Programming lesson
Code-Generator für ChocoPy in CS164: Schritt-für-Schritt-Anleitung zur PA3-Aufgabe
Lerne, wie du in CS164 Assignment 3 einen Code-Generator für ChocoPy implementierst. Von der Einrichtung über die Generierung von RISC-V-Assembly bis zum Testen mit Venus – diese Anleitung führt dich durch den gesamten Prozess.
Einführung in den ChocoPy Code-Generator
In der CS164-Aufgabe 3 (PA3) geht es darum, einen Code-Generator für die Programmiersprache ChocoPy zu implementieren. Ziel ist es, aus einem typisierten AST (Abstract Syntax Tree) eine RISC-V-Assembly-Datei zu erzeugen, die dann mit dem Venus-Simulator ausgeführt werden kann. Diese Anleitung führt dich durch die notwendigen Schritte, von der Einrichtung der Entwicklungsumgebung bis zum Testen deiner Implementierung. Sie ist speziell auf die CS164-Aufgabe zugeschnitten und hilft dir, die PA3-Spezifikation zu verstehen und umzusetzen.
Warum ein Code-Generator?
Ein Code-Generator ist das Herzstück eines Compilers. Er übersetzt den vom Parser und Analyseteil erzeugten AST in ausführbaren Maschinencode. Im Fall von ChocoPy ist das Ziel RISC-V-Assembly, eine moderne und in der Lehre weit verbreitete Befehlssatzarchitektur. Stell dir vor, du programmierst ein Spiel wie Fortnite oder eine KI-App – der Compiler sorgt dafür, dass dein Hochsprachencode effizient auf der Hardware läuft. In dieser Aufgabe wirst du genau diesen Schritt selbst implementieren.
Vorbereitung und Einrichtung
Systemvoraussetzungen
Du benötigst Java (Version 11 oder höher) und Maven. Die Aufgabenstellung verwendet ChocoPy-Referenz-JARs, die bereits im Startercode enthalten sind. Beachte: Unter Windows musst du in den classpath-Argumenten den Doppelpunkt (:) durch ein Semikolon (;) ersetzen.
Bau des Compilers und Ausführen der Tests
Führe folgenden Befehl im Projektverzeichnis aus:
mvn clean package
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy -pass=..s --run --dir src/test/data/pa3/sample/ --testDieser Befehl baut den Compiler und führt alle Tests im angegebenen Verzeichnis aus. Im Startercode sollte nur ein Test bestehen. Deine Aufgabe ist es, den Code-Generator so zu erweitern, dass alle Tests bestanden werden.
Schritt-für-Schritt: Generierung einer Assembly-Datei
Um den Code-Generator auf einer einzelnen ChocoPy-Datei auszuführen, folgst du drei Schritten:
- Referenzparser ausführen, um einen AST-JSON zu erhalten:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=r --out <datei> - Referenzanalyse auf dem AST-JSON ausführen, um einen typisierten AST-JSON zu erhalten:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=.r --out <datei> - Deinen Code-Generator auf dem typisierten AST-JSON ausführen, um eine RISC-V-Assembly-Datei zu erhalten:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..s --out <datei>
Hinweis: Im Verzeichnis src/tests/data/pa3/sample liegen bereits die typisierten AST-JSONs (Endung .out.typed), sodass du die ersten beiden Schritte für die Beispielprogramme überspringen kannst.
Ausführen des generierten Assembly-Programms mit Venus
Um das generierte RISC-V-Programm im Venus-Simulator auszuführen, verwende:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --run <datei>Du kannst auch alle Schritte in einem Befehl ketten, um ein ChocoPy-Programm direkt auszuführen:
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=rrs --runLässt du --run weg, wird das generierte Assembly-Programm ausgegeben, ohne es auszuführen.
Referenzimplementierung nutzen
Um die Ausgabe der Referenzimplementierung des Code-Generators zu sehen, ersetze --pass=rrs durch --pass=rrr in den Befehlen.
Wichtige Aspekte der Implementierung
Dein Code-Generator muss die PA3-Spezifikation auf der Kurswebsite erfüllen. Achte besonders auf:
- Typkorrekte Übersetzung: Jeder AST-Knoten muss korrekt in RISC-V-Befehle übersetzt werden.
- Registerverwaltung: Verwende die Konventionen aus dem ChocoPy Implementation Guide.
- Funktionsaufrufe: Implementiere den Aufrufmechanismus gemäß der RISC-V-Calling-Convention.
- Speicherverwaltung: Korrekte Allokation und Freigabe von Speicher (z.B. für Listen und Objekte).
Häufige Fehler und Tipps
- Klassenpfad-Fehler: Stelle sicher, dass die JAR-Dateien korrekt angegeben sind. Windows-Nutzer: Semikolon statt Doppelpunkt.
- Testausführung: Führe die Tests regelmäßig aus, um sicherzustellen, dass du keine bestehenden Tests brichst.
- Debugging: Nutze die Ausgabe des generierten Assembly-Codes, um Fehler zu finden. Vergleiche mit der Referenzimplementierung.
- Versionskontrolle: Füge das Upstream-Repository hinzu, um Updates zu erhalten:
git remote add upstream https://github.com/cs164fa2024/pa3-chocopy-code-generation.git
Beispiel aus der Praxis: Wie ein Code-Generator den Alltag erleichtert
Stell dir vor, du entwickelst eine KI-gestützte Lern-App wie Duolingo. Der Code, den du in Python oder einer anderen Hochsprache schreibst, muss letztendlich in Maschinensprache übersetzt werden, um auf dem Smartphone zu laufen. Der Compiler, insbesondere der Code-Generator, sorgt dafür, dass deine App effizient und schnell läuft. In dieser Aufgabe lernst du die Grundlagen, die auch in großen Compiler-Projekten wie LLVM oder GCC angewendet werden.
Zusammenfassung
Mit dieser Anleitung solltest du in der Lage sein, den Code-Generator für ChocoPy in CS164 PA3 zu implementieren. Folge den Schritten, nutze die Referenzimplementierung zum Vergleich und teste regelmäßig. Viel Erfolg bei deiner CS164-Aufgabe!