Programmierung für die JVM

Werbung
Programmierung für die JVM
Author: Roland Räz, I98b
Betreuer: Prof. E.Glatz
1
Inhaltsverzeichnis
Einfaches Beispiel
JNI
Performancesteigerungen
10.01.2001 - v5
Jasmin
Oolong
Typen
Java Assembler
JVM
Vergleich mit bekanntem
Programmierung
Diassembler
Decompiler
Runtime Datenbereiche
.class Format
Instruktionen
Performanceverbesserungen
2
Programmierung für die JVM
Einführung 1/3
• Portabilität folgt aus der Laufzeitumgebung
3
Programmierung für die JVM
Einführung 2/3
• Portabilität folgt aus der Laufzeitumgebung
• virtueller Java Prozessor
4
Programmierung für die JVM
Einführung 3/3
• Portabilität folgt aus der Laufzeitumgebung
• virtueller Java Prozessor
• Ziel: Verständnis der Architektur
5
Programmierung für die JVM
JVM - Übersicht 1/4
• Stackarchitektur
6
Programmierung für die JVM
JVM - Übersicht 2/4
• Stackarchitektur
• keine Register
7
Programmierung für die JVM
JVM - Übersicht 3/4
• Stackarchitektur
• keine Register
• einen Stack + Programm Counter pro Thread
8
Programmierung für die JVM
JVM - Übersicht 4/4
• Stackarchitektur
• keine Register
• einen Stack + Programm Counter pro Thread
• objektorientiert
9
Programmierung für die JVM
JVM - Typen
byte
:
short :
int
:
long
:
float :
double :
char
:
Boolean:
Object :
8 Bits Zweierkomplement, vorzeichenbehaftet
16 Bits Zweierkomplement, vorzeichenbehaftet
32 Bits Zweierkomplement, vorzeichenbehaftet
64 Bits Zweierkomplement, vorzeichenbehaftet
32 Bits Floating-Point, IEEE 754
64 Bits Floating-Point, IEEE 754
2 Bytes, Unicode.
true/false
32 Bits, referenziert ein Objekt oder ein Array (ein
Array ist ein Objekt)
ReturnAddress : 32 Bits
10
Programmierung für die JVM
JVM - Runtime Datenbereiche 1/4
• Heap
11
Programmierung für die JVM
JVM - Runtime Datenbereiche 2a/4
• Heap
• Stack
12
Programmierung für die JVM
JVM - Runtime Datenbereiche 2b/4
• Heap
• Stack
↑
Operandenstack (push, pop, arithmetische Operationen,
Vorbereitung für Methodenaufrufe)
Var 3
Var 2
Var 1
Var 0
Lokale Variablen
ß this, ausser für statische Methoden
13
Programmierung für die JVM
JVM - Runtime Datenbereiche 3/4
• Heap
• Stack
• Method Area
14
Programmierung für die JVM
JVM - Runtime Datenbereiche 4/4
• Heap
• Stack
• Method Area
• Native Method Stack
15
Programmierung für die JVM
JVM - .class Format 1/2
ClassFile {
u4 magic;
// muss den Wert 0xCAFEBABE haben
u2 minor_version;
// Version
u2 major_version;
// Version
u2 constant_pool_count;// Anzahl Einträge in der constant_pool Tabelle
cp_info constant_pool[constant_pool_count-1];
// die constant_pool Tabelle ist Das Layout der
// Klasse: Konstanten, Namen, Referenzen
u2 access_flags;
// PUBLIC ,FINAL, SUPER ,INTERFACE,
// ABSTRACT
u2 this_class;
// Index in die constant_pool Tabelle
u2 super_class;
// Index in die constant_pool Tabelle
u2 interfaces_count;// Anzahl Super-Interfaces diese Interaces oder
// der Klasse
u2 interfaces[interfaces_count];
// haben Indexe in die constant_pool Tabelle
16
Programmierung für die JVM
JVM - .class Format 2/2
u2 fields_count;
// Anzahl der fields
field_info fields[fields_count];
// Repräsentieren Klassen- oder
// Instanzenvariablen greiffen auch wieder auf
// die constant_pool Tabelle zurück
u2 methods_count;
// Anzahl Methoden
method_info methods[methods_count];
// Die Methoden
u2 attributes_count;// Anzahl Attribute
attribute_info attributes[attributes_count];
// Hier werden spezielle Attribute (zum
// Beispiel vom einem Debugger) eingetragen.
// Attribute die die JVM nicht kennt, überliesst
// sie.
}
17
Programmierung für die JVM
JVM - Instruktionen - Datenzugriff 1/4
Auf Lokale Variablen
•
•
•
•
•
•
•
•
•
iload <var_num>
iload_ <n>
lload <var_num>
fload <var_num>
istore <var_num>
istore_ <n>
aload <var_num>
astore <var_num>
... etc.
pusht einen Integer auf den Stack
4 kurz Versionen für die Variablen 0-3
... für andere typen
popt vom Stack in Variable
4 kurz Versionen für die Variablen 0-3
pusht eine Referenz auf den Stack
popt eine Referenz vom Stack
18
Programmierung für die JVM
JVM - Instruktionen - Datenzugriff 2/4
auf Objekt/Class Felder
•
•
•
•
getfield
getstatic
putfield
putstatic
<index> object field via einen constant pool descriptor
<index> static class field
<index>
<index>
Push von Konstanten
Basis form (Operand in der Instruktion)
•bipush <byte>
(-128 to +127)
•sipush <short>
(-32768 to +32768)
19
Programmierung für die JVM
JVM - Instruktionen - Datenzugriff 3/4
Kurze Form (1 Byte)
•iconst_m1
•iconst_<n>
•lconst_<l>
•fconst_<f>
•dconst_<d>
(minus 1)
(n=0 ... 5)
(long, 0 und 1)
(float, 0, 1, und 2)
(double, 0 und 1)
Von der constant pool Tabelle (für Konstanten und Strings)
•ldc <index>
•ldc_w <index>
20
Programmierung für die JVM
JVM - Instruktionen - Datenzugriff 4/4
Arrays
•newarray <atype>
•anewarray <index>
•multianearray
•arraylength
•iaload
•laload
•...etc.
•iastore
•...etc.
(Typecode Operand, Grösse auf dem Stack)
Object Typ im constant pool, Grösse auf dem Stack)
für multidimensionale Arrays
(hole Arraylänge, Objektreferenz auf dem Stack)
int aus einem Array kopieren (Referenz und
Index auf dem Stack)
... anderer Typ
int aus einem Array kopieren (Referenz , Index und
Ergebniss auf dem Stack)
21
Programmierung für die JVM
JVM - Instruktionen - Arithm.& Log. Verkn.
Alle Operanden sind auf dem Stack
•
•
•
•
•
•
•
•
•
•
•
•
iadd, ladd, fadd,
isub, lsub, fsub,
imul, lmul, fmul,
idiv, ldiv, fdiv,
irem, lrem, frem,
ineg, lneg, fneg,
ishl, lshl
ishr, lshr
iushr, lushr
iand, land
ior, lor
ixor, lxor
dadd
dsub
dmul
ddiv
drem
dneg
Addition
Subtraktion
Multiplikation
Division
Modulus
Negieren
Arithmetisches Linksschieben
Arithmetisches Rechtsschieben
Logisches Schieben (”unsigned” shift)
And (Binär)
Or (Binär)
Xor (Binär)
22
Programmierung für die JVM
JVM - Instruktionen - Konversion und Andere
Konversion
•i2l, i2f, i2d
•l2i, l2f, l2d
•f2i, f2l, f2d
•d2i, d2l, d2f
•int2byte
•..etc
int to long, int to folat, int to double
...
Andere
•nop
•dup
•dup2
•swap
•pop
•pop2
•tableswitch
•..etc
dupliziert int
dupliziert long
vertauscht
effiziente Realisierung der bekannten switch
Anweisung
23
Programmierung für die JVM
JVM - Instruktionen - Sprünge
•ifeq <Branch Offset>
Sprung wenn tos = zero
•ifnull, ifnonnull
Testet auf NULL-Referenz
•iflt, ifle, ifne, ifgt, ifge
Vergleiche
•andere Varianten
•lcmp, fcmp, dcmp
Vergleicht: Resultat -1, 0, oder +1
•goto
unbedingter Sprung
•jsr
”lightweight” Subroutine
•ret
24
Programmierung für die JVM
JVM - Instruktionen - Methoden Aufrufe
•invokevirtual <index>
Stack: objref, arg1, arg2...
Normaler Methodenaufruf:
Laufzeitprüfung, Methodensignatur im
constant pool
•invokenonvirtual <index>
Stack: objref, arg1, arg2...
Zeilbestimmung während dem
Kompilieren (nicht üblich)
•invokestatic <index>
Stack: arg1, arg2, arg3...
Aufruf einer Klassenmethode
•invokeinterface <index>
Java Interface aufrufen
25
Programmierung für die JVM
JVM - Programmierung - Assembler 3/3
.source HelloWorld.java
.class public synchronized HelloWorld
.super java/awt/Frame
• Jasmin
; >> METHOD 1 <<
.method public <init>()V
.limit stack 5
.limit locals 1
.line 8
.var 0 is this LHelloWorld; from Label1 to Label2
Label1:
aload_0
ldc "1st App"
invokenonvirtual
java/awt/Frame/<init>(Ljava/lang/String;)V
.line 9
aload_0
new java/awt/BorderLayout
dup
invokenonvirtual java/awt/BorderLayout/<init>()V
26
Programmierung für die JVM
JVM - Programmierung - Assembler 3/3
.source HelloWorld.java
.class public super HelloWorld
.super java/awt/Frame
• Jasmin
• Oolong
.method public <init> ()V
.limit stack 5
.limit locals 1
.var 0 is this LHelloWorld; from l0 to l54
.line 8
l0:
aload_0
l1:
ldc "1st App"
l3:
invokespecial java/awt/Frame/<init>
(Ljava/lang/String;)V
.line 9
l6:
aload_0
l7:
new java/awt/BorderLayout
l10:
dup
l11:
invokespecial java/awt/BorderLayout/<init> ()V
27
Programmierung für die JVM
JVM - Programmierung - Assembler 3/3
• Jasmin
• Oolong
•Vergleich mit herkömmlichen Assemblern
28
Programmierung für die JVM
JVM - Programmierung - Diassembler 1/3
• Reverse Enineering
29
Programmierung für die JVM
JVM - Programmierung - Diassembler 2/3
• Reverse Enineering
• D-Java, Gnoolo
30
Programmierung für die JVM
JVM - Programmierung - Diassembler 3/3
• Reverse Enineering
• D-Java, Gnoolo
• Obfuscater
31
Programmierung für die JVM
JVM - Programmierung - Decompiler 1/3
• Reverse Enineering
32
Programmierung für die JVM
JVM - Programmierung - Decompiler 2/3
• Reverse Enineering
• Jad
33
Programmierung für die JVM
JVM - Programmierung - Decompiler 3/3
• Reverse Enineering
• Jad
• Beispiel CS-Directnet
34
Programmierung für die JVM
JVM - Programmierung - Performance 1/3
• Beschränkung auf Referenzen
35
Programmierung für die JVM
JVM - Programmierung - Performance 2/3
• Beschränkung auf Referenzen
• Narrowing
36
Programmierung für die JVM
JVM - Programmierung - Performance 3/3
• Beschränkung auf Referenzen
• Narrowing
• Optimierungsmöglichkeiten
37
Programmierung für die JVM
JVM - JNI - Übersicht 1/3
• Java Native Interface
38
Programmierung für die JVM
JVM - JNI - Übersicht 2/3
• Java Native Interface
• Aufruf von beliebigem Binäcode
39
Programmierung für die JVM
JVM - JNI - Übersicht 3/3
• Java Native Interface
• Aufruf von beliebigem Binäcode
• Auf Win32 > DLL
40
Programmierung für die JVM
JVM - JNI - Beispiel 1/3
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
// deklaration
// static: wird beim Laden
// ausgeführt
// auf Win32 Systemen wird
// hello.dll
// geladen
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
// Klasse instanzieren und
// Aufruf der Methode
}
}
41
Programmierung für die JVM
JVM - JNI - Beispiel 2/3
Tool javah erzeugt aus der HelloWorld.class Datei eine
c - Headerdatei
javah HelloWorld
Implementierung der Native - DLL (C-Sourcecode):
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env,
jobject obj)
{
printf("Hello world!\n");
return;
}
42
Programmierung für die JVM
JVM - JNI - Performance 1/3
• Demo von PerfTest
43
Programmierung für die JVM
JVM - JNI - Performance 2/3
• Demo von PerfTest
• Steigerung: 3..4 x
44
Programmierung für die JVM
JVM - JNI - Performance 3/3
• Demo von PerfTest
• Steigerung: 3..4 x
• Algorithmen: Defaultverhalten von Vector ist gut
45
Programmierung für die JVM
JVM - Weitere Informationen
Web
Haupt Informationsquelle:
http://java.sun.com
Gutes Java Glossar mit vielen Links
http://mindprod.com/jgloss.html
Jasmin:
http://mrl.nyu.edu/meyer/jvm/jasmin.html
Jad: “Offizielle Homepage”
http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
Bücher
Joshua Engel, “Programming for the Java Virtual Machine”, Addision – Wesley 1999, ISBN 0201-30972-6
Tim Lindholen/Frank Yellin, “The Java Virtual Machine Specificatin”, secon edition
46
Programmierung für die JVM
Herunterladen
Explore flashcards