You are on page 1of 7

Una breve historia de los compiladores:

En 1946, se desarrolla la primer computadora digital (lenguaje de


mquina)

1950, John Backus dirige una investigacin en IBM en un lenguaje


algebraico.

1954, se comienza a desarrollar FORTRAN.

1957, FORTRAN se utiliza en la IBM modelo 704.

Surge el concepto traductor.

El primer compilador de FORTRAN tard 18 aos-persona en realizarse.

FORTRAN era dependiente de la mquina.

Paralelamente al desarrollo de FORTRAN en Amrica, en Europa surge


una corriente que pretende que los lenguajes fuesen independientes de
la mquina, esta corriente estaba influida por los trabajos sobre GLC de
Chomsky.

Surge un grupo Europeo encabezado por F.L. Bauer, en la que particip


ACM y John Backus. De este grupo surge un informe que define un
Lenguaje Algebraico Internacional, publicado en Zurich en 1958.

1969, aparece Algol 60.

Junto con los lenguajes tambin la tcnica de los compiladores


avanza1958, Strong y otros proponen una solucin al problema de que
un compilador fuera portable, y esta era dividir al compilador en dos
fases front end (analiza el programa fuente) y back end (genera
cdigo objeto para la mquina objeto).

El puente de unin era un lenguaje intermedio denominado UNCOL (no


funcion).

1959, Rabin y Scott proponen el empleo de AFD y AFN para el


reconocimiento lexicogrfico de los lenguajes.

Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una gua


para el desarrollo del anlisis sintctico.

1959, Sheridan describe un mtodo de parsing de FORTRAN para


introducir parntesis en una expresin.

En los 60s se desarrollan diversos mtodos de parsers ascendentes y


descendentes.

Floyd ms adelante introduce la tcnica de precedencia de operadores y


uso de funciones de precedencia.

1961, se usa por primera vez un parsing descendente recursivo.

En los 60s se estudia el paso de parmetros por nombre, valor y


referencia y se incluyen los procedimientos recursivos para Algol 60.

Se desarrolla la localizacin dinmica de datos.

1968, se estudia y definen las GLC, los parsers predictivos y la


eliminacin de recursividad izquierda.

1975, aparece LEX generador automtico de analizadores lxicos a


partir de expresiones regulares bajo UNIX.

A mitad de los 70s Johnson crea YACC para UNIX (generador de


analizadores sintcticos).

Ahora un compilador de divide en varias etapas.

El ltimo lenguaje de programacin de amplia aceptacin es JAVA (es


interpretado).

Conceptos Bsicos.
Traductor: Cualquier programa que toma como entrada un texto escrito en un
lenguaje llamado fuente y da como salida un programa equivalente en otro
lenguaje, el lenguaje objeto.

Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto


un lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le
denomina compilador.
Ensamblador: Es un programa traductor cuyo lenguaje fuente es el lenguaje
ensamblador.
Intrprete: Es un programa que no genera un programa equivalente, sino que
toma una sentencia del programa fuente en un lenguaje de alto nivel y la
traduce al cdigo equivalente y al mismo tiempo lo ejecuta.
En un principio debido a la escasez de memoria se utilizaban ms los
intrpretes, ahora se usan ms los compiladores (a excepcin de JAVA).
Ventajas de compilar contra a interpretar

Se compila una vez, se ejecuta n veces.


En ciclos, la compilacin genera cdigo equivalente, interpretndolo se
traduce tantas veces una lnea como veces se repite el ciclo.
El compilador tiene una visin global del programa.

Ventajas del intrprete contra el compilador

Un intrprete necesita menos memoria que un compilador.


Permiten una mayor interactividad con el cdigo en tiempo de desarrollo.

Programas que el compilador necesita para obtener un programa ejecutable:

Preprocesador.

Ligador.

Cargador.

Depurador.

Ensamblador.

Tipos de compiladores

De una pasada.

De mltiples pasadas.

De carga y ejecucin.

De depuracin.

De optimizacin.

Ensamblador.

Compilador cruzado.

Compilador con montador.

Autocompilador.

Metacompilador.

Descompilado.

Estructura de un compilador
Un compilador es un programa, en el que pueden distinguirse dos
subprogramas o fases principales: una fase de anlisis, en la cual se lee el
programa fuente y se estudia la estructura y el significado del mismo; y otra
fase de sntesis, en la que se genera el programa objeto.

En un compilador pueden distinguirse, adems, algunas estructuras de datos


comunes, la ms importante de las cuales es la tabla de smbolos, junto con las
funciones de administracin de sta y de los dems elementos del compilador,
y de una serie de rutinas auxiliares para deteccin de errores.

Las funciones de estos mdulos son las siguientes:


Analizador de lxico: Las principales funciones que realiza son:

Identificar los smbolos llmese identificadores o palabras reservadas.

Eliminar los espacios en blanco, caracteres de fin de lnea, tabuladores


etc...

Eliminar los comentarios que acompaan al programa fuente.

Crear unos smbolos intermedios llamados tokens.

Avisar de los errores que detecte.

Token: es carcter con un significado colectivo que tiene dos partes: lexema (la
cadena que representa al token) y gramema (significado o descripcin del
token).
Ejemplo: A partir de la sentencia en PASCAL siguiente
nuevo := viejo + RAZON * 2
genera un cdigo simplificado para el anlisis sintctico posterior, por ejemplo:
<id1> <:=> <id2> <+> <id3> <*> <ent>
Nota: Cada elemento encerrado entre <> representa un nico token. Las
abreviaturas id y ent significan identificador y entero, respectivamente.
Analizador de sintaxis: Comprueba que las sentencias que componen el texto
fuente son correctas en el lenguaje, creando una representacin interna que
corresponde a la sentencia analizada. De esta manera se garantiza que slo
sern procesadas las sentencias que pertenezcan al lenguaje fuente. Durante
el anlisis sintctico, as como en las dems etapas, se van mostrando los
errores que se encuentran.
Ejemplo: El esquema de la sentencia anterior corresponde al de una sentencia
de asignacin del lenguaje Pascal. Estas sentencias son de la forma:
<id> <:=> <EXPRESION>
y la parte que se denomina <EXPRESION> es de la forma:

<id> <+> <EXPRESION> o bien

<id> <*> <EXPRESION> o bien

<id>

Anlisis semntico: Se ocupa de analizar si la sentencia tiene algn


significado.
Se pueden encontrar sentencias que son sintcticamente correctas pero que
no se pueden ejecutar porque carecen de sentido. En general, el anlisis
semntico se hace a la par que el anlisis sintctico introduciendo en ste unas
rutinas semnticas.
Ejemplo: En la sentencia que se ha analizado existe una variable entera. Sin
embargo, las operaciones se realizan entre identificadores reales, por lo que
hay dos alternativas: o emitir un mensaje de error "Discordancia de tipos", o

realizar una conversin automtica al tipo superior, mediante una funcin


auxiliar inttoreal.
Generador de cdigo intermedio: El cdigo intermedio es un cdigo
abstracto independiente de la mquina para la que se generar el cdigo
objeto. El cdigo intermedio ha de cumplir dos requisitos importantes: ser fcil
de producir a partir del anlisis sintctico, y ser fcil de traducir al lenguaje
objeto. Esta fase puede no existir si se genera directamente cdigo mquina,
pero suele ser conveniente emplearla.
Optimizador de cdigo: A partir de todo lo anterior crea un nuevo cdigo ms
compacto y eficiente, eliminando por ejemplo sentencias que no se ejecutan
nunca, simplificando expresiones aritmticas, etc... La profundidad con que se
realiza esta optimizacin vara mucho de unos compiladores a otros. En el peor
de los casos esta fase se suprime.
Generador de cdigo: A partir de los anlisis anteriores y de las tablas que
estos anlisis van creando durante su ejecucin produce un cdigo o lenguaje
objeto que es directamente ejecutable por la mquina. Es la fase final del
compilador. Las instrucciones del cdigo intermedio se traducen una a una en
cdigo mquina reubicable.
Nota: Cada instruccin de cdigo intermedio puede dar lugar a ms de una de
cdigo mquina.
La tabla de smbolos: Es el medio de almacenamiento de toda la informacin
referente a las variables y objetos en general del programa que se est
compilando.
Ejemplo: Hemos visto que en ciertos momentos del proceso de compilacin
debemos hacer uso de cierta informacin referente a los identificadores o los
nmeros que aparecen en nuestra sentencia, como son su tipo, su posicin de
almacenamiento en memoria, etc... Esta informacin es la que se almacena en
la tabla de smbolos.
Rutinas de errores: Estn incluidas en cada uno de los procesos de
compilacin (anlisis de lxico, sintctico y semntico), y se encargan de
informar de los errores que encuentran en texto fuente.
Ejemplo: El analizador semntico podra emitir un error (o al menos un aviso)
cuando detectase una diferencia en los tipos de una operacin.
Los compiladores:
Antes

Una computadora no tena memoria suficiente.

Se tuvo que dividir al compilador en fases.

Cada fase lea un archivo y produca otro.

Actualmente

Se tiene memoria suficiente.

El tamao del archivo ejecutable es relativamente pequeo.

Se han reducido el nmero de pasadas y el nmero de archivos


que se tienen que leer y escribir.

Las fases de un compilador se agrupan en dos partes o etapas:


Optimizacin de cdigo
Anlisis lxico (lineal)
Generacin de cdigo objeto.
Anlisis sintctico (jerrquico) Generacin de cdigo intermedio
Anlisis semntico .
Back end (Sntesis)
Front end
Front end

Dependiente del lenguaje fuente.

Independiente de la mquina objeto para la que se va a generar cdigo.

Independiente del lenguaje objeto.

Dependiente del lenguaje objeto.

Back end

You might also like