In SICP geben die Autoren an ( Abschnitt 1.1 ), dass es drei grundlegende "Mechanismen" von Programmiersprachen gibt:
primitive Ausdrücke , die die einfachsten Entitäten darstellen, mit denen sich die Sprache befasst
Kombinationsmittel , mit denen zusammengesetzte Elemente aus einfacheren aufgebaut werden
Abstraktionsmittel , mit denen zusammengesetzte Elemente als Einheiten benannt und bearbeitet werden können
Wie kann ich eine gängige Programmiersprache (z. B. Java) hinsichtlich dieser Elemente oder Mechanismen analysieren?
Antworten:
Die Unterscheidung zwischen primitiven Ausdrücken, Kombinationsmitteln und Abstraktionsmitteln ist nützlich bei der Modellierung von Programmiersprachen. Beachten Sie, dass dies keine intrinsische Eigenschaft der Sprache ist: Sie können nicht auf eine Sprachdefinition verweisen und sagen: „Diese Funktion ist eindeutig ein primitiver Ausdruck, diese Funktion ist eindeutig ein Kombinationsmittel.“ Die Unterscheidung ist eine Eigenschaft des Modells, und komplexe Modelle können einer Klassifizierung widerstehen.
Ein Lehrbuchbeispiel für diese drei Konzepte ist der Lambda-Kalkül , der jeweils genau eines enthält:
Wenn Sie zu Sprachen mit mehr Funktionen gelangen, kann die Modellierung mehrdeutiger werden. Im Allgemeinen ist ein primitiver Ausdruck ein Ausdruck, den Sie nicht in primitive Komponenten zerlegen können oder wollen. Aber es ist wie das Atom : Es ist primitiv, bis die Wissenschaft voranschreitet. Zum Beispiel gibt es eine Variante des Lambda-Kalküls, bei der Variablen Zahlen anstelle von Namen verwenden ( De-Bruijn-Indizes ), was besonders praktisch ist, wenn Lambda-Begriffe für Computer-Proofs modelliert werden. und in Computer-Proofs werden ganze Zahlen in Bestandteile zerlegt . In diesen Modellen sind Variablen also doch keine primitiven Ausdrücke.
In (einem typischen Modell von) Java sind primitive Ausdrücke hauptsächlich Konstanten und Variablen. Kombinationsmittel umfassen die zahlreichen Operatoren; Genauer gesagt ist „additiver Ausdruck“ ein Mittel zur Kombination mit zwei Slots (der linken und der rechten Seite) oder mit drei Slots (den beiden Seiten plus dem Operator), wenn Sie sowohl A
+
B als auch A-
B einschließen unter diesem Namen (in diesem Fall die Operatoren+
und-
wären selbst primitive Konstrukte). Andere Kombinationsmittel umfassen Sequenzen von Befehl I;
J , Schleifenkonstruktewhile (…) {…}
, und so weiter. Dann haben Sie Konstrukte wie Variablendeklarationen, Funktionsdefinitionen, Klassendefinitionen usw., die sowohl Kombinationsmittel (sie kombinieren Parameternamen und -typen, Körper, Initialisierer usw.) als auch Abstraktionsmittel (weil sie Namen für die Wiederverwendung definieren) sind. Es ist in der Tat durchaus üblich, dass Abstraktionsmittel auch Kombinationsmittel sind: Sie kombinieren einen Namen mit seiner Definition.quelle
Grober Stich:
Ausdrücke sind genau das; Was macht einen Ausdruck in Java aus? Ich weiß nicht, ob sich das auf Aussagen ausweiten würde oder nicht.
Kombinationen würden zusammengesetzte Ausdrücke, (Variablen?,) Anweisungen, Methoden, den Klassenmechanismus und Pakete enthalten. Module auch, sobald sie in der Sprache sind.
In Java ist das einfachste Abstraktionsmittel eine Klasse: Außerhalb einer Klasse darf nichts existieren. Es gibt vielleicht "Abstraktionsebenen": Eine statische Methode ist wohl einfacher als eine Instanzmethode, da sie keine Instanz erfordert.
Generika bieten eine zusätzliche Abstraktionsebene (und Frustration).
quelle
Hier ist meine grundlegende Kategorisierung. Ich versuche, eine Parallele zu LISP zu ziehen.
Primitive Ausdrücke
Parallel in LISP : Atome, Zahlen und Listen.
Kombinationsmittel (Möglichkeiten, wie Sie zusammengesetzte Datenstrukturen erstellen können)
Parallel in LISP : Nachteile Zellen, Listen
Mittel der Abstraktion
+
,-
,*
,/
, ...)Parallel in LISP : Funktionen, syntaktischer Zucker wie
let
,define
quelle
Eine Programmiersprache wird im Allgemeinen durch ihre Syntax und ihre Semantik definiert . Beide werden in den Standards für die Sprache definiert.
Die Syntax beschreibt, wie ein gültiges Programm geschrieben wird, und die Semantik definiert, was dieses gültige Programm bedeutet.
In Ihren Fällen sagt Ihnen die Syntax, was Ihre Grundelemente sind, wie Sie sie kombinieren und wie Sie sie abstrahieren. Die Semantik zeigt Ihnen, was die Kombinationen und Abstraktionen bedeuten.
In der Syntax erfahren Sie beispielsweise, wie Sie eine gültige
for
Schleife schreiben . Die Semantik zeigt Ihnen, was die for-Schleife tut.Wenn Sie wirklich mit der Analyse einer Programmiersprache beginnen möchten, holen Sie sich eine Kopie des Standards und sehen Sie, was darin enthalten ist. Ich würde wirklich mit einer einfachen Sprache wie C beginnen, bevor ich mich mit Java beschäftige. Ich würde auch den Rest des Buches lesen. Zu lernen, warum Programmiersprachen so funktionieren, wie sie funktionieren, hat mich zu einem besseren Programmierer gemacht, obwohl ich keine Compiler implementiere.
quelle
x = ++x;
ist nicht gültig, selbst wenn ein typischer Compiler dies akzeptieren würde.Ich weiß nicht, ob es richtig ist, aber ich verstehe die Unterteilung wie folgt:
primitive Ausdrücke , Dies wären Dinge wie >>, +, *, /, int, boolean, Variablen, Methoden usw.
Mittel der Kombination, Dies kann umstritten sein, entweder seine Dinge wie + und konkret, oder es spricht über fortgeschrittenere Ideen wie Vererbung gegen Komposition und die Methoden, um dies zu tun. Einspritzung, der neue Bediener, Ausdehnung etc.
Abstraktionsmittel Dies ist die Syntax zum Benennen von Variablen und Methoden sowie zum Erstellen von Schnittstellen, Klassen, statischen Klassen, Überladungsmethoden usw.
Möglicherweise müssen Sie uns jedoch weitere Informationen aus dem Buch geben, damit wir genau wissen, was dort gemeint ist.
quelle
means of combination
- dass es schwierig ist herauszufinden, was genau dorthin gehört. Gute Antwort.