03.06.2013 Views

Procesadores de Lenguaje 1 Compilador: DEFINICIÓN

Procesadores de Lenguaje 1 Compilador: DEFINICIÓN

Procesadores de Lenguaje 1 Compilador: DEFINICIÓN

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!