Download Estructura de una Máquina Virtual Java (JVM) Proceso de
Document related concepts
no text concepts found
Transcript
Sesión de laboratorio: VisualJVM 1 2 3 4 Estructura de una Máquina Virtual Java (JVM) Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sesión de laboratorio: VisualJVM Autor: Pedro Pablo Garrido Abenza pgarrido@umh.es Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Proceso de programación • Primero se escribe el programa en un lenguaje de alto nivel (código fuente). • Este código se traduce a instrucciones que una máquina específica puede ejecutar (código ejecutable). Para ello se han inventado varias estrategias: – Ensambladores (ASM Æ Código nativo) – Compiladores (SRC Æ Código nativo) – Intérpretes 1 Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM Problema • Durante mucho tiempo un problema común ha sido la necesidad de poder ejecutar un mismo programa en diferentes plataformas (sistemas operativos, hardware, etc.). 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 2 Lenguajes tradicionales Hola.c Hola.c Compilación Compilación (bcc) (bcc) Hola.obj Hola.obj Enlazado Enlazado (link) (link) Hola.exe Hola.exe CCAPI API Compilación Compilación (gcc) (gcc) Hola.o Hola.o Enlazado Enlazado (ld) (ld) Hola Hola CCAPI API Estructura de una Java Virtual Machine (JVM) 3 Estructura de una Java Virtual Machine (JVM) 4 Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sesión de laboratorio: VisualJVM Java - Una nueva idea • La tecnología Java es: – Un lenguaje de programación – Un conjunto plataformas especializadas J2EE J2SE 1 2 3 4 J2ME Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final “Write Once, Run Anywhere” Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Compilación Compilación (javac) (javac) – En tiempo de compilación se generan bytecodes independientes de la plataforma. Estructura de una Java Virtual Machine (JVM) 5 Sesión de laboratorio: VisualJVM Tecnología Java Hola.java Hola.java • Esto se consiguió gracias al uso de un código intermedio: bytecodes. – En tiempo de ejecución se ejecutan (interpretan) los bytecodes utilizando un programa llamado Java Virtual Machine (JVM) sobre una plataforma específica. • Java fué diseñado específicamente para ser: Estructura de una Java Virtual Machine (JVM) Java - Una nueva idea 6 Tecnología Java • Ventajas: Hola.class Hola.class bytecodes bytecodes 1 2 3 4 Java JavaAPI API (Código independiente de la plataforma: .class) Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – – – – Multiplataforma Código compacto: bytecodes Aplicaciones convencionales y applets Paradigma POO • Inconvenientes: JVM JVM11 (java) (java) JVM JVM22 (java) (java) JVM JVM33 (java) (java) Plataforma Plataforma11 Plataforma Plataforma22 Plataforma Plataforma33 Estructura de una Java Virtual Machine (JVM) – Velocidad de ejecución lenta 7 Estructura de una Java Virtual Machine (JVM) 8 Sesión de laboratorio: VisualJVM Sesión de laboratorio: VisualJVM Tecnología Java • Ventajas: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – – – – Multiplataforma Código compacto: bytecodes Aplicaciones convencionales y applets Paradigma POO 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final • Inconvenientes: – Velocidad de ejecución lenta (interpretado) Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sesión de laboratorio: VisualJVM • Comprender aspectos sobre la portabilidad de los programas Java. • Distinguir el funcionamiento de un intérprete frente al de un compilador. “If you don't understand interpreters, you can still write programs; you can even be a competent programmer. But you can't be a master” (Friedman). • Implementar nuestra propia JVM. • Analizar la salida de los compiladores Java para optimizarlos. Estructura de una Java Virtual Machine (JVM) 11 • Comparando Java con los lenguajes tradicionales: Prog. Java Clases Java (bytecodes) (bytecodes) Programas Máquina Virtual (código nativo) (bytecodes => código nativo) Sistema Operativo Sistema Operativo Hardware Hardware Lenguajes tradicionales Tecnología Java Estructura de una Java Virtual Machine (JVM) 9 ¿Por qué estudiar la JVM? Tecnología Java 10 Implementaciones JVM • Intérpretes desarrollados: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – Sun Microsystems – Microsoft, Borland, IBM – Otros: Kaffe, LaTTe, Kissme, SableVM, Wonka, ...,VisualJVM. • Todos deben ser compatibles: – The Java Virtual Machine Specification – Otras especificaciones (JNI, ...). Estructura de una Java Virtual Machine (JVM) 12 Sesión de laboratorio: VisualJVM Sesión de laboratorio: VisualJVM Implementaciones JVM Estructura de la JVM • Java Language Specification 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Programas Librería Java clases Java Java API Specification JVM JVM Specification JVM - JNI (awt.dll, net.dll, ...) JNI Specification 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Una JVM contiene básicamente: 1. Zona de memoria dinámica (heap) 2. Zona de métodos 3. Hilos de ejecución (threads) Memoria dinámica (Heap) Sistema Operativo Zona de métodos Hilos (Threads) Hardware La torre de especificaciones Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM Estructura de una Java Virtual Machine (JVM) 13 Estructura de la JVM – 1/3 Sesión de laboratorio: VisualJVM 1. Zona de memoria dinámica (heap): 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Objeto Amarillo aun vigente Objeto Amarillo eliminado – – Es una zona de memoria reservada por la JVM para almacenar las instancias de las clases (objetos) que se crean. Periódicamente se ejecuta el algoritmo de Garbage Collection (GC) para liberar memoria ocupada por objetos eliminados, y compactar huecos libres. Heap Heap Estructura de la JVM – 2/3 2. Zona de métodos: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – – Es una zona de memoria utilizada para almacenar el código de los métodos de todas las clases Java cargadas (bytecodes). Zona compartida por todos los hilos. Zona Zonamétodos métodos print Heap Heap factorial exit GC Estructura de una Java Virtual Machine (JVM) 15 14 Estructura de una Java Virtual Machine (JVM) public public static static void void main main (java.lang.String[]); (java.lang.String[]); Code: Code: 0: getstatic 0: getstatic #2; #2; 3: ldc #3; 3: ldc #3; 5: invokevirtual 5: invokevirtual #4; #4; 8: return 8: return }} 16 Sesión de laboratorio: VisualJVM Estructura de la JVM – 3/3 Sesión de laboratorio: VisualJVM 3. Elementos de un marco (Frame): 3. Hilos de ejecución (threads): 1 2 3 4 – – Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sólo uno estará activo en un instante. Cada hilo contiene: • • 1 2 3 4 ID: un identificador único. Stack JVM: pila de llamadas a métodos – – Estructura de la JVM – 3/3 Cada elemento de la pila es un marco (Frame). Frame Pointer (FP): puntero que señala al marco de la cima, el marco actual. Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Zona Zonapara paralas lasvariables variableslocales; locales; las lasprimeras primerassiempre siempreson sonlos los argumentos argumentosrecibidos recibidospor porelel método. método. Hilo Hilo(Thread) (Thread) ID: PC SP FP Frame Pointer Marco actual Marco 3 Marco 2 Marco 1 Marco 0 PC Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Stack JVM Args.=1 Vars. locales=2 #0. args=... #0. args=... #1. n = ? Método asociado PC Program Counter FP Frame Pointer Sesión de laboratorio: VisualJVM public public class class P1e P1e {{ public public static static void void main main (String (String args[]) args[]) {{ int int nn == sumaNat sumaNat (3, (3, 4); 4); }} private private int int sumaNat sumaNat (int (int ini, ini, int int fin) fin) {{ int int i, i, suma=0; suma=0; for for (i=ini; (i=ini; i<=fin; i<=fin; i++) i++) {{ suma+=i; suma+=i; }} return return (suma); (suma); }} }} Frame 0 (main) PC public static void main (String args[]) { int n=sumaNat(3,4); } Estructura de una Java Virtual Machine (JVM) 1 2 3 4 Marco llamador main (String args[]) { ... } 18 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Llamador 19 Puntero Punteroalalmarco marcoque queleleha ha llamado, llamado,para pararetornarle retornarlevalores. valores. Invocaciones: args/return Pila oper. Null Pila de operandos Estructura de una Java Virtual Machine (JVM) 17 Invocaciones: args/return FP Vars. locales=2 #0. args #1. ... Código Códigodel delmétodo, método,que que estará estaráejecutando ejecutandolala instrucción instrucciónindicada indicadapor porelelPC PC main () Estructura de una Java Virtual Machine (JVM) 1 2 3 4 Args.=1 #0. args Método asociado Program Counter Sesión de laboratorio: VisualJVM Los Losopcodes opcodeslalautilizan utilizanpara para extraer extraersus susparámetros parámetros(pop) (pop)yy dejar dejarlos losresultados resultados(push). (push). Args.=1 Vars. locales=2 #0. args=... #0. args=... #1. n = ? Método asociado FP PC Program Counter FP Frame Pointer Frame 0 (main) public static void main (String args[]) { PC int n=sumaNat(3,4); } Estructura de una Java Virtual Machine (JVM) Pila oper. 3 4 Llamador Null 20 Sesión de laboratorio: VisualJVM 1 2 3 4 Invocaciones: args/return Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final #0. ini = 3 #1. fin = 4 #2. i = ? #3. suma = 0 Pila oper. Frame 1 Frame 0 Program Counter (main) Frame Pointer 4 Llamador 1 2 3 4 Vars. locales=2 #0. args=... #0. args=... #1. n = ? Método asociado public static void main (String args[]) PC { int n=sumaNat(3,4); } Llamador FP (sumaNat) PC FP Program Counter Frame Pointer Args.=1 Vars. locales=2 #0. ini = 3 #1. fin = 4 #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 Pila oper. Llamador Frame 0 (main) Args.=1 Vars. locales=2 #0. args=... #0. args=... #1. n = ? Método asociado public static void main (String args[]) PC { int n=sumaNat(3,4); } Frame 1 Frame 0 Program Counter (main) #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 Frame Pointer Args.=1 Vars. locales=2 #0. args=... #0. args=... #1. n = ? Método asociado public static void main (String args[]) PC { int n=sumaNat(3,4); } Pila oper. 7 Llamador Pila oper. Llamador Null Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 7 FP PC Program Counter Null FP 22 Invocaciones: args/return Pila oper. Llamador Vars. locales=2 #0. ini = 3 #1. fin = 4 private int sumaNat (int ini, int fin) { int i, suma=0; for (i=ini; i<=fin; i++) { suma+=i; } PC return (suma); } Null private int sumaNat (int ini, int fin) { int i, suma=0; for (i=ini; i<=fin; i++) { suma+=i; } PC return (suma); } Frame 1 PC Args.=1 Método asociado (sumaNat) 21 Método asociado FP Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Pila oper. Invocaciones: args/return Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 1 2 3 4 FP Args.=1 Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM Invocaciones: args/return 3 private int sumaNat (int ini, int fin) { int i, suma=0; PC for (i=ini; i<=fin; i++) { suma+=i; } return (suma); } (sumaNat) FP Vars. locales=2 #0. ini = 3 #1. fin = 4 Método asociado FP PC Args.=1 Sesión de laboratorio: VisualJVM Frame 0 Args.=1 Vars. locales=2 #0. args=... #0. args=... #1. n = 7 Método asociado (main) public static void main (String args[]) { int n=sumaNat(3,4); } Frame Pointer Pila oper. Llamador Null PC Estructura de una Java Virtual Machine (JVM) 23 Estructura de una Java Virtual Machine (JVM) 24 Sesión de laboratorio: VisualJVM Sesión de laboratorio: VisualJVM Clases - Procesado • Fases para el procesado de clases Java antes de su ejecución: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Inicio 1 2 3 • Tareas: 1 2 3 4 Carga Enlace 2.a Verificación 2.b Preparación 2.c Resolución Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sesión de laboratorio: VisualJVM Clases - Fase de carga 26 Clases - Fase de carga • Estructura de una clase (.class): Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 1 2 3 4 Número Númeromágico: mágico: 0xCAFE 0xCAFEBABE BABE Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – – – – – – – – – Versión: Versión: 0x0000 0x00000031 0031==49.0 49.0 (J2SDK (J2SDK1.5.0) 1.5.0) Estructura de una Java Virtual Machine (JVM) – Archivos .class empaquetados en los archivos .ZIP o .JAR de Java: Estructura de una Java Virtual Machine (JVM) 25 • Los archivos .class son archivos binarios: 1 2 3 4 • Almacenamiento de clases Java: – Archivos .class en cualquier directorio especificado en la variable CLASSPATH. – Archivos .ZIP o .JAR especificados en la variable CLASSPATH. Final Sesión de laboratorio: VisualJVM – Búsqueda y carga de clases Java C:\Archivos de programa\Java\jdk1.5.0\jre\lib\rt.jar C:\WINDOWS\java\Packages\*.zip Inicialización Estructura de una Java Virtual Machine (JVM) Clases - Fase de carga 27 Número mágico: 0xCAFEBABE Versión Java: 49.0 Î J2SDK 1.5 Visibilidad: pública, privada, etc. Nombre de la superclase Constantpool: zona de constantes numeradas (números, nombres de atributos y métodos, Strings, …), utilizadas por los siguientes. Fields: lista de campos. Methods: lista de métodos. Interfaces: lista de interfaces implementadas. Attributes: información adicional. Estructura de una Java Virtual Machine (JVM) 28 Sesión de laboratorio: VisualJVM Sesión de laboratorio: VisualJVM Clases - Fase de carga • Se divide en 3 subfases: • Lista de clases cargadas: A K D Q 1 2 3 4 NULL – Tabla Hash de dispersión abierta: 8 cubetas 1 2 3 4 – Lista enlazada: Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 0 1 2 3 4 5 6 7 NULL A Q Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final NULL NULL K D NULL NULL NULL NULL NULL Ejemplo: “A” ⇒ (65 % 8) = 1 Estructura de una Java Virtual Machine (JVM) Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Sesión de laboratorio: VisualJVM Clases - Inicialización – Ejecución de los constructores de clase (Métodos <clinit>). 1 2 3 4 • Una vez procesada una clase completamente, ya será posible ... – Crear instancias de esa clase. – Ejecutar los métodos que incluye. Estructura de una Java Virtual Machine (JVM) • Estática: se resuelven todas al principio (de forma recursiva). • Perezosa: se resuelven sólo cuando son realmente utilizadas. Sun Microsoft Estática 1398 917 Perezosa 186 58 Estructura de una Java Virtual Machine (JVM) 29 • Tareas: 1 2 3 4 – Verificación: formato correcto – Preparación: creación de datos de clase – Resolución de referencias simbólicas: Resolución Función dispersión: Σ (ASCII(nombre)) % cubetas Sesión de laboratorio: VisualJVM Clases - Fase de enlace Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 30 Repertorio de instrucciones • Cada MV tiene su propio juego de instrucciones, al igual que cualquier CPU. • Tradicionalmente hay dos tipos de juegos de instrucciones: – Basados en pila: las instrucciones toman los operandos de la pila de operandos Æ Máquinas Virtuales (más sencillo). – Basados en registros: los operandos se toman de unos "registros" Æ CPUs. • La JVM está basada en pila (CISC) 31 Estructura de una Java Virtual Machine (JVM) 32 Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Repertorio de instrucciones • La JVM tiene 200 opcodes: 00..FF • A cada opcode se le asocia una palabra fácil de recordar: mnemónico: Sesión de laboratorio: VisualJVM Repertorio de instrucciones • Los opcodes se pueden agrupar por categorías: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final – – – – – – – Carga y almacenamiento (Load & Store), Operaciones aritméticas, Conversiones de tipo, Creación y gestión de objetos, Gestión de pila de operandos, Control de flujo de ejecución, Invocación a métodos y retorno. • Código de los métodos: bytecodes. Un bytecode consta de: – Un código de operación (opcode): 1 byte – Seguido de los argumentos (opcionales): 0..5 bytes opcode opcode Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM Estructura de una Java Virtual Machine (JVM) 33 Repertorio de instrucciones Sesión de laboratorio: VisualJVM • Ejemplos – Load y Store: 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Vars. locales=2 #0. ini=3 #1. fin=4 #0. ini=3 #1. fin=4 #2. i = ? PC Program Counter SP Stack Pointer Se compila como ... Estructura de una Java Virtual Machine (JVM) 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Pila oper. iload_0 istore_2 Método asociado i = ini; 34 Repertorio de instrucciones • Ejemplos - varios: – La familia LOAD apila el valor de una variable local en la cima de la pila de operandos. – La familia STORE desapila el valor de la cima de la pila y lo almacena en una variable local. Args.=2 [arg1] [arg1][arg2] [arg2][arg3] [arg3][arg4] [arg4][arg5] [arg5] 3 opcode mnemónico Finaliza la ejecución del método actual, retornando al método llamador. 16 bipush 4 (0x10) Apila en la pila de operandos el valor entero 4. 18 ldc #4 (0x12) Apila en la pila de operandos el valor de la constante nº 4 de la zona de constantes (ConstantPool). 096 iadd (0x60) Sumar dos enteros. Los pasos son: 1. Extraer operandos de la pila (pop) 2. Realizar la operación (suma) 3. Apilar el resultado en la pila (push) Llamador iload_0 istore_2 Operación 177 return (0xB1) Null 35 PC Program Counter SP Stack Pointer SP Pila de operandos 4 3 Estructura de una Java Virtual Machine (JVM) SP 3 SP 7 36 Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final Repertorio de instrucciones Sesión de laboratorio: VisualJVM • Para obtener el código de un método de una clase hay varias utilidades: 1 2 3 4 – javap (Java 2 SDK): javap -c -verbose HelloWorld – Jasper (& Jasmin): VisualJVM Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final java -jar Jasper.jar HelloWorld – jclasslib Bytecode Viewer – Class Viewer for Java – VisualJVM Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM 1 2 3 4 37 VisualJVM Estructura de una Java Virtual Machine (JVM) Ejemplo 1 // // HelloWorld.java HelloWorld.java public public class class HelloWorld HelloWorld {{ public public static static void void main main (String (String args[]) args[]) {{ System.out.println System.out.println ("Hello ("Hello World!!"); World!!"); }} }} Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final C:\> javap -c –verbose HelloWorld C:\> javap -c –verbose HelloWorld Compiled from HelloWorld.java Compiled from HelloWorld.java class HelloWorld extends Object{ class HelloWorld extends Object{ HelloWorld(); HelloWorld(); Code: Code: 0: aload_0 0: aload_0 1: invokespecial #1 1: invokespecial #1 4: return 4: return public public static static void void main main (java.lang.String[]); (java.lang.String[]); Code: Code: 0: getstatic #2; 0: getstatic #2; 3: ldc #3; 3: ldc #3; 5: invokevirtual #4; 5: invokevirtual #4; 8: return 8: return } } Estructura de una Java Virtual Machine (JVM) 39 38 Constant Constant pool: pool: const #6.#15; const ## 11 == Method Method #6.#15; const # 2 #16.#17; const # 2 == Field Field #16.#17; const # 3 = String #18; const # 3 = String #18; const # 4 = Method #19.#20; const # 4 = Method #19.#20; const # 5 = class #21; const # 5 = class #21; const # 6 = class #22; const # 6 = class #22; const # 7 = Asciz <init>; const # 7 = Asciz <init>; const # 8 = Asciz ()V; const # 8 = Asciz ()V; const # 9 = Asciz Code; const # 9 = Asciz Code; const #10 = Asciz LineNumberTable; const #10 = Asciz LineNumberTable; const #11 = Asciz main; const #11 = Asciz main; const #12 = Asciz ([Ljava/lang/String;)V; const #12 = Asciz ([Ljava/lang/String;)V; const #13 = Asciz SourceFile; const #13 = Asciz SourceFile; const HelloWorld.java; const #14 #14 == Asciz Asciz HelloWorld.java; const #15 = NameAndType #7:#8; const #15 = NameAndType #7:#8; const #16 = class #23; const #16 = class #23; const const #17 #17 == NameAndType NameAndType #24:#25; #24:#25; const #18 = Asciz Hello const #18 = Asciz Hello World!!; World!!; const #26; const #19 #19 == class class #26; const #20 = NameAndType #27:#28; const #20 = NameAndType #27:#28; const HelloWorld; const #21 #21 == Asciz Asciz HelloWorld; const #22 = Asciz java/lang/Object; const #22 = Asciz java/lang/Object; const #23 = Asciz java/lang/System; const #23 = Asciz java/lang/System; const #24 = Asciz out; const #24 = Asciz out; const #25 = Asciz Ljava/io/PrintStream;; const #25 = Asciz Ljava/io/PrintStream;; const #26 = Asciz java/io/PrintStream; const #26 = Asciz java/io/PrintStream; const #27 = Asciz println; const #27 = Asciz println; const #28 = Asciz (Ljava/lang/String;)V; const #28 = Asciz (Ljava/lang/String;)V; Estructura de una Java Virtual Machine (JVM) 40 Ejemplo 2: control de flujo // // Par.java Par.java public public class class Par Par {{ public public static static void void main main (String (String args[]) args[]) {{ boolean b = esPar(6); boolean b = esPar(6); }} }} public public static static boolean boolean esPar esPar (int (int n) n) {{ if ((n % 2) == 0) { if ((n % 2) == 0) { return return (true); (true); }} else else {{ return (false); return (false); }} Ejemplo 2: control de flujo Constant Constant pool: pool: const #4.#15; const ## 11 == Method Method #4.#15; const # 2 #3.#16; const # 2 == Method Method #3.#16; const # 3 = class #17; const # 3 = class #17; const # 4 = class #18; const # 4 = class #18; const # 5 = Asciz <init>; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 6 = Asciz ()V; const # 7 = Asciz Code; const # 7 = Asciz Code; const # 8 = Asciz LineNumberTable; const # 8 = Asciz LineNumberTable; const # 9 = Asciz main; const # 9 = Asciz main; const #10 = Asciz ([Ljava/lang/String;)V; const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz esPar; const #11 = Asciz esPar; const (I)Z; const #12 #12 == Asciz Asciz (I)Z; const #13 = Asciz SourceFile; const #13 = Asciz SourceFile; const #14 = Asciz Par.java; const #14 = Asciz Par.java; const #15 = NameAndType #5:#6; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #16 = NameAndType #11:#12; const Par; const #17 #17 == Asciz Asciz Par; const #18 = Asciz java/lang/Object; const #18 = Asciz java/lang/Object; Estructura de una Java Virtual Machine (JVM) public public Par(); Par(); Code: Code: Stack=1, Stack=1, Locals=1, Locals=1, Args_size=1 Args_size=1 0: aload_0 0: aload_0 1: invokespecial 1: invokespecial #1; #1; // Method java/lang/Object."<init>":()V // Method java/lang/Object."<init>":()V 4: 4: public public static static void void main main (java.lang.String[]); (java.lang.String[]); Code: Code: Stack=1, Stack=1, Locals=2, Locals=2, Args_size=1 Args_size=1 0: bipush 0: bipush 66 2: invokestatic #2; 2: invokestatic #2; // // Method Method esPar:(I)Z esPar:(I)Z 5: istore_1 5: istore_1 6: return 6: return public public static static boolean boolean esPar(int); esPar(int); Code: Code: Stack=2,Locals=1,Args_size=1 Stack=2,Locals=1,Args_size=1 0: 0: 1: 1: 2: 2: 3: 3: 6: 6: 7: 7: 8: 8: 9: 9: iload_0 iload_0 iconst_2 iconst_2 irem irem ifne 88 ifne iconst_1 iconst_1 ireturn ireturn iconst_0 iconst_0 ireturn} ireturn} Estructura de una Java Virtual Machine (JVM) 42 Ejemplo 3: factorial iterativo Constant Constant pool: pool: const #4.#15; const ## 11 == Method Method #4.#15; const # 2 #3.#16; const # 2 == Method Method #3.#16; const # 3 = class #17; const # 3 = class #17; const # 4 = class #18; const # 4 = class #18; const # 5 = Asciz <init>; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 6 = Asciz ()V; const # 7 = Asciz Code; const # 7 = Asciz Code; const # 8 = Asciz LineNumberTable; const # 8 = Asciz LineNumberTable; const # 9 = Asciz main; const # 9 = Asciz main; const #10 = Asciz ([Ljava/lang/String;)V; const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz fact; const #11 = Asciz fact; const (I)I; const #12 #12 == Asciz Asciz (I)I; const #13 = Asciz SourceFile; const #13 = Asciz SourceFile; const #14 = Asciz FactIter.java; const #14 = Asciz FactIter.java; const #15 = NameAndType #5:#6; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #16 = NameAndType #11:#12; const FactIter; const #17 #17 == Asciz Asciz FactIter; const #18 = Asciz java/lang/Object; const #18 = Asciz java/lang/Object; C:\> C:\> javap javap -c -c –verbose –verbose FactIter FactIter Compiled Compiled from from FactIter.java FactIter.java class FactIter extends Object{ class FactIter extends Object{ public public FactIter(); FactIter(); Code: Code: Stack=1, Stack=1, Locals=1, Locals=1, Args_size=1 Args_size=1 0: aload_0 0: aload_0 1: invokespecial #1; 1: invokespecial #1; // // Method Method java/lang/Object."<init>":()V java/lang/Object."<init>":()V 4: 4: 43 return return public public static static void void main main (java.lang.String[]); (java.lang.String[]); Code: Code: Stack=1, Stack=1, Locals=2, Locals=2, Args_size=1 Args_size=1 0: iconst_3 0: iconst_3 1: invokestatic #2; 1: invokestatic #2; // Method fact:(I)I // Method fact:(I)I 4: 4: 5: 5: Estructura de una Java Virtual Machine (JVM) return return 41 Ejemplo 3: factorial iterativo // // FactIter.java FactIter.java public public class class FactIter FactIter {{ public public static static void void main main (String (String args[]) args[]) {{ int n = fact(3); int n = fact(3); }} public public static static int int fact(int fact(int n) n) {{ int int res; res; for for (res=1; (res=1; (n>=1); (n>=1); n--) n--) {{ res res *= *= n; n; }} return return (res); (res); }} }} C:\> C:\> javap javap -c -c –verbose –verbose Par Par Compiled Compiled from from Par.java Par.java class class Par Par extends extends Object{ Object{ istore_1 istore_1 return return public public static static int int fact fact (int); (int); Code: Code: Stack=2,Locals=2,Args_size=1 Stack=2,Locals=2,Args_size=1 0: 0: iconst_1 iconst_1 1: 1: istore_1 istore_1 2: 2: iload_0 iload_0 3: 3: iconst_1 iconst_1 4: 4: if_icmplt if_icmplt 17 17 7: 7: iload_1 iload_1 8: 8: iload_0 iload_0 9: 9: imul imul 10: 10: istore_1 istore_1 11: 0, 11: iinc iinc 0, -1 -1 14: 22 14: goto goto 17: 17: iload_1 iload_1 18: 18: ireturn ireturn }} Estructura de una Java Virtual Machine (JVM) 44 Ejemplo 4: factorial recursivo // // FactRecu.java FactRecu.java public public class class FactRecu FactRecu {{ public public static static void void main main (String (String args[]) args[]) {{ int n = fact(6); int n = fact(6); }} public public static static int int fact(int fact(int n) n) {{ if if (n==1) (n==1) {{ return return (1); (1); }} else else {{ return (n*fact(n-1)); return (n*fact(n-1)); }} }} }} Ejemplo 4: factorial recursivo Constant Constant pool: pool: const #4.#15; const ## 11 == Method Method #4.#15; const # 2 #3.#16; const # 2 == Method Method #3.#16; const # 3 = class #17; const # 3 = class #17; const # 4 = class #18; const # 4 = class #18; const # 5 = Asciz <init>; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 6 = Asciz ()V; const # 7 = Asciz Code; const # 7 = Asciz Code; const # 8 = Asciz LineNumberTable; const # 8 = Asciz LineNumberTable; const # 9 = Asciz main; const # 9 = Asciz main; const #10 = Asciz ([Ljava/lang/String;)V; const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz fact; const #11 = Asciz fact; const (I)I; const #12 #12 == Asciz Asciz (I)I; const #13 = Asciz SourceFile; const #13 = Asciz SourceFile; const #14 = Asciz FactRecu.java; const #14 = Asciz FactRecu.java; const #15 = NameAndType #5:#6; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #16 = NameAndType #11:#12; const FactRecu; const #17 #17 == Asciz Asciz FactRecu; const #18 = Asciz java/lang/Object; const #18 = Asciz java/lang/Object; C:\> C:\> javap javap -c -c –verbose –verbose FactRecu FactRecu Compiled Compiled from from FactRecu.java FactRecu.java class class FactRecu FactRecu extends extends Object{ Object{ public public FactRecu(); FactRecu(); Code: Code: Stack=1, Stack=1, Locals=1, Locals=1, Args_size=1 Args_size=1 0: aload_0 0: aload_0 1: invokespecial 1: invokespecial #1; #1; // // Method Method java/lang/Object."<init>":()V java/lang/Object."<init>":()V 4: 4: return return public public static static void void main main (java.lang.String[]); (java.lang.String[]); Code: Code: Stack=1, Stack=1, Locals=2, Locals=2, Args_size=1 Args_size=1 0: bipush 0: bipush 66 2: invokestatic 2: invokestatic #2; #2; // // Method Method fact:(I)I fact:(I)I 5: istore_1 5: istore_1 6: return 6: return public public static static int int fact(int); fact(int); Code: Code: Stack=3,Locals=1,Args_size=1 Stack=3,Locals=1,Args_size=1 0: 0: iload_0 iload_0 1: 1: iconst_1 iconst_1 2: 2: if_icmpne if_icmpne 77 5: 5: iconst_1 iconst_1 6: 6: ireturn ireturn 7: 7: iload_0 iload_0 8: 8: iload_0 iload_0 9: 9: iconst_1 iconst_1 10: 10: isub isub 11: 11: invokestatic invokestatic #2; #2; // // Method Method fact:(I)I fact:(I)I 14: 14: imul imul 15: 15: ireturn ireturn }} Estructura de una Java Virtual Machine (JVM) Sesión de laboratorio: VisualJVM 1 2 3 4 Inicio Tecn. Java Estruct. JVM Estruct. .class Opcodes Final 45 Estructura de una Java Virtual Machine (JVM) 46 Bibliografía y enlaces • The Java API documentation • Tim Lindholm, Frank Yellin, The JVM Specification, Second Edition, Addison Wesley, Java Series, April 1999. • D. Friedman, M. Wand, and C. Haynes, Essentials of Programming Languages, 2nd ed. MIT Press, 2001. • Bill Blunden, Virtual Machine Design and Implementation in C/C++, Wordware Publishing, March 2002 • JVM Instruction Reference (Quick refer.). Estructura de una Java Virtual Machine (JVM) 47 Estructura de una Máquina Virtual Java (JVM) Sesión de laboratorio: VisualJVM Autor: Pedro Pablo Garrido Abenza pgarrido@umh.es Estructura de una Java Virtual Machine (JVM) 48