Praktikum Compilerbau Sitzung 9 Java Bytecode



Ähnliche Dokumente
J.5 Die Java Virtual Machine

Java Virtual Machine (JVM) Bytecode

Vorkurs C++ Programmierung

Java Virtual Machine (JVM) Übersicht

Java Kurs für Anfänger Einheit 5 Methoden

Java-Prozessoren. Die Java Virtual Machine spezifiziert... Java Instruktions-Satz. Datentypen. Operanden-Stack. Konstanten-Pool.

5. Tutorium zu Programmieren

Effiziente Java Programmierung

Algorithmen und Datenstrukturen

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Diplomarbeit Antrittsvortrag

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Grundlagen von Python

3 Objektorientierte Konzepte in Java

Variablen und Parameter

Java-Bytecode: Der Blick unter die Haube

Javakurs 2013 Objektorientierung

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Java: Vererbung. Teil 3: super()

Rekursion. L. Piepmeyer: Funktionale Programmierung - Rekursion

C# im Vergleich zu Java

Einführung in die Java- Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Javakurs für Anfänger

Informatik II Übung 5 Gruppe 4

Vorkurs Informatik WiSe 15/16

Informatik II Übung 5. Pascal Schärli

Applets I. Grundlagen der g Applet-Programmierung

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die Programmierung

Objektorientierte Programmierung

II.1.1. Erste Schritte - 1 -

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Prinzipien Objektorientierter Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Applet Firewall und Freigabe der Objekte

Tutorium Rechnerorganisation

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Zählen von Objekten einer bestimmten Klasse

Einführung in die Java- Programmierung

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Java Virtual Machine

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

6 Speicherorganisation

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Java Einführung Collections

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Vorkurs Informatik WiSe 15/16

Vererbung & Schnittstellen in C#

Übersetzung objektorientierter Programmiersprachen

JAVA als erste Programmiersprache Semesterkurs

Große Übung Praktische Informatik 1

Tooldemo: Soot. Softwareanalyse SS 2011 Veranstalter: Prof. Dr. Klaus Ostermann Tillmann Rendel, M.Sc. Von Kim Maurice Nuspl

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

1 Vom Problem zum Programm

Programmierung. Programme, Compiler, virtuelle Maschinen, Java

Innere Klassen in Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Studentische Lösung zum Übungsblatt Nr. 7

Modellierung und Programmierung 1

Kapitel 12: Übersetzung objektorienter Konzepte

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

C. BABBAGE ( ): Programmgesteuerter (mechanischer) Rechner

Client-Server-Beziehungen

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Einführung in Eclipse und Java

Java Einführung Methoden in Klassen

Software Engineering Klassendiagramme Einführung

Java Einführung Programmcode

Repetitorium Informatik (Java)

Klassendefinitionen verstehen

Programmieren Tutorium

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

3 Objektorientierte Konzepte in Java

Transkript:

Praktikum Compilerbau Sitzung 9 Java Bytecode Prof. Dr.-Ing. Gregor Snelting Matthias Braun und Sebastian Buchwald IPD Snelting, Lehrstuhl für Programmierparadigmen KIT Universität des Landes Baden-Württemberg und nationales Großforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

1. Letzte Woche 2. Java Bytecode 3. Jasmin Bytecode Assembler 4. Sonstiges 2 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Letzte Woche Was waren die Probleme? Hat soweit alles geklappt? 3 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

1. Letzte Woche 2. Java Bytecode 3. Jasmin Bytecode Assembler 4. Sonstiges 4 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Java Technologie Compiler Java Virtual Machine MyProgram.java MyProgram.class Java Virtual Machine Portable Zwischensprache: Bytecode Als virtuelle Maschine spezifiziert Umfangreiche Bibliothek Laufzeitsystem The Java Virtual Machine Specification http://java.sun.com/docs/books/jvms/ 5 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Virtuelle Maschine - Laufzeitsystem Heap: Speicher für Objektinstanzen. Getypt, automatische Speicherbereinigung (Garbage Collection), gemeinsamer Speicher für alle Threads. Method Area: Code für Methoden, nur lesbar. Runtime Constant Pool: Konstante Daten (Literale, Typinformationen,... ) Threads: Je Thread: Program Counter JVM Stack: Activation Records (Stackframes) Native Method Stack: Für Laufzeitsystem (meist in C/C++ geschrieben) 6 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Activation Records (Stackframe) Rücksprungadresse dynamischer Vorgänger lokale Variablen: Methodenparameter (Impliziter this Parameter an Position 0) p 0, p 1,... Lokale Variablen v 0, v 1,... p 0 p 1... v 0 v 1... Operandenstack 7 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Bytecode, Operandenstack Beispiel: Stackbasierter Bytecode: Operanden und Rückgabewerte liegen auf Operandenstack. Kürzere Befehlscodierung da Operanden und Ziele nicht explizit. Maximale Stackgröße pro Methode im.class-file angegeben. top 5 7 isub (7 5 = 2) top 2 0. 0. 8 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Instruktionen Typen bekannt aus Java Instruktionen explizit typisiert: iadd (int), fadd (float) Instruktionsklassen: Lesen/Schreiben von lokalen Variablen (?load,?store <x>,... ) Lesen/Schreiben von Feldern (getfield, putfield,... ) Sprungbefehle (ifeq, ifnull, tableswitch,... ) Methodenaufrufe (invokevirtual, invokestatic,... ) Objekterzeugung (new, newarray,..) Arithmetische Berechnungen (?mul,?add,... ) 9 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5?... Stack: Befehl: // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5?... Stack:?? Befehl: // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5?... Stack: 1? Befehl: iconst_1 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack:?? Befehl: istore_3 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack: 5? Befehl: iload_2 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack: 6 5 Befehl: iload_3 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack: 30? Befehl: imul // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack: 7 30 Befehl: iload_1 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 7 5 1... Stack: 37? Befehl: iadd // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Ausdruck berechnen void calc(int x, int y) { int z = 6; x = x + y * z; Lokale Variablen: [0] [1] [2] [3] [4] this x y z... 0x? 37 5 1... Stack:?? Befehl: istore_1 // Lade Konstante 1 iconst_1 // Schreibe in z istore_3 // Lade y iload_2 // Lade z iload_3 // y z imul // Lade x iload_1 // x + (y z) iadd // Speichere x istore_1 10 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Fibonnaci-Berechnung public int fib(int steps) { int last0 = 1; int last1 = 1; while (--steps > 0) { int t = last0 + last1; last1 = last0; last0 = t; return last0; iconst_1 // Konstante 1 istore_2 // in last0 (Var 2) schreiben iconst_1 // Konstante 1 istore_3 // in last1 (Var 3) schreiben iinc 1, 1 // steps (Var 1) dekrementieren iload_1 // steps (Var 1) laden ifle 24 // Falls <=0, springe iload_2 // last0 (Var 2) laden iload_3 // last1 (Var 3) laden iadd // addiere (last0+last1) istore 4 // in t (Var 4) schreiben iload_2 // last0 (Var 2) laden istore_3 // in last1 (Var 3) schreiben iload 4 // t (Var 4 laden) istore_2 // in last0 (Var 2) schreiben goto 4 // springe zum Schleifenbeginn iload_2 // last0 (Var 2) laden ireturn // Verlassen mit Wert 11 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Methodenaufrufe 1. Bezugsobjekt auf den Stack (falls nicht static) 2. Parameter auf den Stack 3. invokevirtual / invokestatic ausführen: Folgendes passiert vor / nach dem Aufruf automatisch: 3.1 Array für Parameter und lokale Variablen anlegen (Größe ist angegeben) 3.2 Returnadresse (Program Counter+1) und alten Framepointer sichern 3.3 Neuen Framepointer setzen 3.4 this Pointer und Parameter vom Stack ins Parameter Array kopieren 3.5 Zu Methodenanfang springen und Code ausführen 3.6 Returnwert auf den Stack 3.7 Alten Framepointer setzen und zur Returnadresse springen 4. Returnwert vom Stack holen und weiterverarbeiten 12 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Methodenaufruf int bar() { return foo(42); int foo(int i) { return i; Konstantenpool #2 Method #3.#16 #3 class #17 #11 Asciz foo #12 Asciz (I)I #16 NameAndType #11:#12 #17 Asciz Test int bar(); aload_0 bipush 42 invokevirtual #2 ireturn int foo(int); iload_1 ireturn 13 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Deskriptoren Namen von Klassen, Feldern und Methoden müssen einem festgelegtem Schema entsprechen. (siehe JVMS 4.3) Klassennamen: java.lang.object Ljava/lang/Object; Typen: int I, void V, boolean Z Methoden: void foo(int, Object) foo(iljava/lang/object;)v Deskriptor: ( Parametertypen ) Rückgabetyp Identifiziert über Name Deskriptor Felder: boolean b b:z Identifiziert nur über Name Konstruktoren: Name ist <init>, Static Initializer <clinit> 14 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Objekt erzeugen & initialisieren 1. Objekt anlegen Speicher reservieren 2. Objekt initialisieren Konstruktor aufrufen Hinweis: Jede Klasse braucht einen Konstruktor (Defaultkonstruktor)! class Test { Test foo() { return new Test(); #1 java/lang/object.<init>()v #2 Test #3 Test.<init>()V Test(); aload_0 invokespecial #1; return Test foo(); new #2; dup invokespecial #3; areturn 15 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Array anlegen und darauf zugreifen public void arr() { int[] array = new int[10]; array[7] = 42; bipush 10 // Konstante 10 newarray int // array anlegen vom Typ int astore_1 // in variable array (var 1) speichern aload_1 // variable array (var 1) laden bipush 7 // Konstante 7 bipush 42 // Konstante 42 iastore // Wert (42) auf array index (7) // von array("array") schreiben return // Aus Funktion zurueckkehren 16 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Auf Feld zugreifen class field { public field field; public void setnull() { field = null; aload_0 // Parameter0 (this) auf Stack aconst_null // null Referenz auf den Stack putfield field:lfield; // Schreibe Wert (null) // auf Feld field:lfield; von Objekt(this) return // Aus Funktion zurueckkehren 17 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

1. Letzte Woche 2. Java Bytecode 3. Jasmin Bytecode Assembler 4. Sonstiges 18 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Jasmin Assembler Bytecode Assembler: Assemblersprache für Java Bytecode Leichter lesbar debuggen Sprungmarken statt Bytecodepositionen Automatischer Aufbau des Konstantenpools http://jasmin.sourceforge.net/ Aufruf: java -jar jasmin.jar <Datei> 19 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Jasmin Klasse Header:.class <Modifier> <ClassName>.super <SuperClass> Methode:.method <Modifier> <Name and Deskriptor> <Code>.end method Feld:.field <Modifier> <FieldName> <Descriptor> [= <Value>] 20 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Beispiel: Jasmin Code.class Test.super java/lang/object.method public <init>()v aload_0 invokenonvirtual java/lang/object/<init>()v return.end method.method foo()ltest;.limit locals 1.limit stack 2 new Test dup invokespecial Test/<init>()V areturn.end method 21 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Steuerfluss mit Sprungmarken void foo(int z) { int i = 0; while (i < z) { i = i + 1;.method foo(i)v.limit locals 2.limit stack 3 iconst_0 istore_2 l1: iload_2 iload_1 if_icmpge l2 iload_2 iconst_1 iadd istore_2 goto l1 l2: return.end method 22 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting

Zum Schluss Anmerkungen? Probleme? Fragen? 23 23. Juni 2010 Matthias Braun Sitzung 9 Java Bytecode IPD Snelting