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:
-
Compilieren während des
Interpretierens
-
Interpretieren während des
Compilierens
-
Erzeugung von Sequenzen zum
interpretieren während des Compilierens.
-
Erzeugung von Sequenzen zum compilieren
während des Interpretierens.
- 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.