Hinzugefügt
Ich habe gerade zwei verwandte Fragen gefunden
/programming//a/2582804/156458
In Programmiersprachen aus der Programmiersprache Pragmatik von Michael Scott
Im Allgemeinen wird ein Wert in einer Programmiersprache als erstklassig bezeichnet , wenn er als Parameter übergeben, von einem Unterprogramm zurückgegeben oder einer Variablen zugewiesen werden kann. Einfache Typen wie Ganzzahlen und Zeichen sind in den meisten Programmiersprachen erstklassige Werte. Im Gegensatz dazu kann ein Wert der zweiten Klasse als Parameter übergeben, aber nicht von einem Unterprogramm zurückgegeben oder einer Variablen zugewiesen werden, und ein Wert der dritten Klasse kann nicht einmal als Parameter übergeben werden.
Bezeichnungen sind in den meisten Programmiersprachen Werte der dritten Klasse, in Algol jedoch Werte der zweiten Klasse. Unterprogramme zeigen die meisten Variationen an. Sie sind erstklassige Werte in allen funktionalen Programmiersprachen und den meisten Skriptsprachen. Sie sind auch erstklassige Werte in C # und mit einigen Einschränkungen in mehreren anderen imperativen Sprachen, einschließlich Fortran, Modula-2 und -3, Ada 95, C und C ++. 11 Sie sind Werte zweiter Klasse in den meisten anderen imperativen Sprachen und Werte dritter Klasse in Ada 83.
Was ist die mathematische Grundlage für Werte der ersten, zweiten und dritten Klasse in Programmiersprachen?
Die Terminologie erinnert mich an die Logik erster / zweiter Ordnung, aber hängen sie zusammen?
Es scheint mir, dass der Unterschied zwischen ihnen darin besteht, in welchem speziellen Fall ein Wert verwendet werden kann
- als Parameter übergeben,
- von einem Unterprogramm zurückgegeben oder
- in eine Variable zugewiesen.
Warum sind die spezifischen Fälle wichtig, während andere Fälle nicht erwähnt werden?
Vielen Dank.
Antworten:
Es gibt keine und es ist ziemlich willkürlich.
Die einzige nützliche Unterscheidung ist zwischen erstklassig und allen anderen. Jeder Fall, der sich in der "anderen" Klammer befindet, hat in jedem Fall einen eigenen Satz von Regeln, und sie alle zusammen zu fassen, ist einfach nicht sehr hilfreich. "Erste Klasse" bedeutet im Wesentlichen "Sie müssen die Regeln nicht nachschlagen" und "andere" bedeutet "Sie müssen die Regeln lernen".
Beispielsweise sind in C ++ einzelne Funktionen erstklassige Werte, solange sie zustandslos sind. Überlastsätze sind nicht aber Lambdas sind. In C # sind Funktionen im Allgemeinen erstklassige Werte, aber es gibt einige unangenehme Fälle, die beim Umgang mit Typinferenz auftreten, die verhindern, dass sie in allen Fällen auftreten.
quelle
Ich bin mit DeadMG einverstanden, der wichtige Unterschied ist zwischen erstklassig und "alles andere". Es gibt jedoch eine bekanntere Methode, um den Unterschied zu klassifizieren.
Erstklassige Werte sind Daten, die anderen sind Code. (Grob gesagt: Ich bin sicher, dass es Ausnahmen gibt. Aber dies ist eine wirklich gute Annäherung, die für reale Sprachen gilt.)
In einigen Sprachen können Sie Code als Daten behandeln. Dafür sind funktionale Sprachen bekannt: Mit einigen von ihnen können Sie den Code des laufenden Programms ändern (die Grundlage der genetischen Programmierung ).
Sprachen wie C und C ++ ermöglichen es Ihnen, die Adresse von Funktionen zu übernehmen: Während Sie diese nicht ändern können, können Sie Funktionen als Parameter an andere Funktionen übergeben. C ++ hat auch den syntaktischen Zucker von Funktoren . Die Idee dabei ist, ein ganzes Objekt zu erstellen, das sich auf der Oberfläche wie eine Funktion zu verhalten scheint und so herumgereicht werden kann, als ob es Daten wären. Was sonst eine niedrigere Wertklasse ist, kann als erstklassiger Wert behandelt werden.
Mathematisch denke ich, ist der beste Weg, an die AST eines Programms zu denken . Normalerweise hat jedes Token einen bestimmten Typ, der mit anderen Typen kompatibel sein kann oder nicht. Denken Sie an L-Wert, R-Wert und das andere Durcheinander von Werttypen in C ++ . Fügen Sie dann die Schlüsselwörter, Symbole, die Funktionen usw. sind, hinzu. Einige davon können je nach Sprache Werte der ersten, zweiten oder dritten Klasse sein.
Ich bin mir nicht sicher, ob es wirklich wichtig ist, die "Klasse" von Werten zu kennen, außer vielleicht in einem akademischen Umfeld. In der realen Welt ist es wichtig zu wissen, wie Sie Code weitergeben und wie Daten behandeln können: Funktoren, Lambdas / Closures, Funktionszeiger usw.
quelle
...
"Variable", die zur Bezeichnung von Vararg-Funktionsparametern verwendet wird. Sie können es in vielen Ausdrücken verwenden, als wäre es eine Werteliste (wie z. B.print(...)
oderlocal args = {...}
), aber es gibt einige Dinge, die Sie nicht damit tun können, wie z. B. in einem Closure (function(...) return function() return ... end end
) darauf zu verweisen .Die Denotational Semantics bietet eine mathematische Grundlage für die Beschreibung der Funktionsweise von Werten und Variablen in einer Programmiersprache. Es wurde in meinem Computer Sci Degree so gut erklärt, dass ich eine Bestnote in der Prüfung Denotational Semantics erhielt, dann das meiste vergaß und es in einem 20-jährigen Leben als Programmierer nie gebraucht habe.
Sie können sich für eine gut definierte mathematische Grundlage entscheiden oder eine informelle Terminologie wie „Status erster Klasse“ verwenden. Ich hätte viel mehr gelernt, wenn der Kurs auf Scotts Programmiersprache Pragmatik basiert hätte, aber die formale Mathematik wird für jemanden benötigt, der einen Doktortitel in Programmiersprachendesign machen wird.
Wenn Sie die Spezifikation für die meisten Programmiersprachen lesen, werden Sie feststellen, dass es Dissidenten an Denotational Semantics mangelt. In den meisten gut entwickelten Sprachen befand sich jedoch jemand im Team, der Experte für Programmiersprachendesign ist, weshalb Denotational Semantics gut verstanden wird.
Deshalb verwendet Michearl Scott eine informelle Terminologie, die in gewissem Zusammenhang mit der formalen Mathematik steht, während er das Thema so präsentiert, wie es die meisten Programmierer nutzen können. Seine Terminologie wird von anderen nicht verwendet, ist also für die Kommunikation nicht nützlich, bietet Ihnen jedoch eine gute Grundlage für die Fragen, die Sie stellen sollten, wenn Sie zum ersten Mal eine neue Programmiersprache sehen.
Beachten Sie, dass Michael L. Scott ein führender Forscher auf dem Gebiet der Informatik ist und daher die formale Mathematik verstehen und sehr gerne anwenden wird. Wie die besten Forscher ist er jedoch in der Lage, die Anwendung der Forschung auf den Rest von uns zu erklären.
quelle
Nein, das Wort "first" in "first class" und in "first order" bedeutet verschiedene Dinge.
Aber ja, die Begriffe "erstklassig" und "erster Ordnung" hängen zusammen. In beiden geht es darum, zu klassifizieren, über welche Konzepte, die eine Sprache beschreiben kann, die Sprache auch abstrahieren kann.
Ein Konzept ist erstklassig, wenn die üblichen Abstraktionsmechanismen einer Sprache über dieses Konzept abstrahieren können.
Beispielsweise kann die Programmiersprache Java Ganzzahlen beschreiben, und alle üblichen Mechanismen zum Abstrahieren über Ganzzahlen (Akzeptieren als Methodenparameter, Zurückgeben als Funktionsergebnisse, Speichern in Datenstrukturen usw.) funktionieren für Ganzzahlen.
Ein Konzept ist erster Ordnung, wenn es nicht verwendet werden kann, um über sich selbst zu abstrahieren.
Zum Beispiel können wir in Java Methoden verwenden, um bestimmte Dinge zu abstrahieren. Methoden können jedoch nicht zum Abstrahieren von Methoden verwendet werden, da ein Methodenname nicht als Methodenparameter übergeben werden kann. Dies ist in JavaScript anders, wo Sie mithilfe der Klammernotation über den Namen eines Objekts auf eine Eigenschaft als Zeichenfolge zugreifen und über Zeichenfolgen abstrahieren können.
Ein Konzept ist zweiter Ordnung, wenn es verwendet werden kann, um Verwendungen erster Ordnung von sich selbst zu abstrahieren, nicht jedoch Verwendungen zweiter Ordnung.
In Java können Sie beispielsweise Generics verwenden, um über Typen zu abstrahieren (wie in
class Foo<T> { public List<T> content; }
). Sie können jedoch keine Generika verwenden, um über Generika (wie inclass Bar<T> { public T<Int> content; }
) zu abstrahieren . Dies ist in Scala anders.Ein Konzept ist dritter Ordnung, wenn es verwendet werden kann, um Verwendungen erster und zweiter Ordnung von sich selbst zu abstrahieren, nicht jedoch Verwendungen zweiter Ordnung.
Und so weiter.
Schließlich ist ein Konzept höherer Ordnung, wenn es verwendet werden kann, um willkürliche Verwendungen von sich selbst zu abstrahieren.
Zusammenfassung: Wenn ein Abstraktionsmerkmal erstklassig ist, ist es auch übergeordnet. Und wenn ein Abstraktionsmerkmal erster Ordnung ist, kann es nicht erstklassig sein.
quelle
List<List>
in Java tun . Vielleicht kannst du klarstellen, was du mit diesem Teil meinst?class Foo<A> { A<Int> ... }
. Das heißt, ich meine, einen generischen Typparameter als generische Klasse zu verwenden. DannFoo<List>
würde dasA<Int>
zu instanziierenList<Int>
. In Java ist das nicht möglich. Ich werde versuchen, dies später in der Antwort zu ändern.List<List>
Beispiel ersetzt. Vielen Dank für den Hinweis auf das Problem, @Polygnome.Keine, die mir bekannt sind.
Nicht wirklich.
Die "Klasse" eines Programmiersprachenelements ist nur eine Kurzform der Frage, welche Dinge der Benutzer meiner Sprache programmgesteuert manipulieren möchte . Beispielsweise bietet C # eine Reihe von Operationen zum Bearbeiten von Werten , eine Reihe von weniger Möglichkeiten zum Bearbeiten von Typen und keine Operationen zum Bearbeiten von Beschriftungen .
Ihre Vorstellung, dass es hier einen Zusammenhang gibt, ist jedoch nicht ganz falsch. Es gibt eine Analogie von der Logik erster Ordnung zur prozeduralen Programmierung und von der Logik höherer Ordnung zur funktionalen Programmierung. Bei der Logik erster Ordnung geht es um die logische Manipulation von Werten. In der prozeduralen Programmierung geht es um die programmatische Manipulation von Werten. Bei der Logik höherer Ordnung geht es um die logische Manipulation von Logikaussagen , bei der funktionalen Programmierung um die programmatische Manipulation von Funktionen .
Sie müssten den Autor um eine endgültige Antwort bitten.
Ich würde mich nicht zu sehr auf diesen Begriff "Klasse" einlassen. Es ist keine formal definierte Sache. Es ist eine Abkürzung, mit der Sprachdesigner darüber sprechen, welche Art von Dingen programmgesteuert manipuliert werden können.
quelle
„Erstklassiger Wert“ ist in diesem Zusammenhang eine Standardterminologie in der Programmiersprachtheorie. Ein erstklassiger Wert kann als normaler Wert in der Sprache bearbeitet und zur Laufzeit berechnet werden. Das ist natürlich eine tautologische Definition, bis Sie eine Semantik für die Sprache definiert haben, und dann ist ein Wert das, was die Semantik als Wert definiert. Ziel des Konzepts ist es, zu identifizieren, was direkt manipuliert werden kann, anstatt nur indirekt darauf zuzugreifen.
Beispielsweise sind in fast jeder Programmiersprache Maschinen-Ganzzahlen mit einer begrenzten Größe (z. B. 8-Bit-Ganzzahlen oder 32-Bit-Ganzzahlen oder 64-Bit-Ganzzahlen usw.) erstklassige Werte. Sie können sie in Variablen speichern, übergeben und an Funktionen zurückgeben usw. In den meisten Sprachen, jedoch nicht in einfachen Sprachen wie Assembler und C, sind Zeichenfolgen erstklassige Werte - in C jedoch nicht Zeiger auf Strings bekommen. In C sind Strings und Arrays keine erstklassigen Werte: Beispielsweise können Sie einer Funktion kein Array übergeben, einer Array-Variablen kein Array zuweisen usw. In C sind Funktionen keine erstklassigen Werte entweder: Sie können keine Funktion in einer Variablen speichern, sondern nur einen Zeiger auf eine Funktion. Im Gegensatz dazu sind Zeichenfolgen und Funktionen in den meisten höheren Programmiersprachen erstklassige Werte: Sie können sie in einer Zeichenfolge usw. speichern.
Ein Beispiel für ein Konzept, das in vielen zu kompilierenden Programmiersprachen nicht erstklassig ist, sind Typen. In einer Sprache wie C oder Java leben Typen zur Kompilierungszeit, Sie können sie nicht mit Sprachkonstrukten bearbeiten. (Java hat auch ein dynamisches Typsystem, das auf Klassen basiert. Klassen sind durch Reflektion erstklassige Werte.) Im Gegensatz dazu hat eine Sprache wie Python eine
type
Funktion, die einen Wert zurückgibt, der den Typ ihres Arguments darstellt.Die Negation von „erstklassigem Wert“ in der Standardterminologie ist „kein erstklassiger Wert“. Der Begriff "Wert zweiter Klasse" wird nicht allgemein verwendet, und "Wert dritter Klasse" noch weniger. Erwarten Sie nicht, sie außerhalb dieses Buches zu sehen. Es gibt absolut keine Grundlage für die Definition von "second" als "kann als Parameter übergeben werden" und "third" als "kann nicht als Parameter übergeben werden". Es gibt keine Skala von Dingen, die sinnvoll nummeriert werden könnten. Nur sehr wenige Sprachen unterscheiden zwischen Werten, die als Parameter an Funktionen übergeben werden können, und Werten, die Variablen zugewiesen werden können. Daher ist es nicht sinnvoll, einen Namen für dieses Konzept zu definieren.
quelle