it-swarm.it

Quando una caratteristica è considerata un "cittadino di prima classe" in un linguaggio / piattaforma di programmazione?

Ho visto molte volte dichiarazioni come: "Per favore, rendi questa funzionalità un cittadino di prima classe in una lingua e una piattaforma così". Ad esempio, si dice degli enum in C # /. Net. Quindi, quando una caratteristica è considerata un "cittadino di prima classe" in un linguaggio/piattaforma di programmazione?

64
Gulshan

Definizione

Un oggetto è di prima classe quando:

  • può essere memorizzato in variabili e strutture dati
  • può essere passato come parametro a una subroutine
  • può essere restituito come risultato di una subroutine
  • può essere costruito in fase di esecuzione
  • ha un'identità intrinseca (indipendente da qualsiasi nome)

Il termine "oggetto" è qui usato in modo approssimativo, non necessariamente riferendosi agli oggetti nella programmazione orientata agli oggetti. I tipi di dati scalari più semplici, come numeri interi e in virgola mobile, sono quasi sempre di prima classe.

http://en.wikipedia.org/wiki/First_class_object

42
Waquo

La nozione di "cittadino di prima classe" o "elemento di prima classe" in un linguaggio di programmazione è stata introdotta dallo scienziato informatico britannico Christopher Strachey negli anni '60 nel contesto del primo -classe funzioni. La formulazione più famosa di questo principio è probabilmente in Struttura e interpretazione dei programmi per computer di Gerald Jay Sussman e Harry Abelson:

  • Possono essere nominati da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultato delle procedure.
  • Possono essere inclusi in strutture di dati.

Fondamentalmente, significa che puoi fare con questo elemento del linguaggio di programmazione tutto ciò che puoi fare con tutti gli altri elementi nel linguaggio di programmazione.

Si tratta di "pari diritti": puoi fare tutto quanto sopra, con, diciamo, numeri interi, quindi perché qualsiasi altra cosa dovrebbe essere diversa?

La definizione sopra è un po 'restrittiva, nel senso che parla solo dell'aspetto di prima classe in relazione all'essere oggetti del programma. Una definizione più generale sarebbe che una cosa è di prima classe se puoi fare tutto ciò che puoi fare anche con altre cose di tipo simile.

Ad esempio, Java e Java sono di tipo simile. Puoi definire nuovi metodi, puoi (in qualche modo) scegliere liberamente i nomi dei tuoi metodi , puoi sovrascrivere i metodi, puoi sovraccaricare i metodi. James Gosling può fare tutto ciò anche con gli operatori, ma tu e io non possiamo. significa, contrariamente alla credenza popolare, Java supporta il sovraccarico dell'operatore: ad esempio, + l'operatore è sovraccarico di byte, short, int, long, float, double e String e IIRC in Java 7 anche per BigInteger e BigDecimal (e probabilmente una coppia che ho dimenticato), è proprio questo tu non hai alcuna influenza su di esso. Ciò rende chiaramente gli operatori di seconda classe secondo questa seconda definizione. Nota che i metodi non sono ancora oggetti di prima classe secondo la prima definizione, però. (Questo rende gli operatori di terza classe?)

33
Jörg W Mittag

Normalmente si riferisce a un costrutto passabile come parametro, che può essere definito come tipo di ritorno da una funzione o che può essere assegnato un valore. Normalmente devi essere in grado di costruirli in fase di esecuzione. Ad esempio, un'istanza di una classe sarebbe un cittadino di prima classe in c ++ o Java, ma una funzione in C non lo sarebbe.

6
Pemdas

Direi che una caratteristica è un cittadino di prima classe se è implementata esclusivamente dalla lingua.
Vale a dire. non richiede funzionalità in più lingue o una libreria standard per implementare tale funzione.

Esempio:

In C/C++ non considero le funzioni un cittadino di prima classe (altri potrebbero).
Questo perché esistono modi per manipolare funzioni che sono supportate direttamente dalla lingua ma che richiedono l'uso di altre funzionalità linguistiche. Il collegamento di parametri a una funzione non è direttamente supportato ed è necessario creare un funzione per implementare questa funzione.

1
Martin York