• No se han encontrado resultados

Proceso de programación. Estructura de una Máquina Virtual Java (JVM) Problema. Lenguajes tradicionales

N/A
N/A
Protected

Academic year: 2021

Share "Proceso de programación. Estructura de una Máquina Virtual Java (JVM) Problema. Lenguajes tradicionales"

Copied!
12
0
0

Texto completo

(1)

Estructura de una Java Virtual Machine (JVM)

1

Estructura de una

Máquina Virtual Java (JVM)

Sesión de laboratorio: VisualJVM

Autor: Pedro Pablo Garrido Abenza

[email protected]

Estructura de una Java Virtual Machine (JVM) 2

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:

VisualJVM

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

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 3

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes 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.).

Sesión de

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 4

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:

VisualJVM

Lenguajes tradicionales

Hola.c

Hola.c Hola.objHola.obj Hola.exeHola.exe

C API C API Compilación (bcc) Compilación (bcc) Compilación (gcc) Compilación

(gcc) Hola.oHola.o HolaHola

C API C API Enlazado (link) Enlazado (link) Enlazado (ld) Enlazado (ld) Sesión de laboratorio: VisualJVM

(2)

Estructura de una Java Virtual Machine (JVM) 5 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:

VisualJVM

Java - Una nueva idea

• La tecnología Java es:

– Un lenguaje de programación

– Un conjunto plataformas especializadas

• Java fué diseñado específicamente para ser:

Write Once, Run Anywhere”

laboratorio: VisualJVM

J2EE J2SE J2ME

Estructura de una Java Virtual Machine (JVM) 6

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:

VisualJVM

Java - Una nueva idea

• Esto se consiguió gracias al uso de un

código intermedio:

bytecodes

.

– En tiempo de compilación se generan

bytecodes

independientes de la

plataforma.

– En tiempo de ejecución se ejecutan

(interpretan) los

bytecodes

utilizando un

programa llamado Java Virtual Machine

(JVM) sobre una plataforma específica.

laboratorio:

VisualJVM

Estructura de una Java Virtual Machine (JVM) 7

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:

VisualJVM

Tecnología Java

Hola.java Hola.java Hola.class bytecodes Hola.class bytecodes Java API Java API

Plataforma

1

Plataforma

1

Plataforma

Plataforma

22

Plataforma

Plataforma

33

(Código independiente de la plataforma: .class)

Compilación (javac) Compilación (javac) JVM1 (java) JVM1 (java) JVM(java)2 JVM2 (java) JVM(java)3 JVM3 (java) Sesión de laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 8

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio:

VisualJVM

Tecnología Java

• Ventajas:

– Multiplataforma

– Código compacto:

bytecodes

– Aplicaciones convencionales y

applets

– Paradigma POO

• Inconvenientes:

– Velocidad de ejecución lenta

Sesión de

laboratorio: VisualJVM

(3)

Estructura de una Java Virtual Machine (JVM) 9 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:

VisualJVM

Tecnología Java

• Ventajas:

– Multiplataforma

– Código compacto: bytecodes

– Aplicaciones convencionales y applets

– Paradigma POO

• Inconvenientes:

– Velocidad de ejecución lenta

(interpretado)

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 10

1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio:

VisualJVM

Tecnología Java

• Comparando Java con los lenguajes

tradicionales:

laboratorio: VisualJVM

Hardware

Sistema Operativo

Programas

(código nativo) Lenguajes tradicionales

Hardware

Sistema Operativo

Máquina Virtual

(bytecodes => código nativo)

Tecnología Java

Prog. Java

(bytecodes)

Clases Java

(bytecodes)

Estructura de una Java Virtual Machine (JVM) 11

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

¿Por qué estudiar la JVM?

• 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.

Sesión de

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 12

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Implementaciones JVM

• Intérpretes desarrollados:

– Sun Microsystems

– Microsoft, Borland, IBM

– Otros: Kaffe, LaTTe, Kissme, SableVM,

Wonka, ...,

VisualJVM

.

• Todos deben ser compatibles:

The Java Virtual Machine Specification

Otras especificaciones (JNI, ...).

Sesión de laboratorio: VisualJVM

(4)

Estructura de una Java Virtual Machine (JVM) 13 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes laboratorio: VisualJVM

Hardware

Sistema Operativo

JVM - JNI

(awt.dll, net.dll, ...)

JVM

Programas

Java

Librería

clases Java

Java Language Specification

Java API Specification

JVM Specification JNI Specification

La torre de especificaciones

Implementaciones JVM

Estructura de una Java Virtual Machine (JVM) 14

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Estructura de la JVM

Una JVM contiene básicamente:

1. Zona de memoria dinámica (heap)

2. Zona de métodos

3. Hilos de ejecución (threads)

laboratorio: VisualJVM Memoria dinámica (Heap) Hilos (Threads) Zona de métodos

Estructura de una Java Virtual Machine (JVM) 15

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Estructura de la JVM – 1/3

1. Zona de memoria dinámica (heap):

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.

Sesión de laboratorio: VisualJVM GC Heap Heap Heap Heap Objeto Amarillo eliminado Objeto Amarillo aun vigente

Estructura de una Java Virtual Machine (JVM) 16

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Estructura de la JVM – 2/3

2. Zona de métodos:

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.

print exit factorial Zona métodos Zona métodos Sesión de laboratorio: VisualJVM

public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }

public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }

(5)

Estructura de una Java Virtual Machine (JVM) 17 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Estructura de la JVM – 3/3

3. Hilos de ejecución (threads):

Sólo uno estará activo en un instante.

Cada hilo contiene:

• ID: un identificador único.

• Stack JVM: pila de llamadas a métodos – Cada elemento de la pila es un marco (Frame). – Frame Pointer (FP): puntero que señala al marco de

la cima, el marco actual.

PC SP Program Counter Frame Pointer laboratorio: VisualJVM Marco 0 Hilo (Thread) Hilo (Thread) Stack JVM ID: Marco 1 Marco 2 Marco 3 FP Marco actual main ()

Estructura de una Java Virtual Machine (JVM) 18

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Estructura de la JVM – 3/3

3.

Elementos de un marco (Frame):

laboratorio:

VisualJVM

main (String args[]) { ... } #0. args #1. ... #0. args Marco llamador Método asociado Pila de operandos Vars. locales=2 Args.=1

Puntero al marco que le ha llamado, para retornarle valores.

Puntero al marco que le ha llamado, para retornarle valores.

Código del método, que estará ejecutando la

instrucción indicada por el PC Código del método, que estará ejecutando la

instrucción indicada por el PC

Los opcodes la utilizan para extraer sus parámetros (pop) y dejar los resultados (push).

Los opcodes la utilizan para extraer sus parámetros (pop) y dejar los resultados (push).

Zona para las variables locales; las primeras siempre son los

argumentosrecibidos por el método.

Zona para las variables locales; las primeras siempre son los

argumentosrecibidos por el método.

PC

Estructura de una Java Virtual Machine (JVM) 19

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Invocaciones: args/return

Sesión de laboratorio: VisualJVM

Frame 0

(main) PC FP Program Counter Frame Pointer FP Null public static void main

(String args[]) { int n=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC

public class P1e {

public static void main (String args[]) { int n = sumaNat (3, 4);

}

private int sumaNat (int ini, int fin) { int i, suma=0;

for (i=ini; i<=fin; i++) { suma+=i; } return (suma);

} }

public class P1e {

public static void main (String args[]) {

int n = sumaNat (3, 4); }

private int sumaNat (int ini, int fin) {

int i, suma=0;

for (i=ini; i<=fin; i++) { suma+=i; }

return (suma); }

}

Estructura de una Java Virtual Machine (JVM) 20

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes Sesión de laboratorio: VisualJVM PC FP Program Counter Frame Pointer

Invocaciones: args/return

Frame 0

(main) FP Null public static void main

(String args[]) { int n=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC 4 3

(6)

Estructura de una Java Virtual Machine (JVM) 21 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Invocaciones: args/return

laboratorio: VisualJVM PC FP Program Counter Frame Pointer

Frame 0

(main)

Frame 1

(sumaNat) FP Null

public static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1 PC

private intsumaNat (intini, intfin) {

inti, suma=0;

for(i=ini; i<=fin; i++) { suma+=i; }

return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = ? #3. suma = 0 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC 4 3

Estructura de una Java Virtual Machine (JVM) 22

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Invocaciones: args/return

laboratorio: VisualJVM PC FP Program Counter Frame Pointer

Frame 0

(main)

Frame 1

(sumaNat) FP Null

public static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1

private intsumaNat (intini, intfin) {

inti, suma=0;

for(i=ini; i<=fin; i++) { suma+=i; }

return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC PC 7

Estructura de una Java Virtual Machine (JVM) 23

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Invocaciones: args/return

Sesión de laboratorio: VisualJVM PC FP Program Counter Frame Pointer

Frame 0

(main)

Frame 1

(sumaNat) FP Null

public static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = ? #0. args=... Pila oper. Vars. locales=2 Args.=1

private intsumaNat (intini, intfin) {

inti, suma=0;

for(i=ini; i<=fin; i++) { suma+=i; }

return(suma); } Llamador Método asociado #0. ini = 3 #1. fin = 4 #2. i = 5 #3. suma = 7 #0. ini = 3 #1. fin = 4 Pila oper. Vars. locales=2 Args.=1 PC PC 7

Estructura de una Java Virtual Machine (JVM) 24

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Invocaciones: args/return

Sesión de laboratorio: VisualJVM PC FP Program Counter Frame Pointer FP

Frame 0

(main) Null

public static voidmain (String args[]) { intn=sumaNat(3,4); } Llamador Método asociado #0. args=... #1. n = 7 #0. args=... Pila oper. Vars. locales=2 Args.=1 PC

(7)

Estructura de una Java Virtual Machine (JVM) 25 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Procesado

• Fases para el procesado de clases Java antes

de su ejecución:

2

3

Carga

Inicio

Enlace

Inicialización

Final

Verificación

Preparación

Resolución

1

2.a

2.b

2.c

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 26

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Fase de carga

• Tareas:

– Búsqueda y carga de clases Java

• Almacenamiento de clases Java:

– Archivos .class empaquetados en los

archivos

.ZIP

o

.JAR

de Java:

C:\Archivos de programa\Java\jdk1.5.0\jre\lib\rt.jar C:\WINDOWS\java\Packages\*.zip

– Archivos

.class

en cualquier directorio

especificado en la variable

CLASSPATH

.

– Archivos .ZIP o .JAR especificados en la

variable

CLASSPATH

.

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 27

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Fase de carga

• Los archivos .class son archivos binarios:

Sesión de laboratorio: VisualJVM Número mágico: 0xCAFE BABE Número mágico: 0xCAFE BABE Versión: 0x0000 0031 = 49.0 (J2SDK 1.5.0) Versión: 0x0000 0031 = 49.0 (J2SDK 1.5.0)

Estructura de una Java Virtual Machine (JVM) 28

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Fase de carga

• Estructura de una clase (.class):

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.

Sesión de laboratorio: VisualJVM

(8)

Estructura de una Java Virtual Machine (JVM) 29 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Fase de carga

• Lista de clases cargadas:

– Lista enlazada:

– Tabla Hash de dispersión abierta:

A K D Q NULL 1 2 3 4 5 6 7 0 A Q K D

Función dispersión: Σ(ASCII(nombre)) % cubetas Ejemplo: “A” ⇒(65 % 8) = 1

8

cube ta s NULL NULL NULL NULL NULL NULL NULL NULL laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 30

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Fase de enlace

• Se divide en 3 subfases:

– Verificación: formato correcto

– Preparación: creación de datos de clase

– Resolución de referencias simbólicas:

• Estática: se resuelven todas al principio (de forma recursiva).

• Perezosa: se resuelven sólo cuando son realmente utilizadas.

58

186

Perezosa

917

1398

Estática

Microsoft

Sun

Resolución

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 31

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Clases - Inicialización

• Tareas:

– Ejecución de los constructores de clase

(Métodos

<clinit>

).

• Una vez procesada una clase

completamente, ya será posible ...

– Crear instancias de esa clase.

– Ejecutar los métodos que incluye.

Sesión de

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 32

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

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)

Sesión de

laboratorio: VisualJVM

(9)

Estructura de una Java Virtual Machine (JVM) 33 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Repertorio de instrucciones

laboratorio: VisualJVM

• La JVM tiene

200

opcodes: 00..FF

• A cada opcode se le asocia una

palabra fácil de recordar:

mnemónico

:

Estructura de una Java Virtual Machine (JVM) 34

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Repertorio de instrucciones

• Los opcodes se pueden agrupar por

categorías

:

– 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

laboratorio: VisualJVM

opcode

opcode

[arg1] [arg2] [arg3] [arg4] [arg5]

[arg1] [arg2] [arg3] [arg4] [arg5]

Estructura de una Java Virtual Machine (JVM) 35

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Repertorio de instrucciones

• Ejemplos – Load y Store:

– 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.

Sesión de laboratorio: VisualJVM PC SP Program Counter Stack Pointer Null i = ini; iload_0 istore_2 Llamador Método asociado #0. ini=3 #1. fin=4 #2. i = ? #0. ini=3 #1. fin=4 Pila oper. Vars. locales=2 Args.=2 3 iload_0 istore_2 Se compila como ...

Estructura de una Java Virtual Machine (JVM) 36

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Repertorio de instrucciones

• Ejemplos - varios:

3 4 SP 3 SP SP 7

Apila en la pila de operandos el valor entero 4.

bipush 4 16

(0x10)

Apila en la pila de operandos el valor de la constante nº 4 de la zona de constantes (ConstantPool).

ldc #4 18

(0x12)

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)

iadd 096 (0x60)

Finaliza la ejecución del método actual, retornando al método llamador.

return 177 (0xB1) Operación mnemónico opcode Sesión de laboratorio: VisualJVM PC SP Program Counter

(10)

Estructura de una Java Virtual Machine (JVM) 37 laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

Repertorio de instrucciones

• Para obtener el código de un método

de una clase hay varias utilidades:

– javap (Java 2 SDK):

javap -c -verbose HelloWorld

– Jasper (& Jasmin):

java -jar Jasper.jar HelloWorld

– jclasslib Bytecode Viewer

– Class Viewer for Java

– VisualJVM

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 38

laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

VisualJVM

laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 39

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

VisualJVM

Sesión de laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM) 40

Ejemplo 1

C:\> javap -c –verbose HelloWorld Compiled from HelloWorld.java class HelloWorld extends Object{ HelloWorld();

Code:

0: aload_0 1: invokespecial #1 4: return

public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return }

C:\> javap -c –verbose HelloWorld Compiled from HelloWorld.java class HelloWorld extends Object{ HelloWorld();

Code:

0: aload_0 1: invokespecial #1 4: return

public static void main (java.lang.String[]); Code: 0: getstatic #2; 3: ldc #3; 5: invokevirtual #4; 8: return } Constant pool: const # 1 = Method #6.#15; const # 2 = Field #16.#17; const # 3 = String #18; const # 4 = Method #19.#20; const # 5 = class #21; const # 6 = class #22; const # 7 = Asciz <init>; const # 8 = Asciz ()V; const # 9 = Asciz Code;

const #10 = Asciz LineNumberTable; const #11 = Asciz main;

const #12 = Asciz ([Ljava/lang/String;)V; const #13 = Asciz SourceFile;

const #14 = Asciz HelloWorld.java; const #15 = NameAndType #7:#8;

const #16 = class #23; const #17 = NameAndType #24:#25;

const #18 = Asciz Hello World!!; const #19 = class #26;

const #20 = NameAndType #27:#28; const #21 = Asciz HelloWorld; const #22 = Asciz java/lang/Object;

const #23 = Asciz java/lang/System; const #24 = Asciz out;

const #25 = Asciz Ljava/io/PrintStream;;

const #26 = Asciz java/io/PrintStream; const #27 = Asciz println;

const #28 = Asciz (Ljava/lang/String;)V; Constant pool: const # 1 = Method #6.#15; const # 2 = Field #16.#17; const # 3 = String #18; const # 4 = Method #19.#20; const # 5 = class #21; const # 6 = class #22;

const # 7 = Asciz <init>;

const # 8 = Asciz ()V;

const # 9 = Asciz Code;

const #10 = Asciz LineNumberTable;

const #11 = Asciz main;

const #12 = Asciz ([Ljava/lang/String;)V; const #13 = Asciz SourceFile;

const #14 = Asciz HelloWorld.java; const #15 = NameAndType #7:#8;

const #16 = class #23;

const #17 = NameAndType #24:#25;

const #18 = Asciz Hello World!!;

const #19 = class #26;

const #20 = NameAndType #27:#28; const #21 = Asciz HelloWorld; const #22 = Asciz java/lang/Object;

const #23 = Asciz java/lang/System;

const #24 = Asciz out;

const #25 = Asciz Ljava/io/PrintStream;;

const #26 = Asciz java/io/PrintStream; const #27 = Asciz println;

const #28 = Asciz (Ljava/lang/String;)V;

// HelloWorld.java public class HelloWorld {

public static void main (String args[]) { System.out.println ("Hello World!!"); } } // HelloWorld.java public class HelloWorld {

public static void main (String args[]) { System.out.println

("Hello World!!"); }

(11)

Estructura de una Java Virtual Machine (JVM) 41

Ejemplo 2: control de flujo

// Par.java public class Par {

public static void main (String args[]) { boolean b = esPar(6); }

public static boolean esPar (int n) { if ((n % 2) == 0) { return (true); } else { return (false); } } // Par.java public class Par {

public static void main (String args[]) {

boolean b = esPar(6); }

public static boolean esPar (int n) { if ((n % 2) == 0) { return (true); } else { return (false); } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz esPar;

const #12 = Asciz (I)Z; const #13 = Asciz SourceFile; const #14 = Asciz Par.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz Par;

const #18 = Asciz java/lang/Object; Constant pool:

const # 1 = Method #4.#15; const # 2 = Method #3.#16;

const # 3 = class #17;

const # 4 = class #18;

const # 5 = Asciz <init>;

const # 6 = Asciz ()V;

const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable;

const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V;

const #11 = Asciz esPar;

const #12 = Asciz (I)Z;

const #13 = Asciz SourceFile; const #14 = Asciz Par.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12;

const #17 = Asciz Par;

const #18 = Asciz java/lang/Object;

Estructura de una Java Virtual Machine (JVM) 42

Ejemplo 2: control de flujo

C:\> javap -c –verbose Par Compiled from Par.java class Par extends Object{ public Par();

Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main

(java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1 0: bipush 6

2: invokestatic #2; // Method esPar:(I)Z 5: istore_1

6: return

C:\> javap -c –verbose Par Compiled from Par.java class Par extends Object{

public Par(); Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main

(java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1 0: bipush 6

2: invokestatic #2;

// Method esPar:(I)Z

5: istore_1 6: return

public static boolean esPar(int); Code: Stack=2,Locals=1,Args_size=1 0: iload_0 1: iconst_2 2: irem 3: ifne 8 6: iconst_1 7: ireturn 8: iconst_0 9: ireturn}

public static boolean esPar(int); Code: Stack=2,Locals=1,Args_size=1 0: iload_0 1: iconst_2 2: irem 3: ifne 8 6: iconst_1 7: ireturn 8: iconst_0 9: ireturn}

Estructura de una Java Virtual Machine (JVM) 43

Ejemplo 3: factorial iterativo

// FactIter.java public class FactIter {

public static void main (String args[]) { int n = fact(3); }

public static int fact(int n) { int res; for (res=1; (n>=1); n--) { res *= n; } return (res); } } // FactIter.java public class FactIter {

public static void main (String args[]) { int n = fact(3); }

public static int fact(int n) {

int res; for (res=1; (n>=1); n--) { res *= n; } return (res); } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V;

const #11 = Asciz fact; const #12 = Asciz (I)I;

const #13 = Asciz SourceFile; const #14 = Asciz FactIter.java; const #15 = NameAndType #5:#6;

const #16 = NameAndType #11:#12; const #17 = Asciz FactIter;

const #18 = Asciz java/lang/Object; Constant pool:

const # 1 = Method #4.#15; const # 2 = Method #3.#16;

const # 3 = class #17;

const # 4 = class #18;

const # 5 = Asciz <init>;

const # 6 = Asciz ()V;

const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable;

const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V;

const #11 = Asciz fact; const #12 = Asciz (I)I;

const #13 = Asciz SourceFile; const #14 = Asciz FactIter.java; const #15 = NameAndType #5:#6;

const #16 = NameAndType #11:#12;

const #17 = Asciz FactIter;

const #18 = Asciz java/lang/Object;

Estructura de una Java Virtual Machine (JVM) 44

Ejemplo 3: factorial iterativo

C:\> javap -c –verbose FactIter Compiled from FactIter.java class FactIter extends Object{ public FactIter();

Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main (java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1 0: iconst_3

1: invokestatic #2;

// Method fact:(I)I

4: istore_1 5: return

C:\> javap -c –verbose FactIter Compiled from FactIter.java class FactIter extends Object{

public FactIter(); Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main (java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1 0: iconst_3

1: invokestatic #2;

// Method fact:(I)I

4: istore_1 5: return

public static int fact (int); Code: Stack=2,Locals=2,Args_size=1 0: iconst_1 1: istore_1 2: iload_0 3: iconst_1 4: if_icmplt 17 7: iload_1 8: iload_0 9: imul 10: istore_1 11: iinc 0, -1 14: goto 2 17: iload_1 18: ireturn }

public static int fact (int); Code: Stack=2,Locals=2,Args_size=1 0: iconst_1 1: istore_1 2: iload_0 3: iconst_1 4: if_icmplt 17 7: iload_1 8: iload_0 9: imul 10: istore_1 11: iinc 0, -1 14: goto 2 17: iload_1 18: ireturn }

(12)

Estructura de una Java Virtual Machine (JVM) 45

Ejemplo 4: factorial recursivo

// FactRecu.java public class FactRecu {

public static void main (String args[]) { int n = fact(6); }

public static int fact(int n) { if (n==1) { return (1); } else { return (n*fact(n-1)); } } } // FactRecu.java public class FactRecu {

public static void main (String args[]) { int n = fact(6); }

public static int fact(intn) {

if (n==1) { return (1); } else { return (n*fact(n-1)); } } } Constant pool: const # 1 = Method #4.#15; const # 2 = Method #3.#16; const # 3 = class #17; const # 4 = class #18; const # 5 = Asciz <init>; const # 6 = Asciz ()V; const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable; const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V; const #11 = Asciz fact;

const #12 = Asciz (I)I; const #13 = Asciz SourceFile; const #14 = Asciz FactRecu.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz FactRecu; const #18 = Asciz java/lang/Object; Constant pool:

const # 1 = Method #4.#15; const # 2 = Method #3.#16;

const # 3 = class #17;

const # 4 = class #18;

const # 5 = Asciz <init>;

const # 6 = Asciz ()V;

const # 7 = Asciz Code;

const # 8 = Asciz LineNumberTable;

const # 9 = Asciz main;

const #10 = Asciz ([Ljava/lang/String;)V;

const #11 = Asciz fact;

const #12 = Asciz (I)I;

const #13 = Asciz SourceFile; const #14 = Asciz FactRecu.java; const #15 = NameAndType #5:#6; const #16 = NameAndType #11:#12; const #17 = Asciz FactRecu; const #18 = Asciz java/lang/Object;

Estructura de una Java Virtual Machine (JVM) 46

Ejemplo 4: factorial recursivo

C:\> javap -c –verbose FactRecu Compiled from FactRecu.java class FactRecu extends Object{ public FactRecu();

Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main (java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1 0: bipush 6

2: invokestatic #2; // Method fact:(I)I 5: istore_1

6: return

C:\> javap -c –verbose FactRecu Compiled from FactRecu.java class FactRecu extends Object{

public FactRecu(); Code:

Stack=1, Locals=1, Args_size=1 0: aload_0

1: invokespecial #1;

// Method java/lang/Object."<init>":()V

4: return

public static void main (java.lang.String[]); Code:

Stack=1, Locals=2, Args_size=1

0: bipush 6

2: invokestatic #2;

// Method fact:(I)I

5: istore_1 6: return

public static int fact(int); Code: Stack=3,Locals=1,Args_size=1 0: iload_0 1: iconst_1 2: if_icmpne 7 5: iconst_1 6: ireturn 7: iload_0 8: iload_0 9: iconst_1 10: isub 11: invokestatic #2; // Method fact:(I)I 14: imul 15: ireturn }

public static int fact(int); Code: Stack=3,Locals=1,Args_size=1 0: iload_0 1: iconst_1 2: if_icmpne 7 5: iconst_1 6: ireturn 7: iload_0 8: iload_0 9: iconst_1 10: isub 11: invokestatic #2; // Method fact:(I)I 14: imul 15: ireturn }

Estructura de una Java Virtual Machine (JVM) 47

Sesión de laboratorio: VisualJVM 1 2 3 Tecn. Java Inicio Estruct. JVM Estruct. .class Final 4 Opcodes

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.).

Sesión de laboratorio: VisualJVM

Estructura de una Java Virtual Machine (JVM)

48

Estructura de una

Estructura de una

Máquina Virtual Java (JVM)

Máquina Virtual Java (JVM)

Sesión de laboratorio:

Sesión de laboratorio:

VisualJVM

VisualJVM

Autor: Pedro Pablo Garrido Abenza

Autor: Pedro Pablo Garrido Abenza

[email protected]

Referencias

Documento similar

CENTRE PRIVAT FP LA

It can be noticed from Table (5-19) that most of The Washington Post and The Guardian newspapers’ media items that dealt with reforms in Saudi Arabia in the first period (before

public class TestFrameworkClassLoader extends URLClassLoader{. private static

FP 9524.- Coluvión con fragmentos de calizas M páramo sobre las arcillas inferiores.... FP 9525.- Vista general de la serie estratigráfica de

In the current study, we explore di fferent aspects that a ffect DNN performance, with a special focus on very short utterances and real-time applications. We believe the

Como lenguajes de programación se han usado Java para los endpoints, Python para obtener los datos de los sensores en la Raspberry y nodejs para la conexión con la base de datos y

Las  aplicaciones Android están escritas en lenguaje Java.  Aunque  ya hemos 

C oincidiendo con el final del curso académico, una veintena de estudiantes de Formación Profesional (FP) concluyen este mes sus prácticas en la Universidad Politécnica de