Ich habe schon oft Aussagen wie „Bitte machen Sie diese Funktion zu einem erstklassigen Bürger in so und so Sprache / Plattform“ gesehen. Zum Beispiel wird über Aufzählungen in C # /. Net gesprochen. Wann wird eine Funktion in einer Programmiersprache / -plattform als „Bürger erster Klasse“ betrachtet?

Kommentare

Antwort

Definition

Ein Objekt ist erstklassig, wenn es:

  • kann in Variablen gespeichert werden und Datenstrukturen
  • können als Parameter an eine Unterroutine übergeben werden.
  • kann als Ergebnis einer Unterroutine zurückgegeben werden
  • kann zur Laufzeit erstellt werden
  • hat eine intrinsische Identität (unabhängig von einem bestimmten Namen)

Der Begriff „Objekt“ wird hier lose verwendet, bezieht sich nicht unbedingt 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

Kommentare

  • Also, was macht Aufzählungen zu Objekten zweiter Klasse? in .net / C #?
  • @Gulshan – Sie könnten das Fehlen einer intrinsischen Identität argumentieren – C # -Aufzählungen sind im Grunde nur syntaktischer Zucker (dh ein “ Vorname „) für einen ganzzahligen Wert. Vergleichen Sie mit Java, wo die Aufzählungen eigenständige Objekte sind.
  • @mikera, in .NET sind Aufzählungen eigenständige Werte. Java hat einfach keine Werte, nur Objekte, die ‚ der einzige Unterschied sind.
  • @mikera: Dies verhindert jedoch Java ‚ s Aufzählungen von einigen netten Eigenschaften wie der Möglichkeit, Bitfelder mit ihnen darzustellen. Während ihre Implementierung wahrscheinlich erstklassiger ist, haben die meisten ihrer APIs immer noch viele Ganzzahl- (oder Zeichenfolgen-) Konstanten, und viele Verwendungen davon können nicht einfach durch Aufzählungen ersetzt werden.
  • I don ‚ Ich glaube nicht, dass Enums zur Laufzeit in .Net erstellt werden können, oder? Ich dachte, sie wären immer Konstanten.

Antwort

Der Begriff “ erstklassiger Bürger “ oder “ erstklassiges Element “ in einer Programmiersprache wurde vom britischen Informatiker Christopher Strachey in den 1960er Jahren im Kontext von first eingeführt Klassenfunktionen. Die bekannteste Formulierung dieses Prinzips ist wahrscheinlich in 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 zurückgegeben werden Prozeduren.
  • Sie können in Datenstrukturen enthalten sein.

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

Es geht um “ gleiche Rechte „: Sie können alle oben genannten Schritte ausführen, beispielsweise mit ganzen Zahlen. Warum sollte also etwas anderes anders sein?

Die obige Definition ist etwas restriktiv in dem Sinne, dass sie nur wirklich ist spricht über den Aspekt der Erstklassigkeit als Objekte des Programms. Eine allgemeinere Definition wou Es wäre, dass eine Sache erstklassig ist, wenn Sie alles damit machen können, können Sie auch mit anderen Dingen ähnlicher Art.

Zum Beispiel sind Java-Operatoren und Java-Methoden von ähnlicher Art. Sie können neue Methoden definieren, Sie können (etwas) frei die Namen Ihrer eigenen Methoden wählen, Sie können Methoden überschreiben, Sie können Methoden überladen. James Gosling kann all das auch mit Operatoren tun, aber Sie und ich können das nicht. Ich meine, entgegen der landläufigen Meinung unterstützt Java das Überladen von Operatoren: zum Beispiel Der Operator + ist für byte, short, , long, float, double und String und IIRC in Java 7 auch für BigInteger und BigDecimal (und wahrscheinlich ein paar, die ich vergessen habe). Es ist nur so, dass Sie keinen Einfluss darauf haben.Damit sind die Bediener nach dieser zweiten Definition eindeutig zweitklassig. Beachten Sie, dass Methoden nach der ersten Definition immer noch keine erstklassigen Objekte sind. (Macht dies Operatoren zur dritten Klasse?)

Kommentare

  • Großartige Antwort. So sagen beispielsweise die pipenv-Dokumente , dass “ Windows ein erstklassiger Bürger ist. in unserer Welt. “ Würde dies bedeuten, dass Sie unter Windows alles mit pipenv tun können, was Sie auch unter Linux tun können?
  • Nein, ich ‚ glaube nicht, dass die Verwendung des Begriffs “ erstklassiger Bürger “ hat irgendetwas mit der formalen Programmiersprachtheorie Definition des Begriffs zu tun. Ich denke, pipenv verwendet den Begriff nur mit seiner normalen englischen Standardbedeutung.
  • Wie in “ fair behandelt? “ Vielen Dank für Ihre Hilfe.

Antwort

Normalerweise diese Antwort rs zu einem Konstrukt, das als Parameter passierbar ist, als Rückgabetyp von einer Funktion definiert oder einem Wert zugewiesen werden kann. Normalerweise müssen Sie sie zur Laufzeit erstellen können. Zum Beispiel wäre eine Instanz einer Klasse ein Bürger erster Klasse in C ++ oder Java, eine Funktion in C jedoch nicht.

Kommentare

  • Was macht eine Klasse zu einem erstklassigen Bürger in C ++?
  • @bjarkef: Klingt so, als ob dies bereits beantwortet wurde durch Übereinstimmung mit der Beschreibung in den vorhergehenden Sätzen.
  • @Jonathan: Ja, tut mir leid, ich habe das “ falsch interpretiert und sie zur Laufzeit . Ja, Sie können zur Laufzeit eine Instanz einer Klasse (ein Objekt) erstellen, nicht jedoch die Klasse selbst. Das hat mich verwirrt.
  • 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 in anderen Objekten zurückgegeben werden. Sie können jedoch nicht ohne die Hilfe anderer Konstrukte manipuliert werden (z. B. std :: bind ist erforderlich, um Parameter an eine Funktion zu binden).
  • @Martin Ich habe nie gesagt, dass Funktionen in C / C ++ erstklassige Bürger sind .

Antwort

Ich würde sagen, ein Feature ist ein erstklassiger Bürger, wenn es ausschließlich von der Sprache implementiert wird
dh es sind keine Funktionen für mehrere Sprachen oder eine Standardbibliothek erforderlich, um diese Funktion zu implementieren.

Beispiel:

In C / C ++ betrachte ich Funktionen nicht als erste Klassenbürger (andere können).
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.

Kommentare

  • Würde nicht ‚ t, die gebundene Funktionen (oder “ Schließungen „) nicht erstklassig machen, während Funktionen selbst sind? Wie wirkt sich die Unterstützung von 0x ‚ für Schließungen auf Ihre Analyse aus?
  • @Fred Nurk: Alles hängt von der Sprache ab. In einigen Sprachen sind Schließungen erstklassige Systeme. In anderen nicht. Ich bin mit C ++ 0x noch nicht vertraut genug, um einen expliziten Kommentar abzugeben.
  • ‚ s sagen, die Sprache ist entweder C oder C ++ (aber nicht 0x ), wie in deiner Antwort. Würde ‚ nicht Ihre Definition von “ erstklassig “ machen gebundene Funktionen (oder “ Verschlüsse „) sind nicht erstklassig, während die Funktionen selbst sind?
  • @Fred Nurk: Wenn Sie einschränken Das einzige, was Sie mit einer Funktion tun können, ist, sie zu einem Abschluss zu machen, dann sicher. Aber für mich ist ‚ wie zu sagen, ob Ihre Plattform das Hinzufügen von Ganzzahlen nur durch Importieren einer Bibliothek unterstützt. Dann sind ganze Zahlen Bürger erster Klasse, aber das Hinzufügen von ganzen Zahlen wird nicht berücksichtigt. Meiner Ansicht nach ist das Schließen 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 nicht sicher, ob das eine Frage war).
  • @Martin: Ich muss mich nicht klar erklären. Wenn “ gegeben ist, ist ein Feature ein erstklassiger Bürger, wenn es ausschließlich durch die Sprache “ implementiert wird, werden Funktionen sowohl in C als auch in C ++ implementiert allein durch die Sprache und wäre somit erstklassig. Gebundene Funktionen (die auch als “ -Verschlüsse “ bezeichnet werden können) sind das, was Sie ‚ sind Sprechen mit Bindungsparametern usw., aber dass ‚ eine andere Funktion ist.

Antwort

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

In WCF / C # Sie müssen derzeit ein Klassenobjekt mit einem Servicevertragsattribut markieren, damit es als Service ausgeführt werden kann. Es gibt keine:

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

Eine Klasse ist ein Bürger erster Klasse in c #, wo ein Dienst nicht ist.

Hoffnung Dies hilft

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.