XL (eXtensible Language)

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 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 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 in 2#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, also 16#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, sodass FooBar und foo_bar als gleichwertig angesehen werden.
  • infix-Knoten repräsentieren zwei durch eine Einfügung verknüpfte Knoten, wie A+1 oder 2 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, wie 3! oder Open?.
  • 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

Einzelnachweise

  1. Phil Manchester: Dip into Concept Programming. The Register, abgerufen am 3. Februar 2010.