Skip to content

Commit faf0d4c

Browse files
authored
Merge pull request #23 from Java-rs/codegen
Codegen works now
2 parents 528e88f + bf72084 commit faf0d4c

40 files changed

+1274
-771
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ Cargo.lock
77
lib/testcases/*.json
88
lib/testcases/*.txt
99
lib/testcases/*-gen.java
10-
lib/testcases/*-Test.java
10+
lib/testcases/*Test.java

docs/Project-Doc.md

+37-4
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,50 @@ Folgende Fehler werden vom Typechecker erkannt:
4444

4545
## Codegenerierung
4646

47-
ByteCode-Umwandlung, Bugfixes, StackSize und Improvements: Val Richter
47+
ByteCode-Umwandlung, Bugfixes, StackSize und viele Improvements: Val Richter
4848

49-
Definition DIR(Intermediate Representation), ConstantPool, LocalVarPool, Methoden zur Instruction-generierung, BugFixes, etwas ByteCode-Umwandlung und Umwandlung relativer in absolute Jumps: Marion Hinkel und Benedikt Brandmaier im Pair Programming
50-
- Wer hat welche Arbeit bei codegen gemacht?
51-
- Was für Arbeit musste alles zusätzlich getan werden, weil wir nicht Java + ASM genutzt haben?
49+
Definition DIR(Duck Intermediate Representation), ConstantPool, LocalVarPool, Methoden zur Instruction-generierung, BugFixes, etwas ByteCode-Umwandlung und Umwandlung relativer in absolute Jumps: Marion Hinkel und Benedikt Brandmaier im Pair Programming
50+
51+
Zur Bytecode-generierung wird der Typed Abstract Syntax Tree(TAST) in Java Bytecode komplett selber
52+
umgewandelt. Dafür wird eine Intermediate Representation (IR) genutzt, die eine Class-ähnliche Struktur(mit Konstantenpool, LocalVarpool, Methoden mit Code als Instruktionen, etc.)
53+
besitzt. Diese IR wird dann komplett manuell in Java Bytecode übersetzt. Dies hat dem Code-gen Team sehr viel
54+
Zeit gekostet, da z.B. die Stack-Size, der Konstantenpool, LocalVarpool und die Jumps manuell berechnet werden mussten.
55+
56+
Zudem hatten wir zeitweise eigene Relative Instructions implementiert, da wir dachten, dass die JVM keine relativen Jumps
57+
unterstützt, hatten dann allerdings mit Try-and-Error herausgefunden, dass javap sich die absoluten Addressen ausrechnet
58+
und für die JVM normale jumps als relative Jumps behandelt. Auch die relativen Jumps waren aber sehr fehleranfällig und
59+
hatten häufig off-by-one Errors.
60+
61+
Zudem musste eine StackMapTable implementiert werden, da die JVM sonst unsere Klassen nicht lädt.
62+
Das Troubleshooten von Testfehlern war auch sehr aufwending da oft javap gar nicht erst den Fehler im Klassencode ausgab
63+
und wir mit einem Hex-Editor die Klassen von Hand analysieren mussten, da es auch kein anderes Tool gab, um solche Fehler
64+
auszugeben und die Zeit fehlte ein Eigenes zu schreiben.
65+
66+
Da es auch keine Dokumentation gibt, die in etwa zeigt, welcher Bytecode für welche Operationen genutzt wird, mussten wir
67+
uns die Bytecode-Spezifikationen anschauen und sehr viel mit Tools wie javap und [godbolt](https://godbolt.org/) arbeiten
68+
in die wir manuell Java Code eingeben und schauten, was für Bytecode bei verschiedenen Operationenkombinationen generiert
69+
wird, was sehr zeitaufwendig war.
70+
71+
Auch sehr schwierig war die Implementation einer StackMapTable, da Java diese erwartet. Diese ist eine Tabelle, die für
72+
jede Instruktion die Typen der Elemente auf dem Stack in komprimiertem Format angibt. Diese Tabelle muss manuell
73+
erstellt werden und über die Typen aller Variablen, die in den Stack geschrieben wurden Bescheid wissen.
5274

5375
## Testing
5476

5577
- Wer hat welche Arbeit beim Testing gemacht?
5678
- Wie funktioniert das Testing genau?
5779

80+
Das Testen des Codegens war sehr aufwendig, er besteht aus diesen Schritten:
81+
1. Ein handgeschriebener TAST wird geladen
82+
2. Eine Java Klasse wird erstellt die jede Methode im TAST aufruft
83+
3. Die java Klasse wird mit javac kompiliert und ausgeführt, wobei die Ausgabe in einer Variable gespeichert wird
84+
4. Fürs Debugging wird die Java Klasse mit javap in Bytecode umgewandelt und in eine Datei geschrieben
85+
5. Der TAST wird in eine DIR umgewandelt und zu Bytecode umgewandelt
86+
6. Der Bytecode wird in eine .class-Datei geschrieben
87+
7. Die .class-Datei wird mit javap in Bytecode umgewandelt und in eine Datei geschrieben
88+
8. Die vom Codegen generierte .class-Datei wird ausgeführt und die Ausgabe in einer Variable gespeichert
89+
9. Die Ausgaben der richtigen Java Klasse und der vom Codegen generierten Klasse werden verglichen
90+
5891
## AST-Definition
5992

6093
- Wer hat wie zur endgültigen Definition des ASTs beigetragen?

0 commit comments

Comments
 (0)