Académique Documents
Professionnel Documents
Culture Documents
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
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
Libro de referencia
AHORA SICOMPILADORES
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
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
Compilador
Cdigo ensamblador
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
Un compilador moderno
Cdigo fuente
Anlisis lxico
FRONTEND
Cdigo destino
Un compilador moderno
Cdigo fuente
Anlisis lxico
BACKEND
Optimizacin de IR
Generacin de cdigo Optimizacin
Cdigo destino
Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin
Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin
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
bloque
<
declaracin
asignacin
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
Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin
Anlisis lxico Anlisis sintctico Anlisis semntico Generacin de IR Optimizacin de IR Generacin de cdigo Optimizacin
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
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'
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, 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