Introduccin al diseo de los lenguajes de programacin - PowerPoint PPT Presentation

1 / 87
About This Presentation
Title:

Introduccin al diseo de los lenguajes de programacin

Description:

La especificaci n del bytecode est dada por la JVM que tambi n tiene su ... Muchas de las instrucciones est n dadas por el tipo de dato asociado: i para ... – PowerPoint PPT presentation

Number of Views:120
Avg rating:3.0/5.0
Slides: 88
Provided by: juancarlos5
Category:

less

Transcript and Presenter's Notes

Title: Introduccin al diseo de los lenguajes de programacin


1
Introducción al diseño de los lenguajes de
programación
  • M.C. Juan Carlos Olivares Rojas

2
Agenda
  • 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

3
Visió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

4
Visió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

5
Visió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

6
Visió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.

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

8
Consideraciones 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.

9
Consideraciones 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

10
Consideraciones 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.

11
Consideraciones 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.

12
Consideraciones 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.

13
Consideraciones 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

14
Consideraciones 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.

15
Objetivos 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

16
Objetivos 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.

17
Filosofí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

18
Filosofí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

19
Filosofí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.

20
Diseñ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

21
Caso 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

22
Caso 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.

23
Caso 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

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

25
Formato 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    

26
Formato 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    

27
Formato 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    

28
Formato 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

29
Formato del archivo .class
  • CONSTANT_Long 5
  • CONSTANT_Double 6
  • CONSTANT_NameAndType 12
  • CONSTANT_Utf8 1
  • CONSTANT_Class_info     
  • u1 tag    
  • u2 name_index    

30
Formato 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       

31
Formato del Archivo .class
  •  CONSTANT_InterfaceMethodref_info     
  • u1 tag    
  • u2 class_index    
  • u2 name_and_type_index    
  • CONSTANT_String_info     
  • u1 tag    
  • u2 string_index    

32
Formato del Archivo .class
  • CONSTANT_Integer_info     
  • u1 tag   
  •  u4 bytes        
  • CONSTANT_Float_info     
  • u1 tag    
  • u4 bytes    

33
Formato 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    

34
Formato del Archivo .class
  • CONSTANT_NameAndType_info     
  • u1 tag    
  • u2 name_index    
  • u2 descriptor_index    
  • CONSTANT_Utf8_info     
  • u1 tag    
  • u2 length    
  • u1 byteslength    

35
Formato 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.

36
Formato 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.

37
Formato 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    

38
Formato 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

39
Formato 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

40
Formato 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    

41
Formato 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    

42
Formato 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    

43
Formato 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    

44
Formato 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.

45
Formato 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   
     

46
Formato 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

47
Formato 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.

48
Juego 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

49
Juego 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.

50
Juego de Instrucciones JVM
51
Juego 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

52
Juego 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.

53
Juego 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

54
Juego 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

55
Juego 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

56
Juego 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.

57
Juego 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.

58
Juego 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.

59
Juego 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.

60
Juego 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.

61
Juego 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

62
Juego 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

63
Juego 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

64
Juego 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

65
Juego 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

66
Juego 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

67
Juego 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

68
Juego 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

69
Juego 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

70
Juego 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

71
Juego de Instrucciones JVM
  • (0xc5) multianewarray
  • (0xc6) ifnull
  • (0xc7) ifnonnull
  • (0xc8) goto_w
  • (0xc9) jsr_w
  • Códigos reservados
  • (0xca) breakpoint
  • (0xfe) impdep1
  • (0xff) impdep2

72
Ensamblado 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)

73
Ensamblado 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

74
Ensamblado 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

75
Ensamblado 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

76
Ensamblado 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

77
Ensamblado 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

78
Ensamblado 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

79
Ensamblado 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

80
Ensamblado 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

81
Ensamblado 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

82
Ensamblado 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

83
Ensamblado 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?

84
Ensamblado en Java
  • Entrega de proyecto examen viernes 9 de octubre
    de manera presencial.

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

86
Referencias
  • Java Virtual Machine Specification

87
Preguntas?
Write a Comment
User Comments (0)
About PowerShow.com