Wann wird ein Feature in einer Programmiersprache / -plattform als "First Class Citizen" eingestuft?

61

Ich habe oft Aussagen wie "Bitte machen Sie dieses Feature zu einem erstklassigen Bürger in so und so Sprache / Plattform" gesehen. Beispielsweise wird über Aufzählungen in C # /. Net gesprochen. Wann wird ein Feature in einer Programmiersprache / -plattform als "Bürger erster Klasse" eingestuft?

Gulshan
quelle

Antworten:

40

Definition

Ein Objekt ist erstklassig, wenn es:

  • kann in Variablen und Datenstrukturen gespeichert werden
  • kann als Parameter an ein Unterprogramm übergeben werden
  • kann als Ergebnis eines Unterprogramms zurückgegeben werden
  • kann zur Laufzeit erstellt werden
  • hat eine eigene Identität (unabhängig von einem bestimmten Namen)

Der Begriff "Objekt" wird hier lose verwendet und bezieht sich nicht notwendigerweise auf Objekte in der objektorientierten Programmierung. Die einfachsten skalaren Datentypen wie Ganzzahlen und Gleitkommazahlen sind fast immer erstklassig.

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

Waquo
quelle
1
Also, was macht Enums Objekt der zweiten Klasse in .net / C #?
Gulshan
7
@ Gulshan - Sie könnten das Fehlen einer eigenen Identität argumentieren - C # -Aufzählungen sind im Grunde genommen nur syntaktischer Zucker (dh ein "Vorname") für einen ganzzahligen Wert. Vergleichen Sie mit Java, wo die Aufzählungen Objekte für sich sind.
Mikera
@mikera, in .NET sind Aufzählungen Werte für sich. Java hat einfach keine Werte, nur Objekte, das ist der einzige Unterschied.
SK-logic
@mikera: Das verhindert allerdings, dass Javas Enums einige nette Eigenschaften haben, wie zum Beispiel die Möglichkeit, Bitfelder damit darzustellen. Während ihre Implementierung wahrscheinlich erstklassiger ist, haben die meisten ihrer APIs immer noch viele Integer- (oder String-) Konstanten und viele Verwendungen von diesen können nicht einfach durch Aufzählungen ersetzt werden.
Joey
Ich glaube nicht, dass Enums zur Laufzeit in .Net erstellt werden können, oder? Ich dachte, sie wären immer Konstanten.
Travis
33

Der Begriff "erstklassiger Bürger" oder "erstklassiges Element" in einer Programmiersprache wurde in den 1960er Jahren von dem britischen Informatiker Christopher Strachey im Kontext erstklassiger Funktionen eingeführt. Die wohl bekannteste Formulierung dieses Prinzips ist die Struktur und Interpretation von Computerprogrammen von Gerald Jay Sussman und Harry Abelson:

  • Sie können durch Variablen benannt werden.
  • Sie können als Argumente an Prozeduren übergeben werden.
  • Sie können als Ergebnis von Verfahren zurückgegeben werden.
  • Sie können in Datenstrukturen enthalten sein.

Grundsätzlich bedeutet dies, dass Sie mit diesem Programmiersprachenelement alles tun können, was Sie mit allen anderen Elementen in der Programmiersprache tun können.

Es geht nur um "Gleichberechtigung": Sie können alle oben genannten Aufgaben ausführen, beispielsweise mit ganzen Zahlen. Warum sollte also eine andere Aufgabe anders sein?

Die obige Definition ist insofern einschränkend, als sie nur den Aspekt der Erstklassigkeit in Bezug auf das Sein von Objekten des Programms behandelt. Eine allgemeinere Definition wäre, dass eine Sache erstklassig ist, wenn man alles damit machen kann, was man auch mit anderen Dingen ähnlicher Art machen kann.

Beispielsweise sind Java-Operatoren und Java-Methoden von ähnlicher Art. Sie können neue Methoden definieren, Sie können die Namen Ihrer eigenen Methoden (etwas) frei wählen, Sie können Methoden überschreiben, Sie können Methoden überladen. James Gosling kann all das auch mit Betreibern machen, aber Sie und ich können es nicht. Ich meine, entgegen der landläufigen Meinung, Java tut Support - Betreiber Überlastung: zum Beispiel die +ist Betreiber überlastet für byte, short, int, long, float, doubleund String, und IIRC in Java 7 auch für BigIntegerund BigDecimal(und wahrscheinlich ein paar habe ich vergessen), es ist nur , dass SieHabe keinen Einfluss darauf. Das macht Betreiber nach dieser zweiten Definition eindeutig zur zweiten Klasse. Beachten Sie jedoch, dass Methoden nach der ersten Definition immer noch keine erstklassigen Objekte sind. (Macht das Betreiber dritte Klasse?)

Jörg W. Mittag
quelle
6

Normalerweise bezieht sich dies auf ein Konstrukt, das als Parameter übergeben werden kann, als Rückgabetyp von einer Funktion definiert werden kann oder dem ein Wert zugewiesen werden kann. Normalerweise müssen Sie sie zur Laufzeit erstellen können. Zum Beispiel wäre eine Instanz einer Klasse ein erstklassiger Bürger in c ++ oder Java, eine Funktion in C jedoch nicht.

Pemdas
quelle
Was macht eine Klasse zu einem erstklassigen Bürger in C ++?
Bjarke Freund-Hansen
2
@bjarkef: Hört sich so an, als wäre dies bereits mit der Beschreibung in den vorhergehenden Sätzen beantwortet worden.
Doppelgreener
@ Jonathan: Ja, tut mir leid, ich habe das "Konstruieren zur Laufzeit" falsch verstanden. Ja, Sie können zur Laufzeit eine Instanz einer Klasse (ein Objekt) erstellen, aber nicht die Klasse selbst. Das hat mich verwirrt.
Bjarke Freund-Hansen
1
Das Übergeben von Parametern reicht immer noch nicht aus. In C / C ++ würde ich immer noch Funktionen als Bürger zweiter Klasse betrachten. Sie können als Parameter übergeben und als Ergebnisse innerhalb anderer Objekte zurückgegeben werden. Sie können jedoch nicht ohne die Hilfe anderer Konstrukte manipuliert werden (z. B. wird std :: bind benötigt, um Parameter an eine Funktion zu binden).
Martin York
@Martin Ich habe nie gesagt, dass Funktionen in C / C ++ erstklassige Bürger sind.
Pemdas
1

Ich würde sagen, ein Feature ist ein erstklassiger Bürger, wenn es nur von der Sprache implementiert wird.
Das heißt, es sind keine mehrsprachigen Funktionen oder eine Standardbibliothek erforderlich, um diese Funktion zu implementieren.

Beispiel:

In C / C ++ betrachte ich Funktionen nicht als Bürger erster Klasse (andere mögen).
Dies liegt daran, dass es Möglichkeiten gibt, Funktionen zu manipulieren, die direkt von der Sprache unterstützt werden, aber die Verwendung anderer Sprachfunktionen erfordern. Das Binden von Parametern an eine Funktion wird nicht direkt unterstützt, und Sie müssen einen Funktor erstellen, um diese Funktion zu implementieren.

Martin York
quelle
1
Wäre dies nicht dazu führen, dass gebundene Funktionen (oder "Abschlüsse") nicht erstklassig sind, während Funktionen selbst dies sind? Wie berücksichtigt die 0x-Unterstützung für Closures Ihre Analyse?
Fred Nurk
@Fred Nurk: Das hängt alles von der Sprache ab. In einigen Sprachen sind Verschlüsse erstklassige Systeme. In anderen nicht. Ich bin noch nicht mit C ++ 0x vertraut genug, um einen expliziten Kommentar abzugeben.
Martin York
Nehmen wir an, die Sprache ist entweder C oder C ++ (aber nicht 0x), wie Sie antworten. Wäre Ihre Definition von "erstklassig" gebundene Funktionen (oder "Abschlüsse") nicht erstklassig, während Funktionen selbst dies sind?
Fred Nurk
@Fred Nurk: Wenn Sie das einzige beschränken, was Sie mit einer Funktion tun können, ist, sie zu schließen, dann sicher. Aber für mich ist das so, als würde man sagen, wenn Ihre Plattform das Hinzufügen von Ganzzahlen nur durch Importieren einer Bibliothek unterstützt. Dann sind ganze Zahlen Bürger erster Klasse, aber die Addition von ganzen Zahlen wird nicht berücksichtigt. Aus meiner Sicht ist Closure eine Operation, die für eine Funktion ausgeführt werden kann, die effektiv eine neue Funktion zurückgibt (dies hängt jedoch davon ab, wie Sie sie definieren). Aber Abschluss und Bindung sind nur zwei Operationen, wie viele andere wir von der Diskussion ausschließen (ich bin mir nicht sicher, ob das eine Frage war).
Martin York
@Martin: Ich muss mich nicht klar erklären. Vorausgesetzt, "ein Feature ist ein erstklassiger Bürger, wenn es ausschließlich von der Sprache implementiert wird", dann werden Funktionen in C und C ++ ausschließlich von der Sprache implementiert und wären daher erstklassig. Gebundene Funktionen (die auch als "Abschlüsse" bezeichnet werden können) sind das, worüber Sie mit Bindungsparametern usw. sprechen, aber das ist eine andere Funktion.
Fred Nurk
-1

So fügen Sie den bereits gegebenen Antworten ein Beispiel hinzu:

In WCF / C # müssen Sie derzeit ein Klassenobjekt mit einem Servicevertragsattribut kennzeichnen, damit es als Service ausgeführt wird. Es gibt nicht so etwas wie:

public **service** MyService (in relation public **class** MyClass). 

Eine Klasse ist ein erstklassiger Bürger in c #, ein Dienst dagegen nicht.

Hoffe das hilft

Syg
quelle