| XL | |
|---|---|
| Basisdaten | |
| 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 steht für englisch „eXtensible Language“, also „erweiterbare Programmiersprache“. XL ist eine Programmiersprache, die zur Unterstützung des Paradigmas der konzeptorientierten Programmierung entworfen wurde.
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.
XL ist auf vier Ebenen definiert bzw. aufgeteilt:
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)!
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)
2. Das #-Zeichen kann genutzt werden, um eine andere Basis als 10 zu definieren, wie in 2#101101. Ein trennender Unterstrich kann genutzt werden, um die Lesbarkeit zu verbessern, z. B. 1_000_000.2.5. Es können Basisangaben und Trenner genutzt werden, wie bei Integern, also 16#D.6FD#E-10."Foo" oder 'bar', aber die Syntaxdatei kann auch andere Trenner definieren, einschließlich welcher für mehrzeilige Texte.Hello. Symbole sind Folgen von nicht-alphanumerischen Zeichen, wie * oder =/=. Symbol beachtet die Groß-/Kleinschreibung, aber XL1 ignoriert die Groß-/Kleinschreibung sowie Unterstriche, sodass FooBar und foo_bar als gleichwertig angesehen werden.A+1 oder 2 and 3. Infix-Knoten werden in manchen Fällen genutzt, um Zeilen mit der Einfügung „new-line“ zu trennen.Write "Hello". Dieser Typ wird auch für Postfix-Notationen genutzt, wie 3! oder Open?.(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")))
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.
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.
XL1 ist beeinflusst von einer großen Zahl anderer Sprachen:
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