COMPILADORES
E INTERPRETES
COMPILADOR
El "COMPILADOR" es un
programa especial destinado a traducir automáticamente un lenguaje de segunda o
tercera generación en código de máquina (bits), de tal modo que todas las
instrucciones y los datos contenidos en el programa estén en condiciones de ser
reconocidos y ejecutados por la CPU. El programa original se llama "programa
fuente" y se conserva igual que un texto preparado con un procesador de
palabras. La "traducción" es una serie diferentes de caracteres (utilizables por
la CPU) que debe ser grabado en otro espacio de memoria auxiliar. Se llama
"programa objeto". El usuario "carga" el programa objeto en la memoria principal
(RAM) cuando desea utilizarlo. (Los programas comerciales que compramos vienen
bajo la forma de "programa objeto").
Dado que cada procesador tiene su propio "set" de instrucciones, los
compiladores deben estar asociados a los diversos modelos de procesadores (p.ej.
Intel 8088, Motorola 68000, PowerPC). Y ya que existen múltiples lenguajes de
más alto nivel que el código de máquina, también están ligados a dichos
lenguajes. En consecuencia, debería haber un número de compiladores igual al
número de modelos de procesadores multiplicado por el número de lenguajes (ej.
compilador de PASCAL para Motorola 68000, para Intel 8088, etc.; de BASIC para
Motorola 68000, para Intel 8088, etc.; etc.).
En la realidad el número es menor, ya que no se confeccionan compiladores para
todas las combinaciones posibles.
Estructura de un Compilador.
Cualquier compilador debe realizar dos tareas principales: análisis del programa
a compilar y síntesis de un programa en lenguaje maquina que, cuando se ejecute,
realizara correctamente las actividades descritas en el programa fuente. Para el
estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase
representa una transformación al código fuente para obtener el código objeto. La
siguiente figura representa los componentes en que se divide un compilador. Las
tres primeras fases realizan la tarea de análisis, y las demás la síntesis. En
cada una de las fases se utiliza un administrador de la tabla de símbolos y un
manejador de errores.
Análisis Léxico.
En la fase de análisis léxico se leen los caracteres del programa fuente y se
agrupan en cadenas que representan los componentes léxicos. Cada componente
léxico es una secuencia lógicamente coherente de caracteres relativa a un
identificador, una palabra reservada, un operador o un carácter de puntuación. A
la secuencia de caracteres que representa un componente léxico se le llama
lexema (o con su nombre en inglés token). En el caso de los identificadores
creados por el programador no solo se genera un componente léxico, sino que se
genera otro lexema en la tabla de símbolos.
Análisis Sintáctico.
En esta fase, los componentes léxicos se agrupan en frases gramaticales que el
compilador utiliza para sintetizar la salida.
Análisis Semántico.
La fase de análisis semántico se intenta detectar instrucciones que tengan la
estructura sintáctica correcta, pero que no tengan significado para la operación
implicada.
Generación de código Intermedio.
Algunos compiladores generan una representación intermedia explícita del
programa fuente, una vez que se han realizado las fases de análisis. Se puede
considerar esta operación intermedia como un subprograma para una máquina
abstracta. Esta representación intermedia debe tener dos propiedades
importantes: debe ser fácil de producir y fácil de traducir al programa objeto.
Optimización de Código.
En esta fase se trata de mejorar el código intermedio, de modo que resulte un
código de máquina más rápido de ejecutar.
Generación de Código.
Esta constituye la fase final de un compilador. En ella se genera el código
objeto que por lo general consiste en código en lenguaje máquina (código
relocalizable) o código en lenguaje ensamblador.
Administrador de la tabla de símbolos.
Una tabla de símbolos es una estructura de datos que contiene un registro por
cada identificador. El registro incluye los campos para los atributos del
identificador. El administrador de la tabla de símbolos se encarga de manejar
los accesos a la tabla de símbolos, en cada una de las etapas de compilación de
un programa.
Manejador de errores.
En cada fase del proceso de compilación es posibles encontrar errores. Es
conveniente que el tratamiento de los errores se haga de manera centralizada a
través de un manejador de errores. De esta forma podrán controlarse más
eficientemente los errores encontrados en cada una de las fases de la
compilación de un programa
INTERPRETE
Los "INTERPRETES" son
programas especiales destinados a "traducir" programas redactados en lenguajes
de tercera generación, pero operan de un modo distinto de los compiladores.
Aquí, no se crea un "programa objeto", sino que -cada vez que se desea usar el
programa fuente- se opera leyéndolo y traduciéndolo instrucción por instrucción
en lenguaje de máquina. En este caso, el intérprete debe estar previa y
constantemente disponible en la memoria principal, ya que de él depende la
ejecución del programa.
Los primeros microcomputadores (especialmente los modelos "hogareños") se
entregaban con un intérprete de BASIC "incorporado", lo cual quiere decir que
tenían un chip con el intérprete grabado en ROM, adjunto al procesador. De este
modo podían traducir y ejecutar instrucciones de BASIC desde el momento en que
se encendían.