Oh nein, ich muss vielleicht wieder Wikipedia bearbeiten.
Es gibt wirklich nur zwei Unterscheidungen, die es wert sind: erstklassig und nicht erstklassig. Wenn Michael Scott über eine dritte-Klasse irgendetwas spricht, werde ich sehr deprimiert sein.
Also, was bedeutet "erstklassig" überhaupt? Nun, es ist ein Begriff, der kaum eine technische Bedeutung hat. Die Bedeutung, wenn vorhanden, ist normalerweise vergleichend, und er bezieht sich auf eine Sache in einer Sprache (ich bin hier bewusst vage), die mehr Privilegien hat als eine vergleichbare Sache. Das ist alles, was die Leute damit meinen.
Lassen Sie uns einige Beispiele ansehen:
-
Funktionszeiger in C sind Werte erster Klasse, weil sie an Funktionen übergeben, von Funktionen zurückgegeben und in heap-allokierten Datenstrukturen gespeichert werden können wie jeder andere Wert. Funktionen in Pascal und Ada sind keine Werte erster Klasse, weil sie zwar als Argumente übergeben werden können, aber nicht als Ergebnisse zurückgegeben oder in heap-allokierten Datenstrukturen gespeichert werden können.
-
Struct-Typen sind Typen zweiter Klasse in C, weil es keine Literalausdrücke des Strukturtyps gibt. (Seit C99 gibt es Literalliteratoren mit benannten Feldern, aber dies ist immer noch nicht so allgemein wie ein Literal überall dort, wo Sie einen Ausdruck verwenden können.)
-
Polymorphe Werte sind Werte zweiter Klasse in ML, weil sie zwar an Namen gebunden werden können, aber nicht lambda-gebunden werden können. Daher können sie nicht als Argumente übergeben werden. Aber in Haskell, weil Haskell Polymorphie höherer Ordnung unterstützt, sind polymorphe Werte erstklassig. (Sie können sogar in Datenstrukturen gespeichert werden!)
-
In Java ist der Typ int
zweiter Klasse, weil Sie nicht davon erben können. Der Typ Integer
ist erstklassig.
-
In C sind Labels zweiter Klasse, weil sie keine Werte haben und Sie nicht mit ihnen rechnen können. In FORTRAN haben Zeilennummern Werte und sind daher erstklassig. Es gibt eine GNU-Erweiterung für C, die es ermöglicht, erstklassige Labels zu definieren, und sie ist sehr nützlich. Was bedeutet erstklassig in diesem Fall? Es bedeutet, dass die Labels Werte haben, in Datenstrukturen gespeichert werden können und in goto
verwendet werden können. Aber diese Werte sind in einem anderen Sinne zweiter Klasse, weil ein Label aus einem Verfahren nicht sinnvoll in einem goto
verwendet werden kann, das zu einem anderen Verfahren gehört.
Bekommen wir eine Vorstellung davon, wie nutzlos diese Terminologie ist?
Ich hoffe, diese Beispiele überzeugen Sie davon, dass die Idee von "erstklassig" keine sehr nützliche Idee ist, um darüber nachzudenken, wie Programmiersprachen insgesamt funktionieren. Wenn Sie über ein bestimmtes Merkmal einer bestimmten Sprache oder Sprachfamilie sprechen, kann es ein nützliches Schlagwort sein ("eine Sprache ist nicht funktional, es sei denn, sie hat erstklassige, verschachtelte Funktionen"), aber im Allgemeinen ist es besser, einfach zu sagen, was Sie meinen, anstatt über "erstklassige" oder "nicht erstklassige" Dinge zu sprechen.
Was "drittklassig" betrifft, sagen Sie einfach nein.