it-swarm-eu.dev

Wann wird eine Funktion in einer Programmiersprache / -plattform als "Bürger erster Klasse" angesehen?

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" angesehen?

64
Gulshan

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 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 und 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

42
Waquo

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 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 beispielsweise mit ganzen Zahlen ausführen. Warum sollte also etwas anderes anders sein?

Die obige Definition ist etwas restriktiv in dem Sinne, dass sie nur wirklich über den Aspekt der Erstklassigkeit spricht, der damit zusammenhängt, Objekte des Programms zu sein. Eine allgemeinere Definition 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 Java Operatoren und Java Methoden sind 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 nicht bedeutet, entgegen der landläufigen Meinung, Java unterstützt das Überladen von Operatoren: zum Beispiel das + Operator ist überladen für byte, short, int, 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 das Sie haben keinen Einfluss darauf. Dies macht Operatoren gemäß dieser zweiten Definition eindeutig zweitklassig. Beachten Sie, dass Methoden nach wie vor keine erstklassigen Objekte sind die erste Definition. (Macht das Operatoren zur dritten Klasse?)

33
Jörg W Mittag

Normalerweise bezieht sich dies auf ein 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.

6
Pemdas

Ich würde sagen, ein Feature ist ein erstklassiger Bürger, wenn es nur von der Sprache implementiert wird.
d.h. Für die Implementierung dieser Funktion sind keine Funktionen für mehrere Sprachen oder eine Standardbibliothek erforderlich.

Beispiel:

In C/C++ betrachte ich Funktionen nicht als erstklassigen Bürger (andere mögen es).
Dies liegt daran, dass es Möglichkeiten gibt, Funktionen zu manipulieren, die direkt von der Sprache unterstützt werden, jedoch 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.

1
Martin York