next up previous
Nächste Seite: Unterprogramme (I) (22. 10. Aufwärts: Compilerbau Vorlesung, Wintersemester 2003 Vorherige Seite: Abstrakte Maschinen

Kompilation von Ausdrücken (13. 10. 03)

Ü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 Exp
wir nehmen an, Baumstruktur ist bekannt (vollst. geklammert).

Für Ausdruck $a$ 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 Statement
0 = 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 ireturn
Schreiben 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 -S
Suchen Sie Ähnlichkeiten zum Original ...


next up previous
Nächste Seite: Unterprogramme (I) (22. 10. Aufwärts: Compilerbau Vorlesung, Wintersemester 2003 Vorherige Seite: Abstrakte Maschinen
Johannes Waldmann 2004-01-28