Historia Compiladores

download Historia Compiladores

of 35

description

Reseña histórica Compiladores

Transcript of Historia Compiladores

  • Introduccin a compiladores

    Definicin de compilador

    Historia de los compiladores

    Tipos de traductores

    Fases de un compilador Fases de un compilador

    Agrupamiento de fases

    Compiladores cruzados

    Herramientas automticas

  • Definicin de compilador

    Los compiladores son programas de computadora que traducen de un

    lenguaje a otro. Un compilador toma como su entrada un programa

    escrito en lenguaje fuente y produce un programa equivalente escrito en

    lenguaje objeto.

    Traductor Lenguaje Fuente Lenguaje Destino

    Mensajes de error

  • Definicin de compilador

    Generalmente al lenguaje fuente se le asocia como lenguaje de alto nivel,

    mientras al lenguaje objeto se el conoce como cdigo objeto (cdigo de

    maquina) escrito especficamente para una maquina objeto. A lo largo del

    proceso de traduccin el compilador debe informar la presencia de

    errores en el lenguaje fuente.

    Disear y desarrollar un compilador, no es tarea fcil, y quizs pocos Disear y desarrollar un compilador, no es tarea fcil, y quizs pocos

    profesionales de la computacin se vean involucrados en esta tarea.

    No obstante, los compiladores se utilizan en casi todas las formas de la

    computacin y cualquiera involucrado en esta rea debera conocer la

    organizacin y el funcionamiento bsico de un compilador.

  • Historia de los Compiladores A finales de la dcada de 1940, comenzaron a construirse las primeras

    computadoras digitales y fue necesario implementar un lenguaje capas de realizar los clculos, es aqu donde aparece el lenguaje de maquina que representaba secuencias de cdigos numricos:

    C7 06 0000 0002 (instruccin que mueve el nmero dos a la ubicacin 0000)

    Desafortunadamente este lenguaje era tedioso de seguir y complicado de Desafortunadamente este lenguaje era tedioso de seguir y complicado de mantener, por lo que esta forma de codificacin fue reemplazada por el lenguaje ensamblador, en el cual las instrucciones y las localidades de memoria son formas simblicas. Un ensamblador traduce de los cdigos simblicos a lenguaje de maquina. An con esta mejora, el lenguaje ensamblador sigue siendo demasiado difcil de mantener:

    MOV X, 2 (instruccin en ensamblador equivalente a la anterior)

  • Historia de los Compiladores

    En este punto se presenta la necesidad de lenguajes que permitan escribir los programas de forma concisa, similar a una notacin matemtica, y que se pudieran traducir a cdigo ejecutable para una mquina dada:

    X = 2

    En 1950, G. M. Hooper acua el termino compilador y aparecen los primeros trabajos sobre compiladores relacionados con la traduccin de formulas aritmticas a cdigo de sobre compiladores relacionados con la traduccin de formulas aritmticas a cdigo de mquina.

    John Backus lider un grupo de trabajo en IBM para realizar de un traductor de cdigo mquina a frmulas matemticas. Resultando con gran xito: la especificacin de un lenguaje de alto nivel (FORTRAN, FORmule TRANslation) Trabajaron 18 personas durante mas de un ao en el proyecto.

    Fe un compilador hecho ad-hoc (a puro corazn), pues no exista una teora formal, sino que se iban resolviendo las construcciones una a una, para cada situacin particular.

  • Historia de los Compiladores

    Noam Chomsky comienza sus estudios sobre la estructura del lenguaje natural. Sus estudios lo condujeron a la clasificacin de los lenguajes de acuerdo a una jerarqua de sus gramticas, adems sus estudios sobre los algoritmos de reconocimiento derivaron en una automatizacin del proceso de traduccin mas eficiente.

    1960, se disea el lenguaje LISP. En un principio, el cdigo LISP se traduca manualmente a cdigo mquina. Se escribi en LISP un programa capaz de interpretar programas LISP, que se tradujo manualmente a cdigo de mquina, construyendo de programas LISP, que se tradujo manualmente a cdigo de mquina, construyendo de este modo un intrprete ejecutable de LISP.

    Knuth desarrolla la mayora de las tcnicas de anlisis sintctico.

    1970, se presentan los mayores avances en el rea de lenguajes de programacin.

    Aparecen los primeros programas que automatizan los procesos de anlisis lxico y sintctico. Surgiendo la llamada Torre de Babel debido a la proliferacin de la teora para la construccin de compiladores.

  • Historia de los Compiladores

    Niklaus Wirth, disea Pascal, pensado para la enseanza.

    Wirth propone el concepto de representacin intermedia de cdigo, separando el proceso de traduccin en dos fases: el front-end encargada de analizar el programa fuente (operaciones dependientes slo del lenguaje fuente) y el back-end encargada de generar el cdigo para la mquina objeto.

    1980, comienzan a proliferar las tcnicas de mejoramiento de cdigo 1980, comienzan a proliferar las tcnicas de mejoramiento de cdigo (optimizacin), se consolida y prolifera el concepto de asignacin y liberacin de memoria dinmica. La programacin orientada a objetos es extensamente utilizada y madura.

    1990, los lenguajes de programacin y compiladores son muy similares a lo que tenemos actualmente, surgen los ambientes de desarrollo, los lenguajes interpretados comienza a ganar terreno en aplicaciones de Internet y el cdigo intermedio se vuelve a poner de moda.

  • Tipos de Traductores

    Compilador Programa que convierte un archivo de lenguaje de programacin a su correspondiente en lenguaje objeto. Siendo en realidad es un tipo especifico de traductor.

    Ensamblador Programa que convierte de lenguaje mnemonico a lenguaje mquina, generando un archivo con el cdigo objeto equivalente al cdigo fuente completo, junto con informacin necesaria para el montaje.

    Formadores de Texto toman como entrada una cadena de caracteres que incluye el texto a componer y rdenes (TAGs) para indicar captulos, secciones, prrafos, enumeraciones, figuras, formulas, tablas, etc. (Latex, Html).

    Interpretes Ejecutan las instrucciones del programa segn se vallan presentando. Necesitan menos memoria, pero son ms lentos que los compiladores (LISP, Prolog). Histricamente, se pusieron de moda en los primeros aos porque los recursos de memoria eran escasos. Permiten aadir cdigo dinmicamente durante la ejecucin.

  • Tipos de Traductores

    Lenguajes de programacin interpretados Estn diseados para ser

    ejecutados por medio de interprete a partir de un cdigo pre-compilado.

    Por ejemplo Java es compilado para posteriormente ser ejecutado por un

    traductor del lenguaje objeto denominado Java Virtual Machine.

    Mientas que los lenguajes de la plataforma .NET compilan en una forma

    intermedia (CIL), que posteriormente puede ser recompilado a cdigo de

    maquina nativo o interpretado por una maquina virtual.

    Lenguajes como Python y Java emplean representaciones intermedias de

    cdigo para ser ejecutadas, mientras que lenguajes como Ruby emplean

    un rbol de sintaxis abstracta como representacin intermedia.

  • Tipos de Traductores

    Ventajas del compilador

    Se compila una vez, se ejecuta n-veces

    En bucles, la compilacin genera cdigo equivalente al bucle pero un

    interprete se traduce tantas veces una lnea como veces se repite el bucle

    El compilador tiene una visin global del programa, por lo que la

    informacin de mensajes de errores es ms detallada.informacin de mensajes de errores es ms detallada.

    Ventajas del intrprete

    Un interprete necesita menos memoria que un compilador

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

  • Tipos de Traductores

    Ventajas del compilador - intrprete

    Proporcionan algo de flexibilidad extra

    Son independientes de la plataforma en la que se ejecuten

    Permiten un mecanismo de reflexin

    Tipos de datos altamente dinmicos

    Gestin de memoria dinmico

    Fcilmente depurables y reducidos en tamao

  • Fases de un Compilador

    Un compilador se compone internamente de varias etapas, o fases, que

    realizan operaciones lgicas.

    Es til pensar en estas fases como piezas separadas dentro del compilador,

    y pueden en realidad escribirse como operaciones codificadas

    separadamente aunque en la prctica a menudo se integran.

    A continuacin describiremos brevemente cada un de ellas:

    Anlisis Lxico

    Anlisis Sintctico

    Anlisis Semntico

    Generacin y Optimizacin de cdigo intermedio

    Generacin de cdigo objeto

  • Fases de Compilacin

    Anlisis Lxico

    Anlisis Sintctico

    Cdigo fuente

    Componentes lxicos / Tokens

    rbol sintctico

    Fase de anlisis

    Tabla de smbolos

    Anlisis Semntico

    Generacin / Optimizacin de cdigo intermedio

    Generacin / Optimizacin de cdigo objeto

    rbol sintctico con anotaciones

    Cdigo intermedio

    Cdigo objeto

    Fase de sntesis

    Gestor de errores

  • Fases de Compilacin Analizador lxico: lee la secuencia de caracteres de izquierda a derecha del

    programa fuente y agrupa las secuencias de caracteres en unidades con significado propio (componentes lxicos o tokens en ingles).

    Las palabras clave, identificadores, operadores, constantes numricas, signos de puntuacin como separadores de sentencias, llaves, parntesis, etc. , son diversas clasificaciones de componentes lxicos.

    La estructura lxica la modelaremos mediante expresiones regulares. La estructura lxica la modelaremos mediante expresiones regulares.

    Por ejemplo la siguiente instruccin en cdigo C: a[indice] = 4 + 2;

    a identificador[ corchete de aperturaindice Identificador] corchete de cierre= operador de asignacin4 numero+ operador suma2 numero; punto y coma

    Genera los siguientes componentes lxicos:

  • Fases de Compilacin

    Anlisis sintctico: determina si la secuencia de componentes lxicos sigue la sintaxis del lenguaje y obtiene la estructura jerrquica del

    programa en forma de rbol, donde los nodos son las construcciones de

    alto nivel del lenguaje.

    Se determinan las relaciones estructurales entre los componentes lxicos,

    esto es semejante a realizar el anlisis gramatical sobre una frase en esto es semejante a realizar el anlisis gramatical sobre una frase en

    lenguaje natural. La estructura sintctica la definiremos mediante las

    gramticas independientes del contexto.

    Como ejemplo consideremos la lnea de cdigo C anterior. Representa un

    elemento estructural denominado expresin, la cual es una expresin de

    asignacin compuesta de una expresin de subndice a la izquierda y una

    expresin aritmtica a la derecha (rbol de anlisis gramatical).

  • Fases de Compilacin

    expresin

    expresin asignacin

    expresin expresin =

    expresin subndice expresin aditiva

    expresin expresin expresin expresin

    identificador

    a

    identificador

    indice

    numero

    4

    numero

    2

    [ ] +

  • Fases de Compilacin Los nodos internos del rbol de anlisis gramatical estn etiquetados con los

    nombres de las estructuras que representan y las hojas del rbol representan la secuencia de tokens.

    Los rboles de anlisis gramatical son tiles para visualizar la sintaxis de un programa pero no es eficaz en la representacin de esa estructura. Los analizadores sintcticos tienden a generar un rbol sintctico (una simplificacin de la informacin contenida en un rbol de anlisis gramatical).

    Para nuestro ejemplo observamos que en el rbol sintctico se han eliminado nodos, esto debido a que sabiendo la naturaleza de la expresin, ya no es necesario contar con ciertos tokens.

    =

    [ ] +

    identificador

    a

    identificador

    indice

    numero

    4

    numero

    2

  • Fases de Compilacin

    Anlisis semntico: realiza las comprobaciones necesarias sobre el rbol sintctico para determinar el correcto significado del programa.

    Las tareas bsicas a realizar son: La verificacin e inferencia de tipos en

    asignaciones y expresiones, la declaracin del tipo de variables y funciones

    antes de su uso, el correcto uso de operadores, el mbito de las variables y

    la correcta llamada a funciones. la correcta llamada a funciones.

    Nos limitaremos al anlisis semntico esttico (en tiempo de compilacin),

    donde es necesario hacer uso de la Tabla de smbolos, como estructura de

    datos para almacenar informacin sobre los identificadores que van

    surgiendo a lo largo del programa. El anlisis semntico suele agregar

    atributos (como tipos de datos) a la estructura del rbol semntico.

  • Fases de Compilacin El analizador semntico registrara el rbol sintctico con los tipos de datos

    de las sub-expresiones y verificara que la asignacin tiene sentido para los tipos, en caso contrario mandara un mensaje de error en correspondencia de tipos. De esta forma se obtiene un rbol sintctico con anotaciones.

    Siguiendo con el ejemplo de la expresin en C, el analizador semntico extrae la informacin de que a es una arreglo de valores enteros y que indice es una variable entera. indice es una variable entera.

    =

    [ ] Tipo : entero

    + Tipo : entero

    a

    puntero a enteros

    Tipo: entero

    indice

    Tipo : entero

    4

    constante

    Tipo : entero

    2

    constante

    Tipo : entero

  • Fases de Compilacin

    Generacin y optimizacin de cdigo intermedio: la optimizacin consiste en la calibracin del rbol sintctico donde ya no aparecen construcciones

    de alto nivel. Generando un cdigo mejorado, ya no estructurado, ms

    fcil de traducir directamente a cdigo ensamblador o mquina,

    compuesto de un cdigo de tres direcciones (cada instruccin tiene un

    operador, y la direccin de dos operndoos y un lugar donde guardar el

    resultado), tambin conocida como cdigo intermedio.resultado), tambin conocida como cdigo intermedio.

    La etapa de optimizacin slo dependen del lenguaje fuente (y no de la

    mquina), se busca principalmente: eliminar sub-expresiones comunes,

    identificar cdigo muerto, sustituir operaciones aritmticas, clculo previo

    de constantes, variables de induccin, propagacin de copias o cdigo

    inalcanzable. Suele ser una fase lenta y compleja.

  • Fases de Compilacin Siguiendo con el ejemplo de la expresin de asignacin, el

    generador/optimizador, colapsara la expresin aditiva generando una

    constante 6.

    En ocasiones estas adecuaciones pueden realizarse en el rbol

    directamente, pero generalmente resulta mas fcil hacerlo de manera

    lineal en una estructura de cdigo de tres direcciones (cuadruplos).lineal en una estructura de cdigo de tres direcciones (cuadruplos).

    cdigo optimizado cdigo intermedio

    a[indice] = 6 t1 = indice * elem_size(a)

    t2 = &a + t1

    *t3 = 6

  • Fases de Compilacin

    Generacin de cdigo objeto: toma como entrada la representacin intermedia y genera el cdigo objeto. La optimizacin depende de la mquina,

    es necesario conocer el conjunto de instrucciones, la representacin de los

    datos (nmero de bytes), modos de direccionamiento, nmero y propsito de

    registros, jerarqua de memoria, encauzamientos, etc.

    Suelen implementarse a mano, y son complejos porque la generacin de un Suelen implementarse a mano, y son complejos porque la generacin de un

    buen cdigo objeto requiere la consideracin de muchos casos particulares.

    Tambin se est investigando la creacin de generadores de cdigo

    automticos. La idea es automticamente hacer corresponder una

    representacin intermedia a plantillas de instrucciones objeto. Permitiendo

    generar fcilmente el cdigo objeto para una nueva mquina objeto,

    cambiando el conjunto de plantillas. Por ejemplo GNU GCC posee plantillas

    para mas de 10 arquitecturas ms habituales de ordenadores.

  • Fases de Compilacin Finalmente para nuestro ejemplo debemos decidir ahora cuantos enteros

    se almacenarn para generar el cdigo del arreglo, para este ejemplo

    emplearemos modos de direccionamiento propios de C, generando el

    cdigo objeto en un lenguaje ensamblador hipottico.

    MOV R0, t1 ;; valor de index ->MOV R0, t1 ;; valor de index ->

    MOV R1, &a ;; direccin de a -> R1

    ADD R1, R0 ;; sumar R0 a R1

    MOV *R1, 6 ;; constante 6 -> direccin en R1

  • Fases de Compilacin

    Tabla de Smbolos: es una estructura tipo diccionario con operaciones de insercin, borrado y bsqueda, que almacena informacin sobre los

    smbolos que van apareciendo a lo largo del programa como son:

    los identificadores (variables y funciones)

    Etiquetas

    tipos definidos por el usuario (arreglos, registros, etc.) tipos definidos por el usuario (arreglos, registros, etc.)

    Adems almacena el tipo de dato, mtodo de paso de parmetros, tipo

    de retorno y de argumentos de una funcin, el mbito de referencia de

    identificadores y la direccin de memoria. Interacciona tanto con el

    analizador lxico, sintctico y semntico que introducen informacin

    conforme se procesa la entrada. La fase de generacin de cdigo y

    optimizacin tambin la usan.

  • Fases de Compilacin

    Tabla de Smbolos: es una estructura tipo diccionario con operaciones de insercin, borrado y bsqueda, que almacena informacin sobre los

    smbolos que van apareciendo a lo largo del programa como son:

    los identificadores (variables y funciones)

    Etiquetas

    tipos definidos por el usuario (arreglos, registros, etc.) tipos definidos por el usuario (arreglos, registros, etc.)

    Adems almacena el tipo de dato, mtodo de paso de parmetros, tipo

    de retorno y de argumentos de una funcin, el mbito de referencia de

    identificadores y la direccin de memoria. Interacciona tanto con el

    analizador lxico, sintctico y semntico que introducen informacin

    conforme se procesa la entrada. La fase de generacin de cdigo y

    optimizacin tambin la usan.

  • Fases de Compilacin

    Gestor de errores: detecta e informa de errores que se produzcan durante la fase de anlisis. Debe generar mensajes significativos y reanudar la traduccin.

    Encuentra errores:

    En tiempo de compilacin: errores lxicos (ortogrficos), sintcticos (construcciones incorrectas) y semnticos (p.ej. errores de tipo)

    En tiempo de ejecucin: direccionamiento de vectores fuera de rango, divisiones por cero, etc.por cero, etc.

    De especificacin/diseo: compilan correctamente pero no realizan lo que el programador desea.

    Se trataran slo errores estticos (en tiempo de compilacin). Respecto a los errores en tiempo de ejecucin, es necesario que el traductor genere cdigo para la comprobacin de errores especficos, su adecuado tratamiento y los mecanismos de tratamiento de excepciones para que el programa se contine ejecutando.

  • Fases de Compilacin

    La mayora de los compiladores son dirigidos por la sintaxis, es decir, el proceso de traduccin es dirigido por el analizador sintctico. El anlisis sintctico genera la estructura del programa fuente a travs de tokens. El anlisis semntico proporcionan el significado del programa basndose de la estructura del rbol de anlisis sintctico.

    Las fases de anlisis lxico y anlisis sintctico se pueden automatizar de manera relativamente fcil, las verdaderas dificultades en la construccin de manera relativamente fcil, las verdaderas dificultades en la construccin de compiladores son el anlisis semntico, la generacin y la optimizacin de cdigo.

    El nmero de pasadas, es decir, el nmero de veces que hay que analizar el cdigo fuente, esta en funcin del grado de optimizacin. Tpicamente se realiza una pasada para realizar el anlisis lxico y sintctico, otra pasada para el anlisis semntico y optimizacin del lenguaje intermedio y una tercera pasada para generacin de cdigo y optimizaciones dependientes de la mquina.

  • Estructuras de datos Empleadas

    Componentes lxicos: estructura tipo registro con dos campos, componente lxico representado por una enumeracin y el lexema con una cadena de caracteres.

    rbol sintctico: es una representacin de rbol de la estructura sintctica abstracta del cdigo fuente escrito en cierto lenguaje de programacin. Cada nodo del rbol denota una construccin que ocurre en el cdigo fuente.

    Tabla de Smbolos: contiene informacin sobre los identificadores, funciones, variables, mbito de referencia de identificadores, constantes numricas y literales, tipos de datos, o incluso la direccin de memoria (tabla Hash).

    Cdigo intermedio: se implementa como una lista de registros, donde cada registro tiene cuatro campos (operador, la direccin de los operndoos y del resultado). Es eficiente para mover cdigo para el proceso de optimizacin posterior.

  • Agrupamiento de fases En el modelo de anlisis y sntesis las operaciones del compilador que analizan

    el programa fuente y calculan sus propiedades se clasifican como anlisis del compilador, mientras que las operaciones involucradas con la traduccin a cdigo objeto se conoce como sntesis del compilador.

    Etapa de anlisis:

    Anlisis lxico

    Anlisis sintctico

    Anlisis semnticaAnlisis semntica

    Etapa de sntesis:

    Optimizacin y generacin de cdigo intermedio

    Generacin de cdigo objeto

    La intencin de separa las etapas de anlisis y sntesis, es principalmente para realizar mantenimientos y actualizaciones eficientes.

  • Compilador Cruzado

    Es un compilador que genera cdigo ejecutable para una plataforma

    distinta a aquella en la que se ejecuta

    Es muy comn construir un compilador en una plataforma Linux,

    empleando un lenguaje ANSI C++ para una sintaxis tipo Basic que genere

    cdigo objeto para Windows

    ANSI C++

    Linux

    Basic

    WindowsLinux

    Windows

    BasicANSI C++

    Windows

  • Compilador Cruzado

    Existe tambin la variante que implica un compilador para maquina abstracta,

    que facilita la transportabilidad de compiladores de un lenguaje fuente a

    varias maquina objeto. La construccin de este tipo de compiladores se realiza

    en dos etapas:

    front-end o etapa inicial: Las operaciones dependen slo del lenguaje

    fuente. Incluye: anlisis lxico, sintctico y semntico, la creacin de la fuente. Incluye: anlisis lxico, sintctico y semntico, la creacin de la

    Tabla de Smbolos, generacin de cdigo intermedio y algunas

    optimizaciones. Adems, del manejo de errores de cada fase.

    back-end o etapa final: Las operaciones dependen slo de la mquina

    objeto. Incluye: generacin de cdigo objeto y optimizaciones

    dependientes de la mquina. Depende de los modos de direccionamiento,

    conjunto de instrucciones de la mquina, nmero de registros,

    arquitectura de la mquina, sistema operativo, etc.

  • Compilador Cruzado

    Principal ventaja de este mtodo:

    Si se cambia de lenguaje fuente, entonces se reescribe el front-end. Si se

    cambia la mquina objeto, entonces se reescribe el back-end. Si aparece

    una nueva arquitectura, basta con desarrollar un traductor del lenguaje

    intermedio a esa nueva mquina.

    Cdigo fuente Cdigo intermedio Front-End Back-End Cdigo objeto

  • Compilador Cruzado

  • Herramientas Automticas

    Son programas de ayuda en el proceso de escritura de compiladores: sistemas generadores de traductores. Tambin se les conoce como compiler writing tools, compiler generators, compiler-compilers. A continuacin mencionaremos los mas conocidos.

    Generadores de analizadores lxicos: a partir de una especificacin basada en expresiones regulares. Lex / Flex.

    Generadores de analizadores sintcticos: a partir de una entrada que es la gramtica independiente del contexto que representa la estructura sintctica del lenguaje. Yacc / Bison.

    Generadores de cdigo: con rutinas para la generacin del rbol de anlisis sintctico y para su recorrido. En cada nodo se especifican las acciones para su traduccin a cdigo objeto correspondiente.

  • Bibliografa

    Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas

    y herramientas, capitulo 1, pginas: 1- 25, 743-747.

    Louden, K.C. (1997), Construccin de Compiladores: Principios y prctica,

    capitulo 1, pginas: 1- 27.capitulo 1, pginas: 1- 27.