Sie sind auf Seite 1von 57

Compiladores e Interpretes

Clase Introductoria

Algunas ideas previas


El alumno debe estar familiarizado con matemticas discretas, estructuras de datos bsicas, arquitectura del computador, lenguaje ensamblador, lenguajes formales, sistemas de control. Aunque esto no es parte de la materia, se intentar suplir deficiencias en estas reas siempre que sea posible y este al alcance del ritmo de las clases. Cdigo de tica mnimo a cumplir a la hora de entregar trabajos:
No tomar ideas de otros y presentarlas como propias (esto implica no copiar, no "traducir" artculos de la red y ponerlos en los trabajos como ideas originales, no copiar tareas, etc.) No inducir a sus compaeros a violar el punto 1 (no dejarse copiar, no vender tareas).

En caso de violacin de la tica mnima que debera tener un futuro profesional, la persona y su equipo recibirn cero como nota en dicho proyecto y adems se volvern a revisar todos sus proyectos anteriores en bsqueda de indicios de otras violaciones ticas y se tomarn las medidas que sean correspondientes en caso de conseguirlas.

Orgenes de los lenguajes de programacin

Eslabones importantes
Gdel y Turing: Cambiaron radicalmente las ciencias matemticas,
con sus descubrimientos. Hechos importantes:
Teorema de Gdel, Toda formulacin axiomtica consistente de la teora de nmeros contiene preposiciones indecidibles, es decir cualquier teora matemtica ser siempre incompleta, porque existirn afirmaciones que no se podrn demostrar ni negar. El teorema anterior, motivo a Alan Turing a estudiar que funciones podan ser calculadas y cules no, surgiendo de esta forma el Teorema de Turing, el cual publico en su articulo sobre los nmeros calculables en el cual demostraba que existen problemas irresolubles y adems introdujo el concepto de la mquina de Turing, que es una entidad matemtica abstracta que formalizo por primera vez el concepto de algoritmo.

Eslabones importantes
Autmatas: Claude Elwood Shannon creo las bases para la
aplicacin de la lgica matemtica a los circuitos combinatorios y secuenciales, lo cual a la larga se convirti en la teora de maquinas secuenciales y autmatas finitos. Hechos importantes:
Un autmata es un sistema capaz de transmitir informacin. Es decir acepta seales de su entorno, como resultado cambia de estado y transmite otras seales a su medio. Esta definicin es muy amplia y abarca cualquier mquina, por lo que se hace demasiado general para su estudio terico, por lo que era necesario introducir limitaciones en su definicin. La salida de un autmata puede ser muy resumida como por ejemplo una seal binaria.

Eslabones importantes
Lenguajes y Gramticas: En el campo de la lingstica Noam
Chomsky propuso la teora de las gramticas transformacionales. Hechos importantes:
Esta teora estableci las bases para la lingstica matemtica que sirvi como herramienta para el estudio y formalizacin de los lenguajes de computadora. Dividi el estudio de los lenguajes en anlisis de la estructura de las frases (gramtica) y su significado (semntica), pudiendo a su vez la gramtica analizar las formas que toman las palabras (morfologa), su combinacin para formar frases correctas (sintaxis).

Aunque la distincin entre la sintaxis y la semntica desde el punto de vista terico es un poco artificial, tiene enorme trascendencia prctica, especialmente en el diseo de compiladores.

Eslabones importantes
Mquinas Abstractas y Lenguajes Formales: Ambas disciplinas
poseen una relacin muy estrecha, ya que los mismos fenmenos aparecen independientemente en ambas y es posible establecer correspondencia entre ellas (isomorfismo). Hechos importantes:
Noam Chomsky, clasific las gramticas y lenguajes formales de acuerdo con una jerarqua de cuatro grados. Paralelo a esto existe una jerarqua de maquinas abstractas equivalentes para cada nivel de la clasificacin de Chomsky.

Debido a estos descubrimientos, surgi una nueva rama de estudios: La informtica terica.

La informtica terica
Informtica terica: Rama de rama de las matemticas que hace
uso de lo anteriormente expuesto, pero con un objetivo muy concreto: conseguir mejores sistemas de computacin y clasificar los problemas de acuerdo con su dificultad al ser computados por diferentes modelos. Hechos importantes:
Nace a partir de problemas que se planteaban en la lgica matemtica hacia principios de siglo.
Tradicionalmente, Se distinguen dos grandes campos: la teora de lenguajes formales y las teoras de la calculabilidad y de la complejidad.

Sus intenciones iniciales eran formalizar el lenguaje natural (hablado).


Son la base fundamental para la creacin de compiladores e interpretes.

Una breve historia


(al menos se intento esto)
En un inicio las computadoras eran grandes circuitos electrnicos, que posean codificada en su arquitectura la funcionalidad que ejecutaran, o en otras palabras la disposicin de sus circuitos, buses de comunicacin e interruptores, determinaba su funcionamiento.

Pero el concepto de programa an no exista, siendo estas computadoras, si podan nombrarse as, imposibles de programar mediante el uso de un lenguaje, y su programacin consista en modificar su hardware de alguna forma para que cumpliesen con la tarea requerida, lo cual era propenso a muchos errores.

Una breve historia

(continuacin)

John von Neumann fue un matemtico hngaroestadounidense, de ascendencia juda, que realiz contribuciones importantes en fsica cuntica, anlisis funcional, teora de conjuntos, informtica, economa, anlisis numrico, hidrodinmica (de explosiones), estadstica y muchos otros campos de la matemtica. Recibi su doctorado en matemticas de la Universidad de Budapest a los 23 aos. Fue pionero de la computadora digital moderna publicando un artculo acerca del almacenamiento de programas.

Fuente: wikipedia

El concepto de programa almacenado permiti la lectura de un programa dentro de la memoria de la computadora, y despus la ejecucin de las instrucciones del mismo sin tener que volverlas a escribir.

Una breve historia

(continuacin)

Debido a al trabajo de John von Neumann ahora se tiene la idea de un computador que ejecute un conjunto mnimo de instrucciones bsicas para realizar todas sus operaciones en lugar de cambiar su arquitectura de hardware para llevar a cabo la misma labor.

Debido a esto ahora surge el concepto de lenguaje de maquina, el cual expresa a nivel de este conjunto de instrucciones bsicas expresadas en binario, el programa que resolva la tarea requerida por el operador de la computadora.

Una breve historia

(continuacin)

Ahora los programas podan ser planteados con este lenguaje de maquina en la memoria de la maquina, como por ejemplo el siguiente programa realizado para la arquitectura LC-3

En este programa una lnea de 16 bits representa un valor simple o una instruccin de maquina, comenzando su ejecucin en la primera lnea, al tomarla de la memoria decodificarla (interpretarla) y ejecutarla, entonces el control pasa a la siguiente lnea y el proceso es repetido hasta que no existan instrucciones o se consiga una instruccin de fin de ejecucin (halt).

Una breve historia

(continuacin)

Debido a los programas almacenados se hizo necesario escribir estas secuencias de cdigos o programas que permitiran que los computadores realizaran los clculos deseados. En un principio se uso el lenguaje de Maquina como se mostro anteriormente, que son cdigos numricos que representan las operaciones reales de la maquina que iban a efectuarse, por ejemplo:

C7 06 0000 0002
Representa la instruccin para mover el nmero 2 a la ubicacin 0000 (hexadecimal) en un procesador Intel 80x86.

La escritura de estos cdigos es tediosa y consume mucho tiempo, por lo que se debi buscar una solucin a este problema.

Una breve historia


MOV X,2

(continuacin)

Debido a esto surgi el lenguaje ensamblador, en el cual las instrucciones y las localidades de memoria son formas simblicas dadas, por ejemplo la instruccin anterior seria:

Suponiendo claro que la localidad de memoria 0000 es X. El trabajo es traducir los cdigos simblicos y las localidades de memoria del lenguaje ensamblador a los cdigos numricos correspondientes del lenguaje de mquina.

Una breve historia

(continuacin)

Esto mejoro la velocidad con la que se podan escribir los programas, sin embargo su principal defecto es que no es fcil de escribir y es difcil de leer y comprender, adems de ser dependiente de la plataforma para la cual se creo.

Una breve historia

(continuacin)

Por lo que el siguiente paso fue escribir las operaciones de un programa de una manera concisa que se pareciera a la notacin matemtica o el lenguaje natural. Esto implica que sea independiente de cualquier maquina en particular y se pudiese traducir mediante un programa en cdigo ejecutable, por ejemplo la instruccin anterior se podra plasmar como:

X=2
En un principio se tema que esto no fuese posible y que si lo fuera, el cdigo objeto sera tan poco eficiente que resultara intil.

El lenguaje FORTRAN, creado por John Backus, demostr que estos temores eran infundados.

Una breve historia

(continuacin)

Lo que comenz a hacer evidente la importancia de los lenguajes de alto nivel, por ejemplo a continuacin se compara un programa en ensamblador contra uno equivalente en C++, el objetivo del mismo es llevar a cabo una suma de los elementos presentes en un vector.

Una breve historia

(continuacin)

No obstante el trabajo realizado hasta el momento no era bien comprendido. Noam Chomsky comenz con su estudios del lenguaje natural por ese mismo momento lo cual junto con las maquinas abstractas permitieron sentar las bases de los compiladores modernos. A medida que el problema del lxico, sintaxis y semntica se comprenda mejor gracias a los avances en estas reas, se empezaron a realizar programas que automatizaran esta parte del desarrollo de un compilador, llamndose a estos programas compiladores de compilador. Ejemplo para el anlisis lxico: Jflex o lex. Ejemplo para el anlisis sintctico: Yacc o CUP.

Una breve historia


RESUMIENDO:

(continuacin)

La arquitectura de Von Neumann marca el punto de partida de la informtica moderna. Si se escriban los programas utilizando claves mnemotcnicas (abreviaciones de los cdigos de operacin, ms fciles de recordar que los nmeros), los programas eran ms sencillos de escribir: Lenguaje Ensamblador. En esta dcada de los cincuenta, la investigacin se orient hacia la creacin de un lenguaje en el que las acciones fueran expresadas de la manera ms natural posible por el programador y que fuese lo ms independiente posible de la mquina, por lo tanto aparecen: Los lenguajes de alto nivel. En caso de que el lenguaje fuente que hay que traducir sea de alto nivel y el lenguaje obtenido, de bajo nivel, se utiliza el trmino compilador.

Popularidad de los lenguajes de programacin

(fuente:www.complang.tuwien.ac.at/anton/comp.lang-statistics/)

Paradigmas computacionales
Los lenguajes de programacin se iniciaron imitando y abstrayendo las instrucciones existentes de forma predeterminada en las computadoras. No es entonces ninguna sorpresa que todos se asemejen al modelo propuesto por von Neumman ya que todos los computadores modernos se basan en el mismo: las variables representan localidades de memoria y la asignacin le permite al programa operar sobre estas localidades, etc. Por lo que se puede decir que los primeros lenguajes fueron imperativos debido a que su caracterstica principal es ser semejantes a la arquitectura de von Neumman representando una secuencia de sentencias que representaban comandos o imperativos.

Paradigmas computacionales
Con el paso del tiempo surgieron dos paradigmas o patrones de tipos de lenguajes de lenguajes de programacin, proviniendo ambos de las matemticas. El paradigma funcional, que esta basado en la nocin abstracta del calculo de una funcin como se estudia en el clculo lambda. El paradigma lgico, que se encuentra basado en la lgica simblica.

Paradigmas computacionales
Posteriormente, surgi un cuarto paradigma, el orientado a objetos, el cual es una extensin al paradigma imperativo con la diferencia de que permite obtener programas compuestos de muy pequeas piezas que interactan de una manera muy cuidadosamente controlada y cuya interaccin y por lo tanto su resultado final, puede ser cambiado fcilmente. Pero sin importar cual paradigma sea el escogido, todos los lenguajes de programacin comparten algunos conceptos en comn y estos son los que estudiaremos a continuacin.

Conceptos Importantes
Traductor:
Transforma un cdigo escrito en un lenguaje fuente a un cdigo equivalente escrito en un lenguaje objeto. como funcin importante, el traductor informa de la presencia de errores en el programa fuente.

Conceptos Importantes
Compilador:
Traductor de un lenguaje de alto nivel a uno de bajo nivel. Esto se cumple en el caso de que el lenguaje fuente sea un lenguaje de alto nivel, como por ejemplo Cobol, Pascal o C, y el lenguaje objeto sea un lenguaje de bajo nivel, como por ejemplo el lenguaje mquina o el de ensamblador.

Conceptos Importantes
Ensamblador:
Traductor de lenguaje de ensamblador a lenguaje mquina. Por ejemplo cuando el lenguaje fuente sea un lenguaje de ensamblador y el lenguaje objeto, un lenguaje mquina.

Conceptos Importantes
Vida de un programa: Desde que se escribe hasta que se ejecuta en una plataforma, se pueden distinguir dos periodos de tiempo:
El tiempo de compilacin. Periodo en el que el programa fuente se traduce al programa objeto equivalente. El tiempo de ejecucin. Cuando el programa objeto se ejecuta sobre una plataforma.

Conceptos Importantes
Interprete:
Compila y ejecuta cada sentencia del programa. No genera cdigo objeto equivalente al cdigo fuente, sino que compila paso a paso ejecutando al mismo tiempo:
1) 2) 3) 4) Toma una sentencia del programa fuente. La traduce a su equivalente en el lenguaje objeto. La ejecuta sobre la plataforma. Repite el proceso con la sentencia siguiente del cdigo fuente.

Conceptos Importantes
Intrprete precompilado o compilador interpretativo:
Hace una primera compilacin para obtener un cdigo intermedio libre de error que despus se ejecuta por interpretacin.

Conceptos Importantes
Preprocesador:
Lee el programa fuente y en cierta manera lo modifica antes de la compilacin, procesndolo segn unas directivas de precompilacin y las opciones del entorno de programacin. As pues, segn el lenguaje, el preprocesador se ocupa de incluir archivos, eliminar comentarios, expandir macros, activar directivas de compilacin, etc.

Conceptos Importantes
Enlazador (linker) Muchas veces el programa fuente remite a bibliotecas de programas que ya existen (reaprovechamiento de cdigo). El enlazador es el encargado de construir el archivo ejecutable aadiendo al archivo objeto generado por compilador las cabeceras necesarias y las bibliotecas utilizadas por el programa fuente.

Conceptos Importantes
Depurador (debugger)
Si el compilador ha generado correctamente el programa objeto, el depurador permite hacer un seguimiento de la ejecucin del mismo paso a paso, muestra el contenido de las variables en tiempo de ejecucin, permite introducir puntos de detencin y ayuda a buscar errores de funcionamiento del programa.

Conceptos Importantes
Visin superficial del proceso de compilacin mediante sus principales actores:

Nociones bsicas de un compilador


La tarea de crear un traductor de un lenguaje fuente a un lenguaje objeto es compleja, pero se puede reducir en gran medida si el proceso se divide en fases especializadas que realicen cada una tarea especfica y el modelo bsico de compilador que estudiaremos es:

Nociones bsicas de un compilador


Las fases del compilador, como se ve en la figura anterior, se agrupan en dos bloques: Fases de anlisis (front-end). Analizan el programa fuente en busca de errores (lxicos, sintcticos y semnticos). Son fases que dependen del lenguaje fuente y que deberan ser independientes de la mquina (excepto la lectura y la escritura en disco, agrupada en mdulos independientes), mediante las cuales se genera el cdigo objeto. Fases de sntesis (back-end). A partir del cdigo intermedio, salido del bloque anterior, estas fases generan y optimizan el cdigo objeto. Son fases que dependen del lenguaje objeto y, en general, de la mquina en la que se ejecutar el cdigo generado.

Nociones bsicas de un compilador


En el compilador hay unas estructuras de datos comunes a todas las fases. La ms importante es la tabla de smbolos, que guarda la informacin de los objetos que se encuentran en el anlisis del cdigo fuente (variables, etiquetas, tipos, etc.). Las diferentes fases acceden constantemente a esta tabla y, por lo tanto, las rutinas que la gestionan deberan ser muy eficientes.

Nociones bsicas de un compilador


Estrategia del cdigo intermedio: si se genera el mismo tipo de cdigo intermedio, slo es necesario programar una nica parte de anlisis para cada lenguaje que se desarrolle y una nica parte de sntesis para cada plataforma de ejecucin.

Principales Fases de un compilador


Las principales fases de un compilador son:

I. Anlisis lxico. II.Anlisis sintctico. III.Anlisis semntica. IV.Generacin de Cdigo. V.Optimizacin.

Principales Fases de un compilador


Anlisis lxico: El analizador lxico lee el archivo fuente carcter por carcter y forma grupos de caracteres (lexemas) con un significado lxico mnimo, denominados testigos, que son tratados como una entidad nica. El analizador lxico tambin elimina los componentes no esenciales del programa fuente, e ignora los espacios en blanco, los tabuladores, los caracteres de final de lnea, los comentarios y, en general, todo lo que no sea necesario en las fases posteriores.

Principales Fases de un compilador


Anlisis lxico

Principales Fases de un compilador


Anlisis sintctico: El analizador sintctico utiliza los testigos encontrados por el analizador lxico y comprueba si llegan en el orden correcto: el proporcionado por la gramtica libre de contexto que define el lenguaje fuente. La salida del anlisis sintctico suele ser un rbol sintctico con la estructura sintctica del programa fuente.

Principales Fases de un compilador


Anlisis sintctico Siguiendo el ejemplo que hemos visto en el anlisis lxico, si utilizamos la gramtica parcial siguiente para reconocer la estructura sintctica del programa fuente (las minsculas representan variables sintcticas y las maysculas testigos terminales:
exp -> asigna PUNTO_Y_COMA asigna -> IDENTIFICADOR ASIGNACIN operacin operacin -> operando operador operando operador -> SUMA operando -> IDENTIFICADOR operando -> ENTERO

Principales Fases de un compilador


Anlisis sintctico el rbol sintctico generado sera el que se muestra en la figura:

Principales Fases de un compilador


Anlisis semntico:
El analizador semntico se ocupa de comprobar el significado de las sentencias: puede haber sentencias sintcticamente correctas, pero que no se puedan ejecutar por no tener ningn sentido. Generalmente, este anlisis se hace al mismo tiempo que el sintctico, e introduce unas rutinas semnticas que intentan encontrar errores de significado (semnticos) a partir del rbol sintctico, y al mismo tiempo renen informacin sobre los tipos de datos de los nombres del programa fuente (variables, constantes, etc.) que ser utilizada en la fase de generacin de cdigo.

Principales Fases de un compilador


Anlisis semntico
Entre otras comprobaciones, el anlisis semntico:

Determina el tipo de los resultados intermedios de las operaciones. Comprueba que los operandos de un operador pertenezcan al conjunto de los tipos posibles para el operador y si son compatibles entre s.

Principales Fases de un compilador


Anlisis semntico La salida del anlisis semntico suele ser un rbol semntico, que no es ms que un rbol sintctico en el que cada nodo ha adquirido su significado.

Principales Fases de un compilador


Generacin del Cdigo
En esta ltima fase de la compilacin se genera el cdigo objeto (generalmente cdigo de ensamblador o cdigo mquina reubicable) a partir del cdigo intermedio (optimizado o no):

Se asigna espacio de memoria para cada nombre del programa fuente (variables, tipos, constantes, etc.).
Se traduce cada una de las instrucciones en cdigo intermedio a una secuencia de instrucciones en cdigo objeto que ejecuten la misma tarea.

Principales Fases de un compilador


Generacin del Cdigo Ejemplo: C := A + B

podra tener como objeto equivalente:


LOAD A SUM B STO C

Principales Fases de un compilador


Optimizacin del Cdigo: Esta fase de sntesis est presente en los compiladores ms sofisticados, y su propsito es producir un cdigo objeto ms eficiente:
1. 2. 3. Reduciendo el espacio ocupado por el cdigo generado. Aumentando la rapidez de ejecucin. Haciendo que se necesite menos memoria cuando se ejecute.

Principales Fases de un compilador


Gestin y recuperacin frente a errores: Se debe prever cmo responder frente a los errores que encuentre mientras analiza el cdigo fuente y genera el cdigo objeto. Cada una de las fases del compilador detecta unos tipos de errores determinados. Por lo tanto, la gestin de errores tiene que preverse individualmente en cada fase.

Principales Fases de un compilador


Gestin y recuperacin frente a errores
En el anlisis lxico: smbolos ajenos al lenguaje.
En el anlisis sintctico: expresiones mal construidas. En el anlisis semntico: variables sin declarar.

En resumen
Al hablar de un compilador, hay que especificar como mnimo los tipos de lenguajes siguientes:
El lenguaje fuente. El lenguaje objeto y la plataforma de ejecucin. El lenguaje en el que est escrito el propio compilador, denominado lenguaje de implementacin. Ejemplo
En un compilador de Fortran a cdigo mquina del PC que se ejecuta sobre un PC: El lenguaje fuente sera el Fortran. El lenguaje objeto sera el cdigo mquina del PC. El lenguaje en el que est escrito tambin sera cdigo mquina del PC.

En resumen
Normalmente el lenguaje fuente se especifica generalmente en tres partes: Especificacin lxica. Especificacin sintctica . Especificacin semntica .

Construccin de Compiladores
Especificacin lxica.
Se hace con expresiones regulares que definen los componentes lxicos del lenguaje (testigos). Utilizando estas definiciones se puede crear automticamente un analizador lxico del lenguaje.

Construccin de Compiladores
Especificacin sintctica.
Se utiliza una gramtica libre de contexto, escrita generalmente en notacin BNF, para detallar la estructura sintctica del lenguaje. A partir de esta gramtica, y junto con el analizador lxico obtenido en la parte anterior, se puede generar, tambin automticamente, un analizador sintctico del lenguaje.

Construccin de Compiladores
Especificacin semntica. Se describe el significado de cada instruccin sintctica y las reglas semnticas que se deben cumplir. Hay notaciones formales para especificar la semntica de un lenguaje, pero no se utilizan demasiado. La semntica suele ser especificada con palabras (lenguaje natural) y se programa manualmente.

Lectura Complementaria
Leer en el libro:

http://homepages.mty.itesm.mx/rbrena/AyL.html
http://homepages.mty.itesm.mx/rbrena/AyL.pdf

Desde el inicio hasta la pgina 29 (omita la parte de pruebas por induccin), es decir los preliminares realizando al final los ejercicios que considere acordes con lo ledo.
Importante!!!!: aunque esto no es obligatorio, es deseable que Ud. lo haga para poder comprender posteriormente de manera ms intuitiva (sin traumas) algunos conceptos ms avanzados de la teora de lenguajes formales que aplicaremos durante el transcurso de esta materia y por lo tanto es importante si Ud. tiene aspiraciones de aprobar la misma.

Das könnte Ihnen auch gefallen