Vous êtes sur la page 1sur 14

Proceso de compilacin

1. Cuando un cdigo es ledo por un compilador este entra al anlisis lxico


donde se verifica dnde empieza y termina cada instruccin, esto se hace
tomando como referencia los espacios en blanco.
2. Una vez hecho esto el analizador sintctico llama de manera repetida al
analizador lxico para que este le envi cada lnea de cdigo para ser
verificada si est bien escrita en el lenguaje. Para realizar esta verificacin se
realiza por medio de un estructura llamada rbol gramatical.
Ejemplo:

1. Despus entra en la etapa del analizador semntico, esta se encarga de la


construccin de las instrucciones del lenguaje, revisando que sean iguales a las
definidas.
2. Luego entramos al proceso de sntesis, donde se generas el cdigo
intermedio, este para ser utilizado en la memoria de forma temporal.
3. Ahora este cdigo generado pasa por el optimizador para ser ejecutado de
forma ms rpida.
4. En esta ltima etapa se genera un cdigo que sea entendible por la mquina
para ser ejecutado por la computadora.

1. Anlisis: El cual se trata de la escritura correcta del cdigo fuente. Esta a su


vez comprende varias fases:
Anlisis lxico: esta fase es la encargada de leer el cdigo fuente y separarlo
en lotes para poder ser ledo por el anlisis sintctico.
Anlisis sintctico: esta fase evala los lotes de cdigo con el fin de que este
cumpla con los requerimientos definidos por el compilador.
Anlisis semntico: en esta fase se busca establecer que el cdigo fuente
cumpla con la semntica solicitada por el compilador, es decir que el cdigo
este correctamente escrito para poder ser interpretado.
2. Sntesis: Despus del proceso de anlisis se procede a generar grupos de los
componentes que conforman el programa, para generar una salida.
Generacin de cdigo intermedio: este cdigo se genera con el fin de mejorar
el uso de la memoria con el fin de optimizar cdigo fuente.
Optimizacin de cdigo: el objeto de esta fase es mejorar el cdigo para que
sea ms rpido ejecutarlo.
Generacin de cdigo: Aqu se crea el cdigo final de salida que va a ser
interpretado por la mquina.
FASES DE PROCESO DE COMPILACIN
FASE DE ANLISIS
Anlisis lxico
El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de
izquierda a derecha y se agrupa en componentes lxicos (tokens), que son
secuencias de caracteres que tienen un significado. Adems, todos los espacios
en blanco, lneas en blanco, comentarios y dems informacin innecesaria se
elimina del programa fuente. Tambin se comprueba que los smbolos del
lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.
Como la tarea que realiza el analizador lxico es un caso especial de
coincidencia de patrones, se necesitan los mtodos de especificacin y
reconocimiento de patrones, se usan principalmente los autmatas finitos que
acepten expresiones regulares. Sin embargo, un analizador lxico tambin es la
parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta
entrada a menudo involucra un importante gasto de tiempo, el analizador
lxico debe funcionar de manera tan eficiente como sea posible.

Anlisis sintctico
En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente
en frases gramaticales que el compilador utiliza para sintetizar la salida. Se
comprueba si lo obtenido de la fase anterior es sintcticamente correcto
(obedece a la gramtica del lenguaje). Por lo general, las frases gramaticales
del programa fuente se representan mediante un rbol de anlisis sintctico.
La estructura jerrquica de un programa normalmente se expresa utilizando
reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte
de la definicin de expresiones:
1. Cualquier identificador es una expresin.
2. Cualquier nmero es una expresin.
3. Si expresin1 y expresin2 son expresiones, entonces tambin lo son:

expresin1 + expresin2

expresin1 * expresin2

( expresin1 )

Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3
define expresiones en funcin de operadores aplicados a otras expresiones.
La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor
para determinar la divisin es si una construccin del lenguaje fuente es
inherentemente recursiva o no. Las construcciones lxicas no requieren
recursin, mientras que las construcciones sintcticas suelen requerirla. No se
requiere recursin para reconocer los identificadores, que suelen ser cadenas
de letras y dgitos que comienzan con una letra. Normalmente, se reconocen
los identificadores por el simple examen del flujo de entrada, esperando hasta
encontrar un carcter que no sea ni letra ni dgito, y agrupando despus todas
las letras y dgitos encontrados hasta ese punto en un componente lxico
llamado identificador. Por otra parte, esta clase de anlisis no es
suficientemente poderoso para analizar expresiones o proposiciones. Por
ejemplo, no podemos emparejar de manera apropiada los parntesis de las
expresiones, o las palabras begin y end en proposiciones sin imponer alguna
clase de estructura jerrquica o de anidamiento a la entrada.

Anlisis semntico

La fase de anlisis semntico revisa el programa fuente para tratar de


encontrar errores semnticos y rene la informacin sobre los tipos para la fase
posterior de generacin de cdigo. En ella se utiliza la estructura jerrquica
determinada por la fase de anlisis sintctico para identificar los operadores y
operandos de expresiones y proposiciones.
Un componente importante del anlisis semntico es la verificacin de tipos.
Aqu, el compilador verifica si cada operador tiene operandos permitidos por la
especificacin del lenguaje fuente. Por ejemplo, las definiciones de muchos
lenguajes de programacin requieren que el compilador indique un error cada
vez que se use un nmero real como ndice de una matriz. Sin embargo, la
especificacin del lenguaje puede imponer restricciones a los operandos, por
ejemplo, cuando un operador aritmtico binario se aplica a un nmero entero y
a un nmero real.3 Revisa que los arreglos tengan definido el tamao correcto.
FASE DE SNTESIS
Consiste en generar el cdigo objeto equivalente al programa fuente. Slo se
genera cdigo objeto cuando el programa fuente est libre de errores de
anlisis, lo cual no quiere decir que el programa se ejecute correctamente, ya
que un programa puede tener errores de concepto o expresiones mal
calculadas. Por lo general el cdigo objeto es cdigo de mquina relocalizable o
cdigo ensamblador. Las posiciones de memoria se seleccionan para cada una
de las variables usadas por el programa. Despus, cada una de las
instrucciones intermedias se traduce a una secuencia de instrucciones de
mquina que ejecuta la misma tarea. Un aspecto decisivo es la asignacin de
variables a registros.

Generacin de cdigo intermedio


Despus de los anlisis sintctico y semntico, algunos compiladores generan
una representacin intermedia explcita del programa fuente. Se puede
considerar esta representacin intermedia como un programa para una
mquina abstracta. Esta representacin intermedia debe tener dos
propiedades importantes; debe ser fcil de producir y fcil de traducir al
programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma
intermedia llamada cdigo de tres direcciones que es como el lenguaje
ensamblador de una mquina en la que cada posicin de memoria puede
actuar como un registro. El cdigo de tres direcciones consiste en una
secuencia de instrucciones, cada una de las cuales tiene como mximo tres
operandos. Esta representacin intermedia tiene varias propiedades:

Primera.- Cada instruccin de tres direcciones tiene a lo sumo un operador,


adems de la asignacin, por tanto, cuando se generan estas instrucciones, el
traductor tiene que decidir el orden en que deben efectuarse las operaciones.
Segunda.- El traductor debe generar un nombre temporal para guardar los
valores calculados por cada instruccin.
Tercera.- Algunas instrucciones de tres direcciones tienen menos de tres
operandos, por ejemplo, la asignacin.
Optimizacin de cdigo
Artculo principal: Compilador optimizador
La fase de optimizacin de cdigo consiste en mejorar el cdigo intermedio, de
modo que resulte un cdigo mquina ms rpido de ejecutar. Esta fase de la
etapa de sntesis es posible sobre todo si el traductor es un compilador
(difcilmente un intrprete puede optimizar el cdigo objeto). Hay mucha
variacin en la cantidad de optimizacin de cdigo que ejecutan los distintos
compiladores. En los que hacen mucha optimizacin, llamados compiladores
optimizadores, una parte significativa del tiempo del compilador se ocupa en
esta fase. Sin embargo, hay optimizaciones sencillas que mejoran
sensiblemente el tiempo de ejecucin del programa objeto sin retardar
demasiado la compilacin.3
ESTRUCTURA DE DATOS PRINCIPALES
La interaccin entre los algoritmos utilizados por las fases del compilador y las
estructuras de datos que soportan estas fases es, naturalmente, muy fuerte. El
escritor del compilador se esfuerza por implementar estos algoritmos de una
manera tan eficaz como sea posible, sin aumentar demasiado la complejidad.
De manera ideal, un compilador debera poder compilar un programa en un
tiempo proporcional al tamao del mismo.
Componentes lxicos o tokens
Cuando un analizador lxico rene los caracteres en un token, generalmente
representa el token de manera simblica, es decir, como un valor de un tipo de
datos enumerado que representa el conjunto de tokens del lenguaje fuente. En
ocasiones tambin es necesario mantener la cadena de caracteres misma u
otra informacin derivada de ella, tal como el nombre asociado con un token
identificador o el valor de un token de nmero.
En la mayora de los lenguajes el analizador lxico slo necesita generar un
token a la vez. En este caso se puede utilizar una variable global simple para
mantener la informacin del token. En otros casos (cuyo ejemplo ms notable
es FORTRAN), puede ser necesario un arreglo (o vector) de tokens.

rbol sintctico
Si el analizador sintctico genera un rbol sintctico, por lo regular se
construye como una estructura estndar basada en un puntero que se asigna
de manera dinmica a medida que se efecta el anlisis sintctico. El rbol
entero puede entonces conservarse como una variable simple que apunta al
nodo raz. Cada nodo en la estructura es un registro cuyos campos representan
la informacin recolectada tanto por el analizador sintctico como,
posteriormente, por el analizador semntico. Por ejemplo, el tipo de datos de
una expresin puede conservarse como un campo en el nodo del rbol
sintctico para la expresin.
En ocasiones, para ahorrar espacio, estos campos se asignan de manera
dinmica, o se almacenan en otras estructuras de datos, tales como la tabla de
smbolos, que permiten una asignacin y desasignacin selectivas. En realidad,
cada nodo del rbol sintctico por s mismo puede requerir de atributos
diferentes para ser almacenado, de acuerdo con la clase de estructura del
lenguaje que represente. En este caso, cada nodo en el rbol sintctico puede
estar representado por un registro variable, con cada clase de nodo
conteniendo solamente la informacin necesaria para ese caso.
Tabla de smbolos
Esta estructura de datos mantiene la informacin asociada con los
identificadores: funciones, variables, constantes y tipos de datos. La tabla de
smbolos interacta con casi todas las fases del compilador: el analizador
lxico, el analizador sintctico o el analizador semntico pueden introducir
identificadores dentro de la tabla; el analizador semntico agregar tipos de
datos y otra informacin; y las fases de optimizacin y generacin de cdigo
utilizarn la informacin proporcionada por la tabla de smbolos para efectuar
selecciones apropiadas de cdigo objeto.
Puesto que la tabla de smbolos tendr solicitudes de acceso con tanta
frecuencia, las operaciones de insercin, eliminacin y acceso necesitan ser
eficientes, preferiblemente operaciones de tiempo constante. Una estructura
de datos estndar para este propsito es la tabla de dispersin o de clculo de
direccin, aunque tambin se pueden utilizar diversas estructuras de rbol. En
ocasiones se utilizan varias tablas y se mantienen en una lista o pila.
Tabla de literales
La bsqueda y la insercin rpida son esenciales tambin para la tabla de
literales, la cual almacena constantes y cadenas utilizadas en el programa. Sin
embargo, una tabla de literales necesita impedir las eliminaciones porque sus
datos se aplican globalmente al programa y una constante o cadena aparecer
slo una vez en esta tabla. La tabla de literales es importante en la reduccin

del tamao de un programa en la memoria al permitir la reutilizacin de


constantes y cadenas. Tambin es necesaria para que el generador de cdigo
construya direcciones simblicas para las literales y para introducir definiciones
de datos en el archivo de cdigo objeto.
Cdigo intermedio
De acuerdo con la clase de cdigo intermedio (por ejemplo, cdigo de tres
direcciones o cdigo P) y de las clases de optimizaciones realizadas, este
cdigo puede conservarse como un arreglo de cadenas de texto, un archivo de
texto temporal o bien una lista de estructuras ligadas. En los compiladores que
realizan optimizaciones complejas debe ponerse particular atencin a la
seleccin de representaciones que permitan una fcil reorganizacin.
Generacin de cdigo intermedio
Despus de los anlisis sintctico y semntico, algunos compiladores generan
una representacin intermedia explcita del programa fuente. Se puede
considerar esta representacin intermedia como un programa para una
mquina abstracta. Esta representacin intermedia debe tener dos
propiedades importantes; debe ser fcil de producir y fcil de traducir al
programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma
intermedia llamada cdigo de tres direcciones, que es como el lenguaje
ensamblador para una mquina en la que cada posicin de memoria puede
actuar como un registro. El cdigo de tres direcciones consiste en una
secuencia de instrucciones, cada una de las cuales tiene como mximo tres
operandos. El programa fuente de (1) puede aparecer en cdigo de tres
direcciones como

temp1 := entreal(60)
temp2 := id3 * temp1

===> (2)

temp3 := id2 + temp2


id1 := temp3

Esta representacin intermedia tiene varias propiedades. Primera, cada


instruccin de tres direcciones tiene a lo sumo un operador, adems de la
asignacin. Por tanto, cuando se generan esas instrucciones el compilador
tiene que decidir el orden en que deben efectuarse, las operaciones; la
multiplicacin precede a la adicin al programa fuente de. Segunda, el
compilador debe generar un nombre temporal para guardar los valores
calculados por cada instruccin. Tercera, algunas instrucciones de tres
direcciones tienen menos de tres operadores, por ejemplo la primera y la
ltima instrucciones de asignacin.

Optimizacin de Cdigo
La fase de optimizacin de cdigo trata de mejorar el cdigo intermedio de
modo que resulte un cdigo de mquina ms rpido de ejecutar. Algunas
optimizaciones son triviales. Por ejemplo, un algoritmo natural genera el cdigo
intermedio (2) utilizando una instruccin para cada operador de la
representacin del rbol despus del anlisis semntico, aunque hay una forma
mejor de realizar los mismos clculos usando las dos instrucciones

temp1 := id3 * 60.0

===> (3)

id1 := id2 + temp1

Este sencillo algoritmo no tiene nada de malo, puesto que el problema se


puede solucionar en la fase de optimizacin de cdigo. Esto es, el compilador
puede deducir que la conversin de 60 de entero a real se puede hacer de una
vez por todas en el momento de la compilacin, de modo que la operacin
"entreal( )" se puede eliminar. Adems, temp3 se usa slo una vez, para
transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a
partir de lo cual la ltima proposicin de (2) no se necesita y se obtiene el
cdigo de (3).
Hay muchas variaciones en la cantidad de optimizacin de cdigo que ejecutan
los distintos compiladores. En lo que hacen mucha optimizacin llamados
compiladores optimizadores, una parte significativa del tiempo del
compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas
que mejoran sensiblemente el tiempo de ejecucin del programa objeto sin
retardar demasiado la compilacin.
Archivos temporales
Al principio las computadoras no tenan la suficiente memoria para guardar un
programa completo durante la compilacin. Este problema se resolvi
mediante el uso de archivos temporales para mantener los productos de los
pasos intermedios durante la traduccin o bien al compilar al vuelo, es decir,
manteniendo slo la informacin suficiente de las partes anteriores del
programa fuente que permita proceder a la traduccin.
Las limitaciones de memoria son ahora un problema mucho menor, y es
posible requerir que una unidad de compilacin entera se mantenga en
memoria, en especial si se dispone de la compilacin por separado en el
lenguaje. Con todo, los compiladores ocasionalmente encuentran til generar
archivos intermedios durante alguna de las etapas del procesamiento. Algo
tpico de stos es la necesidad de direcciones de correccin hacia atrs durante
la generacin de cdigo.