Sunteți pe pagina 1din 34

CONCEPTOS INTRODUCTORIOS DE COMPILADORES

Gino Barroso Viruez

Versin 1.0 Marzo de 2011

QU ES UN COMPILADOR?

QUE ES UN COMPILADOR?
A grandes rasgos un compilador es un software que lee un programa escrito en un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traduccin, el compilador informa a su usuario de la presencia de errores en el programa fuente.

QUE ES UN COMPILADOR?
En este diagrama de bloques, se observa que el compilador lee caracter (char) a caracter el contenido del programa fuente F, usualmente escrito en modo texto (plain-text) y luego de un proceso de traduccin genera un programa objeto O, equivalente a F.
Programa Fuente F
char

COMPILADOR

Programa Objeto O

QUE ES UN COMPILADOR?
Es muy comn observar a un compilador como un software que traduce un programa fuente a un programa objeto stand-alone de cdigo mquina absoluto.
Pero esto no necesariamente es as
Juego.exe Juego.cpp (plain-text)
char

COMPILADOR

QUE ES UN COMPILADOR?
Es posible construir compiladores que traduzcan cdigo de Delphi a JAVA, de Pascal a C++, de C++ a JAVA, etc. Recuerde que la definicin de compilador no limita el lenguaje del programa objeto.

QUE ES UN COMPILADOR?
Es ms, la moda actual, es el diseo de lenguajes de programacin, cuyo compilador traduce el cdigo fuente a un lenguaje intermedio (IL), con el objetivo de que ste ltimo sea un cdigo portable. Posteriormente, un programa llamado intrprete, runner o VM se encargar de la interpretacin (run) del cdigo intermedio. Un IL es un lenguaje muy cercano al assembler, pero es independiente del cdigo mquina de cualquier computadora.

El lenguaje ms famoso en esta prctica es JAVA, pues su compilador java.exe traduce el programa fuente F (.java) a un programa objeto O (.jar) escrito en un IL, denominado byte-code. La ejecucin (run) del byte-code lo realiza su intrprete llamado JVM. Siempre se debe recordar que un compilador NO CORRE (run) al programa objeto. Su trabajo solo se limita a realizar la traduccin de F a O

QUE ES UN COMPILADOR?
Compilacin y Ejecucin en JAVA
Juego.jar
Juego.java
byte-code char

COMPILADOR (Java.exe)
byte-code

INTERPRETE (JVM)

Juego.jar

QU ES UN INTRPRETE?

Qu es un intrprete?
Un intrprete o interpretador es un software capaz de analizar y ejecutar (run) otros programas, escritos en un lenguaje de programacin.
Los intrpretes slo realizan la traduccin a medida que sea necesaria, tpicamente, instruccin por instruccin, y normalmente no guardan el resultado de dicha traduccin. A un intrprete tambin se le llama runner, porque corre al programa fuente; o VM (mquina virtual) porque imaginariamente el programa fuente le da instrucciones (rdenes) especficas al intrprete, para que l las lleve a cabo.

Qu es un intrprete?
Un ejemplo sencillo
Para entender mejor los conceptos vertidos en la diapositiva anterior, supngase que usted realiza un software (el cual ser un intrprete), que inicialmente tiene a un cuadrado dibujado en el centro de la pantalla, y que acepta como instrucciones (sentencias u rdenes) de animacin del cuadrado los siguientes caracteres:
- + * / Mover el cuadrado una posicin a la izquierda. Mover el cuadrado una posicin a la derecha. Mover el cuadrado una posicin hacia arriba. Mover el cuadrado una posicin hacia abajo.

Entonces, el usuario de su software, podr escribir un programa fuente F para su intrprete, simplemente almacenando en un string o archivo texto F una secuencia de rdenes.

Qu es un intrprete?
Un ejemplo sencillo
Por ejemplo, si F = +**--/+, su usuario quiere mover el cuadrado una posicin a la derecha dos hacia arriba, dos hacia la izquierda una hacia abajo y finalmente una posicin hacia la derecha. Claramente, para interpretar a F, usted tendra un procedimiento parecido a ste
void Interpretar(String F){ for (int i=0; i<F.length(); i++){ //Para leer cada char de F. char orden = F.charAt(i); //Obtener el char de la pos. i de F. switch (orden){ // Interpretar la orden. case + : Cuadrado.MoverDerecha(); break; case - : Cuadrado.MoverIzquierda(); break; //etc } } }

Qu es un intrprete?
Un ejemplo sencillo
Entonces, su intrprete luego de ejecutar al programa fuente F, habr recibido una serie de 7 instrucciones y por cada una de ellas habr emitido una traduccin:
Instruccin u orden recibida + * * / + Traduccin efectuada Cuadrado.MoverDerecha() Cuadrado.MoverArriba() Cuadrado.MoverArriba() Cuadrado.MoverIzquierda() Cuadrado.MoverIzquierda() Cuadrado.MoverAbajo() Cuadrado.MoverDerecha()

Estas son las traducciones efectuadas por el intrprete y no son guardadas en ninguna parte (archivo, base de datos, etc).

Qu es un intrprete?
Un ejemplo sencillo
Tambin, desde la perspectiva del usuario, su intrprete podr verse como:
Runner (Ejecutor): Porque ejecuta (run) las instrucciones que el usuario anota en (el programa fuente) F. VM (Virtual Machine): Porque al software lo podr observar como una mquina (imaginaria) que anima un cuadrado segn las instrucciones dadas en F.

Instrucciones F

INTERPRETE

Qu es un intrprete?

Los programas interpretados suelen ser ms lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son ms flexibles como entornos de programacin y depuracin (lo que implica, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o aadir mdulos completamente nuevos).
Permiten ofrecer al programa interpretado un entorno no dependiente de la plataforma de Hw y/o Sw donde se ejecuta el intrprete, sino del propio intrprete (una razn ms para llamarlo mquina virtual).

Qu es un intrprete?
Diferencia entre compilador e intrprete
Comparando su actuacin con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro texto independiente traducido a otra lengua, mientras que un intrprete corresponde al intrprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.

LAS FASES DE UN COMPILADOR

LAS FASES DE UN COMPILADOR


Un compilador lleva a cabo su tarea de traduccin en dos etapas: la etapa de anlisis y la etapa de sntesis. En la primera etapa, la de anlisis, el compilador lee caracter (char) a carcter el programa fuente F, con la intencin de verificar su correctitud: Si encuentra errores en F, el compilador comunica al usuario la presencia y ubicacin de los mismos y finaliza su ejecucin; Si no hay errores, contina con la siguiente etapa.
En la etapa de sntesis, es donde el compilador realmente traduce al programa fuente F en un programa objeto O.

LAS FASES DE UN COMPILADOR


Cada etapa a su vez se subdivide, cada una, en tres fases:
1. Anlisis Lxico (Scanner)

Etapa de Anlisis

2. Anlisis Sintctico (Parser)


3. Anlisis Semntico

Por lo tanto, un compilador lleva a cabo SEIS fases para realizar la traduccin de F a O.
Sin embargo, las fases son ayudadas por dos mdulos adicionales: La Tabla de Smbolos y el Manejador de Errores, tal como se muestra a continuacin

4. Generador de Cdigo Intermedio

Etapa de Sntesis

5. Optimador de Cdigo 6. Generador de Cdigo Objeto

LAS FASES DE UN COMPILADOR


Diagrama de Fases
Programa fuente F
char

Analizador Lxico (Scanner)


token

Analizador Sintctico (Parser) Tabla de Smbolos


rbol de A. sintctico

COMPILADOR
Generador de Cdigo Intermedio Optimador de Cdigo

Analizador Semntico

Manejador de Errores

Generador de Cdigo Objeto


Programa Objeto O

LAS FASES DE UN COMPILADOR


Tabla de Smbolos
Un identificador (que se abrevia ID), es un nombre que el programador libremente le otorga a un elemento del lenguaje (class, procedimiento, funcin, variable, etc). Por ejemplo, en este fragmento de cdigo:

public class PilaX { private boolean Sw; String Modo(int x){

No se debe confundir un ID con una String constante (StringCtte). Estas ltimas estn encerradas entre comillas y normalmente son usadas para mensajes (e.g. Hola Mundo)

Los IDs son PilaX, Sw, Modo y x.

LAS FASES DE UN COMPILADOR


Tabla de Smbolos
Una Tabla de Smbolos (TS) es una estructura de datos que mantiene la informacin de TODOS los identificadores (ID) que se usan en el programa fuente. Por cada ID se almacena su nombre, su tipo, su mbito scope (global o local), etc., con la intencin de que esta informacin sea usada por las seis fases del compilador. Como se observa en el Diagrama de Fases, normalmente el Analizador Lxico y el Analizador Sintctico escriben/leen en la TS, mientras que las dems fases slo leen la informacin contenida en ella. Aunque al mdulo se lo nombra en singular, una TS en realidad puede estar compuesta por varias tablas. Algunas TS, tambin crean una tabla de StringCttes

LAS FASES DE UN COMPILADOR


Tabla de Smbolos Ejemplo
La TS mostrada tiene dos tablas. La primera almacena la informacin de los procedimientos, mientras que la segunda, las variables.
Nombre Factorial Leer C3-Ini 0 24 C3-Fin 23 31 Parmetros 1 0
Nombre Sw Tipo boolean mbito 0

Dibujar

32

102

int

Nota. Las tablas mostradas aqu son solo de ejemplo. En la prctica, una TS es diseada de acuerdo a los requerimientos del compilador; por lo tanto, en general, la TS de un compilador difiere con la TS de otro compilador.

LAS FASES DE UN COMPILADOR


Analizador Lxico
Programa fuente F

char
Analizador Lxico (Scanner)

token
Analizador Sintctico (Parser)

El Analizador Lxico, tambin conocido como scanner, lexer o Analex, lee uno a uno los caracteres (chars) del programa fuente con la intencin de reconocer substrings que obedecen a un patrn de formacin, llamados tokens, que luego sern tratados como una nica entidad por el parser.

LAS FASES DE UN COMPILADOR


Analizador Lxico
Por ejemplo, si el programa fuente es x := 640 * Velocidad 456; , el analex agrupar caracteres consecutivos (substrings) para formar tokens:

:=

640

Velocidad
ID

MENOS

456
NUM

;
PTOCOMA

ID ASSIGN NUM POR

Ntese que los tokens tienen un nombre asignado (ID, NUM, ASSIGN, etc). Estos nombres usualmente son inventados por el diseador del compilador. Sin embargo, a los ms conocidos como ID (identifier) y NUM (number), normalmente se les respeta el nombre.

LAS FASES DE UN COMPILADOR


Analizador Lxico

Se debe puntualizar que el Analex, no verifica el orden en que deben aparecer los tokens. Su trabajo solo se circunscribe a reconocerlos. Por ejemplo, si el programa fuente (errneo) fuera x := 640 456; Velocidad * el analex reconoce los tokens, en este orden: ID, MENOS, ASSIGN, NUM, NUM, PTOCOMA, ID, POR, sin comunicar ningn error.

La fase del Anlisis Lxico, es considerada la fase ms lenta del compilador, porque lee char a char al Prog. Fuente.

Aparte de reconocer los tokens, el analex tambin hace tareas adicionales: Ignorar los comentarios del Prog. Fuente, e instalar las StringCttes e IDs en la TS (si corresponde).

LAS FASES DE UN COMPILADOR


Analizador Sintctico
En el diccionario, se define sintaxis, como la parte de la gramtica que estudia la ordenacin y las relaciones mutuas de las palabras en la oracin, hasta formar una expresin completa. En compilacin, la sintaxis es el conjunto de reglas (gramtica) que definen las secuencias correctas (orden) de los elementos (tokens) de un lenguaje de programacin.

Entonces, el Analizador Sintctico (parser), es la fase del compilador que revisa el orden correcto en que deben aparecer los tokens en el programa fuente.

LAS FASES DE UN COMPILADOR


Analizador Sintctico Ejemplo
Programa fuente: x := 640 456; Velocidad * char a char

Analizador Lxico (Scanner)

tokens: ID MENOS ASSIGN NUM NUM PTOCOMA ID POR


Analizador Sintctico (Parser) Manejador de Errores

Error de Sintaxis

En este ejemplo, vemos el proceder del Analizador Sintctico: el parser recibe los tokens enviados por el Scanner y al verificar que stos no estn en el orden correcto, emite un error.

LAS FASES DE UN COMPILADOR


Analizador Semntico
En la lingstica, el trmino semntica se refiere a los aspectos del significado, sentido o interpretacin de un determinado elemento, smbolo, palabra, expresin o representacin formal. En compilacin, entendemos semntica como la interpretacin del significado de las sentencias escritas en el programa fuente (Qu desea hacer el programador con la sentencia escrita?). Por ejemplo, consideremos la siguiente sentencia escrita en C++:

s = a + b;
si las variables son del tipo string, significar una concatenacin; sin son enteras (int) se interpretar como una suma.

LAS FASES DE UN COMPILADOR


Analizador Semntico
Por tanto, en definitiva, el Analizador Semntico es el encargado de comprobar que el significado de lo que se va leyendo es vlido. Esto implica, entonces, que esta fase se dedicar a comprobar la compatibilidad de los tipos de datos, los rangos de una asignacin, etc. Por ejemplo, en el siguiente fragmento de cdigo (sintcticamente bien formado), sta fase encontrar errores semnticos:
byte x, y; string s; int V[5]; x = 300; //Out of range: byte va de 0 a 255 y = s + x; //Tipos incompatibles: (s es string) V[100] = 0; //Out of range: No existe la casilla 100.

LAS FASES DE UN COMPILADOR


Generador de Cdigo Intermedio
Una vez concluida la Etapa de Anlisis (lxico, sintctico y semntico) y al observar que el Prog. Fuente F es vlido, el compilador pasa a la fase de Generacin de Cdigo Intermedio.

Esta fase convierte a F en un cdigo muy cercano al assembler, llamado lenguaje intermedio (IL, Intermediate Language), con la intencin de facilitar el trabajo de las siguientes dos fases (Optimacin de Cdigo y Generacin de Cdigo Objeto final).

LAS FASES DE UN COMPILADOR


Generador de Cdigo Intermedio
Por ejemplo, el programa fuente

x := 640 * Velocidad 456;


se convertir en el cdigo intermedio t1 t2 t3 t4 t5 x = = = = = = 640 Velocidad t1 * t2 456 t3 t4 t5
NOTA. El IL (lenguaje intermedio) mostrado aqu es llamado cdigo de tres direcciones y es considerado el ms popular de todos los ILs. Sin embargo, el diseador del compilador puede optar por otro IL disponible, o uno de su propia creacin.

LAS FASES DE UN COMPILADOR


Optimador de Cdigo
Esta fase es la encargada de reducir el tamao del cdigo intermedio con la finalidad de que el cdigo objeto final sea ms pequeo y ms rpido. Por ejemplo:

t1 t2 t3 t4 t5 x

= = = = = =

640 Velocidad t1 * t2 456 t3 t4 t5

OPTIMACIN

t1 t3 t4 x

= = = =

640 t1 * Velocidad 456 t3 t4

LAS FASES DE UN COMPILADOR


Generador de Cdigo Objeto Final
Una vez optimizado (reducido) el cdigo intermedio, esta fase genera el cdigo objeto final.
Por ejemplo:
Cdigo Objeto Final t1 t3 t4 x = = = = 640 t1 * Velocidad 456 t3 t4

Generar Cdigo Objeto

MOV MOV MUL MOV

[t1], 640 AX, Velocidad BX [t3], BX (etc)