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

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

Upload: ikia

Post on 17-Jan-2016

34 views

Category:

Documents


0 download

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

Page 1: Introducción al diseño de los lenguajes de programación

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

M.C. Juan Carlos Olivares Rojas

Page 2: Introducción al diseño de los lenguajes de programación

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

Page 3: Introducción al diseño de los lenguajes de programación

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

Page 4: Introducción al diseño de los lenguajes de programación

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

Page 5: Introducción al diseño de los lenguajes de programación

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

Page 6: Introducción al diseño de los lenguajes de programación

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.

Page 7: Introducción al diseño de los lenguajes de programación

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

Page 8: Introducción al diseño de los lenguajes de programación

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.

Page 9: Introducción al diseño de los lenguajes de programación

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

Page 10: Introducción al diseño de los lenguajes de programació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.

Page 11: Introducción al diseño de los lenguajes de programación

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.

Page 12: Introducción al diseño de los lenguajes de programación

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.

Page 13: Introducción al diseño de los lenguajes de programación

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

Page 14: Introducción al diseño de los lenguajes de programación

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.

Page 15: Introducción al diseño 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

Page 16: Introducción al diseño de los lenguajes de programación

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.

Page 17: Introducción al diseño de los lenguajes de programación

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

Page 18: Introducción al diseño de los lenguajes de programació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

Page 19: Introducción al diseño de los lenguajes de programación

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.

Page 20: Introducción al diseño de los lenguajes de programación

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

Page 21: Introducción al diseño de los lenguajes de programación

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

Page 22: Introducción al diseño de los lenguajes de programación

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.

Page 23: Introducción al diseño de los lenguajes de programación

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

Page 24: Introducción al diseño de los lenguajes de programación

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

Page 25: Introducción al diseño de los lenguajes de programación

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;    

Page 26: Introducción al diseño de los lenguajes de programación

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

Page 27: Introducción al diseño de los lenguajes de programación

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

Page 28: Introducción al diseño de los lenguajes de programación

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

Page 29: Introducción al diseño de los lenguajes de programación

Formato del archivo *.classCONSTANT_Long 5CONSTANT_Double 6CONSTANT_NameAndType12CONSTANT_Utf8 1

CONSTANT_Class_info {     u1 tag;     u2 name_index;    }

Page 30: Introducción al diseño de los lenguajes de programación

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

Page 31: Introducción al diseño de los lenguajes de programación

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

Page 32: Introducción al diseño de los lenguajes de programación

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

CONSTANT_Float_info {    u1 tag;    u4 bytes;    }

Page 33: Introducción al diseño de los lenguajes de programación

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

Page 34: Introducción al diseño de los lenguajes de programación

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

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

Page 35: Introducción al diseño de los lenguajes de programación

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.

Page 36: Introducción al diseño de los lenguajes de programación

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.

Page 37: Introducción al diseño de los lenguajes de programación

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;    

Page 38: Introducción al diseño de los lenguajes de programación

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

Page 39: Introducción al diseño de los lenguajes de programación

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:

Page 40: Introducción al diseño de los lenguajes de programación

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;    

Page 41: Introducción al diseño de los lenguajes de programación

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;    

Page 42: Introducción al diseño de los lenguajes de programación

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

Page 43: Introducción al diseño de los lenguajes de programación

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;    

Page 44: Introducción al diseño de los lenguajes de programación

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.

Page 45: Introducción al diseño de los lenguajes de programación

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

Page 46: Introducción al diseño de los lenguajes de programación

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

Page 47: Introducción al diseño de los lenguajes de programación

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.

Page 48: Introducción al diseño de los lenguajes de programación

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;

Page 49: Introducción al diseño de los lenguajes de programació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.

Page 50: Introducción al diseño de los lenguajes de programación

Juego de Instrucciones JVM

Page 51: Introducción al diseño de los lenguajes de programación

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

Page 52: Introducción al diseño de los lenguajes de programación

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.

Page 53: Introducción al diseño de los lenguajes de programación

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:

Page 54: Introducción al diseño de los lenguajes de programación

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

Page 55: Introducción al diseño de los lenguajes de programación

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

Page 56: Introducción al diseño de los lenguajes de programación

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.

Page 57: Introducción al diseño de los lenguajes de programación

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.

Page 58: Introducción al diseño de los lenguajes de programación

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.

Page 59: Introducción al diseño de los lenguajes de programación

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.

Page 60: Introducción al diseño de los lenguajes de programación

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.

Page 61: Introducción al diseño de los lenguajes de programación

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

Page 62: Introducción al diseño de los lenguajes de programación

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

Page 63: Introducción al diseño de los lenguajes de programación

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

Page 64: Introducción al diseño de los lenguajes de programación

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

Page 65: Introducción al diseño de los lenguajes de programación

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

Page 66: Introducción al diseño de los lenguajes de programación

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

Page 67: Introducción al diseño de los lenguajes de programación

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

Page 68: Introducción al diseño de los lenguajes de programación

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

Page 69: Introducción al diseño de los lenguajes de programación

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

Page 70: Introducción al diseño de los lenguajes de programación

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

Page 71: Introducción al diseño de los lenguajes de programación

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

Page 72: Introducción al diseño de los lenguajes de programación

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)

Page 73: Introducción al diseño de los lenguajes de programación

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

Page 74: Introducción al diseño de los lenguajes de programación

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

Page 75: Introducción al diseño de los lenguajes de programación

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

Page 76: Introducción al diseño de los lenguajes de programación

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

Page 77: Introducción al diseño de los lenguajes de programación

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

Page 78: Introducción al diseño de los lenguajes de programación

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

Page 79: Introducción al diseño de los lenguajes de programación

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

Page 80: Introducción al diseño de los lenguajes de programación

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

Page 81: Introducción al diseño de los lenguajes de programación

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

Page 82: Introducción al diseño de los lenguajes de programación

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

2.216 dstore 7…

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

Page 83: Introducción al diseño de los lenguajes de programación

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?

Page 84: Introducción al diseño de los lenguajes de programación

Ensamblado en Java• Entrega de proyecto examen: viernes 9

de octubre de manera presencial.

Page 85: Introducción al diseño de los lenguajes de programación

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.

Page 86: Introducción al diseño de los lenguajes de programación

Referencias• Java Virtual Machine Specification

Page 87: Introducción al diseño de los lenguajes de programación

¿Preguntas?