Beispiel – Java Virtual Machine Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2010/2011 Beispiel – Java Virtual Machine– 1/11– 2010-09-06 Java Virtual Machine „Java Virtual Machine” (JVM): konsequentes Design für hohe JIT-Performance: gut spezifizierte, einfache Instruktionen, eine Adressierungsart leicht emulierbare Instruktionen kaum Exceptions (nur Div-by-Zero, NULL-Pointer) keine Interrupts statt dessen Multi-Threading keine Condition-Code-Flags keine MMU, keine Segmentierung, sichere Pointer keine berechneten Sprünge kein selbst-modifizierender Code Beispiel – Java Virtual Machine– 2/11– 2010-09-06 Java Virtual Machine – Instruktionen byte bipush baload bastore short sipush saload sastore int long float double iconst iload istore iaload iastore lconst lload lstore laload lastore fconst fload fstore faload fastore dconst dload dstore daload dastore Beispiel – Java Virtual Machine– 3/11– 2010-09-06 char reference caload castore aconst aload astore aaload aastore Java Virtual Machine – Instruktionen byte short int iinc iadd isub imul idiv irem ineg ishl ishr iushr iand ior ixor long float double ladd lsub lmul ldiv lrem lneg lshl lshr lushr land lor lxor fadd fsub fmul fdiv frem fneg dadd dsub dmul ddiv drem dneg char Beispiel – Java Virtual Machine– 4/11– 2010-09-06 reference Java Virtual Machine – Instruktionen byte i2b short i2s int l2i f2i d2i ifOP if_icmpOP ireturn long i2l f2l d2l lcmp lreturn float i2f l2f double i2d l2d f2d char reference d2f fcmpl fcmpg dcmpl dcmpg freturn dreturn Beispiel – Java Virtual Machine– 5/11– 2010-09-06 if_acmpOP areturn Java Virtual Machine – Instruktionen new getfield arraylength pop dup_x1 ifeq ifgt if_icmpeq if_icmple tableswitch jsr invokevirtual athrow monitorenter newarray putfield instanceof pop2 dup2_x1 iflt ifge if_icmpne if_icmpge lookupswitch jsr_w invokeinterface anewarray getstatic checkcast dup dup_x2 ifle ifnull if_icmplt if_acmpeq goto ret invokespecial multianewarray putstatic dup2 dup2_x2 ifne ifnonnull if_icmpgt if_acmpne goto_w invokestatic monitorexit Beispiel – Java Virtual Machine– 6/11– 2010-09-06 swap Java Virtual Machine – Instruktionen – Beispiel // a = -(b ... iload_1 iload 20 iadd ineg istore_2 ... + c); // // // // // push variable 1 push variable 20 add variables negate result pop as variable 2 Beispiel – Java Virtual Machine– 7/11– 2010-09-06 Java Virtual Machine – Instruktionen – Beispiel // for (i = n; i >= 0; i--) { XXX } iload 4 istore 3 goto L15 L14: XXX iinc 3 by -1 L15: iload 3 ifge L14 Beispiel – Java Virtual Machine– 8/11– 2010-09-06 Java Virtual Machine – Code-Prüfung Code-Prüfung: Idee: Wenn eine bestimmte Code-Zeile ausgeführt wird, liegen immer die gleichen Typen von Argumente auf dem Stack, liegen immer die gleichen Typen in den lokalen Variablen. egal auf welchem Weg die Code-Zeile erreicht wurde. Es liegen die richtigen Typen von Argumenten auf dem Stack, wenn eine Rechenoperation ausgeführt wird, wenn eine Unterprogramm aufgerufen wird. => sichere Pointer, kein selbst-modifizierender Code Beispiel – Java Virtual Machine– 9/11– 2010-09-06 Java Virtual Machine – Code JVM Byte-Code wurde als leicht emulierbarer, leicht zu compilierender Code entwickelt. Er ist ungeeignet für Hardware! Z.B. sind die Garbage-Collection oder die Code-Prüfung praktisch unmöglich in Hardware zu bauen. Beispiel – Java Virtual Machine– 10/11– 2010-09-06 Java Virtual Machine Lizenz: „kostenlos” Mehr Infos unter Allgemeines: http://java.sun.com JVM Interna: http://java.sun.com/docs/books/jvms/index.html Beispiel – Java Virtual Machine– 11/11– 2010-09-06