Está en la página 1de 27

COMPILADORES

Bibliografa
Libros de texto:
Compiladores. Principios, tcnicas y herramientas. Alfred V. Aho, Ravi Sethi, J. D. Ullman Addison-Wesley, 1998 (2007) Construccin de Compiladores. Principios y prcticas Kenneth C. Louden Thomson, 2004. Modern Compiler implementation in Java Andrew w. Appeal Cambridge

Cmo se implementan los lenguajes?


Existen dos estrategias principales: Intrpretes (mas viejos, menos estudiados)

Compiladores (ms nuevos, ms estudiados)


Los Intrpretes ejecutan los programas como estn.
Un poco a nada de pre-procesamiento

Los compiladores realizan pre-procesamiento extensivo

La mayora de las implementaciones usan compiladores

Historia de los Lenguajes de alto nivel


En 1953 IBM desarroll el 701. Toda la programacin se haca en Ensamblador. Problema: El costo del Software exceda el costo del hardware. John Backus: Speedcoding Un Intrprete Corra 10-20 veces ms lento que ensamblador escrito a mano.

Fortran I
1954 IBM desarroll el 704 John Backus Idea: Trasladar cdigo de alto nivel a ensamblador Muchos pensaron que era imposible. 1954-7 Proyecto FORTRAN-1 Para 1958, >50% de todo el software estaba en Fortran. Redujo el tiempo de desarrollo dramticamente. (2 semanas -> 2 horas.) FORTRAN,

acrnimo de FORmula TRANslation (traduccin de frmulas). Primer lenguaje de programacin de alto nivel para computadoras, desarrollado de 1954 a 1958 por Jim Backus, padre de muchos de los conceptos fundamentales de alto nivel, como variables, expresiones, instrucciones, instrucciones condicionales y repetitivas, subrutinas compiladas de forma independiente y entrada y salida con formato. El FORTRAN es un lenguaje compilado y estructurado, utilizado tambin en los campos de la ciencia y la ingeniera. Este lenguaje se fue extendiendo y mejorando mucho, aunque en la actualidad apenas se utiliza; se ha sustituido por otros ms potentes y flexibles.

Fortran I
El primer compilador
Produjo cdigo casi tan bueno como escrito a mano. Alto impacto en ciencias de la computacin.

Condujo a un gran trabajo terico en el rea. Los compiladores modernos preservan la forma de Fortran.

La Estructura de un Compilador
Anlisis lxico Anlisis Sintctico Anlisis Semntico Optimizacin Generacin de cdigo

Los primeros 3, al menos se pueden entender por analoga con el pensamiento humano.

Anlisis Lxico
Primer paso: reconocer palabras. Las unidades ms pequeas Esto es una sentencia. Note la Mayscula " E " (smbolo inicial de la sentencia) Espacio " " (separador de palabras) Punto ". " (fin de la sentencia)

Anlisis lxico (2)


El anlisis lxico no es trivial
Sto on is uma sntencia

Adems los lenguajes de programacin emplean mas signos que otros lenguajes.
*p->f + = -.12345 e-5

Anlisis Lxico (3)


Los analizadores lxicos dividen el texto de un programa en palabras o tokens
If x==y then z=1; else z=2;

Unidades:

If, x, ==, y, then, z, =, 1, ;, else, z, =, 2, ;

Anlisis Sintctico
Una vez que se entendieron las palabras, el siguiente paso es entender la estructura de las sentencias.
Parsing = Diagramas de sentencias
El diagrama es un rbol

Diagrama de una Sentencia

Anlisis Sintctico de Programas


Considere:

if x==y then z=1; else z=2; El diagrama es:

Anlisis Semntico
Una vez que se entendi la estructura, se analiza el significado. Los compiladores realizan un anlisis limitado para detectar inconsistencias. Algunos realizan un mayor anlisis para mejorar el rendimiento del programa.

Anlisis Semntico en Ingls


Ejemplo:

Jack said Jerry left his assigment. A que se refiere his? Jack o Jerry.

An peor

Jack said Jack left his assigment at home. Cul dejo la tarea?

Anlisis Semntico en Programacin


Los lenguajes de programacin definen reglas estrictas.
Este programa en C++ imprime " 4 "; la definicin que se usa es la interna.

{
Int Jack = 3; { Int Jack = 4; count << Jack; } }

Ms sobre Anlisis Semntico


Los compiladores llevan a cabo verificaciones semnticas adems de verificar el entorno de las variables. Ejemplo:
Jack left her homework at home

Un tipo incorrecto entre Jack y her, sabemos que son diferentes.


Asumiendo que Jack es hombre.

Optimizacin
No hay contraparte en Espaol o Ingles, pero es semejante a llevar a cabo edicin. Automticamente modifica programas para que: Corran ms rpido. Usen menos memoria En general, conserven mas recursos. El proyecto no tiene componentes de optimizacin.

Ejemplo de Optimizacin

X=Y*0

Es lo mismo que

X=0

Generacin de Cdigo
Generalmente produce cdigo en ensamblador.
Una traslacin a otro lenguaje

Anlogo a la traslacin entre lenguas

Problemas
La compilacin es casi simple, pero se tienen algunos problemas.
Ejemplo: Cmo se manipulan los programas errneos? El diseo de lenguajes tiene un gran impacto en los compiladores.
Determina que es fcil y difcil de compilar Tema del curso: mucho influye el diseo de los lenguajes.

Compiladores hoy en da
La estructura de casi cualquier compilador se adhiere a nuestro esquema de trabajo. Las proporciones han cambiado desde FORTRAN.
Antes: lxico, sintctico ms complejo, caro. Ahora: la optimizacin domina todas las otras fases, lxico y sintctico es barato.

Tendencias en Compilacin
La optimizacin para mejorar la velocidad es menos interesante. Excepto en:
Programas cientficos Procesadores avanzados Pequeos dispositivos donde la velocidad = vida mayor de la batera.

Ideas de compiladores para mejorar la fiabilidad de cdigo.


Seguridad en memoria Detectar errores

Tendencias
Compiladores
Ms complejos. Manejados por la distincin que existe entre:
Nuevos lenguajes Nuevas arquitecturas.

Porqu estudiar compiladores?


Mejorar el entendimiento acerca de la conducta de programas. Mejorar la habilidad para aprender nuevos lenguajes Aprender a construir un sistema grande y fiable. Ver muchos conceptos de Computacin en la prctica.
Elabor: Dr. Jos Raymundo Marcial Romero

Material Adicional
Flex (Para C)

http://www.gnu.org/software/flex/manual/htm l_chapter/flex_toc.html

Jlex (Para Java)

Para Java buscar

http://www.stanford.edu/class/cs143/ Javacup, o alguna otra herramienta

Tarea 1
Ejercicios 1.2 y 1.3 del libro de Kenneth