Vous êtes sur la page 1sur 28

Procesadores de Lenguajes

Ingeniera Tcnica superior de Ingeniera Informtica


Departamento de Lenguajes y Sistemas informticos

Generacin de
cdigo final
Traduccin a cdigo objeto
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED

Generacin de cdigo final. Traduccin a cdigo objeto


Objetivos

Objetivos
Entender la relacin de proximidad entre cdigo intermedio y cdigo objeto
Entender en qu consiste el proceso de generacin de cdigo final
Aprender los pasos que es necesario dar para llevarlo cabo con xito
Entender las implicaciones del entorno de ejecucin en el proceso
Tipo de arquitectura de ejecucin y juego de instrucciones
Mapa de memoria y modos de direccionamiento
Conocer los diferentes tipo de arquitectura de ejecucin que existen
Conocer los diferentes modos de direccionamiento que existen
Aprender a implementar un generador de cdigo objetos eficaz
Aprender a separar los aspectos dependientes e independientes del entorno
Adquirir una visin crtica acerca del proceso de construccin de generadores de cdigo
Advertir la naturaleza potencialmente ineficiente del proceso de generacin de cdigo
Motivar y justificar el estudio de tcnicas de optimizacin de cdigo

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


ndice

ndice
Introduccin
Resolucin de referencias simblicas
Modos de direccionamiento
Modos de direccionamiento & entornos de ejecucin
Traduccin al juego de instrucciones
Mquinas a pila
Mquinas con registro acumulador
Mquinas con cdigo de tercetos
Mquinas con cdigo de cuartetos
Generacin de cdigo final en la prctica
Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Introduccin

Generacin de cdigo final


La fase de generacin de cdigo final tiene por objeto traducir la secuencia de instrucciones de cdigo
intermedio en una coleccin de instrucciones ejecutables y direccionables en una arquitectura fsica
especfica. Las condiciones arquitectnicas del entorno de ejecucin van a condicionar
considerablemente este proceso de traduccin
MV a t1
MV b t2
GRT t3 t1 t2
BRZ t3 L1

Foco de atencin
El generador de cdigo intermedio
toma una a una las instrucciones de
cdigo intermedio y las traduce a
cdigo ejecutable

Generacin de
cdigo final
0000 0011
0000 0011
0100 0001
0100 0000
0001 0010

Los lenguaje de
cdigo intermedio
utilizado conviene
que se acerquen
estructuralmente
lo mximo posible
al
juego
de
instrucciones de
la
arquitectura
final para que el
proceso
de
traduccin sea lo
ms
directo
posible
Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Introduccin

Flujos de generacin de cdigo final


La generacin de cdigo ejecutable de un cdigo fuente puede hacerse a travs de varios flujos o rutas
de traduccin. Lo ms frecuente es que la traduccin se haga directamente al cdigo objeto final. Sin
embargo algunos compiladores ofrecen la opcin de generar cdigo ensamblador de la mquina objeto
que posteriormente es ensamblado
If (a > b) then

MOVE t1 a

a = a - b;

MOVE t2 b

else
b = b + 1;

CMP t1 t2

00000001 10010100 01100100

Traduccin directa a cdigo final

BZ E1
SUB t3 t1 t2
E1: MOVE t4 #1

Nosotros traduciremos nuestro


cdigo a ensamblador y
acabaremos ah

ADD t5 t2 t4
MOVE b t5

00100011 10010100 10010101


00101100 00001100 00101100

Foco de atencin

MOVE a t3

00000001 10010101 10001100

LD #20[.IX] /100

00000101 10010110 10010100 10010101


00000001 01100100 10010110
00000001 10010110 00000001
00000100 10010111 10010101 10010110
00000001 10010101 10010111

LD #21[.IX] #12[.IX]
CMP #20[.IX] #21[.IX]
BZ E1
SUB #22[.IX] #20[.IX] #21[.IX]

Traduccin a
cdigo ensamblador

LD /100 #22[.IX]
E1: LD

#23[.IX] #1

Traduccin a
cdigo final

ADD #24[.IX] #21[.IX] #23[.IX]


LD

#21[.IX] #24[.IX]

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Introduccin

Partes de la generacin de cdigo final


Durante el procedo de traduccin de cdigo intermedio a cdigo final aparecen dos problemas
principales a los que hay que hacer frente relacionados con el entorno de ejecucin. En primer lugar, es
necesario asociar cada objeto de datos a un direccionamiento en memoria. En segundo lugar, se
requiere adaptar las cudruplas al juego de instrucciones de la arquitectura fsica.

I. Resolucin de referencias simblicas

Generacin de
cdigo final

Los objetos de datos que de manera simblica aparecen referenciados como


operandos dentro del cdigo intermedio deben ser traducidos a posiciones
fsicas de memoria. Aqu la naturaleza del tipo de datos (variable global,
local, parmetro o temporal) y el modelo de entorno seleccionado en el
captulo anterior condicionan considerablemente esta tarea ya que los modos
de direccionamiento se ven directamente afectados

II. Traduccin al juego de instrucciones


Para convertir un programa de cdigo intermedio en cdigo final es necesario
establecer una relacin de traduccin de cada cudrupla en su equivalente
en el juego de instrucciones de la arquitectura final ya que la traduccin de
cada una es independiente de las dems. Por lo general, cada cudrupla
genera varias instrucciones de cdigo objeto. Cuanto ms cercanos,
estructural y semnticamente hablando, se encuentren estos lenguajes ms
directa ser la traduccin

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Resolucin de referencias simblicas

Resolucin de referencias simblicas


La segunda parte del proceso de generacin de cdigo objeto a partir de cdigo intermedio consiste en
expresar cara referencia simblica a un objeto de datos del programa variable local, global, parmetro
o temporal como un espacio en memoria conocido bien en tiempo de compilacin o reservado
dinmicamente en tiempo de ejecucin
Cdigo intermedio

Cdigo final

MOVE t1 a

LD #20[.IX] /100

MOVE t2 b

LD #21[.IX] #12[.IX]

CMP t1 t2

CMP #20[.IX] #21[.IX]

Direccionamiento en memoria

BZ E1

BZ E1

SUB t3 t1 t2

SUB #22[.IX] #20[.IX] #21[.IX]

MOVE a t3

LD /100 #22[.IX]

E1: MOVE t4 #1

E1: LD

#23[.IX] #1

ADD t5 t2 t4

ADD #24[.IX] #21[.IX] #23[.IX]

MOVE b t5

LD

#21[.IX] #24[.IX]

Mapa de memoria & modos de direccionamiento


Tanto el mapa de memoria como los modos de
direccionamiento disponibles para cada operacin
dentro del juego de instrucciones del entorno de
ejecucin objetivo condicionan esta segunda parte
del proceso de traduccin a cdigo final

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Resolucin de referencias simblicas

Modos de direccionamiento
Por norma general existen una coleccin de modos de direccionamiento distintos que se utilizan en
diferentes contextos. Es frecuente que una instruccin no soporte cualquier modo de direccionamiento
sino solo un subconjunto de ellos, lo que puede influir directamente en el proceso de traduccin a
cdigo objeto. A continuacin revisamos los principales modos de direccionamiento

I. Inmediato

II. Directo a registro

El direccionamiento inmediato es
aquel en el que el operando forma
parte la propia instruccin de cdigo
ejecutable. Se expresa anteponiendo
# al valor del operando

El direccionamiento directo a
registro permite direccionar un valor
que est almacenado en uno de los
registros del entorno de ejecucin
objetivo

ADD R1 #3

ADD R1 #3

IV. Indirecto

V. Relativo a registro

III. Directo a memoria


El direccionamiento inmediato a
memoria opera con un valor
almacenado en una direccin
absoluta de memoria. Se utiliza /
para representarlo
ADD R1 /1000

VI. Relativo a contador de programa

El direccionamiento indirecto opera


con el valor almacenado en la
direccin de memoria apuntada en
el registro dado. Se pone entre [ ] el
nombre del registro

El direccionamiento relativo a
registro permite expresar una
direccin de desplazamiento sobre
la base del valor de memoria en un
registro

Utilizado en las instrucciones de


salto, este direccionamiento expresa
un direccionamiento relativo al
registro contador de programa. Se
usa $ y se omite el registro

ADD R1 [R3]

ADD R1 #3[SP]

BR $3

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Resolucin de referencias simblicas

Modos de direccionamiento & Entornos de ejecucin


Como hemos dicho, el tipo de entorno de ejecucin puede condicionar los modos de direccionamiento
disponibles en el juego de instrucciones. Pero, a tenor de lo estudiado en el tema anterior sobre
activacin de subprogramas, merece a su vez reflexionar qu modos de direccionamiento podes
necesitas para cada tipo de objeto de datos en funcin del tipo de entorno disponible
D. Inmedeiato

D. Directo a memoria
Variables globales
Variables locales
Parmetros
Temporales

Valores Literales

Variables globales

Variables locales
Parmetros
Temporales

Valores Literales

Variables globales

Variables locales
Parmetros
Temporales

Esttico

Valores Literales

De pila
Dinmico

D. Relativo a registro

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Resolucin de referencias simblicas

Modos de direccionamiento & Entornos de ejecucin


/100:

Datos estticos
Valor retorno

Ejemplo

Direccin retorno
MOVE t1 a

LD #20[.IX] /100

MOVE t2 b

LD #21[.IX] #12[.IX]

CMP t1 t2
BZ E1
SUB t3 t1 t2
MOVE a t3
E1: MOVE t4 #1

Direccionamiento
en memoria

.IX

Parmetros

CMP #20[.IX] #21[.IX]


BZ E1
SUB #22[.IX] #20[.IX] #21[.IX]

.IX + 12

LD /100 #22[.IX]
E1: LD

#23[.IX] #1

ADD t5 t2 t4

ADD #24[.IX] #21[.IX] #23[.IX]

MOVE b t5

LD

#21[.IX] #24[.IX]

En un entorno de ejecucin basado en pila, las variables globales se resuelven


con direccionamiento directo a memoria ya que su direccin es conocida en
tiempo de compilacin. Para las variables locales, parmetros y temporales se
utiliza direccionamiento relativo a registro ya que la memoria se reserva
dinmicamente en tiempo de ejecucin y la direccin depende del estado de la
pila en cada momento expresndose en base al puntero de marco (.IX)

Enlace Control

RA

Como hemos dicho, el tipo de entorno de ejecucin puede condicionar los modos
de direccionamiento disponibles en el juego de instrucciones. Pero, a tenor de lo
estudiado en el tema anterior sobre activacin de subprogramas, merece a su
vez reflexionar qu modos de direccionamiento podes necesitas para cada tipo
de objeto de datos en funcin del tipo de entorno disponible

.IX + 20

Variables locales

t1
t2
t3
t4
t5

Memoria libre

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Traduccin al juego de instrucciones

Traduccin al juego de instrucciones


El primer paso para articular el proceso de generacin de cdigo final es establecer la relacin de
traduccin de cada operacin de cdigo intermedio en su equivalente o equivalentes en el entorno de
ejecucin objetivo. El juego de instrucciones de la arquitectura fsica determina como se produce esta
traduccin
Cdigo intermedio

Cdigo final

MOVE t1 a

LD #20[.IX] /100

MOVE t2 b

LD #21[.IX] #12[.IX]

CMP t1 t2
BZ E1

CMP #20[.IX] #21[.IX]

Traduccin de operaciones

BZ E1

SUB t3 t1 t2

SUB #22[.IX] #20[.IX] #21[.IX]

MOVE a t3

LD /100 #22[.IX]

E1: MOVE t4 #1

E1: LD

ADD t5 t2 t4
MOVE b t5

#23[.IX] #1

ADD #24[.IX] #21[.IX] #23[.IX]

Juego de instrucciones

LD

#21[.IX] #24[.IX]

Las operaciones del juego de instrucciones de


la arquitectura fsica objetivo determina el
proceso de traduccin. No en vano, se trata
de expresar la semntica de cada cudrupla
en trminos de la expresividad ofrecida por
el lenguaje mquina del entorno de
ejecucin

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Traduccin al juego de instrucciones

Traduccin al juego de instrucciones


El tipo de arquitectura del entorno de ejecucin para el cual se est generando el cdigo final
condiciona directamente la anatoma del mismo. En efecto, los recursos de la mquina suelen
condicionar la estructura y prestaciones del juego de instrucciones con lo que la traduccin puede ser
muy diferente de una mquina a otra
rboles sintcticos

Tercetos

Grafos sintcticos

Representaciones
jerrquicas

Cuartetos

Representaciones
lineales

Segn el nmero de operandos de


las instrucciones las arquitecturas
se pueden clasificar en 4 tipos

El cdigo intermedio tambin debe


ser cuidadosamente elegido para
facilitar la traduccin en funcin
de cmo sea el cdigo final

Generacin de
cdigo final

Mquinas a pila

Mquinas con registro


acumulador

Mquinas con cdigo


de tercetos
2

Mquinas con cdigo


de cuartetos
3
Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Traduccin al juego de instrucciones

Tipos de arquitecturas fsicas


El tipo de arquitectura del entorno de ejecucin para el cual se est generando el cdigo final
condiciona directamente la anatoma del mismo. En efecto, los recursos de la mquina suelen
condicionar la estructura y prestaciones del juego de instrucciones con lo que la traduccin puede ser
muy diferente de una mquina a otra

I. Mquinas a pila
Las mquinas a pila disponen de una pila de operandos donde realizan todas las operaciones propias
de la unidad aritmtico lgica. Para operar una operacin aritmtica, por ejemplo, primero se meten
los operandos en la pila uno o dos segn sea unaria o binaria la operacin y despus se aplica el
operador que extrae de la pila el nmero de operandos que requiere e inserta el resultado en la cima

Traduccin

PUSH b
PUSH C
ADD
POP a

ADD a b c

Cdigo final

Las operaciones de cdigo intermedio se


traducen a instrucciones con 0 operandos ya
que estos son extrados de la pila. Tan solo
las operaciones PUSH y POP contienen un
argumento

c
b
PUSH b

b+c

PUSH C

ADD

POP a

Cdigo intermedio

En una traza de la ejecucin puede verse


como la pila de operandos se va cargando de
datos y vaciando segn se operan sobre ellas
operaciones

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Traduccin al juego de instrucciones

Tipos de juegos de instrucciones


El tipo de arquitectura del entorno de ejecucin para el cual se est generando el cdigo final
condiciona directamente la anatoma del mismo. En efecto, los recursos de la mquina suelen
condicionar la estructura y prestaciones del juego de instrucciones con lo que la traduccin puede ser
muy diferente de una mquina a otra

II. Mquinas con registro acumulador


Las mquinas con registro acumulador disponen, a parte de otros recursos, de un registro especial
llamado registro acumulador contra el que se realizan todas las operaciones de la unidad aritmtico
lgica. Cuando se desea hacer una operacin binaria uno de los datos aparece como operando de la
operacin mientras que el otro se carga en el acumulador y funciona como operando implcito

Traduccin

LD c
ADD b
ST a

ADD a b c

Cdigo final

Las operaciones de cdigo intermedio se


traducen a instrucciones con 1 operandos ya
que el otro se ha cargado previamente en el
registro acumulador y funciona como
operando implcito. La traduccin es ms
sencilla y sinttica que la anterior

c
LD c

b+c

b+c

ADD b

ST a

Cdigo intermedio

En la traza de de ejecucin de esta


traduccin se observa como el registro
acumulador se utiliza de operando implcito
y de almacn de resultados. Cuando se carga
el valor final en a, no se borra del
acumulador por si hace falta para
instrucciones subsiguientes

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Traduccin al juego de instrucciones

Tipos de juegos de instrucciones


El tipo de arquitectura del entorno de ejecucin para el cual se est generando el cdigo final
condiciona directamente la anatoma del mismo. En efecto, los recursos de la mquina suelen
condicionar la estructura y prestaciones del juego de instrucciones con lo que la traduccin puede ser
muy diferente de una mquina a otra

III. Mquinas con cdigo de tercetos


En las mquinas con cdigo de tercetos las operaciones del juego de instruccin disponen a lo sumo
de dos operandos sobre los cuales realizar la operacin. Frecuentemente el primero de ellos se
utiliza como argumento de entrada y salida donde se almacena el resultado final. Si no se quieren
perder los resultados de los operandos hay que hacer una salvaguarda previa de datos
Cdigo intermedio
ADD a b c

Cdigo final
Traduccin

LD a b
ADD a c

b+c

Las operaciones de cdigo intermedio se


traducen a instrucciones con 2 operandos ya
que se asume que el primero de ellos
tambin representa el lugar donde debe
almacenarse el valor resultante tras realizar
la operacin

a b

ADD a c

LD

En esta traza de ejecucin se observa como


para evitar perder el valor b que reside en
b se mueve preliminarmente sta a a y
posteriormente se aplica la operacin de
suma sobre los operandos a y c dejando en el
primero el resultado

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Gestin del juego de instrucciones

Tipos de juegos de instrucciones


El tipo de arquitectura del entorno de ejecucin para el cual se est generando el cdigo final
condiciona directamente la anatoma del mismo. En efecto, los recursos de la mquina suelen
condicionar la estructura y prestaciones del juego de instrucciones con lo que la traduccin puede ser
muy diferente de una mquina a otra

IV. Mquinas con cdigo de cuartetos


Es poco frecuente encontrar mquinas con un juego de instrucciones basado en cuartetos. No
obstante lo abordaremos aqu por motivos de completitud. En las mquinas de cuartetos la las
cudruplas de cdigo intermedio tienen una traduccin directa a las instrucciones de la arquitectura
final. Esta semejara simplifica considerablemente el proceso
Cdigo intermedio
ADD a b c

Cdigo final
Traduccin

ADD a b c

b+c

En este tipo de entornos las operaciones del


juego de instrucciones disponen del mismo
nmero de operandos que la cudrupla (a lo
sumo 2 operandos de entrada y 1 de salida).
Esto hace que el proceso de traduccin se
centre en generar el acrnimo de la
operacin adecuado

ADD a b c
En esta traza de ejecucin se la operacin de
suma se realiza directamente con una nica
instruccin en ensamblador. Esto es posible
debido a que los operaciones no destruyen el
valor de los argumentos de entrada tras la
operacin

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica
Consltese el manual
de usuario de ENS-2001

El entorno de ejecucin ENS-2001

La prctica consiste en implementar un compilador con soporte a la invocacin recursiva de


subprogramas que genere cdigo objeto para la mquina virtual ENS2001. En esta seccin
presentaremos este problema, describiremos la mquina objetivo y discutiremos la forma de proceder
para implementar la generacin de cdigo final
If (a > b) then
a = a - b;
else
b = b + 1;

Se trata de un entorno de ejecucin basado en


Pila y una arquitectura virtual con un entorno
de simulacin que a todos los efectos juega el
papel de una arquitectura fsica real

LD #20[.IX] /100

Generacin de cdigo
intermedio

LD #21[.IX] #12[.IX]
CMP #20[.IX] #21[.IX]
BZ E1

MOVE t1 a
MOVE t2 b
CMP t1 t2
BZ E1

Traduccin a cdigo
ensamblador ENS2001

SUB #22[.IX] #20[.IX] #21[.IX]


LD /100 #22[.IX]
E1: LD

#23[.IX] #1

SUB t3 t1 t2

ADD #24[.IX] #21[.IX] #23[.IX]

MOVE a t3

LD

E1: MOVE t4 #1

#21[.IX] #24[.IX]

Entorno virtual de depuracin

ADD t5 t2 t4
MOVE b t5

ENS2001

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica
Consltese el manual
de usuario de ENS-2001

El entorno de ejecucin ENS-2001

ENS-2001 es una mquina virtual desarrollada con fines educativos que dispone de todos los
elementos tpicos de una arquitectura Von Newman estndar y sirve de marco de simulacin para la
generacin de un cdigo final ejecutable y depurable dentro de un entorno visual independiente de
plataforma. A continuacin describimos sus elementos

Visin general

0
CPU
Registros

SR

R0

R1

R2

R3

R4

PC

SP

R5

R6

R7

R8

R9

IX

IY

Z
Memoria

UC

Bus de datos
16 bits

ALU
(CA2)

Bus de memoria
16 bits

65535

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica
Consltese el manual
de usuario de ENS-2001

El entorno de ejecucin ENS-2001

ENS-2001 es una mquina virtual desarrollada con fines educativos que dispone de todos los
elementos tpicos de una arquitectura Von Newman estndar y sirve de marco de simulacin para la
generacin de un cdigo final ejecutable y depurable dentro de un entorno visual independiente de
plataforma. A continuacin describimos sus elementos

Registros

R0

Registros de estado

SR

Registro Acumulador
...

R9

Registros generales

PC

Contador de Programa

SP

Puntero de pila

IX

IY

D.
D.
D.
D.
D.
D.

Registros de ndice

Flag de parada (5)

Flag de signo (4)

Flag de paridad (3)

Flag de desbordamiento (2)

Flag de acarreo (1)

Flag de cero (0)

Memoria

Pila

(configurable)

Memoria y modos de direccionamiento

Inmediato
Directo a registro
Directo a memoria
Indirecto
Relativa a Reg. ndice
Relativo a PC

:
:
:
:
:
:

#1
.R3
/1000
[.R3]
#3[.IX]
$3

#3[.IY]

65535

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

El entorno de ejecucin ENS-2001

Consltese el manual
de usuario de ENS-2001

ENS-2001 es una mquina virtual desarrollada con fines educativos que dispone de todos los
elementos tpicos de una arquitectura Von Newman estndar y sirve de marco de simulacin para la
generacin de un cdigo final ejecutable y depurable dentro de un entorno visual independiente de
plataforma. A continuacin describimos sus elementos

Juego de instrucciones

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Generacin de cdigo objeto


Como estudiamos en las secciones anteriores la generacin de cdigo objeto se hace en dos fases
consecutivas. Primero deben resolverse todas las referencias simblicas a objetos de datos en
direcciones de memoria real y despus realizar el proceso de traduccin de operaciones teniendo en
cuenta el juego de instrucciones disponibles en el entorno de ejecucin

I. Resolucin de referencias simblicas


En los entornos basados en pila, el direccionamiento de variables globales es a posiciones absolutas
de memoria (direccionamiento directo a memoria) y el del resto es relativo a puntero de marco (.IX).
En esta fase debe asignarse una direccin a cada uno de los objetos de datos para cada mbito
program ::= axiom:a {:

Aunque existen otras estrategias, lo ms cmodo es alojar


la zona de datos estticos (variables globales)
List<ScopeIF> scopes = scopeManager.getAllScopes ();
comenzando en la posicin 0 de memoria y luego ubicar
el
cdigo. Aqu asumiremos que para el programa
for (ScopeIf scope: scopes) {
principal
existe un RA propio lo que permite un
List<SymbolIF> symbols = scope.getSymbolTable ().getSymbols();
tratamiento relativo a .IX. Recurdese como Variable y
for (SymbolIF s: symbols) {
Temporal tienen un atributo Address:
= 0, lOffset = 0;

int gAddress

if (s instanceof SymbolVariable)
if (scope.getLevel () == 0)

Temporal

SymbolVariable

s.setAddress (gAddress + s.getType ().getSize ());


else s.setAddress (lOffset + s.getType ().getSize ());
}
List<TemporalIF> tempotals = scope.getTemporallTable ().getTemporals();
for (TemporalIF t: temporals)

-String name

-String name

-ScopeIF scope

-TypeIF type

-Integer address

-ScopeIF scope

-Integer size

-Integer Address

t.setAddress (lOffset + t.getsize ()); :}

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Generacin de cdigo objeto


Como estudiamos en las secciones anteriores la generacin de cdigo objeto se hace en dos fases
consecutivas. Primero deben resolverse todas las referencias simblicas a objetos de datos en
direcciones de memoria real y despus realizar el proceso de traduccin de operaciones teniendo en
cuenta el juego de instrucciones disponibles en el entorno de ejecucin

II. Traduccin al juego de instrucciones


Una vez que se ha asignado una direccin a cada objeto de datos slo resta escribir cada instruccin
con el acrnimo adecuado y cada operando con la sintaxis de direccionamiento propia del
ensamblador de ENS-2001 en funcin del valor del atributo direccin y el tipo de objeto
...continua
IntermediateCodeBuilder cb = new IntegermediateCodeBuilder (scope);
cb.addQuadruple (DATA, gAddress);
cb.addQuadruples (a.getCode ());
finalCodeFactory.create (cb.create ());
syntaxErrorManager.syntaxInfo ("Parsing proccess ended.");
:}

program ::= axiom:a {:

Antes de proceder con la traduccin a cdigo final


se inserta por delante una instruccin DATA que se
encarga de reservar espacio en memoria para las
variables globales que fueron contabilizadas en
gAddress en la diapositiva anterior. Tanto gAddress
como lAddress fueron incrementadas en la
diapositiva anterior con el tamao del tipo del
objeto de datos. En ENS-2001 todos los tipos
simples pesan 1 palabra en memoria, los arrays 1
palabra por cada elemento y los registros 1 palabra
por cada campo

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Generacin de cdigo objeto


Como estudiamos en las secciones anteriores la generacin de cdigo objeto se hace en dos fases
consecutivas. Primero deben resolverse todas las referencias simblicas a objetos de datos en
direcciones de memoria real y despus realizar el proceso de traduccin de operaciones teniendo en
cuenta el juego de instrucciones disponibles en el entorno de ejecucin

II. Traduccin al juego de instrucciones


Una vez que se ha asignado una direccin a cada objeto de datos slo resta escribir cada instruccin
con el acrnimo adecuado y cada operando con la sintaxis de direccionamiento propia del
ensamblador de ENS-2001 en funcin del valor del atributo direccin y el tipo de objeto
program ::= axiom:a {:

public class ENS2001Environment {

...continua

public String translate (QuadrupleIF q) {

cb.addQuadruple (DATA, gAddress);


cb.addQuadruples (a.getCode ());

return q.toString ();

create

IntermediateCodeBuilder cb =
}
}

finalCodeFactory.create (cb.create ());


syntaxErrorManager.syntaxInfo (");
:}

Lo que el estudiante no ve

ExecutionEnvironment e =
public create (List<QuadrupleIF> qs) {
for (Quadruple q: qs) {
buffer.append(e.translate (q));

invoke

<<volcar a fichero el buffer >> }


}

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Generacin de cdigo objeto


Como estudiamos en las secciones anteriores la generacin de cdigo objeto se hace en dos fases
consecutivas. Primero deben resolverse todas las referencias simblicas a objetos de datos en
direcciones de memoria real y despus realizar el proceso de traduccin de operaciones teniendo en
cuenta el juego de instrucciones disponibles en el entorno de ejecucin

II. Traduccin al juego de instrucciones


Una vez que se ha asignado una direccin a cada objeto de datos slo resta escribir cada instruccin
con el acrnimo adecuado y cada operando con la sintaxis de direccionamiento propia del
ensamblador de ENS-2001 en funcin del valor del atributo direccin y el tipo de objeto
program ::= axiom:a {:

public class ENS2001Environment {

...continua

public String translate (QuadrupleIF q) {


return q.toString ();

cb.addQuadruple (DATA, gAddress);


cb.addQuadruples (a.getCode ());

create

IntermediateCodeBuilder cb =
}
}

if (q.getOperation.equals
(ADD)) {
finalCodeFactory.create
(cb.create
());
Esta
implementacin

dummy del metro de


StringBuffer b = new StringBuffer ();
syntaxErrorManager.syntaxInfo
(");

traduccin solo hace un


String o1 = translate (q.getFirstOperand ());
eco de la cudrupla. Aqu
String o2 = translate (q.getSecondOperand ());
debe implementarse
ExecutionEnvironment
e = la
String r = translate (q.getResult ());
(operacin y
publictraduccin
create (List<QuadrupleIF>
qs) {
direccionamiento)
b.append (LD + .A + o1 + \n);
for (Quadruple q: qs) {
invoke
b.append (ADD
+ r + + o2);

:}

buffer.add(e.translate (q));

<<volcar a fichero buffer >> }

Lo que el estudiante no ve

return b.toString (); } ...

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Generacin de cdigo objeto


Como estudiamos en las secciones anteriores la generacin de cdigo objeto se hace en dos fases
consecutivas. Primero deben resolverse todas las referencias simblicas a objetos de datos en
direcciones de memoria real y despus realizar el proceso de traduccin de operaciones teniendo en
cuenta el juego de instrucciones disponibles en el entorno de ejecucin

II. Traduccin al juego de instrucciones


Una vez que se ha asignado una direccin a cada objeto de datos slo resta escribir cada instruccin
con el acrnimo adecuado y cada operando con la sintaxis de direccionamiento propia del
ensamblador de ENS-2001 en funcin del valor del atributo direccin y el tipo de objeto
program ::= axiom:a {:

public class ENS2001Environment {

...continua

public String translate (QuadrupleIF q) {

cb.addQuadruple (DATA, gAddress);


cb.addQuadruples (a.getCode ());

return q.toString ();

create

IntermediateCodeBuilder cb =
}
}

finalCodeFactory.create
(cb.create
());
La traduccin de los
private
String translate (OperandIF o) {

operandos puede delesyntaxErrorManager.syntaxInfo


(");
if (o instanceof Variable )

garse, por conveniencia


:}
Variable v = (Variable) o;
en un mtodo privado
if (v.isGlobal ()) return / + o.getAddress ();
que realice la traduccin
ExecutionEnvironment
e =
Lo que el estudiante no ve
de
direccionamiento
}
public create (List<QuadrupleIF> qs)
{
adecuada en funcin de
return # + o.getAddress + [.IX];
for (Quadruple q: qs) {
si el operando es
invoke
buffer.add(e.translate
(q)); }
variable global o de otro
<<volcar
a fichero buffer >> }}
tipo
}

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Generacin de cdigo objeto en la prctica

Desarrollo paso a paso


La generacin de cdigo objeto da por finalizado el desarrollo de la construccin de un compilador
completamente operativo. A grandes rasgos, el se puede resumir el conjunto de pasos necesarios para
realizar esta fase en los siguientes puntos:
1. Implementar un mtodo de consulta del tamao de tipos
1. Implementar getSize () en temporales. Delegar en Ens2001Environment. Devuelve 1.
2. Implementar getSize () en Variables. Delega en type.getSize () que delega en Ens2001Environment
1. Para tipos primitivos devuelve 1
2. Para arrays de dimensin N devuelve N
3. Para registros, la suma del tamao de cada campo
2. Implementar la resolucin de referencias simblicas a direcciones de memoria
3. Articular el proceso de traduccin de cudruplas dentro del mtodo translate
1. Implementar con una batera de sentencias condicionales
2. Idear un objeto translator con mtodo translate e implementar 1 subclase por cudrupla
4. Probar el cdigo final generado
1. Ejecutar el cdigo en program ::= axioma (descomentarlo)
2. Observar los resultados en el fichero de salida .ens

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Bibliografa

Material de estudio
Bibliografa bsica
Construccin de compiladores: principios y prctica
Kenneth C. Louden International Thomson Editores,
2004 ISBN 970-686-299-4

Javier Vlez Reyes jvelez@lsi.uned.es

Generacin de cdigo final. Traduccin a cdigo objeto


Bibliografa

Material de estudio
Bibliografa complementaria
Compiladores: Principios, tcnicas y herramientas.
Segunda Edicin Aho, Lam, Sethi, Ullman
Addison Wesley, Pearson Educacin, Mxico 2008

Diseo de compiladores. A. Garrido, J. Iesta, F. Moreno


y J. Prez. 2002. Edita Universidad de Alicante

Javier Vlez Reyes jvelez@lsi.uned.es

Vous aimerez peut-être aussi