Neue Art der Programmierung

Aleph bietet völlig neue Ansätze zur Problemlösung. Hier werden die Konzepte von Compiler und Interpreter zusammengefasst. Ohne auf die Details des Compilierens oder Interpretierens einzugehen, hier ein paar Schlagworte:
Diese Punkte sind in herkömmlichen Sprachen nicht vorhanden. Es scheint nicht einfach, diese Konzepte in den eigenen Stil der Programmierung zu übernehmen. Deshalb erfolgte ein Test mit Schülern, denen eine klassische Programmieraufgabe gestellt wurde. Das Ergebnis überraschte selbst die Entwickler. Deshalb soll die Lösung dieser Aufgabe als überzeugendes Beispiel dienen.

Die Aufgabe

Ein Problem, wie es in praktisch jedem Unterricht zur Informatik vorkommt:

Umwandlung einer römischen in eine dezimale Zahl.

Normalerweise wird noch kurz der rein additive Aspekt von römischen Zahlen angesprochen, dann aber gleich auf die eigentlichen Probleme eingegangen. Römische Ziffern können subtraktiv oder additiv gemeint sein, je nach der Position der höherwertigen Ziffer (VI = 5+1; IV = 5-1). Die Darstellung ist also abhängig vom Kontext. Es kommen noch weitere Regeln hinzu, die hier aber nicht besprochen werden.
Normalerweise wird im Unterricht ein endlicher Automat konstruiert, der aus einer vielen "If" ... "else" ... oder "switch" ... "case" Anweisungen besteht. Insgesamt werden 8 Zustände für die Koordinierung und 7+7+6+5+4+3+2+1=35 Ziffernabfragen benötigt. Insgesamt also 43 Abfragen und jede mit entsprechender Berechnung. Als die Lösung vorgestellt wurde, war die Überraschung groß.

Es ist nur eine repeat-until-Schleife nötig und keine einzige Abfrage im Verlauf.

Es ist fair auf einige Hinweise einzugehen, die im Vorfeld gemacht wurden. Die vorhandene postfix Notation wurde besprochen. Die einfachen Anweisungen zur Manipulation des Stacks waren bekannt. Es sollten möglichst wenig Variablen eingesetzt werden. Als Grundlage diente die vorhandene Dokumentation von Aleph.

Das Ergebnis war so beeindruckend, dass es in die Beispiele zur Dokumentation aufgenommen wurde. Natürlich mit Einverständnis der Schüler.

Der Ansatz

Die entscheidende Überlegung bestand nun darin, dass römische Zahlen aus Symbolen bestehen, die ohne Trennung geschrieben werden. Wer die Symbole kennt kann die entsprechenden Werte einfach addieren und fertig ist das Ergebnis.
Wenn Aleph Sequenzen aus beliebigen Quellen akzeptiert, dann sollte die Wandlung einer römischen Zahl in eine solche Sequenz kein Problem darstellen.

Die Lösung

Die Symbole werden als Commands in Kleinschreibung definiert. So entspricht die römische Zahl "CM" der Definition des Commands ": cm 900 + ;". So werden alle möglichen Symbole als Commands definiert.
Im String mit der römischen Zahl werden dann die groß geschriebenen Symbole durch die Namen der entsprechenden Commands ersetzt und durch ein Leerzeichen voneinander getrennt. Dieser String wird dann der V2M als Sequenz übergeben. Nach Abarbeitung aller Commands in diesem String liegt das Ergebnis vor.

Besonderheiten dieser Lösung

Die von den Schülern präsentierte Lösung ist an Effizienz und Klarheit kaum zu übertreffen. So werden keine Variablen benutzt! Allein diese Tatsache wäre einen Fachartikel wert. Es werden aber auch keine Fallunterscheidungen oder IF-ELSE-Konstrukte für die Berechnung eingesetzt. Nur das Ende der Wiederholungsanweisung ist als REPEAT-UNTIL-Schleife vorhanden.
Das Programm roman.vvm liegt dem Paket bei und ist natürlich frei und OpenSource.
Dieses Beispiel zeigt, wie während der Interpretation die vorhandenen Daten in ein weiteres Programm gewandelt werden, dessen Ausführung im ursprünglichen Programm die Lösung des Problems liefert.

Konsequenzen

Statt einer Sequenz hätte auch eine Kompilierung stattfinden können, dessen Ergebnis ja als Command vorliegt. Dieses Command könnte dann wieder vom Interpreter bearbeitet werden ohne den Verlauf zu unterbrechen. Nachdem die Schüler nach einer kurzen Lernphase aber die oben beschriebene Lösung präsentierten, waren selbst die Betreuer verblüfft.
Ist erst einmal das Prinzip von Aleph klar, so führt auch die Verwendung herkömmlicher Notationen zu gewohnten Strukturen im Programmcode. Eine weitere Idee der Schüler war die Verwendung von Parser-Generatoren (z.B. javacc) während der Compilierung. Auch diese wurde aufgegriffen und ist ab/seit der Version 1.2.2.01 integriert.