introducción al diseño de los lenguajes de programación

Post on 17-Jan-2016

36 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

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

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

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

Formato del Archivo *.classClassFile {   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;    

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

[attributes_count];     }

Formato del archivo *.class• magic = 0xCAFEBABE• 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 {     u1 tag;     u1 info[];    }•

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

acuerdo a su tipo:

CONSTANT_Class7CONSTANT_Fieldref 9CONSTANT_Methodref 10CONSTANT_InterfaceMethodref 11CONSTANT_String 8CONSTANT_Integer 3CONSTANT_Float 4

Formato del archivo *.classCONSTANT_Long 5CONSTANT_Double 6CONSTANT_NameAndType12CONSTANT_Utf8 1

CONSTANT_Class_info {     u1 tag;     u2 name_index;    }

Formato del Archivo *.classCONSTANT_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;    }   

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;    }

Formato del Archivo *.classCONSTANT_Integer_info {    u1 tag;    u4 bytes;    }    

CONSTANT_Float_info {    u1 tag;    u4 bytes;    }

Formato del Archivo *.classCONSTANT_Long_info {    u1 tag;    u4 high_bytes;    u4 low_bytes;    }    

CONSTANT_Double_info {    u1 tag;    u4 high_bytes;    u4 low_bytes;    }

Formato del Archivo *.classCONSTANT_NameAndType_info {     u1 tag;     u2 name_index;     u2 descriptor_index;    }

CONSTANT_Utf8_info {    u1 tag;    u2 length;    u1 bytes[length];    }

Formato del archivo *.class• access_flags: banderas• ACC_PUBLIC 0x0001• ACC_FINAL 0x0010• ACC_SUPER 0x0020• ACC_INTERFACE 0x0200• ACC_ABSTRACT0x0400

• 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 {     u2 access_flags;     u2 name_index;    

Formato del Archivo *.class u2 descriptor_index;     u2 attributes_count;     attribute_info attributes

[attributes_count];    }

• Las banderas pueden ser:• ACC_PUBLIC 0x0001• ACC_PRIVATE0x0002• ACC_PROTECTED 0x0004• ACC_STATIC 0x0008

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:

Formato del Archivo *.class attribute_info {     u2 attribute_name_index;     u4 attribute_length;     u1 info[attribute_length];    }

• Los valores de los atributos son los siguientes:

    SourceFile_attribute {     u2 attribute_name_index;    

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;    

Formato del Archivo *.class u4 attribute_length;     u2 max_stack;     u2 max_locals;     u4 code_length;     u1 code[code_length];     u2 exception_table_length;     { u2 start_pc;     u2 end_pc;     u2 handler_pc;     u2 catch_type;    }

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;    

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.

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];    }

Formato del Archivo *.class• Las banderas son las siguientes: • ACC_PUBLIC 0x0001• ACC_PRIVATE0x0002• ACC_PROTECTED 0x0004• ACC_STATIC 0x0008• ACC_FINAL 0x0010• ACC_SYNCHRONIZED• ACC_NATIVE 0x0100• ACC_ABSTRACT0x0400• ACC_STRICT 0x0800

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> [<operand1> [<operand2>...]] [<comment>]

• 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, ldc_w, ldc2_w, aconst_null, iconst_m1, 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: i2l, i2f,

i2d• Entero largo a flotante o doble: l2f, l2d. • Flotante a doble: f2d.• Otras conversiones:

primertipo2segundotipo

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 clases y

ejemplares: instanceof, checkcast.

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.

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.

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

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

Códigos de operación de los mnemónicos de Java

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

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

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

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

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

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

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

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

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

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

Ensamblado en Javavoid 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 Java2 goto 8 // La primera vez no se incrementa

contador5 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 Javavoid 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.01 dstore_1 // Almacena en la variable local

1 y 2 el valor actual de la pila

Ensamblado en Java2 goto 9 // La primera ocasión no se

incrementa el contador5 dload_1 // Coloca en la pila el valor de las

variables 1 y 26 dconst_1 // Coloca en la pila el valor de la

constante 1.07 dadd // suma dado que no hay

instrucción inc 8 dstore_1 // Almacena el resultado en las

variables locales 1 and 2

Ensamblado en Java9 dload_1// Coloca en la pila el valor de las

variables locales 1 y 210 ldc2_w #4 // coloca el valor de la

constante doble 100 en la pila13 dcmpg // No existe la instrucción

if_dcmplt 14 iflt 5 // Compara que (i < 100.0) 17 return// Regresa vacío

Ensamblado en Javadouble 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

Ensamblado en Javavoid 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 Java5 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

Ensamblado en Javavoid 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

Ensamblado en Java2 istore_1 3 ldc #1 // Coloca en la pila el valor

constante 1000000; 5 istore_2 6 lconst_1 // Se carga el valor constante 17 lstore_3 8 ldc2_w #6 // Coloca el valor largo

0xffffffff (-1); 11 lstore 5

Ensamblado en Java13 ldc2_w #8 // Coloca el valor constante

2.216 dstore 7…

void whileInt() { int i = 0; while (i < 100) { i++; }}

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?

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?

top related