Dr. rer. nat.

Algorithmen

Die Sprache MAL und ihre Syntax

MathTool bietet auch die Möglichkeit, eigene Algorithmen zu schreiben und auszuführen. Die Syntax dieser Algorithmensprache MAL (MathTool Algorithm Language) orientiert sich sehr stark an der Syntax der objektorientierten Programmiersprache Java, ist jedoch einfacher gestrickt, da hier speziell direkter Bezug auf mathematische Probleme und ihre Lösungen genommen wird.

Reservierte Zeichen und Schlüsselwörter

Eine Reihe von Zeichen sind in MAL reserviert und dürfen nur im bestimmten Kontext verwendet werden, da der Compiler ihnen bestimmte Funktionen zuweist. Hier ist eine Übersicht über alle reservierten Zeichen und Operatoren.

Reserviertes Zeichen Bedeutung
, Trennung zwischen Parametern
; Trennung von Befehlen
{ und } Beginn und Ende eines Blocks
( und ) Beginn und Ende einer Methodenklammer oder einer Bedingung in einer Kontrollstruktur
[ und ] Beginn und Ende einer Matrix
& Und
| Oder
! Negation
= Zuweisung
== Vergleich auf Wertegleichheit
> Größer als
>= Größer oder gleich
< Kleiner als
<= Kleiner oder gleich
+ Addition von Ausdrücken
Subtraktion von Ausdrücken
* Multiplikation von Ausdrücken
/ Division von Ausdrücken
^ Potenzieren von Ausdrücken

Ebenso ist eine Reihe von Schlüsselwörtern in MAL reserviert und dürfen nur im bestimmten Kontext verwendet werden, da der Compiler ihnen bestimmte Bedeutungen zuweist. Hier ist eine Übersicht über alle reservierten Schlüsselwörter.

Schlüsselwort Bedeutung
main Name des Algorithmus für den Einstiegspunkt
false Wahrheitswert „falsch“
true Wahrheitswert „wahr“
return Ausstiegspunkt für einen Algorithmus und Anweisung für die Rückgabe eines Bezeichners, wenn nötig.
break Abbruch einer Schleife
continue Anweisung, in einer Schleife fortzufahren
if Wenn
else Sonst
while Beginn einer While-Kontrollstruktur
do Beginn einer Do-While-Kontrollstruktur
for Beginn einer For-Schleife

 

Datentyp Bedeutung
expression Arithmetischer Ausdruck
booleanexpression Boolscher Ausdruck
matrixexpression Matrizenausdruck

 

Aufbau und Prinzipien von MAL

In einer Algorithmendatei können beliebig viele Algorithmen implementiert sein, sofern sie den folgenden Bedingungen genügen:

  • Die Algorithmen haben alle verschiedene Signaturen. Eine Signatur besteht immer aus dem Namen des Algorithmus sowie aus dem geordneten Tupel von Eingabeparametertypen.
  • Es existiert ein Algorithmus mit dem Namen „main“, welcher parameterlos ist. Der Rückgabetyp kann beliebig sein (und auch leer). Dieser Algorithmus ist, ähnlich wie es in einer klassischen Java-Anwendung der Fall ist, der Haupteinstiegspunkt.
  • Bis auf wenige Ausnahmen sind Aufrufe von Unteralgorithmen (also Algorithmen, die nicht den Namen „main“ tragen) immer Call-By-Value. Letzteres bedeutet, dass falls ein Inputparameter innerhalb des Unteralgorithmus einen neuen Wert zugewiesen bekommen, dieser dann nach Beenden des Aufrufs des Unteralgorithmus seinen ursprünglichen Wert (also den Wert, welchen dieser unmittelbar vor dem Aufruf des Unteralgorithmus besessen hatte) wieder annimmt.

 

Datentypen

MAL kennt hier zunächst drei verschiedene Datentypen:

Der Datentyp expression, also einen mathematischen Ausdruck. Hierbei wird nicht weiter unterschieden, der Ausdruck eine ganze Zahl (welche in vielen Programmiersprachen als int oder integer angegeben wird) oder ein komplexer Ausdruck ist.

Beispielcode: expression a = 15;

Der Datentyp matrixexpression, also ein Matrizenausdruck.

Beispielcode: matrixexpression a = [1,2;4,1+x;2,7];

Dabei sei x eine bereits definierte Variable vom Typ expression.

Der Datentyp booleanexpression, also ein boolscher Ausdruck.

Beispielcode: booleanexpression a = x >= 24;

Dabei sei x eine bereits definierte Variable vom Typ expression.

Beispiele

Es folgen einige Codebeispiele mit einer detaillierten Diskussion.

Beispiel 1: Der erste Algorithmus

Wir betrachten den folgenden Code:

expression main(){
expression result=1;
if(result>0){
result=3*result;
}
return result;
}

Ausführung dieses Codes liefert uns die Ausgabe 3. Dem Bezeichner result wird zunächst der Wert 1 zugewiesen. Die Abfrage, ob result > 0 ist, liefert true, und somit wird result auf den Wert 3*result=3 gesetzt. Danach wird result ausgegeben.

Beispiel 2: Aufruf weiterer Algorithmen

Wir betrachten den folgenden Code:

expression main(){
expression a=1;
for(expression i=0,f(i)<=10,i=i+g(i)){
a=3*a+2;
}
return a;
}

expression f(expression i){
return 2*i;
}

expression g(expression i){
return i^2+1;
}

Nach der Ausführung dieses Codes wird für den Ausgabeparameter a das Ergebnis 53 zurückgegeben. Die Berechnung erfolgt hier wie folgt: In der For-Schleife nimmt i die folgenden Werte an: i = 0, i = 1 und i = 3 gemäß der Inkrementierungsanweisung i = i+g(i) = i2+i+1. Somit wird a dreimal ersetzt durch 3*a+2, was nacheinander die Werte 5, 17 und 53 liefert.

Beispiel 3: Algorithmus mit Matrizen

Wir betrachten den folgenden Code:

matrixexpression main(){
matrixexpression a=[1,2;3,4];
for(expression i=0,i<=3,i=i+1){
a=a^2;
}
return a;
}

Hier wird also 4 Mal die Matrix a quadriert, das Ergebnis wird also die Matrix a16=[115007491351,167615035490;251422553235,366430044586] sein.

Beispiel 4: Fehler aufgrund fehlender Wertrückgabe

Der Algorithmus

expression main(){
expression result=1;
if(result>0){
result=3*result;
}
}

liefert beim Kompilieren einen Fehler, da hier als Rückgabewert ein Ausdruck (expression) verlangt wird, dieser aber nichts zurückgibt.

In den nächsten Versionen

Die Sprache MAL befindet sich noch im Aufbau. Entsprechend sind viele nützliche Features noch nicht implementiert. In den nächsten Versionen ist beispielsweise ein Umgang mit Arrays geplant, damit beispielsweise Lösungen von Gleichungen darin abgelegt und weiter behandelt werden können. Zudem wird eine Codehilfe angeboten, welche das Implementieren diverser Strukturen dem Benutzer abnimmt, um so potentielle Syntaxfehler zu vermeiden. Ebenso wird demnächst ein Debug-Modus implementiert, welcher die Fehlersuche erheblich verbessert.