Introduccin al diseo de los lenguajes de programacin

  • Slides: 87
Download presentation
Introducción al diseño de los lenguajes de programación M. C. Juan Carlos Olivares Rojas

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

Agenda • Visión del problema • Consideraciones preliminares • Objetivos y filosofías del diseño

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

Visión del Problema • Los lenguajes de computación pueden ser de propósito general o

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

Visión del Problema • Los lenguajes de programación son como los carros, existen para

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

Visión del Problema • Se debe identificar que es lo que se piensa hacer

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

Visión del Problema • Generalmente se cree que un lenguaje se crea diseñando su

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.

Visión del Problema • En nuestro curso desarrollaremos un ensamblador para la máquina virtual

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

Consideraciones Preliminares • Debemos tomar en cuenta las palabras reservadas del lenguaje, los operadores,

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.

Consideraciones preliminares • Todo código puede ser desensamblado. • Los archivos *. exe se

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

Consideraciones preliminares • Al realizar el desensamblado sólo se muestra la firma de los

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.

Consideraciones Preliminares • Los archivos *. class son archivos en binario si se intentan

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.

Consideraciones preliminares • Las especificaciones de la arquitectura Java se encuentran en documentos denominados

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.

Consideraciones Preliminares • Realizar un programa Hola mundo desde consola y uno gráfico (utilizando

Consideraciones Preliminares • Realizar un programa Hola mundo desde consola y uno gráfico (utilizando JOption. Pane. show. Message. Dialog). • Utilizando un editor hexadecimal visualizar los archivos *. class • Desensamblar cada archivo *. class con javap

Consideraciones Preliminares • Desensamblar cada archivo *. class con la opción –c • Explicar

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.

Objetivos y usos de los lenguajes • Algunos usos de los lenguajes de programación

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

Objetivos y usos • Se pretende que este lenguaje ensamblador pueda servir para realizar

Objetivos y usos • Se pretende que este lenguaje ensamblador pueda servir para realizar programas en Java directamente o implementarse en un chip de pico. Java. • Con el conocimiento adquirido el código de otro lenguaje como C/C++ podría migrarse al bytecode de Java directamente.

Filosofías • Se debe lograr una correcta comunicación entre emisor y receptor. • Es

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

Filosofías • Tratar de hacer lenguajes para múltiples arquitecturas de computadoras (máquinas virtuales). •

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

Filosofía • Para nuestro desarrollo se hará énfasis en lo que es el lenguaje

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.

Diseño Detallado • • Considerar características como: Patrones de diseño Paquetes (bibliotecas, APIs, componentes)

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

Caso de Estudio • Explicar el lenguaje que se va a desarrollar en el

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

Caso de Estudio • Se necesita primeramente comprender el código de un lenguaje como

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.

Caso de Estudio • Compilar un programa de java con la versión más actual

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

Propuesta de Examen • Documentación extensiva y armado de un archivo *. class de

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 Data. Input. Stream 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).

Formato del Archivo *. class Class. File { u 4 magic; u 2 minor_version;

Formato del Archivo *. class Class. File { u 4 magic; u 2 minor_version; u 2 major_version; u 2 constant_pool_count; cp_info constant_pool [constant_pool_count 1]; u 2 access_flags; u 2 this_class; u 2 super_class;

Formato del Archivo *. class u 2 interfaces_count; u 2 interfaces[interfaces_count]; u 2 fields_count;

Formato del Archivo *. class u 2 interfaces_count; u 2 interfaces[interfaces_count]; u 2 fields_count; field_info fields[fields_count]; u 2 methods_count; method_info methods[methods_count]; u 2 attributes_count; attribute_info attributes [attributes_count]; }

Formato del archivo *. class • magic = 0 x. CAFEBABE • minor_version, major

Formato del archivo *. class • magic = 0 x. CAFEBABE • minor_version, major version: Rango de versiones válidas. • constant_pool_count: contador de constantes. • constant_pool[]: tabla de constantes, su tamaño es uno menos que el contador. cp_info { u 1 tag; u 1 info[]; }

Formato del Archivo *. class • El valor de cada campo varía de acuerdo

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_Interface. Methodref 11 CONSTANT_String 8 CONSTANT_Integer 3 CONSTANT_Float 4

Formato del archivo *. class CONSTANT_Long 5 CONSTANT_Double 6 CONSTANT_Name. And. Type 12 CONSTANT_Utf

Formato del archivo *. class CONSTANT_Long 5 CONSTANT_Double 6 CONSTANT_Name. And. Type 12 CONSTANT_Utf 8 1 CONSTANT_Class_info { u 1 tag; u 2 name_index; }

Formato del Archivo *. class CONSTANT_Fieldref_info { u 1 tag; u 2 class_index; u

Formato del Archivo *. class CONSTANT_Fieldref_info { u 1 tag; u 2 class_index; u 2 name_and_type_index; } CONSTANT_Methodref_info { u 1 tag; u 2 class_index; u 2 name_and_type_index; }

Formato del Archivo *. class CONSTANT_Interface. Methodref_info { u 1 tag; u 2 class_index;

Formato del Archivo *. class CONSTANT_Interface. Methodref_info { u 1 tag; u 2 class_index; u 2 name_and_type_index; } CONSTANT_String_info { u 1 tag; u 2 string_index; }

Formato del Archivo *. class CONSTANT_Integer_info { u 1 tag; u 4 bytes; }

Formato del Archivo *. class CONSTANT_Integer_info { u 1 tag; u 4 bytes; } CONSTANT_Float_info { u 1 tag; u 4 bytes; }

Formato del Archivo *. class CONSTANT_Long_info { u 1 tag; u 4 high_bytes; u

Formato del Archivo *. class CONSTANT_Long_info { u 1 tag; u 4 high_bytes; u 4 low_bytes; } CONSTANT_Double_info { u 1 tag; u 4 high_bytes; u 4 low_bytes; }

Formato del Archivo *. class CONSTANT_Name. And. Type_info { u 1 tag; u 2

Formato del Archivo *. class CONSTANT_Name. And. Type_info { u 1 tag; u 2 name_index; u 2 descriptor_index; } CONSTANT_Utf 8_info { u 1 tag; u 2 length; u 1 bytes[length]; }

Formato del archivo *. class • • • access_flags: banderas ACC_PUBLIC 0 x 0001

Formato del archivo *. class • • • access_flags: banderas ACC_PUBLIC 0 x 0001 ACC_FINAL 0 x 0010 ACC_SUPER 0 x 0020 ACC_INTERFACE 0 x 0200 ACC_ABSTRACT 0 x 0400 • Thisclass: indica un rango válido dentro de la tabla de constantes para el nombre de la clase.

Formato del Archivo *. class • super_class: nombre de la clase padre o 0

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.

Formato del Archivo *. class • fields_count: número de campos. No hay dos campos

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 { u 2 access_flags; u 2 name_index;

Formato del Archivo *. class u 2 descriptor_index; u 2 attributes_count; attribute_info attributes [attributes_count];

Formato del Archivo *. class u 2 descriptor_index; u 2 attributes_count; attribute_info attributes [attributes_count]; } • • • Las banderas pueden ser: ACC_PUBLIC 0 x 0001 ACC_PRIVATE 0 x 0002 ACC_PROTECTED 0 x 0004 ACC_STATIC 0 x 0008

Formato del Archivo *. class • ACC_FINAL 0 x 0010 • ACC_VOLATILE 0 x

Formato del Archivo *. class • ACC_FINAL 0 x 0010 • ACC_VOLATILE 0 x 0040 • ACC_TRANSIENT 0 x 0080 • 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:

Formato del Archivo *. class attribute_info { u 2 attribute_name_index; u 4 attribute_length; u

Formato del Archivo *. class attribute_info { u 2 attribute_name_index; u 4 attribute_length; u 1 info[attribute_length]; } • Los valores de los atributos son los siguientes: Source. File_attribute { u 2 attribute_name_index;

Formato del Archivo *. class u 4 attribute_length; u 2 sourcefile_index; } Constant. Value_attribute

Formato del Archivo *. class u 4 attribute_length; u 2 sourcefile_index; } Constant. Value_attribute { u 2 attribute_name_index; u 4 attribute_length; u 2 constantvalue_index; } Code_attribute { u 2 attribute_name_index;

Formato del Archivo *. class u 4 attribute_length; u 2 max_stack; u 2 max_locals;

Formato del Archivo *. class u 4 attribute_length; u 2 max_stack; u 2 max_locals; u 4 code_length; u 1 code[code_length]; u 2 exception_table_length; { u 2 start_pc; u 2 end_pc; u 2 handler_pc; u 2 catch_type; }

Formato del Archivo *. class exception_table [exception_table_length]; u 2 attributes_count; attribute_info attributes [attributes_count]; }

Formato del Archivo *. class exception_table [exception_table_length]; u 2 attributes_count; attribute_info attributes [attributes_count]; } Exceptions_attribute { u 2 attribute_name_index; u 4 attribute_length; u 2 number_of_exceptions;

Formato del Archivo *. class u 2 exception_index_table [number_of_exceptions]; } • Otros atributos son:

Formato del Archivo *. class u 2 exception_index_table [number_of_exceptions]; } • Otros atributos son: Inner. Classes, Synthetic, Line. Number. Table, Local. Variable. Table, and Deprecated attributes. • methods_count: el número de métodos disponibles.

Formato del Archivo *. class • Methods[]: arreglo que contiene cada valor de los

Formato del Archivo *. class • Methods[]: arreglo que contiene cada valor de los métodos en base a la siguiente estructura: method_info { u 2 access_flags; u 2 name_index; u 2 descriptor_index; u 2 attributes_count; attribute_info attributes [attributes_count]; }

Formato del Archivo *. class • • • Las banderas son las siguientes: ACC_PUBLIC

Formato del Archivo *. class • • • Las banderas son las siguientes: ACC_PUBLIC 0 x 0001 ACC_PRIVATE 0 x 0002 ACC_PROTECTED 0 x 0004 ACC_STATIC 0 x 0008 ACC_FINAL 0 x 0010 ACC_SYNCHRONIZED ACC_NATIVE 0 x 0100 ACC_ABSTRACT 0 x 0400 ACC_STRICT 0 x 0800

Formato del Archivo *. class • attributes_count: el número de atributos de la clase.

Formato del Archivo *. class • attributes_count: el número de atributos de la clase. • attributes[]: arreglo con los atributos de la clase. • Examen: Recuperar los mnemónicos de las instrucciones de Java.

Juego de Instrucciones JVM • Las instrucciones del ensamblador de Java se componen de

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;

Juego de Instrucciones JVM • ejecutar la acción del código de operación; • }

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.

Juego de Instrucciones JVM

Juego de Instrucciones JVM

Juego de Instrucciones JVM • La sintaxis de las instrucciones es: • <index> <opcode>

Juego de Instrucciones JVM • La sintaxis de las instrucciones es: • <index> <opcode> [<operand 2>. . . ]] [<comment>] [<operand 1> • Por ejemplo: • 8 bipush 100// Push int constant 100 • 10 ldc #1 // Push float constant 100. 0

Juego de Instrucciones JVM • Los tipos de operaciones son: • Carga y almacenamiento:

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.

Juego de Instrucciones JVM • Para almacenar un valor constante en la pila: bipush,

Juego de Instrucciones JVM • Para almacenar un valor constante en la pila: bipush, sipush, ldc_w, ldc 2_w, aconst_null, iconst_m 1, iconst_<i>, lconst_<l>, fconst_<f>, dconst_<d> • Obtener acceso a varias variables locales: wide. • Operaciones aritméticas:

Juego de Instrucciones JVM • • • Suma: add Resta: iub Multiplicación: mul Division:

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

Juego de Instrucciones JVM • Incremento de variables locales: iinc. • Comparación: cmp. •

Juego de Instrucciones JVM • Incremento de variables locales: iinc. • Comparación: cmp. • • • Instrucciones de conversión: Entero a long, flotante, o doble: i 2 l, i 2 f, i 2 d Entero largo a flotante o doble: l 2 f, l 2 d. Flotante a doble: f 2 d. Otras conversiones: primertipo 2 segundotipo

Juego de Instrucciones JVM • Operaciones para manipular objetos: • Para crear un nuevo

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.

Juego de Instrucciones JVM • Para almacenar un valor de la pila como un

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 ejemplares: instanceof, checkcast. clases y

Juego de Instrucciones JVM • Instrucciones para manipular la pila: pop, pop 2, dup_x

Juego de Instrucciones JVM • Instrucciones para manipular la pila: pop, pop 2, dup_x 1, dup 2_x 1, dup_x 2, dup 2_x 2, 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.

Juego de Instrucciones JVM • Ramificación condicional tableswitch, lookupswitch. compuesta: • Ramificación incondicional: goto,

Juego de Instrucciones JVM • Ramificación condicional tableswitch, lookupswitch. compuesta: • Ramificación incondicional: goto, goto_w, jsr_w, ret. • Invocación de métodos e instrucciones de retorno: • invokevirtual invoca un ejemplar de un método de un objeto.

Juego de Instrucciones JVM • Invokeinterface invoca un método que está definido dentro de

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.

Juego de Instrucciones JVM Códigos de operación de los mnemónicos de Java • •

Juego de Instrucciones JVM Códigos de operación de los mnemónicos de Java • • • (0 x 00) nop (0 x 01) aconst_null (0 x 02) iconst_m 1 (0 x 03) iconst_0 (0 x 04) iconst_1 (0 x 05) iconst_2 (0 x 06) iconst_3 (0 x 07) iconst_4 (0 x 08) iconst_5 • • (0 x 09) lconst_0 (0 x 0 a) lconst_1 (0 x 0 b) fconst_0 (0 x 0 c) fconst_1 (0 x 0 d) fconst_2 (0 x 0 e) dconst_0 (0 x 0 f) dconst_1 (0 x 10) bipush

Juego de Instrucciones JVM • • • (0 x 11) sipush (0 x 12)

Juego de Instrucciones JVM • • • (0 x 11) sipush (0 x 12) ld (0 x 13) ldc_w (0 x 14) ldc 2_w (0 x 15) iload (0 x 16) lload (0 x 17) fload (0 x 18) dload (0 x 19) aload (0 x 1 a) iload_0 • • • (0 x 1 b) iload_1 (0 x 1 c) iload_2 (0 x 1 d) iload_3 (0 x 1 e) lload_0 (0 x 1 f) lload_1 (0 x 20) lload_2 (0 x 21) lload_3 (0 x 22) fload_0 (0 x 23) fload_1 (0 x 24) fload_2

Juego de Instrucciones JVM • • • (0 x 25) fload_3 (0 x 26)

Juego de Instrucciones JVM • • • (0 x 25) fload_3 (0 x 26) dload_0 (0 x 27) dload_1 (0 x 28) dload_2 (0 x 29) dload_3 (0 x 2 a) aload_0 (0 x 2 b) aload_1 (0 x 2 c) aload_2 (0 x 2 d) aload_3 (0 x 2 e) iaload • • • (0 x 2 f) laload (0 x 30) faload (0 x 31) daload (0 x 32) aaload (0 x 33) baload (0 x 34) caload (0 x 35) saload (0 x 36) istore (0 x 37) lstore (0 x 38) fstore

Juego de Instrucciones JVM • • • (0 x 39) dstore (0 x 3

Juego de Instrucciones JVM • • • (0 x 39) dstore (0 x 3 a) astore (0 x 3 b) istore_0 (0 x 3 c) istore_1 (0 x 3 d) istore_2 (0 x 3 e) istore_3 (0 x 3 f) lstore_0 (0 x 40) lstore_1 (0 x 41) lstore_2 (0 x 42) lstore_3 • • • (0 x 43) fstore_0 (0 x 44) fstore_1 (0 x 45) fstore_2 (0 x 46) fstore_3 (0 x 47) dstore_0 (0 x 48) dstore_1 (0 x 49) dstore_2 (0 x 4 a) dstore_3 (0 x 4 b) astore_0 (0 x 4 c) astore_1

Juego de Instrucciones JVM • • • (0 x 4 d) astore_2 (0 x

Juego de Instrucciones JVM • • • (0 x 4 d) astore_2 (0 x 4 e) astore_3 (0 x 4 f) iastore (0 x 50) lastore (0 x 51) fastore (0 x 52) dastore (0 x 53) aastore (0 x 54) bastore (0 x 55) castore (0 x 56) sastore • • • (0 x 57) pop (0 x 58) pop 2 (0 x 59) dup (0 x 5 a) dup_x 1 (0 x 5 b) dup_x 2 (0 x 5 c) dup 2 (0 x 5 d) dup 2_x 1 (0 x 5 e) dup 2_x 2 (0 x 5 f) swap (0 x 60) iadd

Juego de Instrucciones JVM • • • (0 x 61) ladd (0 x 62)

Juego de Instrucciones JVM • • • (0 x 61) ladd (0 x 62) fadd (0 x 63) dadd (0 x 64) isub (0 x 65) lsub (0 x 66) fsub (0 x 67) dsub (0 x 68) imul (0 x 69) lmul (0 x 6 a) fmul • • • (0 x 6 b) dmul (0 x 6 c) idiv (0 x 6 d) ldiv (0 x 6 e) fdiv (0 x 6 f) ddiv (0 x 70) irem (0 x 71) lrem (0 x 72) frem (0 x 73) drem (0 x 74) ineg

Juego de Instrucciones JVM • • • (0 x 75) lneg (0 x 76)

Juego de Instrucciones JVM • • • (0 x 75) lneg (0 x 76) fneg (0 x 77) dneg (0 x 78) ishl (0 x 79) lshl (0 x 7 a) ishr (0 x 7 b) lshr (0 x 7 c) iushr (0 x 7 d) lushr (0 x 7 e) iand • • • (0 x 7 f) land (0 x 80) ior (0 x 81) lor (0 x 82) ixor (0 x 83) lxor (0 x 84) iinc (0 x 85) i 2 l (0 x 86) i 2 f (0 x 87) i 2 d (0 x 88) l 2 i

Juego de Instrucciones JVM • • • (0 x 89) l 2 f (0

Juego de Instrucciones JVM • • • (0 x 89) l 2 f (0 x 8 a) l 2 d (0 x 8 b) f 2 i (0 x 8 c) f 2 l (0 x 8 d) f 2 d (0 x 8 e) d 2 (0 x 8 f) d 2 l (0 x 90) d 2 f (0 x 91) i 2 b 1 (0 x 92) i 2 c • • • (0 x 93) i 2 s (0 x 94) lcmp (0 x 95) fcmpl (0 x 96) fcmpg (0 x 97) dcmpl (0 x 98) dcmpg (0 x 99) ifeq (0 x 9 a) ifne (0 x 9 b) iflt (0 x 9 c) ifge

Juego de Instrucciones JVM • • • (0 x 9 d) ifgt (0 x

Juego de Instrucciones JVM • • • (0 x 9 d) ifgt (0 x 9 e) ifle (0 x 9 f) if_icmpeq (0 xa 0) if_icmpne (0 xa 1) if_icmplt (0 xa 2) if_icmpge (0 xa 3) if_icmpgt (0 xa 4) if_icmple (0 xa 5) if_acmpeq 1 (0 xa 6) if_acmpne • • • (0 xa 7) goto (0 xa 8) jsr (0 xa 9) ret (0 xaa) tableswitch (0 xab) lookupswitch (0 xac) ireturn (0 xad) lreturn (0 xae) freturn (0 xaf) dreturn (0 xb 0) areturn

Juego de Instrucciones JVM • • • (0 xb 1) return (0 xb 2)

Juego de Instrucciones JVM • • • (0 xb 1) return (0 xb 2) getstatic (0 xb 3) putstatic (0 xb 4) getfield (0 xb 5) putfield (0 xb 6) invokevirtual (0 xb 7) invokespecial (0 xb 8) invokestatic (0 xb 9) invokeinterface (0 xba) xxxunusedxxx • • • (0 xbb) new (0 xbc) newarray (0 xbd) anewarray (0 xbe) arraylength (0 xbf) athrow (0 xc 0) checkcast (0 xc 1) instanceof 194 (0 xc 2) monitorenter (0 xc 3) monitorexit (0 xc 4) wide

Juego de Instrucciones JVM • • • (0 xc 5) multianewarray (0 xc 6)

Juego de Instrucciones JVM • • • (0 xc 5) multianewarray (0 xc 6) ifnull (0 xc 7) ifnonnull (0 xc 8) goto_w (0 xc 9) jsr_w • Códigos reservados: • (0 xca) breakpoint • (0 xfe) impdep 1 • (0 xff) impdep 2

Ensamblado en Java void spin() { int i; for (i = 0; i <

Ensamblado en Java void spin() { int i; for (i = 0; i < 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 (i=0)

Ensamblado en Java 2 goto 8 // La primera vez no se incrementa contador

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 < 100) 14 return // Regresa vacío

Ensamblado en Java void dspin() { double i; for (i = 0. 0; i

Ensamblado en Java void dspin() { double i; for (i = 0. 0; i < 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

Ensamblado en Java 2 goto 9 // La primera ocasión no se incrementa el

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

Ensamblado en Java 9 dload_1// Coloca en la pila el valor de las variables

Ensamblado en Java 9 dload_1// Coloca en la pila el valor de las variables locales 1 y 2 10 ldc 2_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 < 100. 0) 17 return// Regresa vacío

Ensamblado en Java double. Locals(double d 1, double d 2){ return d 1 +

Ensamblado en Java double. Locals(double d 1, double d 2){ return d 1 + d 2; } 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

Ensamblado en Java void sspin() { short i; for (i = 0; i <

Ensamblado en Java void sspin() { short i; for (i = 0; i < 100; i++) { ; // Loop body is empty }} Method void sspin(): 0 iconst_0 1 istore_1 2 goto 10

Ensamblado en Java 5 iload_1 // El entero corto es tratado como un entero

Ensamblado en Java 5 iload_1 // El entero corto es tratado como un entero 6 iconst_1 7 iadd 8 i 2 s // Se trunca a short 9 istore_1 10 iload_1 11 bipush 100 13 if_icmplt 5 16 return

Ensamblado en Java void use. Many. Numeric() { int i = 100; int j

Ensamblado en Java void use. Many. Numeric() { int i = 100; int j = 1000000; long l 1 = 1; long l 2 = 0 xffff; double d = 2. 2; . . } Method void use. Many. Numeric(): 0 bipush 100// Coloca en la pila el valor 100

Ensamblado en Java 2 istore_1 3 ldc #1 // Coloca en la pila el

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 ldc 2_w #6 // Coloca el valor largo 0 xffff (-1); 11 lstore 5

Ensamblado en Java 13 ldc 2_w #8 // Coloca el valor constante 2. 2

Ensamblado en Java 13 ldc 2_w #8 // Coloca el valor constante 2. 2 16 dstore 7 … void while. Int() { int i = 0; while (i < 100) { i++; }}

Ensamblado en Java • • • Method void while. Int(): 0 iconst_0 1 istore_1

Ensamblado en Java • • • Method void while. Int(): 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?

Ensamblado en Java • Entrega de proyecto examen: viernes 9 de octubre de manera

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

Referencias • Aho, Sethi, Ullman. Compiladores Principios, técnicas y herramientas Ed. Addison Wesley. •

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.

Referencias • Java Virtual Machine Specification

Referencias • Java Virtual Machine Specification

¿Preguntas?

¿Preguntas?