Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte...

26
Gilberto G. Romero H. Traductores

Transcript of Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte...

Page 1: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Gilberto G. Romero H.

Traductores

Page 2: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente hasta un texto o programa equivalente escrito en un lenguaje destino produciendo, si cabe, mensajes de error.

Los traductores engloban tanto a los compiladores (en los que el lenguaje destino suele ser código máquina) como a los intérpretes (en los que el lenguaje destino estáconstituido por las acciones atómicas que puede ejecutar el intérprete)

Page 3: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Tipos de traductores

Traductores del idioma

CompiladoresEs aquel traductor que tiene como entrada una sentencia en lenguaje formaly como salida tiene un fichero ejecutable, es decir, realiza una traducción de un código de alto nivel a código máquina (también se entiende por compilador aquel programa que proporciona un fichero objeto en lugar del ejecutable final).IntérpretesEs como un compilador, solo que la salida es una ejecución. El programa deentrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código máquina) sino lógico (una ejecución).

Page 4: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

InterpretesSu principal ventaja es que permiten una fácil depuración. Entre los inconvenientes podemos citar, en primer lugar, la lentitud de ejecución , ya que alejecutar a la vez que se traduce no puede aplicarse un alto grado de optimización; por ejemplo, si el programa entra en un bucle y la optimización no está muy afinada, las mismas instrucciones se interpretarán y ejecutarán una y otra vez, enlenteciendo la ejecución del programa. Otro inconveniente es que durante la ejecución, el intérprete debe residir en memoria, por lo que consumen más recursos.

Page 5: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Algunos lenguajes intentan aunar las ventajas de los compiladores y de los intérpretes y evitar sus desventajas; son los lenguajes pseudointerpretados. En estos, el programa fuente pasa por un pseudocompilador que genera un pseudoejecutable. Para ejecutar este pseudoejecutable se le hace pasar por un motor de ejecución que lo interpreta de manera relativamente eficiente. Esto tiene la ventaja de la portabilidad, ya que el pseudoejecutable es independiente de la máquina en que vaya a ejecutarse, y basta con que en dicha máquina se disponga del motor de ejecución apropiado para poder interpretar cualquier pseudoejecutable.

Page 6: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Tipos de (traductores)

PreprocesadoresPermiten modificar el programa fuente antes de la verdadera compilación.Hacen uso de macroinstrucciones y directivas de compilación. Por ejemplo, en lenguaje C, el preprocesador sustituye la directiva #include Uno.c por el código completo que contiene el fichero “Uno.c”, de manera que cuando el compilador comienza su ejecución se encuentra con el código ya insertado en el programa fuente (la figura 1.3 ilustra esta situación). Algunas otras directivas de preprocesamiento permiten compilar trozos de códigos opcionales (lenguajes C y Clipper): #fi, #ifdef, #define, #ifndef, etc.Los preprocesadores suelen actuar de manera transparente para el programador,pudiendo incluso considerarse que son una fase preliminar del compilador.

Page 7: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 8: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Intérpretes de comandos (tipos de traductores)Un intérprete de comandos traduce sentencias simples a invocaciones a programas de una biblioteca. Se utilizan especialmente en los sistemas operativos (la shell de Unix es un intérprete de comandos). Los programas invocados pueden residir en el kernel (núcleo) del sistema o estar almacenados en algún dispositivo externo como rutinas ejecutables que se traen a memoria bajo demanda.Por ejemplo, si bajo MS-DOS se teclea el comando copy se ejecutará la función de copia de ficheros del sistema operativo, que se encuentra residente en memoria.

Page 9: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Ensambladores y macroensambladores

Un ensamblador es un compilador sencillo, en el que el lenguaje fuente tiene una estructura tan sencilla que permite la traducción de cada sentencia fuente a una única instrucción en código máquina. Al lenguaje que admite este compilador también se le llama lenguaje ensamblador. En definitiva, existe una correspondencia uno a uno entre las instrucciones ensamblador y las instrucciones máquina. Ejemplo:

Instrucción ensamblador: LD HL, #0100Código máquina generado: 65h.00h.01h

Por otro lado, existen ensambladores avanzados que permiten definir macroinstrucciones que se pueden traducir a varias instrucciones máquina. A estos programas se les llama macroensambladores, y suponen el siguiente paso hacia los lenguajes de alto nivel. Desde un punto de vista formal, un macroensamblador puede entenderse como un ensamblador con un preprocesador previo.

Page 10: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Conversores fuente-fuente

Permiten traducir desde un lenguaje de alto nivel a otro lenguaje de alto nivel, con lo que se consigue una mayor portabilidad en los programas de alto nivel.

Compilador cruzadoEs un compilador que genera código para ser ejecutado en otra máquina. Se utilizan en la fase de desarrollo de nuevos ordenadores. De esta manera es posible, p.ej., construir el sistema operativo de un nuevo ordenador recurriendo a un lenguaje de alto nivel, e incluso antes de que dicho nuevo ordenador disponga siquiera de un compilador.

Page 11: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Compilación, enlace y carga.

Estas son las tres fases básicas que hay que seguir para que un ordenador ejecute la interpretación de un texto escrito mediante la utilización de un lenguaje de alto nivel.Por regla general, el compilador no produce directamente un fichero

ejecutable, sino que el código generado se estructura en módulos que se almacenan en un fichero objeto. Los ficheros objeto poseen información relativa tanto al código máquina como a una tabla de símbolos que almacena la estructura de las variables y tipos utilizados por el programa fuente. La figura 1.4 muestra el resultado real que produce un compilador.

Page 12: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Durante la fase de enlace, el enlazador o linker resuelve las referencias cruzadas, (así se llama a la utilización de objetos externos), que pueden estar declarados en otros ficheros objeto, o en librerías (ficheros con extensión “lib” o “dll”), engloba en un único bloque los distintos registros que almacenan código máquina, estructura el bloque de memoria destinado a almacenar las variables en tiempo deejecución y genera el ejecutable final incorporando algunas rutinas adicionales procedentes de librerías, como por ejemplo las que implementan funciones matemáticas o de e/s básicas. La figura 1.5 ilustra este mecanismo de funcionamiento.

Page 13: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

De esta manera, el bloque de código máquina contenido en el fichero ejecutable es un código reubicable, es decir, un código que en su momento se podrá ejecutar en diferentes posiciones de memoria, según la situación de la misma en el momento de la ejecución. Según el modelo de estructuración de la memoria del microprocesador, este código se estructura de diferentes formas. Lo más usual es que el fichero ejecutable esté dividido en segmentos: de código, de datos, de pila de datos, etc.

Cuando el enlazador construye el fichero ejecutable, asume que cada segmento va a ser colocado en la dirección 0 de la memoria. Como el programa va a estar dividido en segmentos, las direcciones a que hacen referencia las instrucciones dentro de cada segmento (instrucciones de cambio de control de flujo, de acceso a datos, etc.), no se tratan como absolutas, sino que son direcciones relativas a partir de la dirección base en que sea colocado cada segmento en el momento de la ejecución.El cargador carga el fichero .exe, coloca sus diferentes segmentos en memoria (donde el sistema operativo le diga que hay memoria libre para ello) y asigna los registros base a sus posiciones correctas, de manera que las direcciones relativas funcionen correctamente. La figura 1.6 ilustra el trabajo que realiza un cargador de programas.

Page 14: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 15: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Cada vez que una instrucción máquina hace referencia a una dirección de memoria (partiendo de la dirección 0), el microprocesador se encarga automáticamente de sumar a dicha dirección la dirección absoluta de inicio de su segmento. Por ejemplo para acceder a la variable x almacenada en la dirección 1Fh, que se encuentra en el segmento de datos ubicado en la dirección 8A34h, la instrucción máquina hará referencia a 1Fh, pero el microprocesador la traducirá por 8A34h+1Fh dando lugar a un acceso a la dirección 8A53h: dir absoluta del segmento en memoria + dir relativade x en el segmento = dir absoluta de x en memoria.

Page 16: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Estructura de un traductor

Un traductor divide su labor en dos etapas: una que analiza la entrada y genera estructuras intermedias y otra que sintetiza la salida a partir de dichas estructuras. Por tanto, el esquema de un traductor pasa de ser el de la figura 1.1, a ser el de la figura 1.7.

Básicamente los objetivos de la etapa de análisis son: a) controlar la corrección del programa fuente, y b) generar las estructuras necesarias para comenzar la etapa de síntesis

Page 17: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Para llevar esto a cabo, la etapa de análisis consta de las siguientes fases:

Análisis lexicográfico. Divide el programa fuente en los componentes básicos del lenguaje a compilar. Cada componente básico es una subsecuencia de caracteres del programa fuente, y pertenece a una categoría gramatical: números, identificadores de usuario (variables, constantes, tipos, nombres de procedimientos, ...), palabras reservadas, signos de puntuación, etc. Análisis sintáctico. Comprueba que la estructura de los componentes básicos sea correcta según las reglas gramaticales del lenguaje que se compila.

Análisis semántico. Comprueba que el programa fuente respeta las directrices del lenguaje que se compila (todo lo relacionado con el significado): chequeo de tipos, rangos de valores, existencia de variables, etc.

Page 18: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

La etapa de síntesis construye el programa objeto deseado (equivalente semánticamente al fuente) a partir de las estructuras generadas por la etapa de análisis.

Para ello se compone de tres fases fundamentales:

Generación de código intermedio. Genera un código independiente de la máquina muy parecido al ensamblador. No se genera código máquina directamente porque así es más fácil hacer pseudocompiladores y además se facilita la optimización de código independientemente del microprocesador.

Generación del código máquina. Crea un bloque de código máquina ejecutable, así como los bloques necesarios destinados a contener los datos.

Fase de optimización. La optimización puede realizarse sobre el código intermedio (de forma independiente de las características concretas del microprocesador), sobre el código máquina, o sobre ambos. Y puede ser una aislada de las dos anteriores, o estar integrada con ellas.

Page 19: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Construcción sistemática de compiladores

Con frecuencia, las fases anteriores se agrupan en una etapa inicial (frontend) y una etapa final (back- end). La etapa inicial comprende aquellas fases, o partes de fases, que dependen exclusivamente del lenguaje fuente y que son independientes de la máquina para la cual se va a generar el código. En la etapa inicial se integran los análisis léxicos y sintácticos, el análisis semántico y la generación de código intermedio. La etapa inicial también puede hacer cierta optimización de código eincluye además, el manejo de errores correspondiente a cada una de esas fases.

La etapa final incluye aquellas fases del compilador que dependen de la máquina destino y que, en general, no dependen del lenguaje fuente sino sólo del lenguaje intermedio. En esta etapa, se encuentran aspectos de la fase de generación de código, además de su optimización, junto con el manejo de errores necesario y el acceso a las estructuras intermedias que haga falta.

Page 20: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 21: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Se ha convertido en una práctica común el tomar la etapa inicial de un compilador y rehacer su etapa final asociada para producir un compilador para el mismo lenguaje fuente en una máquina distinta. También resulta tentador crear compiladores para varios lenguajes distintos y generar el mismo lenguaje intermedio para, por último, usar una etapa final común para todos ellos, y obtener así varioscompiladores para una máquina. Para ilustrar esta práctica y su inversa, la figura 1.8 muestra una situación en la que se quiere crear un compilador del lenguaje C para tres máquinas diferentes: Dec-Alpha (Unix), Motorola (Mac OS) e Intel (MS-DOS). Cada bloque de líneas punteadas agrupa un front-end con un back-end dando lugar a un compilador completo.

De manera inversa se podrían construir tres compiladores de Pascal, C y COBOL para una misma máquina, p.ej. Intel, como se ilustra en la figura 1.9. Por último, la creación de compiladores de Pascal, C y COBOL para las máquinas Dec-Alpha, Motorola e Intel, pasaría por la combinación de los métodosanteriores, tal como ilustra la figura 1.10.

Page 22: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 23: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 24: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

La tabla de símbolosUna función esencial de un compilador es registrar los identificadores de usuario (nombres de variables, de funciones, de tipos, etc.) utilizados en el programa fuente y reunir información sobre los distintos atributos de cada identificador. Estos atributos pueden proporcionar información sobre la memoria asignada a unidentificador, la dirección de memoria en que se almacenará en tiempo de ejecución, su tipo, su ámbito (la parte del programa donde es visible), etc. Pues bien, la tabla de símbolos es una estructura de datos que posee información sobre los identificadores definidos por el usuario, ya sean constantes, variables, tipos u otros. Dado que puede contener información de diversa índole, debe hacerse de forma que su estructura no sea uniforme, esto es, no se guarda la misma información sobre una variable del programa que sobre un tipo definido por el usuario. Hace funciones de diccionario de datos y su estructura puede ser una tabla hash, un árbol binario de búsqueda, etc., con tal de que las operaciones de acceso sean lo bastante eficientes.

Page 25: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.
Page 26: Gilberto G. Romero H. Traductores. Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente.

Tanto la etapa de análisis como la de síntesis accede a esta estructura, por lo que se halla muy acoplada al resto de fases del compilador. Por ello conviene dotar a la tabla de símbolos de una interfaz lo suficientemente genérica como para permitir el cambio de las estructuras internas de almacenamiento sin que estas fases deban ser retocadas. Esto es así porque suele ser usual hacer un primer prototipo de un compilador con una tabla de símbolos fácil de construir (y por tanto, ineficiente), y cuando el compilador ya ha sido finalizado, entonces se procede a sustituir la tabla de símbolos por otra más eficiente en función de las necesidades que hayan ido surgiendo a lo largo de la etapa de desarrollo anterior. Siguiendo este criterio, el esquema general definitivo de un traductor se detalla en la figura 1.11. La figura 1.12 ilustra el esquema por fases, donde cada etapa ha sido sustituida por las fases que la componen y se ha hecho mención explícita del preprocesador..