Está en la página 1de 9

16/03/2014

1
Diseo de compiladores
Introduccin y organizacin del curso
Informacin general
Docente
Pablo Garbusi
Correo electrnico
pgarbusi@fing.edu.uy
Pagina web del curso
http://www.fing.edu.uy/inco/curso/compil
Todo el material del curso ser colocado en esta
pagina
Informacin general
Salones y horarios:
Lunes, saln 103, 08:15 10:00
Mircoles, saln 301, 08:15 10:00
Material de clase
Todo lo requerido para el curso, esta en la pagina,
o esta referenciado desde la misma
Cupo, pasaje de lista, etc.
El curso no tiene cupo, no se pasa lista, etc.

Organizacin del curso
Primer parte (aprox. 1 mes y medio)
Terico
Individual
Evaluacin: Parcial, eliminatorio
Segunda parte: (aprox. 2 meses)
Construccin de un interprete/compilador
Grupal (mx. 3 personas)
Evaluacin: Tiene que funcionar
Libro de referencia Algunos otros libros interesantes
16/03/2014
2
Obligatorio: Javascript
En la etapa de construccin del obligatorio el
objetivo ser desarrollar un interprete de
Javascript
http://www.ecma-
international.org/publications/standards/Ecma-
262.htm
Obligatorio: Javascript
Herramientas que se pueden utilizar
JFlex: Analizador lxico
Cup: Analizador sintctico
Java: Programacin del backend
Eclipse: IDE de desarrollo
Con respecto al obligatorio: Copia
Aplica el reglamente general de la Facultad
Se permite el libre intercambio de ideas
Pero NO SE PERMITE EL INTERCAMBIO DE
CODIGO NI LAS COPIAS
En caso de detectar una copia, TODOS LOS
INVOLUCRADOS tendrn las sanciones
administrativas correspondientes

Por que estudiar compiladores?
Ver la teora en funcionamiento
Comprender como funcionan los lenguajes de
programacin
Comprender cuales son los trade-offs en el
diseo de un lenguaje
Aprender como construir lenguajes de
programacin
Domain Specific Languages (DSLs)
Historia de los compiladores
Al comienzo, no haba nada
Luego, apareci el cdigo maquina
Era un forma tediosa de escribir programas
La tarea mas simple llevaba mucho tiempo
Por ejemplo, para cargar el valor 1 en una
variable, haba que hacer:
A9 01
8D 00 0C



Historia de los compiladores
Posteriormente, alguien tuvo la idea de
mejorar la anterior, dndole nombres a los
comando de cdigo maquina
Surge el assembler
Ahora, en vez de lo anterior, hacemos:
LDA 01
STA INDEX
16/03/2014
3
Historia de los compiladores
Los ensambladores fueron mejorando,
agregando mas expresividad y mas
capacidades
if optimized
index = AX
else
index = @address
mov index,1
Historia de los compiladores
Con el paso del tiempo, se comienza a elevar
el nivel de abstraccin
Los lenguajes se alejan cada vez mas de la
mquina en la que ejecutan
If (Persona.Edad > 18) Then
Print(Es mayor de edad);
Else
Print(No es mayor de edad);
Clasificacin de lenguajes
Hoy da existen cientos de lenguajes de
programacin
Existen diferentes clasificaciones y
organizaciones
Una de ellas es la generacin
Tenemos cinco generaciones hoy da
Clasificacin de lenguajes
1era Generacin
Lenguajes de mquina
2da Generacin
Lenguajes ensamblador
3ra Generacin
Lenguajes de alto nivel
Fortran, Cobol, Lisp, C, C++, C#, Java
Clasificacin de lenguajes
4ta Generacin
Lenguajes diseados para aplicaciones especificas
SQL para acceso a bases de datos relaciones
Postscript para formateo de textos
5ta Generacin
Lenguajes lgicos o basados en restricciones
Prolog y OPS5 son ejemplos de ellos
Clasificacin de lenguajes
Otra clasificacin utiliza el termino imperativo
para lenguajes en los que se dice COMO
realizar una computacin
C, C++, Java, C# son ejemplos de estos
Existe la nocin de estado de programa y
sentencias que cambian ese estado
El termino declarativo se utiliza para lenguajes
en los que se dice lo QUE se debe hacer
Prolog, Haskell, ML son ejemplos de estos
16/03/2014
4
Compilador
El encargado de llenar el hueco entre el
lenguaje origen y el destino, es el compilador

Un compilador es un programa que toma
como entrada un programa escrito en un
lenguaje (fuente), y lo traduce en un
programa funcionalmente equivalente escrito
en otro lenguaje (destino)
Compilador
Es bsicamente un
procesador de
lenguajes
Un rol importante
que cumple, es el
de reportar errores
durante el proceso
de traduccin

Compilador
Programa origen
Programa destino
Compilador
Si el programa destino es ejecutable, puede
ser invocado por el usuario para recibir
entradas y generar salidas
Programa
destino
Entrada Salida
Interprete
Es otro tipo de procesador de lenguajes
En vez de producir un programa destino,
aparenta ejecutar las instrucciones del
programa origen, sobre la entrada del usuario
Interprete
Entrada
Salida
Cdigo
Fuente
Compilacin + Interpretacin
Los procesadores del lenguaje Java, combinan
compilacin e interpretacin
Un cdigo fuente java se compila primero en
una forma intermedia, llamada bytecode
.class
Luego, los bytecodes son interpretados por
una maquina virtual
Entre otras ventajas, tenemos la portabilidad
entre plataformas


Compilacin + Interpretacin
Maquina Virtual
Entrada
Salida
Cdigo Destino
Traductor
Cdigo fuente
16/03/2014
5
Compilacin + Interpretacin
Es un enfoque muy utilizado hoy da
Java Virtual Machine
Common Language Runtime (MS CLR .NET)
Dalvik Virtual Machine (Android)
IRB (Interactive Ruby Shell)
Zend Engine (PHP)
Permite controlar en tiempo real las
caractersticas del programa que esta ejecutando
Ejemplo: ArrayIndexOutOfBoundsException
Esquematizacin de la plataforma .NET
Esquematizacin de la plataforma Java
Preprocesadores
El cdigo fuente puede encontrarse dividido
en varios archivos
La tarea de recolectar los programas, es
responsabilidad del preprocesador
Este a su vez puede expandir macros en
construcciones del lenguaje
El cdigo fuente modificado es alimentado al
compilador
Preprocesador en C Ensambladores
El compilador puede producir como cdigo
ensamblador como lenguaje destino, debido a
que es mas fcil de generar y de depurar

El cdigo ensamblador es procesado luego por
un programa llamado ensamblador, el cual
produce cdigo de maquina relocalizable
como salida
16/03/2014
6
Linker / Loader
Los programas grandes por lo general se
compilan en partes, en lo que se conoce como
cdigo de maquina relocalizable
Un programa llamado Linker junta todas estas
partes, en el cdigo que efectivamente corre
en la maquina destino
El Loader carga entonces este programa en
memoria para su ejecucin
Preprocesador
Cdigo fuente
Cdigo fuente
modificado
Compilador
Cdigo ensamblador
Ensamblador
Cdigo
relocalizable
Linker/Loader
Cdigo maquina
ejecutable
Un sistema de
procesamiento de
lenguajes
Descripcin Implementacin
Anlisis lxico
Identificar piezas lgicas del lenguaje (tokens)
Anlisis sintctico
Identificar como las piezas se relacionan entre si
Anlisis semntico
Identificar el significado de las relaciones
anteriores


Descripcin Implementacin
Representacin intermedia
Estructura auxiliar para manipular el programa
ledo
Optimizacin de RI
Simplificar la estructura auxiliar
Generacin de cdigo
Construir la estructura final
Optimizacin final
Mejorar la estructura final del programa


Un compilador moderno
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
Cdigo
fuente
Cdigo
destino
16/03/2014
7
Un compilador moderno
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
Cdigo
fuente
Cdigo
destino
F
R
O
N
T
E
N
D

Un compilador moderno
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
Cdigo
fuente
Cdigo
destino B
A
C
K
E
N
D

Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
while (y < z) {\n\tint x = a + b;\n\ty += x;\n}
En realidad es una secuencia de caracteres
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
T_While
T_LeftParen
T_Identifier y
T_Less
T_Identifier z
T_RightParen
T_OpenBrace
T_Int
T_Identifier x
T_Assign
T_Identifier a
T_Plus
T_Identifier b
T_Semicolon
T_Identifier y
T_PlusAssign
T_Identifier x
T_Semicolon
T_CloseBrace
TOKENS
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
while
expresin
< y z
bloque
declaracin
asignacin
expresin
+ a b
INT
x
expresin
+ y x
y
16/03/2014
8
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
while
expresin
< y z
bloque
declaracin
asignacin
expresin
+ a b
INT
x
expresin
+ y x
y
void
void
bool
int
int
int int
int
int
void
int int
int
int
int
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
lbl:
x = a + b
y = x + y
_t1 = y < z
if _t1 goto lbl
Cdigo de tres direcciones
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
x = a + b
lbl:
y = x + y
_t1 = y < z
if _t1 goto lbl
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
add $1, $2, $3
lbl: add $4, $1, $4
slt $6, $1, $5
beq $6, lbl
Anlisis lxico
Anlisis sintctico
Anlisis semntico
Generacin de IR
Optimizacin de IR
Generacin de cdigo
Optimizacin
while (y < z) {
int x = a + b;
y += x;
}
add $1, $2, $3
lbl: add $4, $1, $4
blt $1, $5, lbl
16/03/2014
9

También podría gustarte