Vous êtes sur la page 1sur 57

Diseo de compiladores

Introduccin y organizacin del curso

Bienvenidos al curso
Algunos temas a ver hoy Informacin general del curso Por que estudiar compiladores? Breve historia de los compiladores Estructura de un compilador

INTRODUCCIN

Informacin administrativa
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 administrativa
Salones y horarios:
Lunes, saln 103, 08:00 10:00 Mircoles, saln 301, 08:00 10:00 Tolerancia de 15 minutos aprox.

Material de clase
Generalmente publicado la semana antes en el sitio

Cupo, pasaje de lista, etc.


El curso no tiene cupo, no se pasa lista, etc.

Organizacin del curso


Primer parte: (aprox. 2 meses)
Terico/practica Individual Evaluacin: Parcial, eliminatorio

Segunda parte: (aprox. 1 mes y medio)


Construccin de un interprete/compilador Grupal (mx. 3 personas) Evaluacin: Tiene que funcionar

Libro de referencia

Algunos otros libros interesantes

Para el que este olvidado del tema

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

AHORA SICOMPILADORES

Por que estudiar compiladores?


Ver la teora en funcionamiento Comprender como funcionan los lenguajes de programacin Comprender cuales son los tradeoffs 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

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 maquina 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 de lenguajes hoy da

Clasificacin de lenguajes
1era Generacin
Lenguajes de maquina

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

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
Programa origen

Compilador

Programa destino

Compilador
Si el programa destino es ejecutable, puede ser invocado por el usuario para recibir entradas y generar salidas

Entrada

Programa destino

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
Cdigo Fuente Entrada

Interprete

Salida

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
Cdigo fuente

Traductor

Cdigo Destino Maquina Virtual Entrada Salida

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 caracteristicas del programa que esta ejecutando
Ejemplo: ArrayIndexOutOfBoundsException

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

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

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

Cdigo fuente

Preprocesador
Cdigo fuente modificado

Un sistema de procesamiento de lenguajes

Compilador
Cdigo ensamblador

Cdigo maquina ejecutable

Ensamblador

Cdigo relocalizable

Linker/Loader

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
Cdigo fuente

Anlisis lxico

Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR


Generacin de cdigo Optimizacin
Cdigo destino

Un compilador moderno
Cdigo fuente

Anlisis lxico

FRONTEND
Cdigo destino

Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR


Generacin de cdigo Optimizacin

Un compilador moderno
Cdigo fuente

Anlisis lxico

Anlisis sintctico Anlisis semntico Generacin de IR

BACKEND

Optimizacin de IR
Generacin de cdigo Optimizacin
Cdigo destino

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; }

En realidad es una secuencia de caracteres

while (y < z) {\n\tint x = a + b;\n\ty += x;\n}

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; }

TOKENS T_While T_LeftParen T_Identifier T_Less T_Identifier T_RightParen T_OpenBrace T_Int T_Identifier T_Assign T_Identifier T_Plus T_Identifier T_Semicolon T_Identifier T_PlusAssign T_Identifier T_Semicolon T_CloseBrace

y
z

Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin

x a b y x

while (y < z) { int x = a + b; y += x; } expresin

while

bloque

Anlisis lxico Anlisis sintctico Anlisis semntico

<

declaracin

asignacin

Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin


a + INT x expresin y expresin y +

while (y < z) { int x = a + b; y += x; } expresin


bool

while

void

bloque

Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo
INT

void

y
int

<

z
int

declaracin
void

asignacin
int

y x
int

expresin
int

int

expresin
int

y
int

x
int

Optimizacin

a
int

b
int

while (y < z) { int x = a + b; y += x; }

Cdigo de tres direcciones

Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin

lbl: x = a + b y = x + y _t1 = y < z if _t1 goto lbl

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

x = a + b lbl: y = x + y _t1 = y < z if _t1 goto lbl

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

add $1, $2, $3 lbl: add $4, $1, $4 slt $6, $1, $5 beq $6, lbl

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

add $1, $2, $3 lbl: add $4, $1, $4 blt $1, $5, lbl

Prximos pasos
Revisar los aspectos importantes de los lenguajes de programacin, que afectan a un compilador Comenzar con la etapa de anlisis lxico de un compilador, repasando construcciones tericas como las expresiones regulares

Obligatorio: Ruby
En la etapa de construccin del obligatorio el objetivo ser desarrollar un interprete / compilador del lenguaje Ruby
De un subconjunto que se publicara mas adelante

Herramientas
Flex, Bison C, C++ Cualquier IDE que quieran usar

Ruby
Por que este lenguaje?
Lenguaje de programacin dinmico Open source, Simple y elegante Fcil de aprender Mucho material en la web Bastante uso hoy da en la industria Esta de moda

Ruby
IRB
Es el interprete interactivo de Ruby

Hola mundo
puts 'Hola mundo'

Toda asignacin devuelve su valor


a=4 a=b=4 a+b

Ruby
Manejo de archivos
archivo = File.open('../compiladores.txt') cont_linea = 0 cont_linea += 1 while (line = archivo.gets)

Abreviaciones
a += 2 a = a+2 a, b = b, a

Ruby
Manejo de funciones
def hola(programador) puts "Hola #{programador}" end

hola('Pepe')

Ruby, todo es un objeto


Todo es un objeto (5.6).round # 6 (5.6).class # Float (5.6).round.class # Fixnum 'un string'.length # 9 'un string'.class # String 'pepe dice'.gsub('p','t') # 'tete dice 'abc'.gsub('b','xxx').length # 5 ['algunas', 'cosas', 'array'].length # 3 ['algunas', 'cosas', 'array'].reverse # ['array', 'cosas', 'array']

Ruby, definicin de clases


class Persona def initialize(nombre) @nombre = nombre end def saludar "Hola, mi nombre es #{@nombre}." end end
pepe = Person.new('Pepe') puts pepe.saludar # Hola, mi nombre es Pepe

Ruby, herencia
class Matz < Persona def initialize super('Yukihiro Matsumoto') end end
puts Matz.new.saludar

Ruby
Existen muchos otros aspectos interesantes del lenguaje Algunos enlaces interesantes
http://www.ruby-lang.org/es/ http://www.ruby-lang.org/en/ http://rubytutorial.wikidot.com/ruby-15-minutos

Ruby on Rails
Framework para desarrollo rapido de aplicaciones web

Vous aimerez peut-être aussi