1 / 87

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

ikia
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  25. Formato del Archivo *.class ClassFile {   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;    

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

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

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

  29. Formato del archivo *.class CONSTANT_Long 5 CONSTANT_Double 6 CONSTANT_NameAndType 12 CONSTANT_Utf8 1 CONSTANT_Class_info {     u1 tag;     u2 name_index;    }

  30. Formato del Archivo *.class CONSTANT_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;    }   

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

  32. Formato del Archivo *.class CONSTANT_Integer_info {     u1 tag;     u4 bytes;    }     CONSTANT_Float_info {     u1 tag;     u4 bytes;    }

  33. Formato del Archivo *.class CONSTANT_Long_info {     u1 tag;     u4 high_bytes;     u4 low_bytes;    }     CONSTANT_Double_info {     u1 tag;     u4 high_bytes;     u4 low_bytes;    }

  34. Formato del Archivo *.class CONSTANT_NameAndType_info {     u1 tag;     u2 name_index;     u2 descriptor_index;    } CONSTANT_Utf8_info {     u1 tag;     u2 length;     u1 bytes[length];    }

  35. Formato del archivo *.class access_flags: banderas ACC_PUBLIC 0x0001 ACC_FINAL 0x0010 ACC_SUPER 0x0020 ACC_INTERFACE 0x0200 ACC_ABSTRACT 0x0400 Thisclass: indica un rango válido dentro de la tabla de constantes para el nombre de la clase.

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

  37. 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;    

  38. Formato del Archivo *.class u2 descriptor_index;     u2 attributes_count;     attribute_info attributes [attributes_count];    } Las banderas pueden ser: ACC_PUBLIC 0x0001 ACC_PRIVATE 0x0002 ACC_PROTECTED 0x0004 ACC_STATIC 0x0008

  39. 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:

  40. 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;    

  41. 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;    

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

  43. 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;    

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

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

  46. Formato del Archivo *.class Las banderas son las siguientes: ACC_PUBLIC 0x0001 ACC_PRIVATE 0x0002 ACC_PROTECTED 0x0004 ACC_STATIC 0x0008 ACC_FINAL 0x0010 ACC_SYNCHRONIZED ACC_NATIVE 0x0100 ACC_ABSTRACT 0x0400 ACC_STRICT 0x0800

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

  48. 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;

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

  50. Juego de Instrucciones JVM

More Related