Upload
lamxuyen
View
217
Download
0
Embed Size (px)
Citation preview
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 1 of 28http://127.0.0.1:3999/s01.intro.slide#1
Compiladores: IntroducciónFrancisco J BallesterosLSUB, URJC
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 2 of 28http://127.0.0.1:3999/s01.intro.slide#1
¿Qué es un lenguaje de programación?
C, Java, Go, ...
Pero también
ls *.c
grep '^[a-z].*\.8'
printf("%s %d", ...)
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 3 of 28http://127.0.0.1:3999/s01.intro.slide#1
¿Cómo se hace un lenguaje de programación?
Compilador
Intérprete
Ambos
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 4 of 28http://127.0.0.1:3999/s01.intro.slide#1
Compiladores
Traducen el lenguaje al de la máquina
O al de una máquina virtual (intérprete).
Procesan mucho el fuente y generan una estructura
Código binario para una máquina
Código de byte para un intérprete
Una estructura de datos para para otro programa
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 5 of 28http://127.0.0.1:3999/s01.intro.slide#1
Intérpretes
Utilizan directamente el fuente
Procesado un poco, hasta que es interpretable
El fuente está siempre "ejecutando"
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 6 of 28http://127.0.0.1:3999/s01.intro.slide#1
Ejemplos
Compiladores: C, Java, Go, Ada, Expresiones regulares, ...
Intérpretes: Shell, Java, Expresiones regulares, printf, ...
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 7 of 28http://127.0.0.1:3999/s01.intro.slide#1
Lenguajes
Normalmente hay varios lenguajes implicados en un compilador
El que queremos compilar
El que describe los tokens o lexemas
Los que describen parte de la gramática (ej. expresiones)
Esto es importante para ver cómo hacemos el compilador
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 8 of 28http://127.0.0.1:3999/s01.intro.slide#1
Lenguajes
Describen conjuntos de strings sobre un alfabeto Varios tipos (Noam Chomsky) Cada tipo incluye a los siguientes
Tipo 0: Recursivamente enumerable (reconocible por un programa)
Tipo 1: Sensible al contexto (reconocible por autómatas)
Tipo 2: Libre del contexto (reconocible por un autómata sólo con una pila)
Tipo 3: Regular (reconocible por un autómata finito)
Ejemplo de tipo Leng. Regular: lexemas de un lenguaje Ejemplo de tipo Leng. Libre del Contexto: expresiones simples Ejemplo de tipo Leng. Sens. al Contexto: los que vamos a compilar
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 9 of 28http://127.0.0.1:3999/s01.intro.slide#1
Estructura de un compilador
1. Análisis léxico
2. Análisis sintáctico
3. Análisis semántico
4. Optimización
5. Generación de código
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 10 of 28http://127.0.0.1:3999/s01.intro.slide#1
Estructura de un compilador
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 11 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis léxico
Hecho por Lexer o Scanner
La entrada son caracteres
La salida son "palabras" o tokens
identificadores
signos de puntuación
comentarios, ...
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 12 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis léxico
De código fuente:
/* an if */if(a == b) { return; }
A tokens:
COMM(" an if ") IF LPAREN ID("a")EQUAL ID("b") RPAREN LBRA RETURN SCOL RBRA
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 13 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis léxico
Otro ejemplo
De código fuente:
"%s -> %d\n"
A tokens:
STRARG CHARS(" -> ") NUMARG NL
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 14 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis léxico
Otro ejemplo
De código fuente:
abs(3*x/2)
A tokens:
ABS LPAREN NUM(3) STAR VAR("x") DIV NUM(2) RPAREN
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 15 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis sintáctico
Hecho por el analizador sintáctico o parser
La entrada son tokens
La salida es la estructura sintáctica
como en lengua
es un árbol
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 16 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis sintáctico
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 17 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis sintáctico
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 18 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis sintáctico
No sólo hay que reconocer programas correctos
Hay que reconocer programas con errores sintácticos e informar de errores.
Esto complica mucho el analizador y no es trivial.
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 19 of 28http://127.0.0.1:3999/s01.intro.slide#1
Análisis semántico
Comprobar el significado del árbol
Sólo lo que importa para generar código
Y para detectar errores sencillos
Detectar incoherencias
Comprobar tipos
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 20 of 28http://127.0.0.1:3999/s01.intro.slide#1
Optimización
Modificar el programa para
que ejecute más rápido
que utilize menos recursos
manteniendo su significado
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 21 of 28http://127.0.0.1:3999/s01.intro.slide#1
Optimización
true or x
lo cambiamos por
true
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 22 of 28http://127.0.0.1:3999/s01.intro.slide#1
Optimización
a*2/4
lo cambiamos por
a/2
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 23 of 28http://127.0.0.1:3999/s01.intro.slide#1
Optimización
Y puede que
a/2
lo cambiemos por
a>>1
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 24 of 28http://127.0.0.1:3999/s01.intro.slide#1
Optimización
(x*5/y) + (x*5/y)
lo cambiamos por
temp = x*5/ytemp + temp
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 25 of 28http://127.0.0.1:3999/s01.intro.slide#1
Generación de código
Traducir el árbol al lenguaje objeto
Tal vez pasando por uno intermedio (un "ensamblador abstracto").
normalmente optimizamos el árbol
generamos código intermedio
optimizamos el código intermedio
generamos código objeto
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 26 of 28http://127.0.0.1:3999/s01.intro.slide#1
Generación de código
Se utilizan facilidades hechas para usar durante la ejecución
Eso es el sistema de run-time del lenguaje.
En lenguajes interpretados el intérprete es el run-time.
En lenguajes compilados las librerías (y builtins) son el run-time.
Como mínimo el arranque, parada y E/S
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 27 of 28http://127.0.0.1:3999/s01.intro.slide#1
Run-time
Gestión de memoria
asignación
tal vez recolección
Entrada Salida
Objetos construidos dentro del lenguaje
Comprobaciones en tiempo de ejecución
1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB
Page 28 of 28http://127.0.0.1:3999/s01.intro.slide#1
Questions?
Francisco J BallesterosLSUB, URJChttp://lsub.org (http://lsub.org)