Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Compiladores e Intérpretes
Conceptos GeneralesSebastian Gottifredi
Universidad Nacional del Sur
Departamento de Ciencias e Ingeniería de la Computación
2019
1
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Administrativa
• Clases Miércoles y Viernes de 16 a 20hs Aula 2 DCIC
• Página web: http://cs.uns.edu.ar/~lc/cei/
• Evaluación: Proyecto (múltiples etapas)
• Para más detalles consultar la información y los documentos
en la página web de la materia
2
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Problema: ¿Cómo ejecutamos un programa?
3
prog1
if(id1>10)
var= “hola”;
else
print “chau”;
//fin
Ejecutar!
TEXT:if(id1>10)var=_“hola”;elseprint_“chau”;//fin
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Problema: ¿Cómo ejecutamos un programa?
• Dos principales estrategias
4
011010
100110
101010
>chau
Ejecutar!
Traducción de prog1
a código de una
máquina destino
prog1
if(id1>10)
var= “hola”;
else
print “chau”;
//fin
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Problema: ¿Cómo ejecutamos un programa?
• Dos principales estrategias
5
011010
100110
101010
>chau
Ejecutar!
Programa actualmente corriendo
en la máquina destino recibe y va
ejecutando prog1
prog1
if(id1>10)
var= “hola”;
else
print “chau”;
//fin >chau
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Problema: ¿Cómo ejecutamos un programa?
• Dos principales estrategias
6
011010
100110
101010Compilador
>chau
Intérprete
Ejecutar!prog1
if(id1>10)
var= “hola”;
else
print “chau”;
//fin >chau
Compiladores e Intérpretes 2018
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Características de un Compilador
7
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Características de un Compilador
• Un Compilador es un software que traduce automáticamente
un programa de un lenguaje fuente a un programa equivalente
de un lenguaje destino.
8
011010
100110
101010
Compilador
Programa
fuente
Usualmente
Alto Nivel
Usualmente
Bajo Nivel
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Usualmente
Alto Nivel
Usualmente
Bajo Nivel
Características de un Compilador
• Un Compilador es un software que traduce automáticamente
un programa de un lenguaje fuente a un programa equivalente
de un lenguaje destino.
9
011010
100110
101010
Programa
fuente
Lenguaje Alto Nivel
• Independiente de la
máquina
• Sintaxis compleja
• Semántica compleja
• Anidamiento
• Subprogramas
• Objetos
…
Compilador
Lenguaje Bajo Nivel
• Específico
• Sintaxis simple
• Semántica simple
• Manejo de Memoria
• Registros
• Alcance simple
…
Gran brecha entre el fuente
y el destino… ¿Cómo y por
dónde comenzamos?¡Dividir y Conquistar!
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de
Análisis
Fases de
Síntesis
Características de un Compilador
• Las tareas del compilador se dividen en fases, las cuales se
agrupan de la siguiente manera:
10
011010
100110
101010
Compilador
Programa
fuente
CompiladorCompilador
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de
Análisis
Fases de
Síntesis
Características de un Compilador
• Las tareas del compilador se dividen en fases, las cuales se
agrupan de la siguiente manera:
11
011010
100110
101010
Compilador
Programa
fuente
Compilador
Analizar el
programa fuente
Mapear lo
analizado al
código destino
Compiladores e Intérpretes 2018
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
12
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
13
Fases de
Análisis
Analizar y recopilar
la información de
la estructura y el
significado del
fuente
Programa
fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
14
Fases de
AnálisisConstruir una representación
interna del fuente que capture la
estructura del programa
Árbol Sintáctico Abstracto (AST)
Programa
fuente
Analizar y recopilar
la información de
la estructura y el
significado del
fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
15
Fases de
Análisis Nombre tipo
x float
y float
Nombre Retorno Params
m1 void -
…
Construir una estructura con
toda la información recolectada
de las entidades del programa
Tabla de Símbolos
Analizar y recopilar
la información de
la estructura y el
significado del
fuente
Programa
fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
16
Fases de
Análisis…
Verificar la correctitud sintáctica y semántica
del programa; en caso de no ser correcto,
reportar el error con la información
adecuada.
Analizar y recopilar
la información de
la estructura y el
significado del
fuente
Programa
fuenteNombre tipo
x float
y float
Nombre Retorno Params
m1 void -
Programa
fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
17
…
Especificación del
Lenguaje fuente
Fases de
AnálisisEl compilador debe
valerse de la
especificación del
lenguaje fuente - de
sus reglas de
Sintaxis y Semántica
Analizar y recopilar
la información de
la estructura y el
significado del
fuente
Programa
fuenteNombre tipo
x float
y float
Nombre Retorno Params
m1 void -
Programa
fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
18
Analizador
Léxico
Analizador
Sintáctico
Analizador
Semántico
Fases de Análisis
¡Dividir y Conquistar!
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Análisis
19
Analizador
Léxico
Analizador
Sintáctico
Analizador
Semántico
¡Dividir y Conquistar!
Fases de Análisis
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Léxico
• Las reglas de sintaxis están expresadas en términos de los
tipos de palabras válidas (tokens) del lenguaje.
• Estas reglas determinan el orden en que pueden aparecer los
tokens en un programa válido.
• Problema: el programa fuente es una secuencia de
caracteres, no de tokens.
20
//cuenta
var = x * (y +10) ;
//fin cuenta
TEXT://cuentavar˽=˽x˽*˽˽(y˽+10)˽;//fin˽cuenta
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Léxico
• Para atacar este problema está la fase de análisis léxico.
• El analizador léxico toma como entrada el fuente y lo transforma en
una secuencia de tokens.
• Para esto irá agrupando caracteres contiguos del fuente que formen tokens.
• Además es el encargado omitir blancos, separadores y comentarios.
21
Analizador
Léxico
//cuentavar˽=˽x˽*˽˽(y˽+10)˽;//fin˽cuenta
Secuencia tokens//cuenta
var = x * (y +10) ;
//fin cuenta
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Léxico
• Además, el analizador léxico será el encargado de detectar y
reportar errores léxicos.
• Por ejemplo:
• Identificadores mal formados: 4varible me%todo
• Símbolos inválidos: € ☺ ~
• Comentarios multi-línea no cerrados: /*comentario…
22
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Léxico
23
Analizador
Léxico
Secuencia de Tokens
Reporte de Errores
Léxicos
Secuencia de Caracteres Fuente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
• A partir de la secuencia de tokens el compilador debe usar
las reglas de sintaxis de la especificación del lenguaje para:
• Controlar que la secuencia no viola ninguna de las reglas.
• Organizar los tokens en una representación arbórea que refleje la
estructura impuesta por estas reglas.
• Recolectar información de las entidades declaradas.
• El Analizador Sintáctico es el encargado de realizar estas
tareas.
24
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
• La implementación del analizador sintáctico se vale de las
teorías de lenguajes formales.
• Las reglas de sintaxis del lenguaje están expresadas en
términos de una gramática libre de contexto.
25
Derivación: partiendo del
símbolo inicial aplicamos
producciones y llegamos a
la cadena
Re
gla
s
Sin
tax
is
<A>::= id = <E> ;
<E>::= id<E>::= intval<E>::= <E> + <E>
<E>::= <E> * <E>
<E>::=(<E>)
Describen cómo generar
las cadenas del lenguaje
Cómo generar los
programas
sintácticamente
validos del lenguaje
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
• En esta fase ya tenemos la cadena (secuencia de tokens) y
queremos analizar su pertenencia al lenguaje.
• La estrategia general del analizador sintáctico será simular la
derivación (inteligentemente) buscando llegar a la secuencia
de tokens.
• En caso de no ser posible quiere decir que el programa fuente tiene
un error sintáctico, el cual deberá ser reportado.
26
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
• Las derivaciones tienen asociado un árbol de derivación.
• Este árbol refleja cómo se aplicaron las reglas de manera
jerárquica.
• Contiene información redundante o irrelevante para las próximas
fases.
• El analizador sintáctico generará una versión más abstracta de
ese árbol conocida como Árbol Sintáctico Abstracto (AST).
27
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
• Usualmente el analizador sintáctico recopila información de
las entidades declaradas.
• Esta información se almacena en la tabla de símbolos:
• Estructura jerárquica de tablas, que respeta los
ambientes de declaración del lenguaje.
• Para cada entidad se almacena información útil para las
siguientes fases (tipo, posición, tamaño, etc.).
28
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Sintáctico
29
Analizador
Sintáctico
Árbol Sintáctico Abstracto
Reporte de Errores
Sintácticos
Secuencia
de Tokens
Tabla de Símbolos
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Semántico
• En las fases anteriores obtuvimos información y controlamos la
forma del programa fuente.
• Esta fase concierne su significado.
• Intuitivamente, se busca:
• Descubrir cómo son utilizadas las entidades y los valores
del programa, y
• analizar si su uso es correcto.
30
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Semántico
• El analizador semántico tiene dos actividades principales:
• Resolución de Nombres: Identificar adecuadamente a qué entidad
declarada hace referencia un identificador utilizado.
Por ejemplo (en un lenguaje al estilo Java):
31
void m1(A x){
…
w = x.m2() + r;
…
}
¿Está declarada
la clase A?
¿Es w una variable local? Sino
¿es un parámetro? Sino ¿es
una variable de instancia?¿Es m2 un método de la
clase A o de un ancestro?
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Semántico
• El analizador semántico tiene dos actividades principales:
• Chequeo de Tipos: Controlar que cuando un elemento tipado
(variable, función, valor, expresión) es utilizado en un contexto su
tipo sea el adecuado.
Por ejemplo (en un lenguaje al estilo Java):
32
void m1(A x){
…
w = x.m2() + r;
…
}¿Puedo operar con + los
tipos de las sub-expresiones
(retorno de m2 y r)?
¿Es compatible el
tipo del resultado del
+ con el tipo de w?
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Semántico
• En cada una de estas actividades se pueden detectar errores:
• Cuando en la resolución de nombres no se encuentra una entidad
asociada al identificador analizado.
• Cuando en el chequeo tipos se produce una incompatibilidad de
tipos.
• De manera similar a las fases anteriores, el compilador deberá
reportar los errores semánticos detectados.
33
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Análisis Semántico
34
Analizador
Semántico
Árbol Sintáctico Abstracto*
Reporte de Errores
Semánticos
Tabla de Símbolos*
Árbol Sintáctico
Abstracto
Tabla de
Símbolos
Compiladores e Intérpretes 2018
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Síntesis
35
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de
Síntesis
Fases de Síntesis
36
011010
100110
101010
Árbol Sintáctico
Abstracto*
Tabla de
Símbolos*
Toman la información
recopilada por las
fases de análisis y
traducen a código del
lenguaje destino
Buscan que el
resultado sea un
código eficiente
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Síntesis
37
Analizador
Léxico
Analizador
Sintáctico
Analizador
Semántico
Fases de Síntesis
¡Dividir y Conquistar!
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Síntesis
38
Generador
de Código
Intermedio
Fases de Síntesis
¡Dividir y Conquistar!
Optimizador
(Código
Intermedio)
Generador
de Código
Destino
Optimizador
(Código
Destino)
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Generación de Código Intermedio
• Objetivo: traducir el programa a una representación que sea
útil para las siguientes fases.
• La representación intermedia debe ser tal que:
• Sea fácil de generar a partir del AST y de la Tabla de Símbolos.
• Sea fácil de traducir al lenguaje destino.
• Sea útil para aplicar técnicas de optimización.
39
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Generación de Código Intermedio
• En esta fase se traduce a una representación intermedia de
bajo nivel similar al lenguaje destino pero más abstracto.
• Para esto, el generador de código intermedio:
• Genera instrucciones a medida que recorre el AST.
• Utiliza la Tabla de Símbolos para obtener información.
40
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Generación de Código Intermedio
41
Generador
de Código
Intermedio
Árbol Sintáctico
Abstracto*
Tabla de
Símbolos*
Código Intermedio
de Bajo Nivel
Tabla de Símbolos*
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Optimización de Código Intermedio
• Esta fase reconstruye partes del código intermedio buscando
mejorar su calidad (abstrayéndose de la máquina destino).
• Sin alterar el resultado esperado de la computación.
• En general buscará hacer un código más eficiente, minimizando,
por ejemplo:
• Cantidad de instrucciones.
• Accesos a memoria.
• Uso de temporales.
42
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fase de Optimización de Código Intermedio
43
Optimizador
(Código
Intermedio)
Código Intermedio de
Bajo Nivel Mejorado
Tabla de Símbolos*
Código Intermedio
de Bajo Nivel
Tabla de Símbolos*
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Síntesis
44
Generador
de Código
Intermedio
Fases de Síntesis
Optimizador
(Código
Intermedio)
Generador
de Código
Destino
Optimizador
(Código
Destino)
Es posible tener varias fases
de generación de código
intermedio y optimización
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Generación y Optimización de Código Destino
• En estas fases se traduce la representación intermedia de
bajo nivel del programa fuente a código del lenguaje destino.
• Si elegimos una representación intermedia adecuada, una
estrategia básica de traduccion implicará:
• Tomar una instrucción de la representación intermedia, y
• traducirla a una secuencia de instrucciones del lenguaje destino que
realicen la misma tarea.
• Esta tarea se denomina selección de instrucciones.
45
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Fases de Generación y Optimización de Código Destino
• Si el destino es código máquina se asociarán registros y
locaciones de memoria para las variables del programa.
• Optimizaciones sobre el código destino requieren considerar
características de la arquitectura de la máquina destino.
• Por ejemplo: la máquina tiene un número limitado de registros.
• La clave es optimizar el uso de los registros reales, reutilizándolos
cuanto más sea posible.
46
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Programa
fuente
Estructura de un Compilador
47
Fases de Análisis
An
ali
zad
or
Léxic
o
An
ali
zad
or
Sin
tácti
co
An
ali
za
do
r
Sem
án
tico
Fases de Síntesis
Gen
. C
ód
igo
Inte
rmed
io
Op
tim
izad
or
Inte
rmed
io
Gen
. C
ód
igo
Desti
no
Op
tim
izad
or
Desti
no 011010
100110
101010
Compilador Estándar
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Programa
fuente
Estructura de un Compilador
48
Fases de Análisis
An
ali
zad
or
Léxic
o
An
ali
zad
or
Sin
tácti
co
An
ali
za
do
r
Sem
án
tico
Compilador Estándar
Fases de Síntesis
Gen
. C
ód
igo
Inte
rmed
io
Op
tim
izad
or
Inte
rmed
io
Gen
. C
ód
igo
Desti
no
Op
tim
izad
or
Desti
no 011010
100110
101010
No toda etapa necesita que la/s
anteriores terminen para
realizar su tareaCuanto más “secuenciales” son las etapas
más pasadas tendrá el compilador
En uno no Estándar
algunas etapas pueden
no existir
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
¿Por qué estudiamos Compiladores?
• Los compiladores son piezas fundamentales en computación:
preparan el problema para que sea resuelto por una computadora
• Nos permiten tener lenguajes y herramientas de más alto nivel
adecuados a las necesidades de problemáticas más específicas
• Un compilador es un software complejo → Desafío de ingeniería
de software
• Los compiladores son un ejemplo de cómo aplicar técnicas
formales para asegurar resultados en la práctica
49
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
¿Por qué estudiamos Compiladores?
• En la actualidad hay muchas herramientas que utilizan conceptos o son prácticamente compiladores, intérpretes o traductores
• Por Ejemplo:
• Web Browser
• Librerías de desarrollo web (JSX en React, GWT, etc.)
• Refactoring de código
• Parseo de datos en formatos específicos (JSON, XML, etc.)
• Procesadores de Lenguajes no estructurados
50
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Bibliografía
• A. Aho, M. Lam, R. Sethi, J. Ullman - Compilers: Principles
Techniques and Tools.
• K. Cooper, L. Torczon - Engineering a Compiler
• T. A. Mogensen - Basics of Compiler Design
• M. Scott - Programming Languages Pragmatics
51