Title: Introduccin al diseo de los lenguajes de programacin
1Introducción al diseño de los lenguajes de
programación
- M.C. Juan Carlos Olivares Rojas
2Agenda
- Visión del problema
- Consideraciones preliminares
- Objetivos y filosofías del diseño de los
lenguajes de programación - Diseño detallado
- Caso de estudio
3Visión del Problema
- Los lenguajes de computación pueden ser de
propósito general o específicos. - C, C, Java, Pascal, etc. son lenguajes de
programación de propósito general - SQL, PROMELA, Actionscripts son lenguajes
específicos
4Visión del Problema
- Los lenguajes de programación son como los
carros, existen para todos los gustos y/o usos. - Quién cargaría una tonelada de papas en un auto
deportivo? - Los lenguajes de propósito general son como los
autos sedán, sirven para casi todo
5Visión del Problema
- Se debe identificar que es lo que se piensa hacer
con el lenguaje, ya que puede ser sólo la
estructuración de contenido Web, visualizar
información o bien realizar la conversión de un
documento. -
- HTML es lenguaje de representación visual
- OWL es lenguaje de descripción de elementos
- C es un lenguaje programación de propósito general
6Visión del Problema
- Generalmente se cree que un lenguaje se crea
diseñando su gramática y aunque es cierta la
afirmación previamente se debió haber realizado
un modelado (análisis y diseño) del problema que
se pretende resolver. - Por ejemplo una problemática de los lenguajes
naturales es que son cambiantes dependiendo de la
región. Existe un lenguaje universal llamado
Esperanto que pretende resolver el problema.
7Visión del Problema
- En nuestro curso desarrollaremos un ensamblador
para la máquina virtual de Java. - El código fuente que recibirá el traductor será
directamente en la sintaxis de la especificación
de la máquina virtual de Java en un archivo texto
plano con extensión .jas. La salida generada
(código objeto) será un archivo .class válido
(ejecutable por la máquina virtual de java
comando java-).
8Consideraciones Preliminares
- Debemos tomar en cuenta las palabras reservadas
del lenguaje, los operadores, los tipos de datos.
- Debemos considerar el objetivo del lenguaje, si
es un lenguaje de enseñanza, si es un lenguaje
para profesionales, si el código desarrollado va
a ser mejor.
9Consideraciones preliminares
- Todo código puede ser desensamblado.
- Los archivos .exe se pueden desemsamblar con el
comando debug de DOS. - Los archivos .class de java sufren el mismo
efecto. Esto se puede realizar con el comando
javap, la sintaxis es javap archivo. Donde
archivo es e nombre del archivo .class sin la
extensión
10Consideraciones preliminares
- Al realizar el desensamblado sólo se muestra la
firma de los métodos, atributos y nombre de la
clase más no su implementación. - Para observar los bytecode generados se deberá
colocar la opción c de esta forma muestra el
ensamblado más directo.
11Consideraciones Preliminares
- Los archivos .class son archivos en binario si
se intentan abrir en un editor de texto plano no
se visualizan de forma adecuada. - Se necesitan de editores hexadecimales para poder
abrir cada byte de información. - La especificación del bytecode está dada por la
JVM que también tiene su especificación definida.
12Consideraciones preliminares
- Las especificaciones de la arquitectura Java se
encuentran en documentos denominados JSR y tienen
un número que los identifica de manera única. - Estos documentos se encuentran dentro del JCP
(http//www.jcp.org). Se deberá investigar
exactamente como funciona y cuales son los
mnemotécnicos básicos del ensamblador de Java.
13Consideraciones Preliminares
- Realizar un programa Hola mundo desde consola y
uno gráfico (utilizando JOptionPane.showMessageDia
log). - Utilizando un editor hexadecimal visualizar los
archivos .class - Desensamblar cada archivo .class con javap
14Consideraciones Preliminares
- Desensamblar cada archivo .class con la opción
c - Explicar que trata de hacer cada línea del
ensamblado. - Generar un archivo en java con método main vacío
y otra clase sin nada implementado. Ver que
código generan.
15Objetivos y usos de los lenguajes
- Algunos usos de los lenguajes de programación
son - Comunicación humana
- Prevención y Detección de errores
- Usabilidad
- Portabilidad
- Independencia de la máquina
16Objetivos y usos
- Se pretende que este lenguaje ensamblador pueda
servir para realizar programas en Java
directamente o implementarse en un chip de
picoJava. - Con el conocimiento adquirido el código de otro
lenguaje como C/C podría migrarse al bytecode
de Java directamente.
17Filosofías
- Se debe lograr una correcta comunicación entre
emisor y receptor. - Es más importante que un programa sea leíble que
escribible, ya que un programa generalmente se
escribe una vez y se lee muchas veces
(documentación, mantenimiento, etc.) - La tendencia actual es separa la interfaz de la
implementación
18Filosofías
- Tratar de hacer lenguajes para múltiples
arquitecturas de computadoras (máquinas
virtuales). - Control de apuntadores
- Control de tipo de datos robustos
- Simplicidad por eficiencia
19Filosofía
- Para nuestro desarrollo se hará énfasis en lo que
es el lenguaje Java y no en sus APIs como tal. - De esta forma el ensamblador podrá ser real o
bien implementarse sobre una máquina virtual. - La implementación del código en Java puede
realizarse a través de diversas máquinas
virtuales como IJVM.
20Diseño Detallado
- Considerar características como
- Patrones de diseño
- Paquetes (bibliotecas, APIs, componentes)
- Excepciones
- Validaciones
- Marco de trabajo
- Utilerías auxiliares (preprocesador, enlazador)
- Inclusión de otros lenguajes
21Caso de Estudio
- Explicar el lenguaje que se va a desarrollar en
el curso - Por qué se va a desarrollar (problemática)?
- Vocabulario del lenguaje (léxico palabras clases
que hacen) - Reglas de estructura (gramática, sintaxis)
Semántica - Si existe código intermedio
- Si se mejora ese código
- El código objeto final
22Caso de Estudio
- Se necesita primeramente comprender el código de
un lenguaje como Java a nivel de su ensamblado. - Actividad modificar el .class de una clase con
un valor diferente. Comprobar que sucede al
ejecutar. - Compilar un programa de java con una versión más
vieja del JDK, correrla en una versión más nueva.
23Caso de Estudio
- Compilar un programa de java con la versión más
actual de Java correr el programa en un JDK más
viejo. - Formato del archivo .class
24Propuesta de Examen
- Documentación extensiva y armado de un archivo
.class de manera directa. Programa que lea
.class y pueda interpretar valores. - Se recomienda utilizar la clase DataInputStream
con el comando read que devuelve el primer byte
del flujo y así de manera consecutiva. - En parejas, equivale el 70 del parcial
(ponderación del examen).
25Formato del Archivo .class
- ClassFile
- u4 magic
- u2 minor_version
- u2 major_version
- u2 constant_pool_count
- cp_info constant_pool constant_pool_count-1
- u2 access_flags
- u2 this_class
- u2 super_class
26Formato del Archivo .class
- u2 interfaces_count
- u2 interfacesinterfaces_count
- u2 fields_count
- field_info fieldsfields_count
- u2 methods_count
- method_info methodsmethods_count
- u2 attributes_count
- attribute_info attributes attributes_count
-
27Formato del archivo .class
- magic 0xCAFEBABE
- minor_version, major version Rango de versiones
válidas. - constant_pool_countcontador de constantes.
- constant_pool tabla de constantes, su tamaño
es uno menos que el contador. - cp_info
- u1 tag
- u1 info
-
28Formato del Archivo .class
- El valor de cada campo varía de acuerdo a su
tipo -
- CONSTANT_Class 7
- CONSTANT_Fieldref 9
- CONSTANT_Methodref 10
- CONSTANT_InterfaceMethodref 11
- CONSTANT_String 8
- CONSTANT_Integer 3
- CONSTANT_Float 4
29Formato del archivo .class
- CONSTANT_Long 5
- CONSTANT_Double 6
- CONSTANT_NameAndType 12
- CONSTANT_Utf8 1
- CONSTANT_Class_info
- u1 tag
- u2 name_index
30Formato del Archivo .class
- CONSTANT_Fieldref_info
- u1 tag
- u2 class_index
- u2 name_and_type_index
- CONSTANT_Methodref_info
- u1 tag
- u2 class_index
- u2 name_and_type_index
31Formato del Archivo .class
- CONSTANT_InterfaceMethodref_info
- u1 tag
- u2 class_index
- u2 name_and_type_index
- CONSTANT_String_info
- u1 tag
- u2 string_index
32Formato del Archivo .class
- CONSTANT_Integer_info
- u1 tag
- u4 bytes
- CONSTANT_Float_info
- u1 tag
- u4 bytes
33Formato del Archivo .class
- CONSTANT_Long_info
- u1 tag
- u4 high_bytes
- u4 low_bytes
- CONSTANT_Double_info
- u1 tag
- u4 high_bytes
- u4 low_bytes
34Formato del Archivo .class
- CONSTANT_NameAndType_info
- u1 tag
- u2 name_index
- u2 descriptor_index
- CONSTANT_Utf8_info
- u1 tag
- u2 length
- u1 byteslength
35Formato del archivo .class
- access_flags banderas
- ACC_PUBLIC 0x0001
- ACC_FINAL 0x0010
- ACC_SUPER 0x0020
- ACC_INTERFACE 0x0200
- ACC_ABSTRACT 0x0400
- Thisclass indica un rango válido dentro de la
tabla de constantes para el nombre de la clase.
36Formato del Archivo .class
- super_class nombre de la clase padre o 0 si no
existe (la clase es object la cual no deriva). Si
llega a existir se basa en la estructura
CONSTANT_Class_info. - interfaces_count número de interfaces
- interfaces cada valor es un índice de la tabla
de constantes. Cada interface está representada
por un CONSTANT_Class_info.
37Formato del Archivo .class
- fields_count número de campos. No hay dos campos
que tengan los mismos valores. - fields arreglo con los valores de cada campo.
Están representados por una estructura - field_info
- u2 access_flags
- u2 name_index
38Formato del Archivo .class
- u2 descriptor_index
- u2 attributes_count
- attribute_info attributes attributes_count
- Las banderas pueden ser
- ACC_PUBLIC 0x0001
- ACC_PRIVATE 0x0002
- ACC_PROTECTED 0x0004
- ACC_STATIC 0x0008
39Formato del Archivo .class
- ACC_FINAL 0x0010
- ACC_VOLATILE 0x0040
- ACC_TRANSIENT 0x0080
- attributes_count indica el número de atributos
que tiene el campo. En el arreglo attributes se
guardan las especificaciones de cada atributo de
acuerdo a la siguiente estructura
40Formato del Archivo .class
- attribute_info
- u2 attribute_name_index
- u4 attribute_length
- u1 infoattribute_length
- Los valores de los atributos son los siguientes
- SourceFile_attribute
- u2 attribute_name_index
41Formato del Archivo .class
- u4 attribute_length
- u2 sourcefile_index
- ConstantValue_attribute
- u2 attribute_name_index
- u4 attribute_length
- u2 constantvalue_index
- Code_attribute
- u2 attribute_name_index
42Formato del Archivo .class
- u4 attribute_length
- u2 max_stack
- u2 max_locals
- u4 code_length
- u1 codecode_length
- u2 exception_table_length
- u2 start_pc
- u2 end_pc
- u2 handler_pc
- u2 catch_type
43Formato del Archivo .class
- exception_table exception_table_length
- u2 attributes_count
- attribute_info attributes attributes_count
- Exceptions_attribute
- u2 attribute_name_index
- u4 attribute_length
- u2 number_of_exceptions
44Formato del Archivo .class
- u2 exception_index_table number_of_exceptions
- Otros atributos son InnerClasses, Synthetic,
LineNumberTable, LocalVariableTable, and
Deprecated attributes. - methods_count el número de métodos disponibles.
45Formato del Archivo .class
- Methods arreglo que contiene cada valor de los
métodos en base a la siguiente estructura - method_info
- u2 access_flags
- u2 name_index
- u2 descriptor_index
- u2 attributes_count
- attribute_info attributes attributes_count
46Formato del Archivo .class
- Las banderas son las siguientes
- ACC_PUBLIC 0x0001
- ACC_PRIVATE 0x0002
- ACC_PROTECTED 0x0004
- ACC_STATIC 0x0008
- ACC_FINAL 0x0010
- ACC_SYNCHRONIZED
- ACC_NATIVE 0x0100
- ACC_ABSTRACT 0x0400
- ACC_STRICT 0x0800
47Formato del Archivo .class
- attributes_count el número de atributos de la
clase. - attributesarreglo con los atributos de la
clase. - Examen Recuperar los mnemónicos de las
instrucciones de Java.
48Juego de Instrucciones JVM
- Las instrucciones del ensamblador de Java se
componen de un código de operación de un byte. - El funcionamiento de la máquina virtual es el
siguiente - hacer
- obtener código de operación
- si (hay operandos)
- obtener operandos
49Juego de Instrucciones JVM
- ejecutar la acción del código de operación
- mientras (haya más código de operaciones)
- Muchas de las instrucciones están dadas por el
tipo de dato asociado i para enteros, l para
enteros largos, s para enteros cortos, b para
byte, c para caracter, f para flotantes, d para
dobles, y a para referencias.
50Juego de Instrucciones JVM
51Juego de Instrucciones JVM
- La sintaxis de las instrucciones es
- ltindexgt ltopcodegt ltoperand1gt ltoperand2gt...
ltcommentgt - Por ejemplo
- 8 bipush 100// Push int constant 100
- 10 ldc 1 // Push float constant 100.0
52Juego de Instrucciones JVM
- Los tipos de operaciones son
- Carga y almacenamiento
- Load carga el valor de una variable en la pila.
- Store almacena el valor de la pila en una
variable local.
53Juego de Instrucciones JVM
- Para almacenar un valor constante en la pila
bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null,
iconst_m1, iconst_ltigt, lconst_ltlgt, fconst_ltfgt,
dconst_ltdgt - Obtener acceso a varias variables locales wide.
- Operaciones aritméticas
54Juego de Instrucciones JVM
- Suma add
- Resta iub
- Multiplicación mul
- Division div
- Residuo rem
- Negación neg
- Corrimiento shl
- OR a nivel de bits or
- AND a nivel de bits and
- XOR a nivel de bits xor
55Juego de Instrucciones JVM
- Incremento de variables locales iinc.
- Comparación cmp.
- Instrucciones de conversión
- Entero a long, flotante, o doble i2l, i2f, i2d
- Entero largo a flotante o doble l2f, l2d.
- Flotante a doble f2d.
- Otras conversiones primertipo2segundotipo
56Juego de Instrucciones JVM
- Operaciones para manipular objetos
- Para crear un nuevo ejemplar new.
- Para crear un arreglo newarray, anewarray,
multianewarray. - Para acceder a métodos getfield, putfield,
getstatic, putstatic. - Para cargar un arreglo de componentes dentro de
la pila baload, caload, saload, iaload, laload,
faload, daload, aaload.
57Juego de Instrucciones JVM
- Para almacenar un valor de la pila como un
arreglo de componentes bastore, castore,
sastore, iastore, lastore, fastore, dastore,
aastore. - Para obtener la longitud de un arreglo
arraylength. -
- Para ver las propiedades de clases y ejemplares
instanceof, checkcast.
58Juego de Instrucciones JVM
- Instrucciones para manipular la pila pop, pop2,
dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2,
swap. - Instrucciones para la transfeencia del control
- Ramificación condicional ifeq, iflt, ifle, ifne,
ifgt, ifge, ifnull, ifnonnull, if_icmpeq,
if_icmpne, if_icmplt, if_icmpgt, if_icmple,
if_icmpge, if_acmpeq, if_acmpne.
59Juego de Instrucciones JVM
- Ramificación condicional compuesta tableswitch,
lookupswitch. -
- Ramificación incondicional goto, goto_w, jsr,
jsr_w, ret. - Invocación de métodos e instrucciones de retorno
- invokevirtual invoca un ejemplar de un método de
un objeto.
60Juego de Instrucciones JVM
- Invokeinterface invoca un método que está
definido dentro de una interface. - invokespecial invoca un método de inicialización,
un método privado o un método de una súper clase. - invokestatic un método de una clase estática.
- Lanzamiento de excepciones athrows.
61Juego de Instrucciones JVM
Códigos de operación de los mnemónicos de Java
- (0x00) nop
- (0x01) aconst_null
- (0x02) iconst_m1
- (0x03) iconst_0
- (0x04) iconst_1
- (0x05) iconst_2
- (0x06) iconst_3
- (0x07) iconst_4
- (0x08) iconst_5
- (0x09) lconst_0
- (0x0a) lconst_1
- (0x0b) fconst_0
- (0x0c) fconst_1
- (0x0d) fconst_2
- (0x0e) dconst_0
- (0x0f) dconst_1
- (0x10) bipush
62Juego de Instrucciones JVM
- (0x11) sipush
- (0x12) ld
- (0x13) ldc_w
- (0x14) ldc2_w
- (0x15) iload
- (0x16) lload
- (0x17) fload
- (0x18) dload
- (0x19) aload
- (0x1a) iload_0
- (0x1b) iload_1
- (0x1c) iload_2
- (0x1d) iload_3
- (0x1e) lload_0
- (0x1f) lload_1
- (0x20) lload_2
- (0x21) lload_3
- (0x22) fload_0
- (0x23) fload_1
- (0x24) fload_2
63Juego de Instrucciones JVM
- (0x25) fload_3
- (0x26) dload_0
- (0x27) dload_1
- (0x28) dload_2
- (0x29) dload_3
- (0x2a) aload_0
- (0x2b) aload_1
- (0x2c) aload_2
- (0x2d) aload_3
- (0x2e) iaload
- (0x2f) laload
- (0x30) faload
- (0x31) daload
- (0x32) aaload
- (0x33) baload
- (0x34) caload
- (0x35) saload
- (0x36) istore
- (0x37) lstore
- (0x38) fstore
64Juego de Instrucciones JVM
- (0x39) dstore
- (0x3a) astore
- (0x3b) istore_0
- (0x3c) istore_1
- (0x3d) istore_2
- (0x3e) istore_3
- (0x3f) lstore_0
- (0x40) lstore_1
- (0x41) lstore_2
- (0x42) lstore_3
- (0x43) fstore_0
- (0x44) fstore_1
- (0x45) fstore_2
- (0x46) fstore_3
- (0x47) dstore_0
- (0x48) dstore_1
- (0x49) dstore_2
- (0x4a) dstore_3
- (0x4b) astore_0
- (0x4c) astore_1
65Juego de Instrucciones JVM
- (0x4d) astore_2
- (0x4e) astore_3
- (0x4f) iastore
- (0x50) lastore
- (0x51) fastore
- (0x52) dastore
- (0x53) aastore
- (0x54) bastore
- (0x55) castore
- (0x56) sastore
- (0x57) pop
- (0x58) pop2
- (0x59) dup
- (0x5a) dup_x1
- (0x5b) dup_x2
- (0x5c) dup2
- (0x5d) dup2_x1
- (0x5e) dup2_x2
- (0x5f) swap
- (0x60) iadd
66Juego de Instrucciones JVM
- (0x61) ladd
- (0x62) fadd
- (0x63) dadd
- (0x64) isub
- (0x65) lsub
- (0x66) fsub
- (0x67) dsub
- (0x68) imul
- (0x69) lmul
- (0x6a) fmul
- (0x6b) dmul
- (0x6c) idiv
- (0x6d) ldiv
- (0x6e) fdiv
- (0x6f) ddiv
- (0x70) irem
- (0x71) lrem
- (0x72) frem
- (0x73) drem
- (0x74) ineg
67Juego de Instrucciones JVM
- (0x75) lneg
- (0x76) fneg
- (0x77) dneg
- (0x78) ishl
- (0x79) lshl
- (0x7a) ishr
- (0x7b) lshr
- (0x7c) iushr
- (0x7d) lushr
- (0x7e) iand
- (0x7f) land
- (0x80) ior
- (0x81) lor
- (0x82) ixor
- (0x83) lxor
- (0x84) iinc
- (0x85) i2l
- (0x86) i2f
- (0x87) i2d
- (0x88) l2i
68Juego de Instrucciones JVM
- (0x89) l2f
- (0x8a) l2d
- (0x8b) f2i
- (0x8c) f2l
- (0x8d) f2d
- (0x8e) d2
- (0x8f) d2l
- (0x90) d2f
- (0x91) i2b1
- (0x92) i2c
- (0x93) i2s
- (0x94) lcmp
- (0x95) fcmpl
- (0x96) fcmpg
- (0x97) dcmpl
- (0x98) dcmpg
- (0x99) ifeq
- (0x9a) ifne
- (0x9b) iflt
- (0x9c) ifge
69Juego de Instrucciones JVM
- (0x9d) ifgt
- (0x9e) ifle
- (0x9f) if_icmpeq
- (0xa0) if_icmpne
- (0xa1) if_icmplt
- (0xa2) if_icmpge
- (0xa3) if_icmpgt
- (0xa4) if_icmple
- (0xa5) if_acmpeq1
- (0xa6) if_acmpne
- (0xa7) goto
- (0xa8) jsr
- (0xa9) ret
- (0xaa) tableswitch
- (0xab) lookupswitch
- (0xac) ireturn (0xad)
- lreturn (0xae) freturn
- (0xaf) dreturn (0xb0)
- areturn
70Juego de Instrucciones JVM
- (0xb1) return
- (0xb2) getstatic
- (0xb3) putstatic
- (0xb4) getfield
- (0xb5) putfield
- (0xb6) invokevirtual
- (0xb7) invokespecial
- (0xb8) invokestatic
- (0xb9) invokeinterface
- (0xba) xxxunusedxxx
- (0xbb) new
- (0xbc) newarray
- (0xbd) anewarray
- (0xbe) arraylength
- (0xbf) athrow
- (0xc0) checkcast
- (0xc1) instanceof194
- (0xc2) monitorenter
- (0xc3) monitorexit
- (0xc4) wide
71Juego de Instrucciones JVM
- (0xc5) multianewarray
- (0xc6) ifnull
- (0xc7) ifnonnull
- (0xc8) goto_w
- (0xc9) jsr_w
- Códigos reservados
- (0xca) breakpoint
- (0xfe) impdep1
- (0xff) impdep2
72Ensamblado en Java
- void spin()
- int i
- for (i 0 i lt 100 i)
- // Ciclo vacio
-
- Method void spin()
- 0 iconst_0 // Pone la constante entera 0 en la
pila - 1 istore_1 // Almacena el valor de la pila en la
variable local 1 (i0)
73Ensamblado en Java
- 2 goto 8 // La primera vez no se incrementa
contador - 5 iinc 1 1 // Incrementa la variable local 1 en 1
(i) - 8 iload_1 // Coloca el valor de la variable local
1 en la pila (i) - 9 bipush 100 // Se coloca en la pila el valor
constante entero 100 - 11 if_icmplt 5 // Compara que (i lt 100)
- 14 return // Regresa vacío
74Ensamblado en Java
- void dspin()
- double i
- for (i 0.0 i lt 100.0 i)
- // Loop body is empty
- Method void dspin()
- 0 dconst_0 // Se coloca en la pila el valor 0.0
- 1 dstore_1 // Almacena en la variable local 1 y 2
el valor actual de la pila
75Ensamblado en Java
- 2 goto 9 // La primera ocasión no se incrementa
el contador - 5 dload_1 // Coloca en la pila el valor de las
variables 1 y 2 - 6 dconst_1 // Coloca en la pila el valor de la
constante 1.0 - 7 dadd // suma dado que no hay instrucción inc
- 8 dstore_1 // Almacena el resultado en las
variables locales 1 and 2
76Ensamblado en Java
- 9 dload_1// Coloca en la pila el valor de las
variables locales 1 y 2 - 10 ldc2_w 4 // coloca el valor de la constante
doble 100 en la pila - 13 dcmpg // No existe la instrucción if_dcmplt
- 14 iflt 5 // Compara que (i lt 100.0)
- 17 return// Regresa vacío
77Ensamblado en Java
- double doubleLocals(double d1, double d2)
- return d1 d2
- Desensamblado
- 0 dload_1 // Se carga el primer argumento en las
variables locales 1 y 2 - 1 dload_3 // Se carga el segundo rgumento en
variables locales 3 y 4 - 2 dadd
- 3 dreturn
78Ensamblado en Java
- void sspin()
- short i
- for (i 0 i lt 100 i)
- // Loop body is empty
- Method void sspin()
- 0 iconst_0
- 1 istore_1
- 2 goto 10
79Ensamblado en Java
- 5 iload_1 // El entero corto es tratado como un
entero - 6 iconst_1
- 7 iadd
- 8 i2s // Se trunca a short
- 9 istore_1
- 10 iload_1
- 11 bipush 100
- 13 if_icmplt 5
- 16 return
80Ensamblado en Java
- void useManyNumeric()
- int i 100
- int j 1000000
- long l1 1
- long l2 0xffffffff
- double d 2.2 .
- ...
- Method void useManyNumeric()
- 0 bipush 100// Coloca en la pila el valor 100
81Ensamblado en Java
- 2 istore_1
- 3 ldc 1 // Coloca en la pila el valor constante
1000000 - 5 istore_2
- 6 lconst_1 // Se carga el valor constante 1
- 7 lstore_3
- 8 ldc2_w 6 // Coloca el valor largo 0xffffffff
(-1) - 11 lstore 5
82Ensamblado en Java
- 13 ldc2_w 8 // Coloca el valor constante 2.2
- 16 dstore 7
-
- void whileInt()
- int i 0
- while (i lt 100)
- i
83Ensamblado en Java
- Method void whileInt()
- 0 iconst_0
- 1 istore_1
- 2 goto 8
- 5 iinc 1 1
- 8 iload_1
- 9 bipush 100
- 11 if_icmplt 5
- 14 return
- Se parece al método spin?
84Ensamblado en Java
- Entrega de proyecto examen viernes 9 de octubre
de manera presencial.
85Referencias
- Aho, Sethi, Ullman. Compiladores Principios,
técnicas y herramientas Ed. Addison Wesley. - Beck,. Software de Sistemas, Introducción a la
programación de Sistemas Ed. Addison-Wesley
Iberoamericana. - Kenneth C. Louden. Construcción de compiladores
Principios y práctica. Ed. Thomson.
86Referencias
- Java Virtual Machine Specification
87Preguntas?