You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/Project-Doc.md
+37-4
Original file line number
Diff line number
Diff line change
@@ -44,17 +44,50 @@ Folgende Fehler werden vom Typechecker erkannt:
44
44
45
45
## Codegenerierung
46
46
47
-
ByteCode-Umwandlung, Bugfixes, StackSize und Improvements: Val Richter
47
+
ByteCode-Umwandlung, Bugfixes, StackSize und viele Improvements: Val Richter
48
48
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.
52
74
53
75
## Testing
54
76
55
77
- Wer hat welche Arbeit beim Testing gemacht?
56
78
- Wie funktioniert das Testing genau?
57
79
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
+
58
91
## AST-Definition
59
92
60
93
- Wer hat wie zur endgültigen Definition des ASTs beigetragen?
0 commit comments