Sie sind auf Seite 1von 4

Las fases de un compilador.

Un compilador opera en fases, cada una de las cuales transforma al programa fuente de una
representacin en otra.
Las primeras tres fases (anlisis lxico, sintctico y semntico) que forman la mayor parte de la
porcin del anlisis, as como tambin la generacin de cdigo intermedio, optimiacin de cdigo
y generacin de cdigo, se muestran en interaccin con dos acti!idades que tambin se llamarn
"fases# de manera informal, estas son la administracin de la tabla de smbolos y el mane$o de
errores.
Administracin de la tabla de smbolos
Una funcin esencial de un compilador es registrar los identificadores utiliados en el programa
fuente para reunir informacin sobre sus atributos. %stos nos permiten conocer la memoria asignada
al mismo, su tipo, su mbito y, en el caso de nombres de procedimientos, el n&mero y tipos de sus
argumentos, el mtodo para pasarlos y el tipo que de!uel!e, si lo 'ay.
na tabla de smbolos es una estructura de datos que contiene un registro por cada identificador con
campos para cada atributo. %sta estructura permite encontrar rpidamente el registro de cada uno,
para almacenar o consultar datos.
Las fases restantes introducen informacin sobre los identificadores en la tabla y la utilian de
!arias formas. (uando se est 'aciendo el anlisis semntico y la generacin de cdigo intermedio,
se necesitan conocer los tipos de identificadores para comprobar si se los utilia de forma !lida y
asi poder generar operaciones apropiadas con ellos.
%l generador de cdigo generalmente introduce y utilia informacin detallada sobre la memoria
asignada a los identificadores.
Deteccin e informacin de errores
(ada fase puede encontrar errores, despus de detectarlos, los debe tratar de alguna forma para
continuar la compilacin, permitiendo la deteccin de ms errores en el programa fuente.
Las fases de anlisis sintctico y semntico, mane$an una gran parte de los errores detectables por el
compilador. La fase lxica puede detectar errores donde los caracteres no forman ning&n
componente lxico del lengua$e, asimismo, las cadenas de componentes lxicos que forman las
reglas de estructura son determinadas por la fase de anlisis sintctico.
Generacin de cdigo intermedio
%n el proceso de traducir un programa fuente a cdigo destino, un compilador puede construir
una o ms representaciones intermedias, las cuales pueden tener una !ariedad de formas. Los
rboles sin tcticos son una forma de representacin intermedia) por lo general, se utilian durante
el anlisis sin tctico y semntico.
*espus del anlisis, muc'os compiladores generan un ni!el ba$o explcito, o una representacin
intermedia similar al cdigo mquina, que podemos considerar como un programa para una
mquina abstracta. %sta representacin intermedia debe tener dos propiedades importantes+ debe ser
fcil de producir y fcil de traducir en la mquina destino.
Los pasos a realiar en esta fase seran+
Elegir una representacin intermedia:
La representacin intermedia puede tener di!ersas formas, como por e$emplo+
, Los rboles, incluyendo los de anlisis sin tctico y los sintcticos (abstractos).
, Las representaciones lineales, en especial el "cdigo de tres direcciones#.
-omando como base los rboles de anlisis sintctico, que representan las instrucciones del
programa, se puede generaliar un nue!o tipo de grafo, llamado un grafo dirigido acclico (.*/)
para las subexpresiones de una expresin.
%n este grafo, una subexpresin 0 tendra ms de un padre, si esta apareciera !arias !eces en la
misma expresin. %n un rbol de sintaxis regular, la expresin parecera tantas !eces como
apareca en la expresin original. %sta caracterstica de los grafos de subexpresiones 'ace que el
compilador genere cdigo ms eficiente al e!aluar una expresin.
Una forma de implementar un grafo aciclico de subexpresiones es mediante un !ector. %n cada
entrada del !ector se guarda un cdigo de operacin y, dependiendo de la operacin, un !alor, o
referencias a las entradas del !ector que pueda utiliar ese !ector.
%l principal problema de esta forma de implementacin, es que cada !e que se quiera encontrar
un nodo de la expresin, 'ay que recorrer todo el !ector. Una alternati!a de implementacin es con
una tabla 'as', en la cual en cada espacio se guarden los nodos, pro!eyendo acceso casi inmediato a
los nodos.
La forma intermedia llamada cdigo de tres direcciones es como el lengua$e ensamblador de una
mquina en la que cada posicin de memoria puede actuar como un registro. %l cdigo de tres
direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como mximo
tres operandos. %sta representacin intermedia tiene !arias propiedades+
1rimera+ (ada 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. 2egunda+ %l traductor debe generar un nombre temporal para
guardar los !alores calculados por cada instruccin. -ercera+ /lgunas instrucciones de tres
direcciones tienen menos de tres operandos, por e$emplo, la asignacin.
Traducir expresiones: Las expresiones con operaciones integradas pueden desglosarse en
una secuencia d e operaciones indi!iduales.
Comprobar tipos: Una coercin es una con!ersin de tipos implcita, como la con!ersin de
integer a float. %l cdigo intermedio con tiene con!ersiones de tipos explcitas para asegurar una
coincidencia exacta entre los tipos de los operandos y los tipos que espera un operador.
Usar una tabla de smbolos para implementar las declaraciones: Una declaracin especifica
el tipo de un nombre. %l tama3o de un tipo es la cantidad de almacenamiento necesaria para un
nombre con ese tipo . (on el uso de tama3os la direccin relati!a de un nombre en tiempo d e
e$ecucin puede calcularse como un desplaamiento a partir del inicio de una nue!a rea de datos.
%l tipo y la direccin relati!a de un nombre se colocan en la tabla de smbolos debido a una
declaracin, para que el traductor pueda obtenerlas ms adelante, cuando el nombre aparece en una
expresin.
Aplanar arreglos: 1ara un acceso rpido, los elementos d e los arreglos se almacenan en
ubicaciones consecuti!as. Los arreglos d e arreglos se aplanan, de manera que puedan tratarse como
un arreglo unidimensional de elementos indi!iduales. %l tip o d e un arreglo se utilia para calcular
la direccin d e un elemento d el arreglo, relati!o a la base d el mismo.
Generar cdigo de salto para expresiones booleanas: %n el cdigo de corto circuito o d e
salto, el !alor de una expresin booleana est implcito en la posicin a la que se llega en el cdigo.
mplementar instruccin es mediante el uso del flu!o de control: Las instrucciones pueden
traducirse 'eredando una etiqueta siguiente, en donde siguiente marca la primera instruccin
despus del cdigo para esta instruccin.
Como alternati"a # usar parc$eo de retroceso: %s una tcnica para generar cdigo en las
expresiones booleanas y las instrucciones de una sola pasada. La idea es mantener listas
de saltos incompletos, en donde todas las instrucciones de salto en una lista tienen el
mismo destino. (uando el destino se !uel!e conocido, todas las instrucciones en su lista
se completan llenando el destino.
mplementar registros: Los nombres de los campos en un registro o en una clase pueden tratarse
como una secuencia de declaraciones. Un tipo d e registro codifica los tipos y las direcciones
relati!as d e los campos. 1odemos usar un ob$eto de tabla de smbolos para este propsito.
%ptimi&acin de cdigo
La fase de optimiacin de cdigo independiente de la mquina trata de me$orar el cdigo
intermedio, de manera que se produca un me$or cdigo destino. 1or lo general, me$or significa
ms rpido, pero pueden lograrse otros ob$eti!os, como un cdigo ms corto, o un cdigo de
destino que consuma menos poder. 1or e$emplo, un algoritmo directo genera el cdigo intermedio,
usando una instruccin para cada operador en la representacin tipo rbol que produce el analiador
semntico.
4ay una gran !ariacin en la cantidad de optimiacin de cdigo que realian los distintos
compiladores. %n aquellos que realian la mayor optimiacin , a los que se les denomina como
"compiladores optimiadores#, se in!ierte muc'o tiempo en es ta fase. 4ay optimiaciones
simples que me$oran en forma considerable el tiempo d e e$ecucin d el programa destino , sin
reducir demasiado la !elocidad de la compilacin.
Generacin de cdigo
L a generacin de cdigo es la fase final d e un compilador. %l generador de cdigo asigna la
representacin intermedia producida por el front5end, o si 'ay una fase de optimiacin
de cdigo correspondiente al optimiador de cdigo, al programa de destino.
6ecibe como entrada una representacin intermedia del programa fuente y la asigna al lengua$e
destino. 2i el lengua$e destino es cdigo mquina, se seleccionan registros o ubicaciones
(localidades) de memoria para cada una de las !ariables que utilia el programa. *espus, las
instrucciones intermedias se traducen en secuencias de instrucciones de mquina que realian la
misma tarea. Un aspecto crucial de la generacin de cdigo es la asignacin $uiciosa de los registros
para guardar las !ariables. 7tro aspecto importante es la organiacin del espacio de
almacenamiento en tiempo de e$ecucin depende del lengua$e que se est compilando. Las
decisiones sobre la asignacin de espacio de almacenamiento se realian durante la generacin de
cdigo intermedio, o durante la generacin de cdigo.
(omprende las siguientes acti!idades y elementos)
La seleccin de instrucciones: es el proceso de elegir instrucciones del lengua$e de destino
para ca d a instruccin representacin intermedia.
La reparticin de registros: es el proceso de decidir qu !alores de representacin intermedia
mantener en los registros. L a coloracin d e grafos es una tcnica efecti!a para realiar
la reparticin d e registros en los compiladores.
L a asignacin de registros: es el proceso de decidir qu registro debe contener un !alor de
representacin intermedia dado.
Un compilador redestinable: es uno que puede generar cdigo para !arios con$untos de
instrucciones.
Una m'(uina "irtual: es un intrprete p ara un lengua$e intermedio de bytecodes, producido por
lengua$es como 8a!a y ( 9 .
Una m'(uina C)C: es, por lo general, una mquina de dos direcciones, con pocos registros, !arias
clases d e registros e instrucciones d e longitud !ariable con modos de direccionamiento comple$os.
Una m'(uina *)C: es, por lo general, una mquina de tres direcciones con muc'os registros,
en donde las operaciones se realian en los registros.
Un blo(ue b'sico: es una secuencia mxima de instrucciones consecuti!as d e tres direcciones,
en donde el flu$o de control slo puede entrar en la primera instruccin del bloque
y salir en la &ltima instruccin, sin detenerse o bifurcarse, tal !e excepto en la &ltima
instruccin del bloque bsico.
Un grafo de flu!o: es una representacin grfica d e un programa, en el cual los nodos del
grfico son bloques bsicos y las flec'as del grafo muestran cmo puede fluir el control
entre los bloques.
Una representacin en GDA de un bloque bsico es un grafo dirigido acclico, en el cual los
nodos del . * / representan a las instrucciones dentro del bloque y cada 'i$o d e un nodo
corresponde a la instruccin, que es la &ltima definicin de un operando utiliado en la instruccin.
Las optimi&aciones de mirilla +peep$ole, son transformaciones para me$orar el cdigo
local q u e pueden aplicarse a un programa, por lo general, a tra!s de una !entana desliable.
La seleccin de instrucciones puede realiarse mediante un proceso de rescritura de rboles, en el
cual los patrones tipo rbol que corresponden a las instrucciones de mquina se utilian para
re!estir un rbol sin tctico. 1odemos asociar los costos con las reglas de rescritura de rboles y
aplicar la programacin dinmica para ob tener un re!estimiento ptimo para clases &tiles de
mquinas y expresiones.
Un n-mero de Ers$o" indica cuntos registros se necesitan para e!aluar una expresin sin
almacenar !alores temporales.
El cdigo de derrame es una secuencia d e instrucciones que almacena un !alor en un registro
en la memoria, con el fin d e 'acer espacio para guardar otro !alor en ese registro.