Analysieren einer Programmiersprache


10

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?


Haben Sie schon einmal in Extended Backus-Naur Form, EBNF oder Backus-Naur Form, BNF gesucht ? Es kann eine Grammatik ähnlich diesen drei Konzepten auflösen, obwohl ich nicht wirklich sicher bin, was Ihre Absichten sind, so dass ich nicht weiß, ob es helfen wird oder nicht.
Jetti

@Jetti - ja, das habe ich und nein, es ist nicht das, woran ich interessiert bin. Ich möchte wirklich die Semantik (Frage: Ist das eigentlich das Wort, nach dem ich suche?) Von Programmiersprachen analysieren, nicht ihre schriftlichen Formen (dh Syntax).

Antworten:


1

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:

  • Die Variablen x , y ,… sind die einzigen primitiven Ausdrücke.
  • Funktionsanwendung MN ist das einzige Kombinationsmittel.
  • Die Lambda-Abstraktion λx.M ist das einzige Mittel zur Abstraktion.

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.


Gute Antwort; Sie haben die Probleme, mit denen ich zu kämpfen hatte - die mehrdeutige Unterscheidung zwischen

Was genau meinst du mit "Variable"? Können diese nicht als Abstraktionsmittel beschrieben werden, weil sie einen Namen haben?
morbidCode

@morbidCode Das Konzept der Variablen ist kompliziert, und das Wort hat im Lambda-Kalkül und in Java eine andere, aber verwandte Bedeutung. Eine Variable kann als „Abstraktion“ betrachtet werden, da sie sich auf einen nicht angegebenen Wert bezieht. Es ist jedoch kein Mittel zur Abstraktion: Es erstellt keine Referenz, sondern lediglich eine Möglichkeit, die vorhandene Abstraktion zu verwenden. Eine Lambda-Abstraktion schafft eine Möglichkeit, einen Codeblock als Objekt zu verwenden, das manipuliert werden kann.
Gilles 'SO - hör auf böse zu sein'

4

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).


@MattFenwick Ein Ausdruck kann aus einem einzelnen Grundelement bestehen. Kombinationen von Grundelementen und anderen Entitäten ergeben einen zusammengesetzten Ausdruck (immer noch ein Ausdruck, aber keine Aussage).
Dave Newton

@MattFenwick Ich bin nicht, ich sage nicht, dass ein Ausdruck ein Grundelement ist , ich sage, dass ein Ausdruck nur aus einem einzigen Grundelement bestehen kann. Es gibt keine Möglichkeit, dass ein String ein Grundelement ist, nur weil die Sprache syntaktischen Zucker dafür bereitstellt, es sei denn, Sie möchten zwischen einem unmittelbaren String und der von ihm erstellten Referenz unterscheiden. Ich würde sagen, + ist, weil es in keiner Weise bearbeitet werden kann.
Dave Newton

In Bezug auf Ihre Seite: Gibt es ein Problem mit der Implementierung von Generika in Java?
Steven Evers

2

Hier ist meine grundlegende Kategorisierung. Ich versuche, eine Parallele zu LISP zu ziehen.

Primitive Ausdrücke

  • Alle primitiven Werte, Dinge, die Sie mit Literalen darstellen können (Zahlen, Boolesche Werte, ...)

Parallel in LISP : Atome, Zahlen und Listen.

Kombinationsmittel (Möglichkeiten, wie Sie zusammengesetzte Datenstrukturen erstellen können)

  • Arrays
  • Objekte / Strukturen.

Parallel in LISP : Nachteile Zellen, Listen

Mittel der Abstraktion

  • Alle Steuerflusssyntax (if, while for)
  • Alle eingebauten Operatoren ( +, -, *, /, ...)
  • Alle Funktionen (in dieser Kategorie enthalten wir Klassen und Methoden)

Parallel in LISP : Funktionen, syntaktischer Zucker wie let,define


Gute Antwort! Ich dachte jedoch, dass einige der Kontrollflusskonstrukte unter Kombinationsmöglichkeiten passen würden. Schöne Parallelen zu LISP, das hilft sehr.

Nicht ganz. Arrays und Objekte werden auf einer anderen Ebene abgespielt. Sie sind Teil der Datendarstellung und nicht der Sprache selbst. Array-Initialisierer sind Teil der Sprache und ein Mittel zur Kombination. Operatoren und Kontrollflusskonstrukte sind keine Abstraktionsmittel, da sie nichts zur Wiederverwendung „speichern“. Abstraktionsmittel geben einer Entität normalerweise einen Namen für die zukünftige Wiederverwendung unter diesem Namen.
Gilles 'SO - hör auf böse zu sein'

0

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 forSchleife 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.


1
Warte was? "Einfach wie C, bevor Sie sich mit Java beschäftigen." Du hast mich bei "Simple like C" verloren.
CorsiKa

Matt, ich glaube ich verstehe nicht wirklich, was du dann tust. Das Buch, das Sie aus zitiert haben, spricht über diese beiden Dinge, unabhängig davon, ob die Autoren sie explizit als Syntax und Semantik bezeichnen oder nicht.
mpdonadio

Tatsächlich beschreibt "Syntax" genau die "einfachsten" Dinge in den Sprachen, aus denen die Atome bestehen.
Ira Baxter

Die Syntax erfasst nicht vollständig, was ein gültiges Programm ist, weit davon entfernt. Beispielsweise kann ein syntaktisch korrektes Programm die Typprüfung nicht bestehen. Ein AC-Programm, das die Anweisung ausführt, x = ++x;ist nicht gültig, selbst wenn ein typischer Compiler dies akzeptieren würde.
Gilles 'SO - hör auf böse zu sein'

0

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.


Das Buch ist kostenlos online; Ein Link wird im OP angegeben. Mir ging es genauso means of combination- dass es schwierig ist herauszufinden, was genau dorthin gehört. Gute Antwort.

Wissen Sie, in welchen anderen Kapiteln er über Kombinationen und Abstraktionen spricht?
Bob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.