En grandes rasgos, un traductor es el que convierte un programa de computadora
escrito en un lenguaje de programacin a otro lenguaje de programacin.
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. El esquema de un traductor se identifica en dos etapas:
En la etapa de anlisis bsicamente analiza el programa de origen para determinar si cumple las restricciones semnticas, sintcticas y lexicogrficas impuestas por el programa fuente. Esta etapa de anlisis consta de las siguientes fases: Anlisis lexicogrfico. Divide el programa fuente en los componentes bsicos del lenguaje a compilar. Cada componente bsico es una subsecuencia de caracteres del programa fuente. Anlisis sintctico. Comprueba que la estructura de los componentes bsicos sea correcta segn las reglas que maneje el lenguaje a compilar. Anlisis semntico. Comprueba que el programa fuente respeta las normas del lenguaje que se compila: chequeo de tipos, rangos de valores, existencias de variables, etc.
En la etapa de sntesis se genera el cdigo objeto correspondiente en el idioma de destino a partir de las estructuras generadas por la etapa de anlisis. Esta etapa de sntesis consta de las siguientes fases: Generacin de cdigo intermedio. Genera un cdigo independiente de la mquina muy parecido al ensamblador. Generacin del cdigo mquina. Crea un bloque de cdigo mquina ejecutable, as como los bloques necesarios destinados a contener los datos. Fase de optimizacin. Se realiza sobre el cdigo intermedio, sobre el cdigo mquina o ambos. Puede ser aislada de las dos anteriores o integrada con ellas.
Qu es un compilador? Un compilador es un programa especial que procesa declaraciones escritas en un lenguaje de programacin en particular y los convierte en lenguaje que la mquina sea capaz de interpretar.
El proceso completo de compilacin se ilustra como:
Preprocesador. Realiza generalmente las operaciones sobre el archivo(s) fuente antes de la compilacin. Las operaciones tpicas de preprocesamiento incluyen: a) La expansin de macros (notaciones cortar para construcciones mas largas). Por ejemplo en C, #define foo(x,y) (3*x+y*(2+x)) Define un macro foo, que cuando es usado despus en el programa, es expandido por el preprocesador. Por ejemplo, a= foo(a,b) convirtindose a=(3*a+b*(2+a)) b) Insercin nombrando archivo. Por ejemplo en C #include header.h es remplazado por el contenido del archivo header.h
Enlazadores. Un enlazador combina cdigo objeto producido de compiladores y ensambladores de muchos programas, como tambin las funciones de biblioteca estndar y recursos proporcionados por el sistema operativo. Esto implica la resolucin de referencias en cada objeto presentando a las variables y procedimientos externos declarados en otros archivos.
Cargadores. Compiladores, ensambladores y enlazadores usualmente producen cdigo que hace referencia en memoria con relacin aun punto de partida indeterminado que puede estar en cualquier parte de memoria. Un cargador calcula direcciones absolutas para estas locaciones de memoria y modifica el cdigo usado para estas direcciones.
Cualquier compilador debe realizar dos tareas principales: anlisis del programa a compilar y sntesis de un programa en lenguaje mquina. Un compilador es un programa complejo en el que no es fcil distinguir claramente unas partes de otras. Sin embargo, se ha conseguido establecer una divisin lgica del compilador en fases, lo que permite formalizar y estudiar por separado cada una de ellas. En la prctica, estas fases no siempre se ejecutan secuencialmente sino que lo hacen simultneamente, pudiendo ser unas fases tratadas como subrutinas de otras. En cada una de las fases se utiliza un administrador de la tabla de smbolos y un manejador de errores. En la siguiente imagen se ilustran las fases de un compilador.
Anlisis lxico. El analizador lxico, tambin conocido como scanner, lee los caracteres del programa fuente, uno a uno, desde el chero de entrada y va formando grupos de caracteres con alguna relacin entre s (tokens).Donde:
Tokens son nombres simblicos para las entidades que conforman el texto del programa. Un patrn es una regla que especfica cundo una secuencia de caracteres a partir de la entrada constituye una muestra. Un lexema es una secuencia de caracteres a partir de la entrada que coincida con un patrn.
Cada token es tratado como una nica entidad, constituyendo la entrada de la siguiente fase del compilador. Existen diferentes tipos de tokens y a cada uno se le puede asociar un tipo y, en algunos casos, un valor. Los tokens se pueden agrupar en dos categoras:
Cadenas especcas, como las palabras reservadas (if, while, ...), signos de puntuacin(.,,,=, ...), operadores aritmticos (+,*, ...) y lgicos (AND, OR, ...), etc. Habitualmente, las cadenas especcas no tienen asociado ningn valor, slo su tipo. Cadenas no especcas, como los identicadores o las constantes numricas o de texto. Las cadenas no especicas siempre tienen tipo y valor. Por ejemplo, si dato es el nombre de una variable, el tipo del token ser identicador y su valor ser dato.
Frecuentemente el analizador lxico funciona como una subrutina del analizador sintctico. Para el diseo del analizador lxico se utilizan los Autmatas Finitos.
Analizador sintctico. El analizador sintctico, tambin llamado parser, recibe como entrada los tokens que genera el analizador lxico y comprueba si estos tokens van llegando en el orden correcto. Siempre que no se hayan producido errores, la salida terica de esta fase del compilador ser un rbol sintctico. Si el programa es in- correcto se generarn los mensajes de error correspondientes. Para el diseo de los analizadores sintcticos se utilizan los Autmatas de Pila.
Analizador semntico. El analizador semntico trata de determinar si el signicado de las diferentes instrucciones del programa es vlido. Para conseguirlo tendr que calcular y analizar informacin asociada a las sentencias del programa, por ejemplo, deber determinar el tipo de los resultados intermedios de la expresiones, comprobar que los argumentos de un operador pertenecen al conjunto de los operandos posibles, comprobar que los operandos son compatibles entre s, etc. La salida terica de esta fase ser un rbol semntico. Este es una ampliacin de un rbol sintctico en el que cada rama del rbol ha adquirido, adems, el signicado que debe tener el fragmento de programa que representa. Esta fase del anlisis es ms difcil de formalizar que las dos anteriores y se utilizaran para ello las gramticas atribuidas.
Generador de cdigo intermedio. Despus de la etapa de anlisis de le compilador, se suele generar una representacin intermedia explcita del programa fuetne. Dicha representacin se considera como un programa para una mquina abstracta. Cualquier representacin debe tener dos propiedades importantes; debe ser fcil de generar y fcil de traducir al cdigo mquina destino
Generacin del cdigo mquina. Crea un bloque de cdigo mquina ejecutable, as como los bloques necesarios destinados a contener los datos. En esta fase consideramos: La gestin de memoria. Asignacin de registro. Mquina especfica de optimizacin.
Fase de optimizacin. La mayora de los compiladores suelen tener una fase de optimizacin de cdigo intermedio (independiente de los lenguajes fuente y objeto), y una fase de optimizacin de cdigo objeto (no aplicable a otras mquinas).
Se realiza sobre el cdigo intermedio, sobre el cdigo mquina o ambos. Puede ser aislada de las dos anteriores o integrada con ellas. Existen muchas maneras en las que el cdigo puede ser optimizado, las mas comunes son: Remover identificadores redundantes. Remover secciones inalcanzables de cdigo. La identificacin de subexpresiones comunes . Despliegue de bucles.
Manejo de errores. En todas las fases se pueden encontrar errores, sin embargo en el perodo de anlisis se encuentran con ms frecuencia. En la deteccin de un error el compilador debe: Reportar el error de una manera til. Corregir el error, s es posible. Continuar el proceso, s este fuera posible. Dentro de los tipos de errores se encuentran los errores de sintctica y semntica: Los errores de sintctica son errores en el programa de texto; pueden ser lxicos gramaticales: o Un error lxico es un error en un lexema, por ejemplo escribir tehn en vez de then. o Un error gramatical es una violacin a las reglas gramaticales del lenguaje, por ejemplo: If x=5 y=4 (hara falta el then). Los errores semnticos son errores sobre el sentido de una construccin del programa; ya sean errores de tipo, errores lgicos o errores de tiempo de ejecucin: o Un error de tipo ocurre cuando se aplica un operador a un argumento del tipo incorrecto. o Un error lgico se produce cuando se ejecuta un programa mal concebido, por ejemplo: while x=y do donde x e y inicialmente tienen el mismo valor y el cuerpo del ciclo no cambia el valor de x y. o Un error en tiempo de ejecucin se produce solo cuando se ejecuta el programa.
Tabla de smbolos El compilador necesita gestionar la informacin de los elementos que se va encontrando en el programa fuente: variables, tipos, funciones, clases, etc. Esta informacin se almacena en una estructura de datos interna conocida como tabla de smbolos. Para que la compilacin sea enciente la tabla debe ser diseada cuidadosamente de manera que contenga toda la informacin que el compilador necesita. Adems, hay que prestar especial atencin a la velocidad de acceso a la informacin con objeto de no ralentizar el proceso.