Es gibt tatsächlich eine große Ähnlichkeit zwischen Sortierungen für die Abstact-Syntax und Typen, wie sie normalerweise verstanden werden. Aber Sortierungen sind ein formales syntaktisches Konzept , und AS-Bäume sind auch Syntax, während Typen ein semantisches Konzept sind .
Die Terminologie stammt aus dem Begriff Algebren (auch freie Algebren genannt ) und der universellen Algebra . Dies sind im Wesentlichen syntaktische Theorien algebraischer Strukturen, die unabhängig von Interpretationen analysiert werden. Sie wurden in der ersten Hälfte des 20. Jahrhunderts entwickelt.
Ein Begriff kann als Baum angesehen werden, bei dem die Knoten von einer endlichen Menge von Operatoren beschriftet werden, wobei jeder Operator eine feste Arität hat, die die Anzahl der Töchter im Baum angibt. Arity 0 ist für Blätter. In mehrfach sortierten Algebren wird dies mit Sortierungen verfeinert, sodass jeder Operator zu einer Sortierung gehört, und Aritäten werden durch eine geordnete Liste von Sortierungen ersetzt, die für jede Tochter die Sortierung ihres Hauptoperators festlegt. Die Art eines Operators wird zusammen mit der Liste der Sorten seiner Tochter als Signatur des Operators bezeichnet.
In universellen Algebren wird dies weiter verfeinert, indem gleich definierte Äquivalenzbeziehungen zwischen Begriffen eingeführt werden.
Obwohl es ein wenig verblasst zu sein scheint, waren diese Konzepte im späten 20. Jahrhundert sehr populär und wurden in der Informatik vielfach studiert, da abstrakte Algebren dann als Grundlage für abstrakte Datentypen angesehen wurden, die teilweise Vorläufer dessen sind, was ist nos Klassen in der objektorientierten Programmierung.
Universelle Algebren beziehen sich auf die Entwicklung der Kategorietheorie, die auch in der gegenwärtigen Vision von Typen und Programmiersprachen von grundlegender Bedeutung ist.
Algebren sind syntaktische Objekte und sollen mit einer Interpretation in einigen semantischen Domänen verwendet werden, die Typen entsprechen. Eine Interpretation ist ein Homomorphismus, der Sortierungen in Wertebereiche (Typen) und Operatoren in Funktionen zwischen diesen Bereichen abbildet , so dass Signaturen und Gleichungen auch im Fall einer Gleichungsalgebra respektiert werden. Auf diese Weise können Sie die Ergebnisse der Gruppentheorie auf jede Domäne mit einer Operation anwenden, die die Definition einer Gruppe berücksichtigt.
Diese Organisation wurde von frühen Forschern in Programmiersprachen als sehr praktisch angesehen, insbesondere von Forschern, die sich mit der Formalisierung von Programmiersprachen befassen. Es hatte den Vorteil, Syntax und Semantik zu isolieren und mathematisch gut verstanden zu werden.
Ein weiterer Grund für die Übernahme war die Entwicklung eines Tools zur Manipulation von Programmen, entweder in Entwicklungsumgebungen oder in formalen Systemen, um die Eigenschaften von Programmen zu beweisen (was sich als immer mehr Doppelprobleme herausstellte).
Dies führte zur Entstehung des Konzepts des abstrakten Syntaxbaums (AST) für Programmiersprachen, bei denen es sich im Wesentlichen um Begriffe einer mehrsortierten Algebra handelt (die manchmal in einigen Systemen durch die Verwendung der Sortiervereinigung verfeinert wird). Der AST ist die Referenzsyntax für eine Sprache, aus der die Semantik durch Homomorphismus wie in der Denotationssemantik definiert werden kann.
Dies ist nicht nur praktisch, um die Semantik von Sprachen zu studieren, sondern Bäume sind auch besser strukturiert als Zeichenfolgen und somit eine bessere Grundlage für die Entwicklung von Programmierwerkzeugen und Programmierumgebungen.
Es ermöglicht das Isolieren von Parsing, was traditionell ein chaotischer Teil war, da die Einschränkungen der Parsing-Technologie die Verwendung verzerrter Grammatiken erzwangen. Präsentationsprobleme werden ebenfalls berücksichtigt.
Es ermöglicht mehrere konkrete (Zeichenfolgen- oder Grafik-) Darstellungen von Programmen, was manchmal praktisch sein kann (es gibt keinen Grund, warum die Verwendung von Interpunktion anstelle von Tabulatoren oder umgekehrt in der Programmsyntax den Personen aufgezwungen werden sollte).
Es macht es einfach, viele Interpretationen von Programmen und Arten zu definieren , um Programmeigenschaften mit abstrakten Interpretationen zu analysieren.
Es ist praktisch, um (halb-) automatisierte Programmmanipulationswerkzeuge zu schreiben, beispielsweise für automatische Programmtransformationen oder Übersetzungen zwischen Sprachen.
In der Praxis können die Dinge manchmal etwas komplizierter sein, da einige Formen der abstrakten Syntax es einigen Operatoren ermöglichen, Bäume (Ausdrücke) zu erstellen, die zu mehreren Sorten gehören (eine informelle Sichtweise). Beispielsweise könnte es eine Sortierung für syntaktische Konstrukte geben, die Variablen (zuweisbare Entitäten) darstellen, und eine andere für Ausdrücke. Aber jede Variable kann als Ausdruck verwendet werden, wobei das Gegenteil falsch ist.
Frühe Veröffentlichungen zu Programmiersprachen stammen aus der Mitte der siebziger Jahre. Die damalige Konzeptualisierung war für die Produktion syntaxbewusster Programmierumgebungen gedacht (das Wort "gerichtet" wurde dann verwendet)). Suchen Sie nach Mentor und Centaur in Europa und nach Cornell Program Synthesizer in den USA. Sie waren die ersten beiden Systeme, die solche Konzepte tatsächlich auf praktische Weise verwendeten. Viele andere wurden später entwickelt.
Die abstrakte Syntax geht jedoch diesen Systemen voraus. Die Lisp-Sprache (1958) hatte eine abstrakte Syntax, was nicht verwunderlich ist, da sie von einem Logiker entwickelt wurde und zum Zwecke der Erstellung von Programmen, die Programme manipulieren (siehe auch ML und LCF ... die später kamen). Aber Lisp war nicht sortiert: Alles war syntaktisch eine Liste und eine verfeinerte Struktur war im Wesentlichen semantikabhängig. Dies führte einige Leute zu der falschen Annahme, dass Lisp keine Syntax hatte.