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.
- Tutti gli elementi possono essere i parametri effettivi delle funzioni
- Tutti gli elementi possono essere restituiti come risultati di funzioni
- Tutti gli elementi possono essere oggetto di dichiarazioni di assegnazione
- 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 IV né C 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.