KSP Aufgabe 4

Jetzt wird's ernst... ;-)
Mit der Loesung dieser Aufgabe steht Ihnen das komplette Ninja (mit Ausnahme der Array- und Record-Objekte) zur Verfuegung. Sie koennen damit z.B. die folgenden Programme ausfuehren:
a) ggT
b) n! rekursiv
c) n! iterativ
Aber schoen der Reihe nach...

Neue Instruktionen der VM

1. Hier ist eine Diskussion der Instruktionen zum Unterprogrammaufruf und hier eine Liste aller Instruktionen der VM dieser Version.

2. Realisieren Sie Unterprogrammspruenge und -rueckspruenge mit den Instruktionen "call" und "ret". Hier ist ein Testprogramm ohne Argumente und ohne Rueckgabewert . Sie sollten die Ausfuehrung mit Hilfe Ihres Debuggers im Einzelschrittverfahren genau verfolgen koennen.

3. Implementieren Sie die Instruktion "drop" und testen Sie den Zugriff auf die Argumente einer Prozedur mit diesem Testprogramm .

4. Fuegen Sie das Rueckgaberegister zur Maschinenarchitektur hinzu und implementieren Sie die Instruktionen "pushr" und "popr". Sie koennen die Rueckgabe eines Wertes mit diesem Testprogramm ueberpruefen.

5. Dann sollte schliesslich dieses Testprogramm ohne weitere Arbeit funktionieren.

6. Implementieren Sie die Instruktion "dup", die den obersten Stackeintrag dupliziert: ... n --> ... n n

7. Der zu dieser Aufgabenstellung gehoerende Assembler ist natuerlich auch verfuegbar:
nja

8. Zu guter letzt hier wieder die Referenzimplementierung:
njvm

Der Ninja-Compiler

Nun gibt's eine erste Version des Ninja-Compilers - noch ohne Arrays, Records und anderen Schnickschnack, aber mit Prozeduren und Funktionen, Kontrollstrukturen, Zuweisungen und Ausdruecken. Die Grammatik zusammen mit den Tokens und den vordefinierten Bezeichnern beschreibt, wie ein korrektes Ninja-Programm (in unserem noch etwas reduzierten Sprachumfang) aussieht.

1. Uebersetzen Sie die drei ganz oben genannten Testprogramme mit Hilfe des Ninja-Compilers. Der Output ist Ninja-Assembler und kann z.B. mit einem Texteditor angeschaut werden. Versuchen Sie, jedes vom Compiler generierte Assembler-Statement einer Ninja-Quelltext-Anweisung zuzuordnen. Wenn Sie Fragen dazu haben, diskutieren Sie diese bitte mit den Betreuern im Praktikum!

2. Assemblieren Sie die drei Testprogramme und lassen Sie sie durch Ihre VM ausfuehren. Verfolgen Sie die Ausfuehrung mit dem Debugger Ihrer VM.

3. Schreiben Sie mindestens fuenf weitere Testprogramme, entweder in Ninja oder in Assembler, um sicherzugehen, dass die VM korrekt funktioniert. Loten Sie dabei auch Konstruktionen aus, die bisher nicht Bestandteil der Tests waren. Ein Beispiel: Kann eine Funktion in ihrem Return-Statement eine andere Funktion aufrufen? Geht das auch geschachtelt?

4. Welche Sequenz von Instruktionen erzeugt der Compiler fuer das logische "und" und das logische "oder"? Erklaeren Sie genau, wie damit die Kurzschlussauswertung implementiert wird!