XL (eXtensible Language)
XL steht für englisch „eXtensible Language“, also „erweiterbare Programmiersprache“. XL ist eine Programmiersprache, die zur Unterstützung des Paradigmas der konzeptorientierten Programmierung entworfen wurde.[1]
XL | |
---|---|
Paradigmen: | multiparadigmatisch: konzeptorientiert, imperativ |
Erscheinungsjahr: | 2000 |
Designer: | Christophe de Dinechin |
Entwickler: | Christophe de Dinechin |
Aktuelle Version: | 0.1 () |
Typisierung: | stark |
Beeinflusst von: | Ada, C++ |
Betriebssystem: | Unixartige |
Lizenz: | GPLv2 |
xlr.sf.net |
XL stellt individuell rekonfigurierbare Syntax und Semantik bereit. Compiler-Plug-ins können benutzt werden, um der Sprache mehr Funktionen hinzuzufügen. Ein Basissatz an Plug-ins implementiert eine ziemlich „normale“ imperative Programmiersprache. Programmierer können eigene Plug-ins schreiben, die beispielsweise Funktionen wie die symbolische Differenzierung von Gleichungen zur Verfügung stellen. Daraufhin lassen sich diese Funktionen genauso wie die eingebauten Features nutzen.
Sprache
XL ist auf vier Ebenen definiert bzw. aufgeteilt:
- XL0 definiert, wie ein Eingabetext in einen Syntaxbaum transformiert wird.
- XL1 definiert eine Grundsprache mit zu C++ vergleichbaren Eigenschaften.
- XL2 definiert die Standard-Bibliothek, die allgemeine Datentypen und Operatoren umfasst.
- XLR definiert eine dynamische Laufzeit für XL, die auf XL0 basiert.
XL hat keine elementaren Datentypen oder Schlüsselwörter. Alle Operatoren und Datentypen, wie Integer-Zahlen oder die Addition, sind in der Standard-Bibliothek definiert (XL2). XL1 ist portabel zwischen verschiedenen Ausführungsumgebungen. Dies gilt nicht für XL2; falls eine bestimmte CPU beispielsweise keine Gleitkomma-Multiplikation implementiert, so kann der zugehörige Operator in der Standard-Bibliothek fehlen, und das Benutzen einer Gleitkomma-Multiplikation im Quelltext führt während der Kompilierung zu einem Fehler.
Das Hallo-Welt-Programm sieht in XL wie folgt aus:
use XL.TEXT_IO
WriteLn "Hallo Welt"
Eine alternative Form in einem für umfangreiche Programme geeigneten Stil sähe so aus:
import IO = XL.TEXT_IO
IO.WriteLn "Hello World"
Eine rekursive Implementation der Fakultät sähe so aus:
0! -> 1
N! -> N * (N-1)!
Syntax
Die Syntax von XL ist in der XL0-Ebene definiert. Die XL0-Ebene des Compilers kann durch eine Syntaxbeschreibungsdatei konfiguriert werden, in der Eigenschaften wie die Textdarstellung oder der Operatorenvorrang definiert werden. Eine Basis-Syntaxdatei definiert außerdem allgemeine mathematische Schreibweisen, wie z. B. '+' für Addition.
Der Syntaxbaum besteht aus 7 Knotentypen, 4 Blattknotentypen (integer, real, text und symbol) und 3 innere Knotentypen (infix, prefix und block)
- Der integer-Typ repräsentiert ein Integer-Literal, wie zum Beispiel
2
. Das#
-Zeichen kann genutzt werden, um eine andere Basis als 10 zu definieren, wie in2#101101
. Ein trennender Unterstrich kann genutzt werden, um die Lesbarkeit zu verbessern, z. B.1_000_000
. - Der real-Typ repräsentiert nicht-ganzzahlige Zahlenwerte, wie
2.5
. Es können Basisangaben und Trenner genutzt werden, wie bei Integern, also16#D.6FD#E-10
. - Der text-Typ repräsentiert Texte bzw. Strings. Dieser Typ ist normalerweise durch einfache oder doppelte Hochkommas umschlossen, also
"Foo"
oder'bar'
, aber die Syntaxdatei kann auch andere Trenner definieren, einschließlich welcher für mehrzeilige Texte. - Der symbol-Typ repräsentiert Namen oder Operatoren. Namen sind Folgen alphanumerischer Zeichen, die mit einem Buchstaben beginnen, wie z. B.
Hello
. Symbole sind Folgen von nicht-alphanumerischen Zeichen, wie*
oder=/=
. Symbol beachtet die Groß-/Kleinschreibung, aber XL1 ignoriert die Groß-/Kleinschreibung sowie Unterstriche, sodassFooBar
undfoo_bar
als gleichwertig angesehen werden. - infix-Knoten repräsentieren zwei durch eine Einfügung verknüpfte Knoten, wie
A+1
oder2 and 3
. Infix-Knoten werden in manchen Fällen genutzt, um Zeilen mit der Einfügung „new-line“ zu trennen. - prefix-Knoten repräsentieren zwei aufeinanderfolgende Knoten, wie
Write "Hello"
. Dieser Typ wird auch für Postfix-Notationen genutzt, wie3!
oderOpen?
. - block-Knoten repräsentieren einen Knoten, der durch gruppierende Symbole umschlossen ist, wie
(A)
oder[Index]
. Einrückung wird intern durch einen Block-Knoten dargestellt.
Mit der voreingestellten Syntaxdatei ist das folgende Beispiel gültiges XL0, wobei die Semantik unwichtig sei:
A = B + "Hallo"
Wird zu:
infix("=",
symbol("A"),
infix("+",
symbol("B"), text("Hallo")))
Semantik von XL1
Die XL1-Phase ist definiert als Abfolge von Operationen auf den XL0-Syntaxbaum. Diese Operationen werden durch verschiedene Compiler-Plug-ins zur Verfügung gestellt, die auf Grundlage der Form des Syntaxbaums ausgeführt werden.
Bestimmte Konstrukte, translate
und translation
, werden durch ein Plug-in bereitgestellt, das das Schreiben anderer Plug-ins ermöglicht. Das quote
-Konstrukt generiert einen Syntaxbaum. Hier steht, wie diese Schreibweisen benutzt werden können, um ein Plug-in namens ZeroRemoval
zu implementieren, das überflüssige Additionen und Multiplikationen mit 0 eliminiert.
when
'X' + 0
then
return X
when
'X' * 0
then
return parse_tree(0)
Ein Plug-in kann für eine ganze Datei aktiviert werden, entweder über die Kommandozeile, oder lokaler im Quellcode, indem man die pragma-Schreibweise nutzt:
X := {Differentiate} d(sin(omega * T) * exp(-T/T0)) / dT
Die XL1-Ebene beinhaltet einen großen Satz an Plug-ins, besonders XLSemantics
, das allgemeine Abstraktionen zur Verfügung stellt, wie Subroutinen, Datentypen und Variablendeklaration und -definitionen, genauso auch grundlegende strukturierte Statements, wie If-Gatter oder Schleifen.
Entwicklungsstatus und Geschichte
Das aktuelle XL ist das Ergebnis einer langen Entwicklungsarbeit, die etwa 1992 begann. Die Sprache wurde hauptsächlich von Christophe de Dinechin entwickelt und implementiert.
Zuallererst war der XL-Compiler in C++ geschrieben. Er hatte einen Punkt erreicht, an denen die meisten vorgesehenen Eigenschaften korrekt funktionierten, doch das Schreiben von Plug-ins war sehr schwierig, da C++ selbst nicht erweiterbar ist, sodass das Implementieren von translate
-ähnlichen Ausdrücken unmöglich ist. Der Syntaxbaum war komplizierter mit Dutzenden Knotentypen, da er für die gleichzeitige Unterstützung mehrerer Sprachen (Cross-Language-Support) ausgelegt war. Es gibt einen Java-zu-Java-Compiler namens „Moka“, der die gleiche Infrastruktur nutzt.
Zum Ausstieg aus der komplexen Syntaxbaum-Struktur wurde 2003 ein komplett neuer Compiler geschrieben. Der Syntaxbaum wurde erheblich vereinfacht, hinunter zu den 7 XL0-Knotentypen, die jetzt in Benutzung sind. Mit diesem neuen Compiler startete das Bootstrapping 2004, und die gesamte aktuelle Entwicklung der Entwicklertools geschieht in XL. Trotzdem hat der Compiler immer noch teilweise inkompatiblen XL1-Support, obwohl dessen Möglichkeiten schon in einigen Bereichen C++ übertreffen.
Abstammung
XL1 ist beeinflusst von einer großen Zahl anderer Sprachen:
- Ada beeinflusste die Ausnahmenbehandlung, Aufgabenverwaltung, Instandhaltungsaspekte und Teile der Infrastruktur zum Modularisieren größerer Programme.
- BASIC, besonders die modernen Varianten, die ohne Zeilennummern auskommen und strukturiertes Programmieren unterstützen, sowie zeigen, wie einfach eine Programmiersprache sein kann.
- C wurde als Maßstab hinsichtlich der Laufzeit und dem Maschinenebenensupport hinzugezogen. XL benötigt keine virtuelle Maschine zur Ausführung.
- C++ und die Standard Template Library zeigten die Notwendigkeit guter Unterstützung generischer Typen, einschließlich impliziter Instanziierung (an der es Ada fehlt).
- Fortrans ungebrochener Leistungsvorsprung gegenüber C und C++ in numerisch-intensiven Anwendungen half herauszufinden, welche Sprachkonstrukte nützliche Optimierungen verhindern würden.
- Java zeigte die Wichtigkeit einer großen, portablen Unterstützungsbibliothek. Die Java-Container zeigten auch die Grenzen eines nicht auf generischer Programmierung basierenden Ansatzes. Die Kopplung mit Java-Code bleibt eine interessante Herausforderung für XL.
- Lisps Erweiterbarkeit wurde als Schlüsselfaktor für Relevanz und Überleben bis zum heutigen Tag betrachtet. LISP war die erste Sprache, die objektorientierte Merkmale normierte, obwohl sie Jahre vor dem Aufkommen der Idee der Objektorientierung entwickelt wurde.
- Prolog zeigte, dass alternative Programmiermodelle manchmal nützlich und hochproduktiv sind. Es wurde viel Aufwand betrieben, um sicherzustellen, dass auch in XL solche Plug-ins wie in Prolog möglich sind.
- Visual Basic zeigte, wie der Syntaxbaum von der visuellen Darstellung gelöst werden kann. Wenige Leute bearbeiten VB-Formulare als Text. Es wird erwartet, dass XLs Bearbeitungsplugins eines Tages ebenfalls ähnliche Fähigkeiten zur Verfügung stellen, um den Syntaxbaum unmittelbar zu bearbeiten.
Semantik von XLR
XLR ist eine dynamische Sprache, die ursprünglich als Backend für den XL1-Compiler geplant wurde, inzwischen jedoch der Name für die XL-Laufzeit. XLR benutzt die Basissyntax von XL0 gemeinsam mit XL1, doch das Verhalten lässt sich viel eher nahe an eine funktionelle Sprache einordnen, wohingegen XL1 als eher imperativ aussehende Sprache gestaltet wurde. XLR hat praktisch nur einen eingebauten Operator, "->
", der eine Neuschreibung markiert. Die Schreibung auf der linken Seite des Operators wird in die Notation auf der rechten Seite umgewandelt.
Dieser Mechanismus wird benutzt, um Standardschreibweisen zu implementieren:
if true then TrueBody else FalseBody -> TrueBody
if false then TrueBody else FalseBody -> FalseBody
Weblinks
- Die frühere Entwicklungsseite
- „Coverage on XL and Concept programming“ in „The Register“ (englisch)
- Artikel in „Byte“ (englisch) (Memento vom 14. Januar 2009 im Internet Archive)
- Präsentation über XL und konzeptionale Programmierung im Allgemeinen (englisch) (PDF; 4,8 MB)
Einzelnachweise
- Phil Manchester: "Dip into Concept Programming", The Register. Abgerufen am 3. Februar 2010.