Übersetzung von Ausdrücken
Id: ausdr.tex,v 1.1 2003/10/21 20:47:27 joe Exp
Kontextfreie Grammatik, reguläre Baumsprache:
Exp -> Zahl | Name | Operator Exp Expwir nehmen an, Baumstruktur ist bekannt (vollst. geklammert).
Für Ausdruck erzeuge Code,
der insgesamt Push (Wert a)
entspricht.
code (Zahl i) ==> Push i code (Name n) ==> Push (Adresse von n) ; Load code (Op e1 e2) ==> code (e1) ; code (e2) ; Op
Übersetzung von Zuweisungen
Id: zuweis.tex,v 1.1 2003/10/21 20:47:27 joe Exp
Grammatik:
Statement -> Assign ; Assign -> Name := Exp
Für Anweisungen: erzeuge Code, der Stack insgesamt nicht ändert.
code ( n := e ) ==> code (e) ; Push (Adresse von n) ; Store
Anweisungsfolgen:
code ( s1 ; s2 ; .. ) => code (s1) ; code (s2) ; ...
Felder
Id: feld.tex,v 1.1 2003/11/10 14:08:58 joe Exp
Vorsicht: erstmal Arrays ohne Bounds-Checking. Identifizieren Array mit seiner Start-Adresse, und beginnen Indizierung bei 0.
Erweitern Grammatiken
Element -> Name [ Exp ] Exp -> .. | Element Assign -> Element := Exp address ( n [i] ) ==> Push (Addr. von n) ; code (i) ; Plus code ( n [i] ) ==> address (n [i]) ; load code ( n [i] := e ) ==> code (e) ; address (n [i]) ; store
Übersetzen von Verzweigungen
Id: if.tex,v 1.1 2003/10/21 20:47:27 joe Exp
Statement -> .. | If Exp Statement Statement0 = falsch, sonst = wahr (wir haben noch kein Bool)
code (Ifz e y n) ==> code (e) Jumpz nein code (y) Jump ende nein: code (n) ende:
Übersetzen von Schleifen
Id: while.tex,v 1.1 2003/10/21 20:47:27 joe Exp
Statement -> .. | While Exp Statement
code (While e b) ==> test: code (e) Jumpz ende code (b) Jump test ende:
Die Java-VM
Id: jvm.tex,v 1.1 2003/10/21 20:47:27 joe Exp
Definiert hardware-unabhängige Plattform zur Ausführung von Java-Programmen.
Spezifikation: http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
Java-Bytecode betrachten mit javap
emacs Foobar.java javac Foobar.java javap -c -v Foobar
Aufgabe 1 schreiben Sie Java-Programme entsprechend der Aufgaben EXP1, EXP2, TIMES.
class Check { static int exp1 (int x1, int x2) { ... } public static int Main (String [] args) { ... } }Kompilieren Sie und vergleichen Sie den erzeugten Bytecode mit Ihrer Lösung für das autotool.
Lesen Sie die Dokumentation der dabei benutzten JVM-Befehle.
Wie werden Schleifen (while, for) übersetzt?
Aufgabe 2 Welcher Java-Quelltext gehört (wahrscheinlich) hierzu:
Method int example1(int, int) 0 iconst_0 8 istore_2 1 istore_2 9 iinc 1 -1 2 goto 12 12 iload_1 5 iload_2 13 ifgt 5 6 iload_0 16 iload_2 7 iadd 17 ireturnSchreiben Sie ein Java-Programm, dessen Kompilation möglichst genau obigen Text ergibt.
Aufgabe 3 Welcher Java-Quelltext gehört (wahrscheinlich) hierzu:
Method int example2(int, int) 0 goto 21 15 iload_0 3 iload_0 16 istore_2 4 iload_1 17 iload_1 5 if_icmplt 15 18 istore_0 8 iload_0 19 iload_2 9 iload_1 20 istore_1 10 isub 21 iload_0 11 istore_0 22 ifgt 3 12 goto 21 25 iload_1 26 ireturn
Ausblick (Registermaschinen)
Suchen/Installieren Sie einen Bytecode-Compiler
( z. b. gcj
, siehe http://gcc.gnu.org/java/ )
und kompilieren Sie ein Class-file zu Assembler-Code.
gcj --main=Loop Loop.class -SSuchen Sie Ähnlichkeiten zum Original ...