Über 􊨖lgola

􊨖lgola ist eine objektorientierte, funktionale und erweiterbare Sprache.

Die Objektorientierung erlaubt den Umgang mit unbekannten Implementierungen, solange sie einer wohldefinierten Schnittstelle genügen. Die Objekte können einen veränderlichen Zustand haben, was für die Modellierung einige Vorteile birgt. Im Gegensatz dazu kompensiert das Funktionale mit seiner Unveränderlichkeit und den Funktionen höherer Ordnung die Nachteile der zustandsbehafteten Programmierung.

Aber erst die Kombination der beiden Paradigmen erlaubt es, nachvollziehbar und trotzdem effizient zu programmieren und dabei auch der mit den modernen Mehrkernrechnern einhergehenden Komplexität Herr zu werden.

Darüber hinaus erlaubt es 􊨖lgolas Erweiterbarkeit, auch neuen Anforderungen gerecht zu werden, ohne dabei einen stilistischen Bruch zu riskieren. So können etwa neue Sprachkonstrukte einfach wie Bibliotheken „importiert“ werden, womit sichergestellt ist, dass derartige Sprachneuerungen nicht mit bestehenden Quellen in Konflikt geraten können.

Alles in allem ist 􊨖lgola eine moderne Sprache, die den aktuellen Problemen der Programmentwicklung gewachsen ist.

Typografie

Im Gegensatz zu vielen anderen Sprachen nutzt 􊨖lgola den Unicode-Zeichensatz aus. Damit können Mengenbeziehungen wie gewohnt mit oder beschrieben und die Quantoren und genutzt werden. Einige verwandte Operatoren wie +, oder beschreiben zwar alle eine Addition, allerdings alle mit wohlunterschiedenen Eigenschaften: normal, mit Überlaufsprüfung; saturiert, den Maximal- bzw. Minimalwert nicht überschreitend; und überlaufend. Dabei wird unter 􊨖lgola sorgfältig darauf geachtet, dass die Operatorsymbole konsistent verwendet werden.

Um die Darstellung von 􊨖lgola-Programmen auch in nicht dedizierten 􊨖lgola-Umgebungen nutzen zu können, steht der 􊨖lfons-Font zur Verfügung. Damit ist auch eine Darstellung in einfachen Unicode-Editoren möglich. Insbesondere können damit auch behelfsmäßig Ausdrücke wie x²􊊾⁺¹ dargestellt werden. Ungeachtet dessen erlaubt der 􊨖lfons-Font endlich die typografisch korrekte Darstellung von Bindestrich „-“, Gedankenstrich „–“ und Minuszeichen „−“.

Die Eingabe von Sonderzeichen ist naturgemäß in einer 􊨖lgola-Umgebung deutlich einfacher. Dort liefert etwa ein zügiges Tippen der Kombination von „-“ und „>“ den Pfeil „“, „+“ und „>“ den Abbildungspfeil „“ und „>“ und „=“ den deutlicher lesbaren Vergleichsoperator „“.

Kompatibilität zu Java

In der ersten Aufbaustufe läuft 􊨖lgola auf der JVM. Damit steht jedem 􊨖lgola-Programm das ganze Java-Universum zur Verfügung. Während unter 􊨖lgola alle Java-Bibliotheken unverändert übernommen werden können, ist ein Aufruf von 􊨖lgola-Teilen aus Java nur eingeschränkt möglich. Das ist unter anderem darin begründet, dass es unter 􊨖lgola eben eine Reihe von Basistypen gibt, die unter Java keine Entsprechung haben. 􊨖lgola-Implementierungen von Java-Klassen und -Schnittstellen lassen sich jedoch immer problemlos verwenden.

Während die Typen von Java-Objekten grundsätzlich auch die null-Referenz zulassen, ist dies in 􊨖lgola nicht möglich. Dort müssen diejenigen Typen, die auch null zulassen wollen, mit einem hochgestellten Fragezeichen (􊀓􊋑) annotiert werden. Unter 􊨖lgola ist in diesem Fall nur dann ein Zugriff auf das Objekt möglich, wenn explizit ausgeschlossen wurde, dass es sich bei der Referenz nicht um null handelt.

Damit sind die unter Java sehr unangenehmen und unerwünschten NullPointerExceptions unter 􊨖lgola nicht mehr möglich.

Schnittstellenverträge

Nicht nur um Schnittstellen möglichst gut beschreiben zu können, sondern auch um schon zur Übersetzungszeit möglichst viel prüfen zu können, erlaubt 􊨖lgola die Definition von Schnittstellenverträgen. Mit den Vorbedingungen kann geprüft werden, ob die aktuellen Parameter tatsächlich den geforderten Bedürfnissen genügen. Mithilfe der Nachbedingungen wird dann gewährleistet, dass gemachte Zusicherungen tatsächlich der Spezifikation genügen.

Im Zusammenhang mit der Vererbung werden auch bei überschriebenen Methoden die Vor- und Nachbedingungen geprüft. Bei expliziter Angabe neuer Bedingungen werden diese auf Verträglichkeit mit dem Liskovschen Substitutionsprinzip hin geprüft.

Vor- und Nachbedingungen werden grundsätzlich immer geprüft. Lediglich in vertrauenswürdigen Umgebungen kann der Übersetzer, wenn er denn sichere Aussagen über Parameter und Rückgabewerte machen kann, auf diese Tests verzichten.

Tests

Das Testen ist integraler Bestandteil von 􊨖lgola. Tests sind so wichtig, dass ihnen ein eigenes Schlüsselwort gewidmet wurde. Damit lassen sich Tests von Funktionen und Prozeduren einfach in jeder Übersetzungseinheit integrieren. Dabei garantiert der Übersetzer, dass nicht versehentlich vom normalen Code auf Test-Code zugegriffen wird.

Alle Tests können auch zur Übersetzungszeit automatisch ausgeführt werden. Selbstverständlich gibt es unter 􊨖lgola Werkzeuge, mit deren Hilfe die Tests in eigene Übersetzungseinheiten ausgegliedert werden können.

Basistypen

Unabhängig von der zugrunde liegenden Hardware erlaubt 􊨖lgola das Arbeiten mit Registerbreiten bis (mindestens) 128 Bit. Darüber hinaus stehen Vektoren von diesen Werten zur Verfügung. Beispielsweise liegen die vorzeichenbehafteten Zahlen 􊈫 als , ₁₆, ₃₂, ₆₄ und ₁₂₈ vor. Von diesen gibt es nicht negative Varianten gleicher Repräsentation , ₁₆, ₃₂, ₆₄ und ₁₂₈. Diese können auch zu 512-Bit-Vektoren kombiniert werden, sodass etwa mit ₆₄⁸ gleichzeitig 8 ganzzahlige 64-Bit-Zahlen verarbeitet werden können. Darüber hinaus stehen mit und beliebig große ganze Zahlen zur Verfügung, deren Bereich nur durch den vorhandenen Speicher eingeschränkt wird.

Neben den ganzen Zahlen stehen die Brüche 􊈫 bzw. zur Verfügung, wobei k die Anzahl der Bits für jeweils den Nenner und Zähler angibt (₃₂ belegt also 64 Bit). Auch hier erlaubt die Variante analog zu den Typen und beliebig große Brüche.

Während sich mit den Brüchen naturgemäß auch ¹⁄₃ exakt darstellen lässt, geht das mit den Dezimalzahlen 𝔻 nicht; allerdings legen diese ein unter dem Dezimalsystem gewohntes Rundungsverhalten an den Tag. Die Dezimalzahlen liegen als Fest- und Gleitkommazahlen vor. Als Festkommazahl kann beispielsweise mit 𝔻₁₀􊈽₄ eine Zahl mit maximal 10 Ziffern vor und exakt 4 Ziffern hinter dem Komma dargestellt werden. ¹⁄₁₀ entspricht dann 0,1; ¹⁄₃ entsprechend 0,3333 und ¹⁄₆ schließlich 0,6667.

Mithilfe der „normalen“ Gleitkommazahlen können (in der Regel hardwaregestützt) wissenschaftliche Berechnungen durchgeführt werden. Diese haben ihre Stärken (etwa einen großen Definitionsbereich), aber auch ihre Schwächen (schon 0,1 lässt sich nicht exakt darstellen). 􊨖lgola bietet dafür die zwei verschiedenen Typen 𝔽􊈫 und 𝔾􊈫. 𝔽􊈫 entspricht weitestgehend den IEEE-Gleitkommazahlen. 𝔾􊈫 entspricht im Wesentlichen 𝔽􊈫, allerdings ohne das „undefinierte Element“ NaN (Not a Number).

Schließlich unterstützt 􊨖lgola noch die komplexen Zahlen 􊈫, wobei auch hier k für die Anzahl der Bits der jeweiligen Komponenten steht. Bemerkenswert ist in diesem Zusammenhang, dass die komplexen Zahlen erwartungsgemäß in der Form a + b 􊀢 definiert werden können.

Zu den nicht numerischen Typen gehören die Zeichenketten. Diese beschreiben unabhängig von der tatsächlichen Repräsentation eine Sequenz von Unicode-Zeichen (und nicht etwa UTF-16-Zeichen wie bei Java oder C#). Das Suchen und Teilen der Zeichenketten basiert deshalb auch auf Indizes, deren konkreter Wert verborgen bleibt. Nur damit ist es möglich, die Zeichenketten auch abhängig von ihrem Inhalt bestmöglich zu speichern.

Zu den Basistypen zählen auch generische Listen, Sequenzen, Mengen, Beutel, Abbildungen, Vektoren und Matrizen. Speziell die Collections (Ansammlungen von Elementen) und Container (Sammlungen, bei denen geprüft werden kann, ob ein bestimmtes Element enthalten ist) stehen dabei nicht nur für Objekte – wie es in vielen objektorientierten Sprachen der Fall ist –, sondern auch für Primitive zur Verfügung. In diesem Fall werden für die entsprechenden Typen eigene Implementierungen generiert, durch deren Hilfe auf die Umwandlung von Primitiven in Objekte (das sogenannte Boxing) verzichtet werden kann.

Bezeichnend ist hier, dass für alle diese Basistypen vernünftige, eindeutige Möglichkeiten gegeben sind, um diese zu beschreiben. So sind beispielsweise Listen, Sequenzen, Mengen und Beutel eindeutig an den Klammern ⟨⟩, [], {} bzw. ⦃⦄ zu erkennen. Selbst Vektoren und Matrizen lassen sich vernünftig darstellen.