![]()
OBJETIVO
Nos ayudara a profundizar conocimiento acerca del diseño de los programas y su implementación. El proceso de construcción de un compilador se integra muchos de los diferentes tópicos de ciencias de la computación.
MARCO TEÓRICO
Los principios y técnicas de
escritura de compiladores son tan amplios que las ideas encontradas se usarán muchas veces en la
carrera de un científico de la computación. La escritura de compiladores
comprende los lenguajes de programación, la arquitectura de computadores, la
teoría de lenguajes, los algoritmos y la ingeniería de software. Por fortuna,
con algunas técnicas básicas de escritura de compiladores se pueden construir
traductores para una gran variedad de lenguajes y máquinas. En la compilación describiendo los componentes de un
compilador, el entorno en el que trabajan los compiladores y algunas
herramientas de software que facilitan la construcción de compiladores.
COMPILADORES
A grandes rasgos, un compilador es un programa que lee un programa escrito en un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente programa fuente compilador mensajes de error programa..
A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay
miles de lenguajes fuente, desde los lenguajes de programación tradicionales,
como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido
virtualmente en todas las áreas de aplicación de la informática. Los lenguajes
objeto son igualmente variados; un lenguaje objeto puede ser otro lenguaje de
programación.
A pesar de esta aparente complejidad, las tareas básicas que debe realizar
cualquier compilador son esencialmente las mismas. Al comprender tales tareas,
se pueden construir compiladores para una gran diversidad de lenguajes fuente y
máquinas objeto utilizando las mismas técnicas básicas.
Nuestro conocimiento sobre cómo organizar y escribir compiladores ha aumentado
mucho desde que comenzaron a aparecer los primeros compiladores a principios de
los años cincuenta. Es difícil dar una fecha exacta de la aparición del primer
compilador: porque en un principio gran parte del trabajo de experimentación y
aplicación se realizó de manera independiente por varios grupos. Gran parte de
los primeros trabajos de compilación estaba relacionada con la traducción de
fórmulas aritméticas a código de máquina.
En la década de 1950, se consideró a los compiladores como programas
notablemente difíciles de escribir. El primer compilador de FORTRAN, por
ejemplo, necesitó para su implantación 18 años de trabajo en grupo (Backus y
otros 1975).
Desde entonces, se han descubierto técnicas sistemáticas para manejar muchas de
las importantes tareas que surgen en la compilación. También se han desarrollado
buenos lenguajes de implantación, entornos de programación y herramientas de
software.
Modelo de análisis y síntesis de la compilación
En la compilación hay dos partes: análisis y síntesis. La parte del análisis
divide al
programa fuente en sus elementos componentes y crea una representación
intermedia del programa fuente. La parte de la síntesis construye el programa
objeto deseado a partir de la representación intermedia. De las dos partes, la
síntesis es la que requiere las técnicas más especializadas.
Durante el análisis, se determinan las operaciones que implica el programa
fuente
y se registran en una estructura jerárquica llamada árbol. A menudo, se usa una
clase especial de árbol llamado árbol sintáctico, donde cada nodo representa una
operación y los hijos de un nodo son los argumentos de la operación.
Muchas herramientas de software que manipulan programas fuente realizan primero algún tipo de análisis. Algunos ejemplos de tales herramientas son:
2. Impresoras estéticas: Una impresora estética analiza un programa y
lo imprime
de forma que la estructura del programa resulte claramente visible. Por ejemplo,
los comentarios pueden aparecer con un tipo de letra especial, y las
proposiciones pueden aparecer con una indentación proporcional a la profundidad
de su
anidamiento en la organización jerárquica de las proposiciones.
3. Verificadores estáticos: Un verificador estático lee un
programa, lo analiza e intenta descubrir errores potenciales sin ejecutar el
programa. Así, un verificador estático puede detectar si hay partes de un
programa que nunca se podrán ejecutar o si cierta variable se usa antes de ser
definida. Además, puede detectar errores de lógica, como intentar utilizar una
variable real como apuntador, empleando las técnicas de verificación de tipos
que se analizan.
4. Intérpretes:
En lugar de producir un programa objeto como
resultado de una
traducción, un intérprete realiza las operaciones que implica el programa
fuente.
Para una proposición de asignación, por ejemplo, un intérprete podría construir
un árbol , y después efectuar las operaciones de los nodos conforme "recorre" el
árbol. En la raíz descubriría que tiene que realizar una asignación, y llamaría
a una rutina para evaluar la expresión de la derecha y después almacenaría el
valor resultante en la localidad de memoria asociada con el identificador
posición. En el hijo derecho de la raíz, la rutina descubriría que tiene que
calcular la suma de dos expresiones. Se llamaría a sí misma de manera recursiva
para calcular el valor de la expresión velocidad*60. Después sumaría ese valor
al valor de la variable inicial.
Muchas veces los intérpretes se usan para ejecutar lenguajes de órdenes, pues
cada operador que se ejecuta en un lenguaje de órdenes suele ser una invocación
de una rutina compleja, como un editor o un compilador. Del mismo
modo,
algunos lenguajes de "muy alto nivel", como APL, normalmente son interpretados,
porque hay muchas cosas sobre los datos, como el tamaño y la forma de
las matrices, que no se pueden deducir en el momento de la compilación.
Tradicionalmente, se concibe un compilador como un programa que traduce un
programa fuente, como FORTRAN, al lenguaje ensamblador o de máquina de algún
computador. Sin embargo, hay lugares, no relacionados donde la
tecnología de los compiladores se usa con regularidad.
1. Formadores de textos: Un formador de textos toma como entrada una cadena de caracteres, la mayor parte de la cual es texto para componer, pero alguna incluye órdenes para indicar párrafos, figuras o estructuras matemáticas, come subíndices o superíndices.
2. Compiladores de circuitos de silicio:. Un compilador de circuitos de silicio tiene un lenguaje fuente similar o idéntico a un lenguaje de programación convencional. Sin embargo, las variables del lenguaje no representan localidades de memoria, sino señales lógicas (O ó 1) o grupos de señales en un circuito de conmutación. La salida es el diseño de un circuito en un lenguaje apropiado.
3. Intérpretes de consulta:
Un intérprete de consultas traduce un
predicado que
contiene operadores relacionales y booleanos a órdenes para buscar en una base
de datos registros que satisfagan ese predicado.
El contexto de un compilador
Además de un compilador, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confía a un programa distinto, llamado preprocesador. El preprocesador también puede expandir abreviaturas, llamadas macros, a proposiciones del lenguaje fuente.
El programa objeto creado por el compilador puede requerir
procesamiento adicional antes de poderlo ejecutar. El compilador crea un código
en lenguaje ensamblador el cual es traducido por un ensamblador a código de
máquina y después se enlaza a algunas rutinas de biblioteca para producir el
código que realmente se ejecute en la máquina.
ANÁLISIS DEL PROGRAMA FUENTE
El análisis y su uso en
algunos lenguajes de formación de textos. En la compilación, el análisis consta
de tres fases: Análisis lineal, en el que la cadena de caracteres que constituye el programa
fuente se lee de izquierda a derecha y se agrupa en componentes léxicos, que son
secuencias de caracteres que tienen un significado colectivo.
DESARROLLO
LAS FASES DE UN COMPILADOR
Un compilador opera en fases cada una de las cuales transforma
al programa fuente de una representación en otra. En la figura se muestra una
descomposición típica de un compilador.

Las tres primeras fases que forman la mayor parte de la porción de análisis de un compilador.