Introducción al diseño de los lenguajes de programación
description
Transcript of Introducción al diseño de los lenguajes de programación
![Page 1: Introducción al diseño de los lenguajes de programación](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/1.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/2.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/3.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/4.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/5.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/6.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/7.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/8.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/9.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/10.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/11.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/12.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/13.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/14.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/15.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/16.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/17.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/18.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/19.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/20.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/21.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/22.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/23.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/24.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/25.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/26.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/27.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/28.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/29.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/30.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/31.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/32.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/33.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/34.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/35.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/36.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/37.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/38.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/39.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/40.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/41.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/42.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/43.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/44.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/45.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/46.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/47.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/48.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/49.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/50.jpg)
Juego de Instrucciones JVM
![Page 51: Introducción al diseño de los lenguajes de programación](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/51.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/52.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/53.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/54.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/55.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/56.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/57.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/58.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/59.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/60.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/61.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/62.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/63.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/64.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/65.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/66.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/67.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/68.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/69.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/70.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/71.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/72.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/73.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/74.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/75.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/76.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/77.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/78.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/79.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/80.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/81.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/82.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/83.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/84.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/85.jpg)
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](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/86.jpg)
Referencias• Java Virtual Machine Specification
![Page 87: Introducción al diseño de los lenguajes de programación](https://reader036.fdocuments.es/reader036/viewer/2022062805/56814c50550346895db96280/html5/thumbnails/87.jpg)
¿Preguntas?