Procesadores de Lenguaje 1 Compilador: DEFINICIÓN
Procesadores de Lenguaje 1 Compilador: DEFINICIÓN
Procesadores de Lenguaje 1 Compilador: DEFINICIÓN
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Procesadores</strong> <strong>de</strong> <strong>Lenguaje</strong> 1<br />
Introducción<br />
<strong>Compilador</strong>: <strong>DEFINICIÓN</strong><br />
Proceso <strong>de</strong> traducción que convierte un<br />
programa fuente escrito en un lenguaje<br />
<strong>de</strong> alto nivel a un programa objeto en<br />
código máquina y listo por tanto para<br />
ejecutarse en el or<strong>de</strong>nador, con poca o<br />
ninguna preparación adicional<br />
Programa<br />
Fuente<br />
<strong>Compilador</strong><br />
Mensajes<br />
<strong>de</strong> Error<br />
Programa<br />
Objeto
<strong>Compilador</strong>es, Introducción<br />
Código<br />
Máquina<br />
<strong>Compilador</strong>es<br />
Código<br />
Máquina<br />
Ensamblador<br />
<strong>Lenguaje</strong><br />
Ensamblador<br />
Código<br />
Máquina<br />
<strong>Lenguaje</strong><br />
Ensamblador<br />
Ensamblador <strong>Compilador</strong><br />
<strong>Lenguaje</strong><br />
<strong>de</strong> alto Nivel<br />
En los 50los compiladores eran<br />
consi<strong>de</strong>rados programas muy difíciles<br />
FORTRAN se <strong>de</strong>sarrolló en grupo durante<br />
18 años<br />
Se han <strong>de</strong>sarrollado técnicas sistemáticas,<br />
entornos <strong>de</strong> programación y herramientas<br />
software que facilitan la tarea <strong>de</strong> <strong>de</strong>sarrollo
<strong>Compilador</strong>es<br />
Gran variedad <strong>de</strong> lenguajes <strong>de</strong> alto nivel<br />
Gran variedad <strong>de</strong> lenguajes objeto, tanto otro<br />
lenguaje <strong>de</strong> alto nivel como código máquina<br />
No pue<strong>de</strong> darse una fecha exacta <strong>de</strong>l primer<br />
<strong>de</strong>sarrollo<br />
Varios grupos in<strong>de</strong>pendientemente <strong>de</strong>sarrollaron<br />
técnicas <strong>de</strong> análisis<br />
Los primeros traducían fórmulas aritméticas a<br />
código máquina<br />
Conceptos Relacionados<br />
Teoría <strong>de</strong><br />
<strong>Lenguaje</strong>s<br />
Arquitectura<br />
<strong>de</strong> Or<strong>de</strong>nadores<br />
Teoría <strong>de</strong><br />
Algoritmos<br />
<strong>Compilador</strong>es<br />
<strong>Lenguaje</strong>s <strong>de</strong><br />
Programación<br />
Ingeniería<br />
<strong>de</strong>l Software
Motivación (I)<br />
Para ser buen programador<br />
Saber como se obtiene un ejecutable permite<br />
saber más sobre corrección y eficiencia<br />
Para enten<strong>de</strong>r más sobre lenguajes<br />
Tipificación: estática, dinámica, fuerte,<br />
polimorfismo, conversiones, sobrecarga <strong>de</strong><br />
operadores...<br />
Estructura <strong>de</strong> bloques, ámbitos<br />
Paso <strong>de</strong> parámetros<br />
Gestión <strong>de</strong> memoria, punteros<br />
Motivación (II)<br />
La teoría es imprescindible<br />
Antes <strong>de</strong> la aplicación <strong>de</strong> teoría <strong>de</strong> autómatas<br />
y lenguajes formales, programación, etc. Los<br />
compiladores eran muy malos<br />
Aplicar la teoría y herramientas a otros<br />
campos:<br />
Intérpretes <strong>de</strong> comandos y consultas<br />
Formateadores <strong>de</strong> texto (TeX, LaTeX)<br />
<strong>Lenguaje</strong>s <strong>de</strong> simulación (GPSS)<br />
Intérpretes Gráficos (PS, GIF, JPEG, PovRAY)
<strong>Compilador</strong>; Definiciones I<br />
Ensamblador:<br />
<strong>Compilador</strong> sencillo, el lenguaje fuente tiene<br />
una estructura simple que permite una<br />
traducción <strong>de</strong> una sentencia fuente a una<br />
instrucción en código máquina<br />
<strong>Compilador</strong> cruzado:<br />
<strong>Compilador</strong> que traduce un lenguaje fuente a<br />
objeto, el objeto es para un or<strong>de</strong>nador distinto<br />
<strong>de</strong>l que compila<br />
<strong>Compilador</strong>; Definiciones II<br />
Compile-Link-Go frente a Compile-Go:<br />
<strong>Lenguaje</strong> que permita la fragmentación,<br />
compilación separada y enlazado <strong>de</strong> las parte<br />
El compilador <strong>de</strong>ja en memoria directamente<br />
un módulo cargable que se ejecuta a<br />
continuación<br />
<strong>Compilador</strong> <strong>de</strong> una o varias pasadas:<br />
“Pasada”: recorrido total <strong>de</strong> todo el fuente con<br />
alguna misión específica
<strong>Compilador</strong>; Definiciones III<br />
Traductor o compilador incremental<br />
(interactivo o conversacional)<br />
Encontrados y corregidos los errores <strong>de</strong>spués<br />
solo se compilan estos<br />
Autocompilador<br />
<strong>Compilador</strong> escrito en el propio lenguaje que<br />
compila<br />
Facilitar la portabilidad<br />
<strong>Compilador</strong>; Definiciones IV<br />
Metacompilador<br />
Programa que recibe un lenguaje y genera un<br />
compilador para ese lenguaje<br />
Decompilador<br />
Programa que recibe como entrada código<br />
máquina y lo traduce a un lenguaje <strong>de</strong> alto<br />
nivel
Esquema <strong>de</strong> Compilación<br />
Compilación<br />
Ejecución<br />
Objeto<br />
Resultados<br />
Fuente<br />
<strong>Compilador</strong><br />
Listado<br />
Diagnósticos<br />
Bien<br />
Si<br />
Programa<br />
Objeto<br />
No<br />
<strong>Compilador</strong>, Esquema<br />
Estructura <strong>de</strong><br />
Programa Fuente<br />
Preprocesador <strong>Compilador</strong> Ensamblador<br />
Programa<br />
Fuente<br />
Programa<br />
Objeto<br />
Ensamblador<br />
Código Máquina<br />
Absoluto<br />
Corregir<br />
Errores <strong>de</strong>l<br />
Fuente<br />
Datos<br />
Editor <strong>de</strong><br />
Carga<br />
Código Máquina<br />
Relocalizable<br />
Biblioteca <strong>de</strong><br />
Archivos Objeto<br />
Relocalizables
Fases <strong>de</strong> un <strong>Compilador</strong><br />
Análisis<br />
Analizador<br />
Léxico<br />
Analizador<br />
Sintáctico<br />
Analizador<br />
Semántico<br />
Entrada<br />
Salida<br />
Tabla <strong>de</strong><br />
Símbolos<br />
Generador<br />
<strong>de</strong> Código<br />
Intermedio<br />
Tratamiento<br />
<strong>de</strong> errores<br />
Optimizador<br />
Front End Backend<br />
Analizador Léxico (scanner)<br />
x:=a+b*c;<br />
y:=3+b*c;<br />
Generación<br />
Generador<br />
<strong>de</strong> Código<br />
Análisis Lineal: La ca<strong>de</strong>na <strong>de</strong> entrada se<br />
lee <strong>de</strong> izquierda a <strong>de</strong>recha y se agrupa en<br />
componentes léxicos (tokens)<br />
Secuencias <strong>de</strong> caracteres con un significado<br />
colectivo<br />
Analizador<br />
Léxico<br />
(id,”x”)<br />
(op,”+”)<br />
(id,”c”)<br />
(id,”y”)<br />
(op,”+“)<br />
(id,”c”)<br />
TOKENS<br />
(op,”:=“)<br />
(id,”b”)<br />
(punt,”;”)<br />
(op,”:=“)<br />
(id,”b”)<br />
(punt,”;”)<br />
(id,”a”)<br />
(op,”*”)<br />
(num,”3”)<br />
(op,”*“)
Analizador Sintáctico<br />
Análisis Jerárquico<br />
(id,”x”)<br />
(op,”+”)<br />
(id,”c”)<br />
(id,”y”)<br />
(op,”+“)<br />
(id,”c”)<br />
Agrupa los componentes léxicos en frases<br />
gramaticales que el compilador utiliza<br />
TOKENS<br />
(op,”:=“)<br />
(id,”b”)<br />
(punt,”;”)<br />
(op,”:=“)<br />
(id,”b”)<br />
(punt,”;”)<br />
(id,”a”)<br />
(op,”*”)<br />
(num,”3”)<br />
(op,”*“)<br />
Sentencias<br />
Analizador<br />
Sintáctico<br />
Sentencia ; Sentencias<br />
Asignación Sentencia<br />
Variable := Expresión Asignación<br />
X Variable + Expresión Variable := Expresión<br />
a Variable * Expresión y Constante + Expresión<br />
b Variable 3 Variable * Expresión<br />
c b Variable<br />
c
<strong>Compilador</strong>; Gramática<br />
Sentencias ::= Sentencia “;” Sentencias | Sentencia<br />
Sentencia ::= Asignación | Condicional | Iterativa<br />
Asignación ::= Variable “:=“ Expresión<br />
Condicional ::= “if” Condición “then” Sentencias “else”<br />
Sentencias<br />
Iterativa ::= “while” Condición “do” Sentencias<br />
Expresión ::= Variable-Número “+” Expresión |<br />
Variable-Número “*” Expresión |<br />
Variable-Número “-” Expresión |<br />
Variable-Número “/” Expresión |<br />
Variable-Número<br />
Variable ::= [A-Za-z] [A-Za-z0-9] *<br />
Variable-Número ::= Variable | Número<br />
Número ::= [0-9] +<br />
Analizador Semántico<br />
Busca errores semánticos, reúne<br />
información <strong>de</strong> tipos; i<strong>de</strong>ntifica operadores<br />
y operandos<br />
•<br />
:= :=<br />
x + y +<br />
a * 3 *<br />
b c b c
Optimización<br />
•<br />
:= :=<br />
x + y +<br />
a * 3 •<br />
b c<br />
Generador <strong>de</strong> Código<br />
•<br />
:= :=<br />
x + y +<br />
a * 3 •<br />
b c<br />
Push a<br />
Push b<br />
Load (c), R1<br />
Mult (S), R1<br />
Store R1, R2<br />
Add (S), R1<br />
Store R1,(x)<br />
Add #3, R2<br />
Store R2, (y)<br />
a→pila<br />
b→pila<br />
c→R1<br />
b*c→R1<br />
R1→R2<br />
a+b*c→R1<br />
R1→x<br />
3+b*c→R2<br />
R2→y
Generación <strong>de</strong> código<br />
El uso <strong>de</strong> código intermedio reduce la<br />
complejidad <strong>de</strong>l <strong>de</strong>sarrollo <strong>de</strong><br />
compiladores<br />
m front ends y n backends comparten un<br />
código intermedio común<br />
1<br />
1<br />
Front Ends<br />
2<br />
m<br />
CI<br />
n<br />
2<br />
Backends<br />
Fases <strong>de</strong> un <strong>Compilador</strong><br />
Agrupación lógica <strong>de</strong> un compilador<br />
Etapa Inicial<br />
Fases, o parte <strong>de</strong> fases que <strong>de</strong>pen<strong>de</strong>n <strong>de</strong>l<br />
lenguaje fuente y que son in<strong>de</strong>pendientes <strong>de</strong> la<br />
máquina<br />
Análisis léxico, sintáctico, semántico y generación <strong>de</strong><br />
código intermedio, manejo <strong>de</strong> errores <strong>de</strong> cada parte<br />
Etapa Final<br />
Fases que <strong>de</strong>pen<strong>de</strong> <strong>de</strong> la máquina, <strong>de</strong>pen<strong>de</strong> <strong>de</strong>l<br />
lenguaje intermedio<br />
Optimización <strong>de</strong> código, generación <strong>de</strong> código,<br />
operaciones con la tabla <strong>de</strong> símbolos
Aplicaciones<br />
Desarrollo <strong>de</strong> interfaces <strong>de</strong> texto<br />
Tratamiento <strong>de</strong> ficheros <strong>de</strong> texto estructurados<br />
Perl, Tcl, comando <strong>de</strong> Unix (egrep)<br />
<strong>Procesadores</strong> <strong>de</strong> texto<br />
vi,emacs<br />
Formateo <strong>de</strong> texto y <strong>de</strong>scripción gráfica<br />
HTML, TeX, Postscript<br />
Gestión <strong>de</strong> bases <strong>de</strong> datos<br />
Procesamiento <strong>de</strong>l <strong>Lenguaje</strong> Natural<br />
Traducción <strong>de</strong> formatos <strong>de</strong> programas<br />
Cálculo simbólico<br />
Reconocimiento <strong>de</strong> formas<br />
Diagramas <strong>de</strong> Tombstone<br />
Conjunto <strong>de</strong> “piezas <strong>de</strong> puzzle” útiles<br />
para razonar acerca <strong>de</strong> los<br />
procesadores <strong>de</strong> lenguaje y los<br />
programas<br />
Tienen diferentes tipos <strong>de</strong> piezas<br />
Hay reglas <strong>de</strong> formación, no todos los<br />
diagramas están permitidos
Diagramas <strong>de</strong> Tombstone<br />
• Diagrama para Programas<br />
P<br />
L<br />
Programa P<br />
expresado en<br />
el lenguaje L<br />
• Diagrama para Máquinas<br />
M<br />
Máquina M<br />
capaz <strong>de</strong> ejecutar<br />
programas en el<br />
lenguaje M<br />
HolaMundo<br />
x86<br />
sort<br />
JAVA<br />
Diagramas <strong>de</strong> Tombstone<br />
x86<br />
SPARC<br />
Ejecución <strong>de</strong> un programa en una<br />
máquina<br />
HolaMundo<br />
x86<br />
x86<br />
A<br />
B<br />
B<br />
La máquina y el<br />
lenguaje <strong>de</strong>ben<br />
coincidir<br />
HolaMundo<br />
x86<br />
SPARC
Diagramas <strong>de</strong> Tombstone<br />
• Diagrama para Traductores/<strong>Compilador</strong>es<br />
<strong>Lenguaje</strong><br />
Fuente<br />
S → T<br />
L<br />
• Diagrama para Intérpretes<br />
<strong>Lenguaje</strong><br />
Fuente<br />
S<br />
L<br />
<strong>Lenguaje</strong><br />
Objeto<br />
<strong>Lenguaje</strong><br />
<strong>de</strong> Implementación<br />
<strong>Lenguaje</strong><br />
<strong>de</strong> Implementación<br />
Diagramas <strong>de</strong> Tombstone<br />
Ejemplo <strong>de</strong> compilación<br />
tetris<br />
C C → x86<br />
x86<br />
x86<br />
tetris<br />
x86<br />
Compilación cruzada<br />
tetris<br />
C C → PPC<br />
x86<br />
x86<br />
tetris<br />
PPC<br />
tetris<br />
x86<br />
x86<br />
tetris<br />
PPC<br />
PCC<br />
Ada → x86<br />
C<br />
Ada → x86<br />
x86<br />
Perl<br />
Sparc
Diagramas <strong>de</strong> Tombstone<br />
Emulador<br />
Intérprete<br />
tetris<br />
Basic<br />
Basic<br />
x86<br />
x86<br />
Máquinas abstractas<br />
tetris<br />
Atari<br />
Atari<br />
x86<br />
x86<br />
Atari<br />
C C → x86<br />
x86<br />
x86<br />
Atari<br />
x86<br />
Máquina Atari sobre x86<br />
Doom<br />
C C → Atari<br />
x86<br />
x86<br />
Diagramas <strong>de</strong> Tombstone<br />
Compilar un compilador<br />
Java→ x86 Java→ x86<br />
C C → x86<br />
x86<br />
x86<br />
x86<br />
Para una máquina distinta (half bootstrap)<br />
C→ PPC<br />
C<br />
C→ PPC<br />
C<br />
C → x86<br />
x86<br />
x86<br />
C→ PPC<br />
C→ PPC PPC<br />
x86<br />
x86<br />
Doom<br />
Atari<br />
Atari<br />
x86<br />
x86
Bootstrapping<br />
Compilar un compilador (una versión<br />
antigua) consigo mismo<br />
Vamos a obtener un nuevo compilador<br />
Ada-s → x86 Ada-s → x86<br />
C C → x86<br />
x86<br />
x86<br />
x86<br />
Ada → x86 Ada-s→ x86<br />
Ada-s Ada-s→ x86<br />
x86<br />
x86<br />
x86<br />
Ada-s → x86 Ada-s→ x86<br />
Ada-s Ada-s→ x86<br />
x86<br />
x86<br />
x86<br />
Ya no <strong>de</strong>pen<strong>de</strong>mos<br />
<strong>de</strong> C!!!<br />
Obtener un compilador rápido<br />
Tenemos:<br />
Hacemos:<br />
Ada → x86 f<br />
Ada Ada → x86 s<br />
x86 s<br />
x86<br />
Ada → x86 s<br />
Ada<br />
Ada → x86 f<br />
Ada<br />
Ada → x86 f<br />
x86 s<br />
Ada → x86 s<br />
x86 s<br />
Ada → x86 f<br />
Ada Ada → x86 f<br />
x86 s<br />
x86<br />
Ada → x86 f<br />
x86 f