Introduccin al diseo de los lenguajes de programacin
- Slides: 87
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 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 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 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 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 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 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, 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 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 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 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 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 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 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 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 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 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). • 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 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) 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 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 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 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 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; 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; 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 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 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 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 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; 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; } CONSTANT_Float_info { u 1 tag; u 4 bytes; }
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 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 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 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 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]; } • • • 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 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 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 { 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; 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]; } 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: 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 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 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. • 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 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; • } 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 • 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: • 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, 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: 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. • • • 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 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 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 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, 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 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 • • • (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) 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) 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 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 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) 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) 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 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 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) 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) 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 < 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 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 < 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 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 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 + 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 < 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 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 = 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 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 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 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 presencial.
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
¿Preguntas?
- Programacin
- Programacin
- Costos mixtos
- Portafolio de diseo
- Diseo grafico
- Diseo web
- Diseo de interiores
- Introduccin
- Introduccin
- Introduccin
- Introducción de enzimas
- Introduccin
- Induccin
- Lenguajes expresivos en educación inicial
- Mapa conceptual de los lenguajes de programacion
- Generaciones de los lenguajes de programacion
- Lenguajes libres de contexto
- Gramática independiente del contexto
- Lenguajes de bajo nivel
- Lenguajes de marcado
- Lenguajes de descripción de hardware (hdl)
- Analisis semantico lenguajes y automatas
- Forma normal de chomsky
- Tipos de lenguajes culturales
- Los idiomas de la biblia
- Lenguajes de bajo nivel
- Lenguaje de control de datos (dcl)
- Lenguajes paralelos
- Opera mini lenguajes de programación
- Pero al revés
- Traductor
- Lenguajes de programacion
- Lenguajes descriptores de arquitectura
- Lenguajes y representación técnica
- Lenguajes ensambladores
- Lenguaje algoritmico
- Como trabajar los unos los dieces y los cienes
- Folklore poético ejemplos
- 10 deberes de los padres para con los hijos
- Tipos de textos expositivos
- Comprensión del entorno sociocultural
- Porque los sacerdotes pueden perdonar los pecados
- Rechaza el spam y los ficheros inesperados
- Cuales son los nombres de los profetas menores
- Nuestros pensamientos no son los pensamientos de dios
- Los padres son como puertos
- Los cuatro seres vivientes y los evangelios
- Amigo color
- Las misiones se hacen con los pies de los que van
- Oracin
- Historia derechos del niño
- Fruto de la pascua
- Escuchar a los muertos con los ojos
- Blanco refleja luz
- Destino de los esqueletos carbonados de los aminoácidos
- Derechos de los niños cuales son
- Ubique las cifras del 1 al 9 en los circulos
- Dos reyes dos laberintos
- El espiritu del profeta esta sujeto al profeta
- Mapa mixto de polinomios
- Si es posible engañaran a los escogidos
- Signo sensible
- Objetivo medios de transporte
- Ao diptongo
- Los colores de los amigos
- Los colores de los amigos
- Colores para amigos
- Resuelve el siguiente problema
- Los cobardes no heredaran
- Expresiones con polinomios
- Mayas avances cientificos
- No consultaras adivinos
- Las lenguas cesarán
- Joel 2 29-32
- Saludaos unos a otros
- Ejemplos de
- Nomenclatura de compuestos binarios hidrogenados
- Cual es el ambiente de no oyes ladrar los perros
- Elipse ejercicios resueltos
- Factores que modifican el comportamiento de los gases
- Un unas una unos
- Qué término está implicado en los otros
- Cuáles fueron los principales avances de los aztecas
- Que los mejores momentos sean los que están por llegar
- Los niveles de organización de los seres vivos
- Identificamos los beneficios de los
- Cuales son los sacramentos de curacion
- Los colores amigos