Über die erste-,zweite - und Dritte-Klasse Wert
Erste-Klasse Wert kann
- als argument übergeben
- nach der Rückkehr von einem Unterprogramm
- zugeordnet, in einer Variablen.
Zweiter Klasse Wert nur können werden als argument übergeben.
Dritten Klasse Wert selbst kann nicht als ein argument übergeben.
Warum sollten diese Dinge, die definiert, wie das? So wie ich das verstehe, "kann als argument übergeben" bedeutet, es kann geschoben werden in der runtime-stack;"zugeordnet werden können, in eine variable" bedeutet, es kann verschoben werden in einen anderen Speicherort des Speichers; "zurückgegeben werden kann aus einem Unterprogramm" hat fast die gleiche Bedeutung "zugeordnet werden können, in eine variable", da der zurückgegebene Wert immer in eine bekannte Adresse, also der ersten Klasse Wert ist völlig "beweglichen" oder "dynamisch",die zweite Klasse Wert ist die Hälfte der "beweglichen" , und die Dritte Klasse Wert ist nur "statische", wie Etiketten in C/C++, die nur behoben werden kann durch die goto-Anweisung, und Sie können nicht nichts tun mit, dass die Adresse mit "goto" .Hat Mein Verständnis keinen Sinn? oder was haben diese drei Arten von Werten konkret?
- Können Sie uns den link oder Verweis zu diesen Definitionen?
- en.wikipedia.org/wiki/First-class_object oder Programmierung Sprache Pragmatik, Zweite Ausgabe 3.5.2 Erste - und Zweite-Klasse-Subroutinen
- Nicht bekommen aufgehängt auf die Implementierungsdetails beim Versuch, befassen sich mit Allgemeinen Definitionen wie diese. Zum Beispiel, Argumente sind nicht unbedingt auf den stack gelegt.
- Diese Dinge sind definiert in Christopher Strachey 1961 definition der Sprache ALGOL.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oh Nein, ich habe zu gehen, Bearbeiten der Wikipedia wieder.
Gibt es eigentlich nur zwei Unterscheidungen lohnt sich: erste-Klasse und nicht die erste-Klasse. Wenn Michael Scott spricht über Dritten-Klasse alles, werde ich sehr deprimiert.
Ok, also was ist ein "first-class" überhaupt? Gut, es ist ein Begriff, hat kaum eine technische Bedeutung. Die Bedeutung, sofern vorhanden, wird in der Regel vergleichende, und es gilt für eine Sache in einer Sprache (ich bin absichtlich vage hier), der hat mehr Rechte als eine vergleichbare Sache. Dass alle Menschen damit meinen.
Betrachten wir einige Beispiele:
Funktionszeigern in C sind erstklassige Werte, weil Sie an Funktionen übergeben und von Funktionen zurückgegeben und gespeichert heap-allokierten Datenstrukturen genauso wie jeder andere Wert. Funktionen in Pascal und Ada sind nicht die erste-Klasse-Werte, weil, obwohl Sie als Argumente übergeben wurden, können Sie nicht zurückgegeben werden, wie Ergebnisse oder gespeicherten heap-allokierten Datenstrukturen.
Struct-Typen sind zweite-Klasse-Typen in C, da gibt es keine wörtliche Ausdrücke der struct-Typ. (Seit C99 gibt es wörtliche Initialisierungen mit benannten Feldern, aber das ist noch nicht so allgemein, als dass eine wörtliche überall können Sie einen Ausdruck verwenden.)
Polymorphe Werte sind zweite-Klasse-Werte in ML, denn obwohl Sie vermietet werden kann-gebunden an Namen, Sie kann nicht sein, lambda-gebundene. Daher können Sie nicht als Argumente übergeben wurden. Aber in Haskell, da Haskell unterstützt höheren Rang Polymorphismus, polymorphe Werte sind first-class. (Sie können auch gespeichert werden, in Daten-Strukturen!)
In Java, den Typ
int
ist zweite Klasse da kann man nicht Erben. Geben SieInteger
ist erste Klasse.In C, Etiketten zweiter Klasse, weil Sie keine Werte, und Sie können nicht berechnen Sie mit Ihnen. In FORTRAN -, Linien-Nummern haben die Werte und so sind erste Klasse. Es ist eine GNU-Erweiterung zu C, das Ihnen erlaubt zu definieren, der erste-Klasse-labels, und es ist jolly nützlich. Was bedeutet erste-Klasse-in diesem Fall bedeuten? Es bedeutet, dass die Etiketten haben Werte, die gespeichert werden können in den Datenstrukturen, und kann verwendet werden
goto
. Aber diese Werte sind der zweiten Klasse in einem anderen Sinn, weil Sie ein label von einem Verfahren können nicht sinnvoll verwendet werdengoto
, gehört zu einem anderen Verfahren.Sind wir immer eine Idee, wie nutzlos diese Terminologie ist?
Ich hoffe, diese Beispiele werden Sie überzeugen, dass die Idee von "first-class" ist nicht eine sehr nützliche Idee, die im denken über Programmiersprachen insgesamt. Wenn du redest über ein bestimmtes feature einer bestimmten Sprache oder Sprachfamilie, es kann eine sinnvolle Kurzform ("eine Sprache ist nicht betriebsbereit, es sei denn, er hat erste-Klasse verschachtelte Funktionen"), aber im großen und ganzen sind Sie besser dran, nur sagen, was du meinst, anstatt zu sprechen über "first-class" oder "nicht erstklassigen" Dinge.
Als für die "Dritte Klasse", sagen Sie einfach Nein.
(forall a. a -> a, forall b. b -> b)
ist nicht gültig geben Sie, bevor Sie sagen{ -# ImpredicativeTypes #- }
, dass die Erweiterung ist sehr veraltet und funktioniert nicht mit jeder vernünftigen definition von Arbeit.Etwas ist erste Klasse, wenn es explizit manipuliert werden, die in den code. In anderen Worten, etwas ist erstklassig, wenn es sein kann programmgesteuert manipuliert, die zur Zeit ausführen.
Diese eng bezieht sich auf die meta-Programmierung in dem Sinne, dass das, was Sie beschreiben, in der der code (bei der Entwicklung) ist eine meta-Ebene, und alles, was existiert, auf die run-Zeit ist ein weiteres meta-Ebene. Aber die Barriere zwischen diesen zwei meta-Ebenen können unscharf werden, zum Beispiel mit Reflexion. Wenn etwas vergegenständlicht zur Laufzeit, es wird explizit manipulierbar.
Sprechen wir von der ersten Klasse Objekt, weil Objekte, die manipuliert werden können programmgesteuert zur Laufzeit (das ist der eigentliche Zweck).
In java, Sie haben Klassen, aber Sie sind nicht Erster Klasse, weil die code können in der Regel nicht manipulieren einer Klasse, es sei denn, Sie verwenden Reflexion. Aber in Smalltalk sind die Klassen-first-class: der code manipulieren können, eine Klasse wie ein reguläres Objekt.
In java, Sie haben - Pakete (Module), aber Sie sind nicht erste Klasse, da der code nicht manipulieren Paket zur Laufzeit. Aber in Neusprech, Pakete (Module) sind erste Klasse, können Sie instanziieren Sie ein Modul und geben es an ein anderes Modul angeben, um die Modularität zur Laufzeit.
In C#, Sie haben Verschlüsse, die first-class-Funktionen. Sie existieren und bearbeitet werden können, zur Laufzeit programmgesteuert. Solche Dinge, die nicht vorhanden ist (noch) nicht in java.
Mir, die Grenze der ersten Klasse/keine erste-Klasse ist nicht gerade streng. Es ist manchmal schwer auszusprechen für einige Programmiersprachen, wie z.B. java-primitive Typen. Wir könnten sagen, es ist nicht Erster Klasse, weil es ist nicht ein Objekt und ist nicht manipulierbar durch eine Referenz, die übergeben werden können zusammen, aber der primitive Wert noch vorhanden ist und manipuliert werden kann, zur Laufzeit.
PS: ich Stimme mit Norman Ramsey und 2. Klasse und 3.-Klasse-Wert machen für mich keinen Sinn.
in
Roger Keays und Andry Rakotonirainy. Context-orientierte Programmierung. In proceedings of the 3rd ACM International Workshop on Data Engineering for Wireless and Mobile Access, MobiDe '03, pages 9-16, New York, NY, USA, 2003. ACM.
Diese Begriffe sind sehr weit gefasst und nicht wirklich Global definiert, aber hier sind die logischen Definitionen für Sie:
First-class-values sind diejenigen, die die tatsächlichen, greifbaren Werte, und die so betrieben werden kann, und gehen um, als Variablen, Argumente, Rückgabewerte oder was auch immer.
Diese nicht wirklich brauchen, eine Gründliche Beispiel, nicht wahr? In C ein int ist erste Klasse.
Zweite-Klasse-Werte sind mehr beschränkt. Sie haben Werte, aber Sie können nicht direkt verwendet werden, so dass der compiler bewusst Grenzen, was Sie mit ihm tun können. Können Sie auf Sie, so können Sie sich immer noch ein first-class-Wert, die Sie vertreten.
Beispielsweise in C eine Funktion ist ein zweite-Klasse Wert. Es kann nicht verändert werden, es kann aber angerufen werden und auf die verwiesen wird.
Dritte-Klasse-Werte sind noch begrenzt. Sie nicht nur nicht Werten, sondern Interaktion ist völlig abwesend, und oft gibt es ihn nur als compile-time Attribute.
Zum Beispiel in Rust, ein Leben lang ist eine Dritte-Klasse Wert. Sie nicht verwenden können, das Leben überhaupt. Sie können nur erhalten es als template-parameter, können Sie nur verwenden Sie es als template-parameter (nur beim erstellen einer neuen variable), und das ist alle Sie mit ihm tun können.
Weiteres Beispiel, in C++ ein struct oder eine Klasse ist eine Dritte-Klasse Wert. Dies braucht nicht viel Erklärung.