Java Bytecode - Freie Universität Berlin

Werbung
Java Bytecode
Eike Robert
Freie Universität Berlin
Softwareprojekt Übersetzerbau, 2013
. . . .... .... .... . . . . .
. . . .... .... .... . . . . .
Inhalt
Bytecode Allgemein
Architektur
Aufbau
Instruktionsgruppen
Beispiel
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
2
Inhalt
Bytecode Allgemein
Architektur
Aufbau
Instruktionsgruppen
Beispiel
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
3
Architektur
▶
▶
▶
1 Byte pro Befehl → 28 = 256 Befehle
51 davon z.Zt. unbenutzt
3 gesperrt
▶
▶
0xCA → Breakpoint-Marker
0xFE, 0xFF → Reserviert für spezielle Debuggerbefehle
▶
kompakt
▶
JVM Stackorientiert → kompatibel zu registerarmen Plattformen
(z.B. Intel 80486: 9 Register)
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
4
Inhalt
Bytecode Allgemein
Architektur
Aufbau
Instruktionsgruppen
Beispiel
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
5
Aufbau
<offset> <opcode> [<arg1>, <arg2>]
▶
▶
offset → aktuelle Bytezahl, Sprungmarker
opcode, args → Befehl und Argumente
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
6
Aufbau
<offset> <opcode> [<arg1>, <arg2>]
▶
▶
offset → aktuelle Bytezahl, Sprungmarker
opcode, args → Befehl und Argumente
0 iinc 0, 1
▶
Befehl iinc: Inkrementieren
▶
Prefix i: → integer
Argument 1 (0): oberstes Stackelement
Argument 2 (1): um 1 erhöhen
▶
▶
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
6
Aufbau
▶
Prefixe/Suffixe: Datentypen
i integer, l long, s short, b byte, c character
f float, d double, z boolean, a reference
0 fcmpl
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
7
Aufbau
▶
Prefixe/Suffixe: Datentypen
i integer, l long, s short, b byte, c character
f float, d double, z boolean, a reference
0 fcmpl
▶
Suffixe (speziell): const, load, store + _n
0 iconst_0
0 iconst_m1
1 sipush 999
FU Berlin, Bytecode, Übersetzerbau 2013
// 03
// 02
// 11 03 E7
.
.. ..
push int 0 to stack
push int -1 to stack
push signed int 999 to stack
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
7
Aufbau
▶
▶
An Bytegrenzen ausgerichtet
JVM-Stack Slotgröße: 4 byte
▶
▶
integer, float, byte, short: 4 byte/1 Slot
long, double: 8 byte/2 Slots
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
8
Inhalt
Bytecode Allgemein
Architektur
Aufbau
Instruktionsgruppen
Beispiel
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
9
Instruktionsgruppen
▶
Laden/Speichern
FU Berlin, Bytecode, Übersetzerbau 2013
aload_0, istore
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
Arithmetische/logische Operationen
FU Berlin, Bytecode, Übersetzerbau 2013
aload_0, istore
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
ladd, fcmpl
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
Arithmetische/logische Operationen
Typkonversion
▶
FU Berlin, Bytecode, Übersetzerbau 2013
aload_0, istore
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
ladd, fcmpl
i2b, d2i
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
Arithmetische/logische Operationen
Typkonversion
Objekterzeugung und -manipulierung
▶
▶
FU Berlin, Bytecode, Übersetzerbau 2013
aload_0, istore
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
ladd, fcmpl
i2b, d2i
new, putfield
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
▶
Arithmetische/logische Operationen
Typkonversion
Objekterzeugung und -manipulierung
▶
Operandenstapelmanagement
▶
FU Berlin, Bytecode, Übersetzerbau 2013
aload_0, istore
.
.. ..
ladd, fcmpl
i2b, d2i
new, putfield
swap, dup2
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
Arithmetische/logische Operationen
Typkonversion
Objekterzeugung und -manipulierung
▶
▶
▶
▶
aload_0, istore
ladd, fcmpl
i2b, d2i
new, putfield
Operandenstapelmanagement
Kontrollübertragung
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
swap, dup2
ifeq, goto
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
10
Instruktionsgruppen
▶
Laden/Speichern
▶
Arithmetische/logische Operationen
Typkonversion
Objekterzeugung und -manipulierung
▶
▶
aload_0, istore
▶
Operandenstapelmanagement
Kontrollübertragung
▶
Methodenausführung
▶
FU Berlin, Bytecode, Übersetzerbau 2013
ladd, fcmpl
i2b, d2i
new, putfield
swap, dup2
ifeq, goto
invokespecial, areturn
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
10
Inhalt
Bytecode Allgemein
Architektur
Aufbau
Instruktionsgruppen
Beispiel
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
11
Bytecode-Ausschnitt
$ javac Example.java
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
12
Bytecode-Ausschnitt
$ javac Example.java
$ javap -c -s -v -l Example
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
12
1
2
3
4
Constant pool:
#1= Methodref
#2= Fieldref
#3= Methodref
#5.#15 // java/lang/Object ."<init >":()V
#16.#17 // java/lang/System.out:Ljava/io/PrintStream;
#18.#19 // java/io/PrintStream.println :(I)V
5
6
class example.Example {
7
example.Example ();
0: aload_0
1: invokespecial #1
4: return
8
9
10
11
12
public static void main(java.lang.String []);
0: iconst_0
1: istore_1
2: iload_1
3: iconst_5
4: if_icmpge
20
7: getstatic
#2
10: iload_1
11: invokevirtual #3
14: iinc
1, 1
2
17: goto
20: return
13
14
15
16
17
18
19
20
21
22
23
24
25
}
. . . .... .... .... . . . . .
. . . .... .... .... . . . . .
Beispielprogramm
1
class Example {
2
public static void main(String [] args) {
for(int i = 0; i < 5; i++) {
System.out.println(i);
}
}
3
4
5
6
7
8
9
}
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Classfile /data/Repositories/FUBerlin/Semester/ss13/ss13 -com/Vortrag/example/Example.class
Last modified 17.04.2013; size 446 bytes
MD5 checksum 1 f4fd95d93cfdb73b348333b97ca87d2
Compiled from "Example.java"
class example.Example
SourceFile: "Example.java"
minor version: 0
major version: 51
flags: ACC_SUPER
Constant pool:
#1 = Methodref
#5.#15
// java/lang/Object ."<init >":()V
#2 = Fieldref
#16.#17
// java/lang/System.out:Ljava/io/PrintStream;
#3 = Methodref
#18.#19
// java/io/PrintStream.println :(I)V
#4 = Class
#20
// example/Example
#5 = Class
#21
// java/lang/Object
#6 = Utf8
<init >
#7 = Utf8
()V
#8 = Utf8
Code
#9 = Utf8
LineNumberTable
#10 = Utf8
main
#11 = Utf8
([ Ljava/lang/String ;)V
#12 = Utf8
StackMapTable
#13 = Utf8
SourceFile
#14 = Utf8
Example.java
#15 = NameAndType
#6:#7
// "<init >":()V
#16 = Class
#22
// java/lang/System
#17 = NameAndType
#23:#24
// out:Ljava/io/PrintStream;
#18 = Class
#25
// java/io/PrintStream
#19 = NameAndType
#26:#27
// println :(I)V
#20 = Utf8
example/Example
#21 = Utf8
java/lang/Object
#22 = Utf8
java/lang/System
#23 = Utf8
out
#24 = Utf8
Ljava/io/PrintStream;
#25 = Utf8
java/io/PrintStream
#26 = Utf8
println
#27 = Utf8
(I)V
{
example.Example ();
Signature: ()V
flags:
LineNumberTable:
line 3: 0
. . . .... .... .... . . . . .
. . . .... .... .... . . . . .
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Code:
stack=1, locals=1, args_size =1
0: aload_0
1: invokespecial #1
4: return
LineNumberTable:
line 3: 0
// Method java/lang/Object ."<init >":()V
public static void main(java.lang.String []);
Signature: ([ Ljava/lang/String ;)V
flags: ACC_PUBLIC , ACC_STATIC
LineNumberTable:
line 6: 0
line 7: 7
line 6: 14
line 9: 20
Code:
stack=2, locals=2, args_size =1
0: iconst_0
1: istore_1
2: iload_1
3: iconst_5
4: if_icmpge
20
// Field java/lang/System.out:Ljava/io/PrintStream;
7: getstatic
#2
10: iload_1
11: invokevirtual #3
// Method java/io/PrintStream.println :(I)V
14: iinc
1, 1
17: goto
2
20: return
LineNumberTable:
line 6: 0
line 7: 7
line 6: 14
line 9: 20
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 2
locals = [ int ]
frame_type = 250 /* chop */
offset_delta = 17
}
. . . .... .... .... . . . . .
. . . .... .... .... . . . . .
Quellen
▶
▶
▶
▶
The Java Virtual Machine Specification, Java SE 7 Edition
http://docs.oracle.com/javase/specs/jvms/se7/html/
insbesondere Kapitel 6: Java Virtual Machine Instruction Set
Java Class File Disassembler Documentation
http://docs.oracle.com/javase/7/docs/technotes/tools/
windows/javap.html
http://en.wikipedia.org/wiki/Java_bytecode
http://www.javaworld.com/jw-09-1996/jw-09-bytecodes.html
FU Berlin, Bytecode, Übersetzerbau 2013
.
.. ..
. . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
. . .
.. .. ..
,
17
Herunterladen