Cittadino di prima classe - First-class citizen

Nella progettazione del linguaggio di programmazione , un cittadino di prima classe (anche type , object , entity o value ) in un dato linguaggio di programmazione è un'entità che supporta tutte le operazioni generalmente disponibili per altre entità. Queste operazioni in genere includono il passaggio come argomento, il ritorno da una funzione, la modifica e l'assegnazione a una variabile.

Storia

Il concetto di oggetti di prima e seconda classe è stato introdotto da Christopher Strachey negli anni '60. In realtà non ha definito rigorosamente il termine, ma ha messo a confronto numeri e procedure reali in ALGOL :

Oggetti di prima e seconda classe. In ALGOL, un numero reale può apparire in un'espressione o essere assegnato a una variabile e uno di essi può apparire come un parametro effettivo in una chiamata di procedura. Una procedura, invece, può apparire solo in un'altra chiamata di procedura o come operatore (il caso più comune) o come uno dei parametri effettivi. Non ci sono altre espressioni che coinvolgono procedure o i cui risultati sono procedure. Quindi in un certo senso le procedure in ALGOL sono cittadini di seconda classe: devono sempre apparire di persona e non possono mai essere rappresentate da una variabile o da un'espressione (tranne nel caso di un parametro formale)...

Robin Popplestone ha dato la seguente definizione: Tutti gli articoli hanno determinati diritti fondamentali.

  1. Tutti gli elementi possono essere i parametri effettivi delle funzioni
  2. Tutti gli elementi possono essere restituiti come risultati di funzioni
  3. Tutti gli elementi possono essere oggetto di dichiarazioni di assegnazione
  4. Tutti gli articoli possono essere testati per l'uguaglianza.

Durante gli anni '90, Raphael Finkel ha proposto definizioni di valori di seconda e terza classe, ma queste definizioni non sono state ampiamente adottate.

Esempi

I tipi di dati scalari più semplici , come i numeri interi e in virgola mobile, sono quasi sempre di prima classe.

In molti linguaggi precedenti, gli array e le stringhe non sono di prima classe: non possono essere assegnati come oggetti o passati come parametri a una subroutine. Ad esempio, né Fortran IVC supportano l'assegnazione di array e quando vengono passati come parametri, viene effettivamente passata solo la posizione del loro primo elemento: la loro dimensione viene persa. C sembra supportare l'assegnazione di puntatori all'array , ma in realtà questi sono semplicemente puntatori al primo elemento dell'array e, di nuovo, non riportano le dimensioni dell'array.

Nella maggior parte dei linguaggi, i tipi di dati non sono oggetti di prima classe, sebbene in alcuni linguaggi orientati agli oggetti, le classi siano oggetti di prima classe e siano istanze di metaclassi .

Pochi linguaggi supportano le continuazioni e le etichette GOTO come oggetti, figuriamoci come oggetti di prima classe.

Concetto Descrizione Le lingue
funzione di prima classe chiusure e funzioni anonime Dart , Scheme , ML , Haskell , F# , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust
controllo di prima classe continuazioni Schema , ML , F#
tipo di prima classe tipi dipendenti Coq , Idris , Agda
tipo di dati di prima classe Haskell generico , C++ 11
polimorfismo di prima classe polimorfismo impredicativo
messaggio di prima classe messaggi dinamici (chiamate di metodo) Smalltalk , Obiettivo-C
classe di prima classe metaclasse Smalltalk , Objective-C , Ruby , Python , Delphi
prove di prima classe oggetto di prova Coq , Agda

Funzioni

Molti linguaggi di programmazione supportano il passaggio e la restituzione di valori di funzione, che possono essere applicati agli argomenti. Se questo sia sufficiente per chiamare i valori di funzione di prima classe è controverso.

Alcuni autori richiedono che sia possibile creare nuove funzioni in fase di esecuzione per chiamarle "di prima classe". Di conseguenza, le funzioni in C non sono oggetti di prima classe; invece, a volte sono chiamati oggetti di seconda classe , perché possono ancora essere manipolati nella maggior parte dei modi sopra descritti (tramite puntatori a funzione ).

In Smalltalk , le funzioni (metodi) sono oggetti di prima classe, proprio come le classi Smalltalk. Poiché gli operatori Smalltalk (+, -, ecc.) sono metodi, sono anche oggetti di prima classe.

Riflessione

Alcuni linguaggi, come Java e PHP , hanno un sottosistema di riflessione esplicita che consente l'accesso a strutture di implementazione interne anche se non sono accessibili o manipolabili allo stesso modo degli oggetti ordinari.

Guarda anche

Riferimenti