01 Generalidades de Compiladores
01 Generalidades de Compiladores
01 Generalidades de Compiladores
1 GENERALIDADES DE COMPILADORES
DEFINICIÓN DE UN COMPILADOR
Partes de un compilador
Normalmente los compiladores están divididos en dos partes:
Front End: es la parte que analiza el código fuente para comprobar su validez. Esta parte
suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. El Front
End realiza la fase de Análisis de la compilación.
Back End: es la parte que genera el código objeto, específico de una plataforma, a partir de
los resultados de la fase de análisis, realizada por el Front End. El Back End realiza la fase
de Síntesis de la compilación.
Esta división permite que el mismo Back End se utilice para generar el código máquina de
varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar
el código fuente de un lenguaje de programación concreto sirva para generar código
máquina en varias plataformas distintas.
El código que genera el Back End normalmente no se puede ejecutar directamente, sino que
necesita ser enlazado por un programa enlazador (linker).
HISTORIA
FORTRAN, fue el primer lenguaje compilado, en un intento por facilitar a los programadores
Franceses e Ingleses su trabajo. Fue un cambio difícil, pero un gran paso en los
compiladores.
En esa época el refrán “Los verdaderos programadores utilizan un lenguaje ensamblador” era
muy aceptado.
FORTRAN no poseía estructuras como registros, conjuntos, punteros, tipos enumerados, y no
estaba incluida la recursividad, debía simularse con una pila.
Hoy en día los compiladores son mucho más poderosos, y es posible especificar lenguajes
donde se usen más estructuras y tecnologías actuales, como la comunicación en red y
algoritmos complejos.
TRADUCTORES
Generalidades
Traductor: Es una máquina teórica que tiene como entrada un texto escrito en un lenguaje
L1 y como salida un texto escrito en un lenguaje L2. Habitualmente se denomina a L1
Lenguaje fuente y a L2 el lenguaje objeto.
Las técnicas que se desarrollan en esta asignatura no sólo son válidas para la
implementación de compiladores, sino que son aplicables en general a todos los sistemas de
procesamiento de lenguajes y de traducción. Estos sistemas pueden ser de distintos tipos:
Compiladores - Generalidades 3
Traductores de Lenguaje Natural: Serían los que tradujeran un lenguaje natural en otro
(por ejemplo, español a inglés). Esto en la actualidad no se ha conseguido debido
fundamentalmente a la ambigüedad del lenguaje natural. Los mayores logros en la materia
siempre trabajan con un subconjunto del lenguaje natural, limitando las construcciones
sintácticas válidas y/o el vocabulario.
Este tema se aborda generalmente mediante técnicas de Inteligencia Artificial.
Intérprete: Es un traductor que realiza la operación de compilación paso a paso. Para cada
sentencia que compone el texto de entrada, se realiza una traducción, ejecuta dicha
sentencia y vuelve a iniciar el proceso con la sentencia siguiente. La principal ventaja del
proceso de compilación frente al de interpretación es que los programas se ejecutan mucho
más rápidamente una vez compilados; por el contrario, es más cómodo desarrollar un
programa mediante un intérprete que mediante un compilador puesto que en el intérprete
las fases de edición y ejecución están más integradas. La depuración de los programas suele
ser más fácil en los intérpretes que en los compiladores puesto que el código fuente está
presente durante la ejecución. Estas ventajas pueden incorporarse al compilador mediante la
utilización de entornos de desarrollo y depuradores simbólicos en tiempo de ejecución.
Un Intérprete no arroja código objeto, ya que ejecuta directamente las instrucciones sobre la
máquina.
Compiladores de una sola pasada: generan el código máquina a partir de una única
lectura del código fuente.
Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de
poder producir el código máquina.
Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del
código según se necesitan.
Compiladores - Generalidades 4
Autocompilador: Es aquél que está escrito en el mismo lenguaje que se pretende compilar.
Supongamos, por ejemplo, que queremos desarrollar la versión 2.0 de un compilador Pascal.
Dicho compilador generará un código mucho más rápido y eficiente que el que generaba la
versión anterior 1.0. Sin embargo, son ya muchas las máquinas (IBM 370, Serie 1, PDP 11,
...) que disponen del antiguo compilador, o que al menos tienen otro compilador Pascal. La
mejor opción consiste en escribir el nuevo compilador en Pascal, ya que así podrá (el
compilador) ser compilado en las distintas máquinas por los compiladores Pascal ya
existentes.
El Preprocesador
En una fase compilación se puede apreciar que son varios los componentes que se involucran
en la interpretación del código fuente. El más visible para el usuario es el Preprocesador. Es
común encontrase en un código fuente la necesidad de agregar líneas como:
#include<stdio.h>
#include<conio.h>
void main()
{
int a;
if( a ){
printf(“Hola mundo”);
}
}
La idea de agregar las líneas include es la de reutilizar código previamente desarrollado y así
facilitar nuestras construcciones. Por esta razón, el trato a este tipo de código es diferente al
trato hecho al código fuente propio, pero en ambos casos es importante reconocer cual es la
función del compilador, ya que esta depende del tipo de lenguaje que interpreta.
El enlazador (del inglés, linker) resuelve las referencias a objetos externos que se
encuentran en un fichero fuente. Estas referencias son a objetos que se encuentran en otros
módulos compilados, ya sea en forma de ficheros objeto o incorporados en alguna biblioteca
(del inglés, library).
Para terminar:
¿Qué es un compilador?
¿Cuál es la función de un compilador?
¿Por qué es importante un compilador en el desarrollo de software?
¿Qué tipo de proyectos requieren la existencia de un compilador?
Consulte