Traductores

¿Que es?

Un traductor es un programa que lee un programa fuente escrito en el lenguaje fuente y produce como resultado otro programa, con el mismo significado (misma semántica) que el fuente.

Composición

El modelo de análisis – síntesis para un traductor

La compilación suele dividirse en dos fases el análisis y la síntesis

Análisis

Durante el análisis se estudia el programa partiéndolo en sus trozos constituyentes intentando determinar el significado de dicho programa y construyendo una representación intermedia. En el análisis se suele construir una representación interna jerárquica del programa que refleja su estructura estas son llamadas (árbol de sintaxis abstracta).

Existen herramientas de software que también realizan análisis antes de manipular los programas

Editores de estructura

Pretty printers

Comprobadores estáticos

Formateadores de texto

Interpretes

Interpretes de consulta a una base de datos

Síntesis

Durante la síntesis se construye el programa objeto a partir de la representación intermedia. De ambas fases, la síntesis es la que necesita unas técnicas más especializadas.

Contexto de un traductor

Además de un traductor, suelen ser necesarias otras herramientas para crear el programa ejecutable. Por ejemplo, un programa fuente puede estar escrito en módulos separados. Estos módulos se copilan produciendo programas en ensamblador que, a continuación, se ensamblan produciendo modulos en lenguaje máquina que necesitan linkarse con las rutinas y otros módulos para dar un programa reubicable que aún necesita de un cargador para ejecutarse.

Herramientas para la construcción de traductores

Existen varias herramientas desarrolladas para el diseño de componentes específicos de traductores.

Generadores de analizadores lexicograficos

Generadores de analizadores sintacticos

Maquinas traductoras dirigidas por sintaxis

Generadores automáticos de código

Maquinas de flujo de datos

Herramientas para su ejecución

Programa fuente

Compilador

Programa en ensamblador

Ensamblador

Modulo en código maquina

Enlazador (Linkador)

Cargador

Preprocesadores

Los preprocesadores proporcionan la entrada para los traductores y pueden realizar distintas funciones

Funciones

Proceso de macros

Los macros son abreviaturas para las instrucciones o conjuntos de instrucciones. A menudo la definición de macro permite parámetros formales.

Inclusión de archivos

Puede permitirse la inclusión de otros archivos.

Preprocesadores raciones y extensiones a los lenguajes

Estos preprocesadores enriquecen lenguajes anticuados con nuevas estructuras de flujo de control y manejo de daros más actuales.

Ensambladores

Los ensambladores son compiladores que admiten como lenguaje fuente el lenguaje ensamblador y como lenguaje objeto el lenguaje máquina de un cierto procesador. El lenguaje ensamblador es una versión simbólica para el lenguaje máquina en la que se utilizan nombre nemotécnico en vez de códigos binarios de operación y nombres simbólicos en vez de direcciones de memoria.

Cargadores y linkadores

Cargador

Un cargador toma un código maquina reubicable, altera las direcciones, según el proceso descrito anteriormente, y sitúa el código ya alterado y los datos en memoria en la posición precisa.

Linkadores

El linkador crea un único archivo con programa objeto reubicable de varios archivos conteniendo código maquina reubicable (cada archivo es el resultado de una compilación de un modulo diferente del programa) y de rutinas de librerías suministradas por el sistema.

Fases de un traductor

Podemos considerar que un traductor trabaja en fases, cada una de las cuales transforma el programa fuente de una representacion a otra.

Análisis del programa fuente

Análisis lineal

Se lee de izquierda a derecha la cadena de caracteres que constituye el programa fuente y se agrupan dichos caracteres para formar los tokens que son cadenas de caracteres con un significado conjunto. Los tokens constituyen los datos de entrada para realizar el análisis jerárquico.

Análisis jerárquico

Los tokens se agrupan jerárquicamente para forman conjuntos anidados con in significado colectivo. El análisis jerárquico lo realiza el analizador sintáctico.

Análisis semántico o de restricciones contextuales

Se comprueba que los componentes del programa encajan adecuadamente en el contexto en que están utilizados. Aquí se comprueba una serie de requisitos que no se pueden expresar mediante métodos sintácticos.

Análisis lexicógrafo

Al análisis lineal en un traductor se le denomina análisis lexicógrafo o scanning. Normalmente durante en análisis lexicógrafo se eliminaran los espacio blancos que separan los tokens.

Análisis sintáctico

Constituye el análisis jerárquico. También se le llama parsing. Consiste en agrupar los token del programa fuente formando frases gramaticales que son utilizadas por el traductor para sintetizar el resultado.

Análisis semántico o de restricciones contextuales

En esta fase se chequea el programa fuente buscando errores semánticos y recopilando información sobre los tipos de los datos para la fase de generación de código posterior. Se utiliza la estructura jerárquica creada por el analizador sintáctico para identificar los operadores y operandos de las expresiones.

Manejo de la tabla de simbolos

La tabla de símbolos es una estructura de datos que contiene un registro por cada identificador, con campos para cada uno de sus atributos. Es importante que esta estructura permita encontrar rápidamente el registro de cada identificador.

Detección de errores y emisión de mensajes de error

Cada fase puede detectar sus propios errores. El analizador lexicógrafo puede detectar errores cuando los caracteres de entrada no forman ninguna token conocido.

Cambio en la representación interna

La representación interna del programa fuente cambia conforme avanza la compilación y pasa por diferentes fases.

Generación de código intermedio

Después de los análisis lexicógrafo y sintáctico algunos traductores generan una representación interna explicita del programa fuente, la representación intermedia puede tener muchas formas posibles como un el famoso código de tres direcciones.

Optimización de código intermedio

Esta fase intenta mejorar el código intermedio para que se ejecute más rápido.

Generación de código

La fase final de un traductor consiste en la generación de código produciendo generalmente codigo maquina reubicable o lenguaje ensamblador.