Sunteți pe pagina 1din 27

Procesadores de Lenguajes

Ingeniera Tcnica superior de Ingeniera Informtica


Departamento de Lenguajes y Sistemas informticos

Estrategias de
optimizacin
Optimizacin de cdigo
intermedio y cdigo objeto
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Objetivos

Objetivos
Entender que es la optimizacin de cdigo
Entender que son las transformaciones y qu tipos existen
Aprender las fases en las que pueden aplicarse transformaciones de cdigo
Estudiar las principales transformaciones independientes del entorno de ejecucin
Conocer el mbito de aplicacin de estas transformaciones (locales vs. globales)
Conocer los tipos de transformaciones independientes del entorno
Aquellas que preservan la estructura del grafo/bloque
Aquellas que no preservan la estructura del grafo/bloque
Estudiar las principales transformaciones dependientes del entorno de ejecucin
Aprender a medir el coste de ejecucin de un programa
Aprender a seleccionar instrucciones para la traduccin a cdigo final
Aprender a seleccionar direccionamientos para la traduccin a cdigo final
Adquirir una actitud crtica sobre las tcnicas de optimizacin de cdigo intermedio y final

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


ndice

ndice
Introduccin
Transformaciones independientes del entorno de ejecucin
Grafos de flujo, bloques bsicos y DGA
Transformaciones que preservan la estructura
Transformaciones que no preservan la estructura
Transformaciones dependientes del entorno de ejecucin
Seleccin de instrucciones para la traduccin
Seleccin del lugar de almacenamiento para la traduccin
Bibliografa

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Qu es la optimizacin de cdigo?
La generacin de cdigo, tpicamente realizada en 2 fases a travs del cdigo intermedio, provoca
frecuentemente cdigo ejecutable que aunque correcto resulta torpe y poco eficiente desde el punto de
vista del tamao o del tiempo que tarda ste en ejecutarse. Esto suele ser debido a que el alcance de
visibilidad del compilador en estas fases es a nivel de cudrupla. Conviene as, aplicar ciertas
estrategias de optimizacin sobre el cdigo resultante
La optimizacin del cdigo es el proceso mediante el cual se aplican ciertas
transformaciones de cdigo para conseguir que un programa ejecutable sea ms eficiente
en tiempo de ejecucin y / o compacto en memoria

Sabiendo que
x := y + z
traduce

MV
MV
ADD
MV

t0
t1
t2
x

y
z
t0 t1
t2

Entonces
a := b + c traduce
d := a + e

MV
MV
ADD
MV
MV
MV
ADD
MV

t0
t1
t2
a
t3
t4
t5
d

Tr. #1
b
c
t0 t1
t2
a
e
t3 t4
t5

MV
MV
ADD
MV
MV
ADD
MV

t0
t1
t2
a
t4
t5
d

Tr. #2
b
c
t0 t1
t2
e
t2 t4
t5

MV
MV
ADD
MV
MV
ADD
MV

t0
t1
t2
a
t0
t1
d

b
c
t0 t1
t2
e
t2 t0
t1

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Qu es una transformaciones de cdigo?


Como acabamos de describir, el proceso de optimizacin de cdigo se basa en la aplicacin de una
coleccin de transformaciones sobre el mismo. Los compiladores actuales tienen implementadas una
serie de estas transformaciones de mayor o menor nivel de complejidad que persiguen algn
determinado objetivo de mejora sobre el cdigo final
Una transformacin de cdigo es una reescritura del programa que tiene por objeto obtener
una versin funcionalmente equivalente del mismo y mejorada con respecto a algn criterio
de calidad
De acuerdo a esto, las transformaciones de cdigo que suelen implementar los compiladores se
pueden caracterizar a partir de 3 premisas fundamentales. A continuacin describimos brevemente
cada una de ellas en detalle
I. Preservacin del significado
Las transformaciones que se
aplican sobre un determinado
cdigo deben preservar en todo
momento la semntica del
mismo. Una optimizacin no debe
cambiar el resultado producido
para ciertos datos de entrada ni
causar un error para los mismos

II. Mejora de la calidad


Toda transformacin aplicada
sobre un determinado cdigo
debe suponer una mejora
mensurable sobre algn criterio
de calidad, tpicamente expresado
en compactacin de cdigo o
tiempo de ejecucin

III. Aplicabilidad
Una transformacin realizada sobre
un determinado cdigo debe ser
ante todo aplicable como tcnica de
mejora dentro del compilador. Esto
implica que el orden de complejidad
de su aplicacin no debe ser muy
superior al propio del proceso de
compilacin

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Objetivos de las transformaciones de cdigo


La aplicacin de las transformaciones de optimizacin de cdigo pueden perseguir distintos propsitos.
En trminos generales es posible distinguir entre optimizacin del tiempo de ejecucin y optimizacin
del tamao en memoria del programa ejecutable. Contrariamente a lo que pueda parecer, no obstante,
estos dos tipos de transformaciones estn estrechamente relacionadas entre s puesto que cuanto ms
compacto es un programa ms rpida suele resultar su ejecucin. La explicacin de este hecho se
estudiar a lo largo de este captulo

I. Optimizacin del tiempo de ejecucin

Objetivos de las
transformaciones
de cdigo

El propsito de este tipo de transformaciones es lograr una mejora


no necesariamente ptima del tiempo que tarda el cdigo final
en ser ejecutado sobre determinada arquitectura final. Este tipo de
transformaciones son las de aplicacin ms frecuente

Foco de atencin

II. Optimizacin del tamao del programa ejecutable


Las transformaciones para la optimizacin del tamao, tienen por
objetivo mejorar la compactacin del programa final ejecutable en
memoria de manera que ocupen menos espacio. Este tipo de
transformaciones son menos frecuentes ya que la capacidad
actual de las memorias no es un recurso escaso

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Seleccin de las transformaciones de cdigo


Las transformaciones de optimizacin de cdigo que existen actualmente reconocidas realizan un
determinado cambio dentro del cdigo sobre el que se aplican bajo la hiptesis de que tendrn un
impacto suficiente sobre la eficiencia del programa objetivo. Sin embargo, cmo se puede medir de
manera objetiva dicha eficiencia?
I. Anlisis del peor caso

Estrategias de
seleccin de
transformaciones
de cdigo

Ante toda falta de informacin de cmo un programa ejecutable va


a ser ejecutado, el optimizador de cdigo debe ponerse en el peor
caso y realizar las asunciones de uso peores para escoger las
transformaciones que va a aplicar. A esta estrategia se le conoce
por el nombre de estimacin conservadora de la ejecucin y es de
aplicacin frecuente

Foco de atencin

II. Anlisis estadstico


Cuando el equipo que desarrolla el compilador sabe del tipo de
programas que se van a programar y dispone de datos
estadsticos sobre los escenarios de ejecucin ms frecuentes,
puede guiar la seleccin de las tcnicas de transformacin de
cdigo en funcin de estos datos. A este tipo de compiladores se
les conoce como compiladores de rendimiento y su existencia
suele ser reducida y focalizada a determinados dominios dado lo
irrealista de la asuncin de existencia de estadsticas de uso

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Fases de aplicacin de las transformaciones de cdigo


Las transformaciones de cdigo toman un cdigo de entrada y reescriben el mismo con el nimo de
mejorar su calidad. Cabe preguntarse cuando deben ser aplicadas dichas transformaciones. En
realidad existen transformaciones destinadas a ser aplicadas en cada una de las fases del proceso de
compilacin. Diferentes compiladores escogen unas u otras
Foco de atencin

En algunos lenguajes
como C o C++ las
directivas de compilacin
se resuelven a nivel de
cdigo fuente transformando este es una
versin simplificada y
ms optima del mismo

En la mayora de los
lenguajes la incorporacin y propagacin
de constantes ser
realizan en la fase de
anlisis sintcticos

E > E

WHILE

Algunos
lenguajes
generan errores de
cdigo
inalcanzable
detectable en esta fase
para evitar que el
espacio en memoria y
tiempo de la ejecucin
sea mayor del necesario

DO

E > E

LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1

Tras la generacin de
cdigo
intermedio
se
obtiene una representacin
del programa que permite
hacer un anlisis de
transformaciones
independientes del entorno de
ejecucin

0000 0011
0000 0011
0100 0001
0100 0000
0001 0010

DO

Cdigo intermedio

WHILE

Analizador semntico

Analizador sintctico

<WHILE, PR>

Analizador lxico

eli hw

Cdigo final

While ( a > b ) do
a := a + 1;

Tras la generacin de
cdigo final se aplican
transformaciones que van
dirigidas a mejorar la
calidad teniendo en cuenta
los recursos y prestaciones
del entorno de ejecucin

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Introduccin

Tipos de transformaciones de cdigo


Con todo lo establecido hasta este punto, ya es posible hacer una distincin tipolgica entre dos clases
principales de transformaciones. A lo largo de este captulo nos centraremos en desarrollar en
profundidad cada una de ellas, la primera centrada en el cdigo intermedio y la segunda en el cdigo
final
I. Transformaciones independientes del entorno de ejecucin

Tipos de
transformaciones
de cdigo

Las transformaciones independientes del entorno de ejecucin


son aquellas que se aplican sobre las fases anteriores a la
generacin de cdigo final. La ventaja de estas transformaciones
es que su aplicacin tiene efecto independientemente del tipo de
entorno de ejecucin objetivo que se utilice para ejecutar el
programa. Nosotros centraremos especialmente nuestra atencin
en aquellas transformaciones de este grupo que se aplican sobre
el cdigo intermedio
II. Transformaciones dependientes del entorno de ejecucin
Al contrario que las anteriores, estas transformaciones se aplican
sobre el cdigo final una vez generado. Se basan en un
conocimiento profundo de las prestaciones, funcionamiento y
estructura interna del entorno de ejecucin objetivo donde va a
ejecutarse el programa. Naturalmente, el xito de aplicacin de
estas transformaciones est potencialmente limitado al entorno
objetivo

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

Grafos de flujo, bloques bsicos y DGA


Para aplicar transformaciones de optimizacin sobre el cdigo intermedio es conveniente representar el
mismo en forma de un grafo de flujo compuesto por arcos y bloques bsicos. Un bloque bsico es una
secuencia de instrucciones de saltos. Los arcos representan los saltos entre bloques
Program factorial
VAR i, r: Integer;
begin
r := 1;
i := 1;
while i <= 5
begin
r := r * i;
i := i + 1;
end;
end.
MV r 1
MV i 1
E1: CMP i 5
BZF E2
MV t0 r
MV t1 i
MUL t2 t0 t1
MV r t2
MV t3 i
MV t4 1
ADD t5 t3 t4
MV i t5
BR E1;
E2: HALT

MV
MV

r 1
i 1

E1: CMP i 5
BZF E2

B0

Mtodo de construccin

B1

MV
MV
MUL
MV
MV
MV
ADD
MV
BR

E2: HALT

t0 r
t1 i
t2 t0 t1
r t2
t3 i
t4 1
t5 t3 t4
i t5
E1

B2

Todo bloque comienza por un lder

La primera cudrupla es un lder

El destino de un salto es un lder

El siguiente a un salto es un lder

Se construyen los bloques

Se incluye el lder

Se incluyen las cudruplas detrs del lder

Se conectan los bloques

Si B sigue a A se pone un arco de A a B

Si hay un salto de B a C se pone un arco de B a C

B4

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

Grafos de flujo, bloques bsicos y DGA


Para aplicar transformaciones de optimizacin sobre el cdigo intermedio es conveniente representar el
mismo en forma de un grafo de flujo compuesto por arcos y bloques bsicos. Un bloque bsico es una
secuencia de instrucciones de saltos. Los arcos representan los saltos entre bloques

Las transformaciones globales, o


transformaciones a nivel de
grafo, alcanzan el cuerpo de
todo el procedimiento. Estas
transformaciones
son
ms
delicadas ya hay que tener en
cuenta cualquier efecto que la
modificacin de un bloque pueda
tener en otros bloques

MV
MV

r 1
i 1

B0

E1: CMP i 5
BZF E2

B1

MV
MV
MUL
MV
MV
MV
ADD
MV
BR

B2

E2: HALT

t0 r
t1 i
t2 t0 t1
r t2
t3 i
t4 1
t5 t3 t4
i t5
E1

Transformaciones globales

B4

Transformaciones locales
Las transformaciones locales, o transformaciones
a nivel de bloque, consisten en rescrituras de las
cudruplas de un bloque dirigidas a mejorar la
calidad del mismo. Este tipo de transformaciones
suelen ser de sencillas puesto que su mbito de
aplicacin est confinado a un pequeo grupo de
instrucciones sin interferencias del resto de
bloques

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

Grafos de flujo, bloques bsicos y DGA


Para aplicar transformaciones de optimizacin sobre el cdigo intermedio es conveniente representar el
mismo en forma de un grafo de flujo compuesto por arcos y bloques bsicos. Un bloque bsico es una
secuencia de instrucciones de saltos. Los arcos representan los saltos entre bloques
b
a
d
a

c
d
b
d

Bn

a
b
c
d

Tambin es frecuente representar los bloques de un grafo de flujo, de


manera independiente mediante un grafo dirigido acclico (GDA). En esta
representacin los nodos hoja del grafo representan los operandos, los
nodos intermedios las operaciones que se realizan sobre otros nodos y
adjuntan los objetos de datos que las contienen. En el ejemplo adjunto
por ejemplo el GDA seria el siguiente

Las instrucciones de movimiento


de
datos
operacin
de
asignacin desde un operando
de origen a uno de destino

+
- [b, d]

[a]

[c]

ADD
SUB
ADD
SUB

La construccin del GDA de un bloque


puede hacerse
utilizando dos
diccionarios. En uno se guardan los
operandos y en otro los nodos
intermedios. Cuando han de referirse los
nodos hoja se usa el primer diccionario.
Cuando se trata de clculos intermedios
se usa el segundo, que devuelve un
subrbol del grafo representando dicho
computo

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

Catlogo de transformaciones
Independientemente del alcance local o global que tengan las transformaciones de optimizacin, es
posible dividir las mismas en dos grandes grupos segn repercutan en el grafo de flujo que representa
el subprograma sometido a anlisis de optimizacin. De esta manera es posible establecer el siguiente
catlogo de transformaciones independientes del entorno de ejecucin que utilizaremos de ndice de
referencia durante el resto de la seccin

No alteran la
estructura
del grafo de
flujo

Preservan
estructura

Transformaciones locales

Transformaciones globales

-Eliminacin de subexpresiones comunes

-Eliminacin de subexpresiones comunes globales

-Eliminacin de cdigo inactivo

-Propagacin de copias

-Renombramiento de variables temporales


-Intercambio de cudruplas independientes

Alteran la
estructura
del grafo de
flujo

No preservan
estructura

III

-Transformaciones algebraicas

-Traslado de cdigo

-Reduccin de la intensidad

-Eliminacin de variables de induccin

-Propagacin de constantes

II

IV

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

I. Transformaciones locales que preservan la estructura


Las transformaciones locales que preservan la estructura del grafo de flujo constituyen reglas de
reescritura sencillas que articulan mejoras probadas sobre el tiempo de ejecucin y o el tamao del
cdigo ejecutable. En concreto destacan 4 transformaciones dentro de esta categora
Eliminacin de subexpresiones comunes
Cuando en un bloque aparecen dos
subexpresiones asignadas a dos o ms objetos
de datos, se puede generar un temporal para
almacenar el computo y asignar despus todos
los objetos a ese temporal
+ [c]

Eliminacin de cdigo innecesario


La eliminacin de de cdigo inaccesible o
innecesario permite aumentar la eficiencia del
programa. Los GDA ayudan a identificar dicho
cdigo. En efecto, todas las cimas (nodos sin
padre) que no tengan variables activas pueden
eliminarse sin efectos colaterales
+ [e]

- [b, d]
+
b
ADD
SUB
ADD
SUB

a
b
c
d

b
a
d
a

+ [a]

[a]

c
c
d
b
d

Bn

ADD
SUB
ADD
MV

a
b
c
d

b c
a d
d b
b

Bn

ADD
SUB
SUB
ADD

a
b
c
e

- [b]
c

b
b
c
b

c
d
d
c

Bn

+ [c]
d

SUB b b d
SUB c c d
ADD e b c

Bn

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

I. Transformaciones locales que preservan la estructura


Las transformaciones locales que preservan la estructura del grafo de flujo constituyen reglas de
reescritura sencillas que articulan mejoras probadas sobre el tiempo de ejecucin y o el tamao del
cdigo ejecutable. En concreto destacan 4 transformaciones dentro de esta categora
Renombramiento de variables temporales
Todas las ocurrencias de una variable temporal
de un bloque puede sustituirse por otra sin que
ello afecte al resultado
+ [t4, d]

Dos
cudruplas
independientes
pueden
intercambiar su orden de ejecucin sin que eso
afecte al resultado final de la ejecucin. Hay que
comprobar que la segunda cudrupla no
contiene por operandos el resultado calculado
por la primera

+ [t2, a]
t1

t0

Intercambio de cudruplas independientes

+ [e]

t3
+ [a]

b
MV
MV
ADD
MV
MV
ADD
MV

c
t0
t1
t2
a
t3
t4
d

b
c
t0 t1
t2
e
t2 t3
t4

Bn

+ [c]

- [b]

MV
MV
ADD
MV
MV
ADD
MV

t0
t1
t2
a
t7
t8
d

b
c
t0 t1
t2
e
t2 t7
t8

Bn

b
ADD
SUB
SUB
ADD

a
b
c
e

c
b
b
c
b

c
d
d
c

Bn

d
ADD
SUB
SUB
ADD

a
c
b
e

b
c
b
b

c
d
d
c

Bn

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

II. Transformaciones locales que no preservan la estructura


Las transformaciones locales que no preservan la estructura del grafo de flujo son reglas de reescritura
que producen cambios dentro del GDA que representa el bloque y suponen mejoras probadas sobre el
tiempo de ejecucin y o el tamao del cdigo ejecutable. En concreto destacan 3 transformaciones
Algebraicas

Reduccin de la intensidad

Algunas veces es conveniente realizar


una construccin algebraica ms
elaborada para expresar el cdigo de
otra
manera
semnticamente
equivalente
x
x
x
x

:=
:=
:=
:=

x
x
1
x

+
*
/

0 := 0 + x
0
x := x * 1
1

a
b
MV a b

Estas transformaciones son un


subconjunto de las anteriores y se
aplican para reducir los ciclos de
cmputo que requerira el calculo
original
X ^ 2 := x * x
2 * x := x + 2
X / 2 := x * .5

Para las expresiones constantes,


formadas exclusivamente
por
literales y constantes simblicas, es
posible calcular en tiempo de
compilacin su valor y sustituirlo.
Hay que tener en cuenta precedencia
y asociatividad
+ [t1, a]

+ [a]
b

Propagacin de constantes

ADD a b 0

*
2

[a]
x

MUL a x 2

+
x

[a]
x

ADD a x x

[t0]
3

MUL t0 2 3
ADD t1 t0 5
MV a t1

a
5

11
MV a 11

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

III. Transformaciones globales que preservan la estructura


Las transformaciones globales que preservan la estructura del grafo de flujo son reglas de reescritura
que producen cambios de los bloques del grafo pero que no alteran la relacin de dependencia de
control de flujo que existe entre ellas. En concreto destacan 2 transformaciones
Eliminacin de subexpresiones comunes
Las subexpresiones comunes tambin pueden
identificarse a lo largo de varios bloques de un
grafo de flujo. Es una mejora eliminarlas

Propagacin de copias
Es posible eliminar cudruplas de reasignacin
de la forma MV x y por propagacin del valor de
y en todas las ocurrencias futuras de x

...
MV a b c
...

B1

...
MV a b c
...

B1

...
ADD e b c
ADD f 2 e
...

Bn

...
MV e a
ADD f 2 e
...

Bn

...
ADD a b c
...

B1

...
MV e a
ADD f 2 e
...

Bn

...
MV a b c
...

B1

...
ADD f 2 a
...

Bn

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones independientes del entorno de ejecucin

IV. Transformaciones globales que no preservan la estructura


Las transformaciones globales que no preservan la estructura del grafo de flujo son reglas de
reescritura que producen cambios en la estructura relacional entre bloques que establece el grafo de
flujo. En concreto destacan 2 transformaciones
Traslado de cdigo

Eliminacin de variables de induccin

El traslado de cdigo consiste en promocionar un


trozo de cdigo de un bloque para ubicarlo en
alguna parte de un bloque anterior. La
extraccin de invariantes de bucle es un ejemplo
MV i 1

B1

LS t0 u v
BRT E1 t0

B2

B3
E1: MV i 2
INC u
DEC v
EQ t1 v 20

B4

Sobre los bucles es posible eliminar variables de


induccin aplicando sencillas transformaciones
algebraicas y realizando traslados de cdigo

MV i 1
MV i 2

B1

LS t0 u v
BRT E1 t0

B2

MV i n

B1

INC i
MUL t0 i 4
...

Bn

MV i n
MUL t0 4 i

B1

INC i
ADD t0 t0 4
...

Bn

B3
E1: INC u

DEC v
EQ t1 v 20

B4

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Transformaciones dependientes del entorno de ejecucin


El coste de ejecucin de un programa puede expresarse proporcionalmente en trminos del coste de
cada una de sus operaciones. Para calcular el coste de una operacin hay que tener en cuenta el coste
de su ejecucin y sumarlo al coste de traer dicha operacin de la memoria a la unidad central de
proceso. En este sentido, las transformaciones dependientes del entorno de ejecucin van dirigidas a
mejorar el tiempo de ejecucin y / o la compactacin del programa ejecutable dentro de una
arquitectura especfica, teniendo en cuenta su estructura interna y recursos disponibles. En general
pueden distinguirse dos tipos de transformaciones
I. Seleccin de instrucciones para la traduccin

Tipos de
transformaciones
dependientes del
entorno de
ejecucin

Como cada entorno de ejecucin dispone de su propio juego de


instrucciones, es conveniente escoger cuidosamente que
operacin u operaciones van a emplearse para traducir cada
cudrupla de cdigo intermedio a cdigo final
II. Seleccin de direccionamiento para la traduccin
Cada modo de direccionamiento tiene un coste asociado a la
recuperacin de datos desde la memoria. Las transformaciones
de direccionamiento buscan optimizar el uso de recursos de
manera que se deseche, en la medida de lo posible,
direccionamientos pesados a favor de direccionamientos giles

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin de instrucciones para la traduccin


Cada entorno de ejecucin dispone de un juego de instrucciones propio que est adaptado a la
optimizacin de determinados escenarios de ejecucin hipotticamente recurrentes. Las
transformaciones dependientes del entorno nos ayudan a seleccionar, para una arquitectura concreta,
qu instruccin de cdigo final debe ser empleada en cada caso para traducir una cudrupla de cdigo
intermedio
Arquitecturas CISC

Arquitecturas VAX
Las arquitecturas VAX tienen una
instruccin especifica de incrementocomparacin-ramificacin para dar
soporte gil a la implementacin de
bucles

Las arquitecturas CISC (Complex


Instruction Set Computer) constan de
un completo juego de instrucciones
que pueden realizar operaciones
complejas con mltiples modos de
direccionamiento

Arquitecturas RISC
Las arquitecturas RISC (Reduced
Instruction Set Computer) disponen
de 1 juego reducido de instrucciones
muy giles donde solo operaciones
de carga y almacenamiento tienen
direccionamiento a memoria

Ejemplo

Cuanto ms larga sea la traduccin a cdigo


final mayor ser el coste de almacenamiento
en memoria y el tiempo de ejecucin

MOVE .R0 a
ADD .R0 #1
MOVE a .R0

Si el entorno de ejecucin dispone de una


instruccin explcita para realizar la
operacin que deseamos hacer debemos
aprovecharla puesto que ser ms eficiente
que otras traducciones equivalente

ADD a 1
INC a

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin del direccionamiento para la traduccin


El coste de ejecutar cada operacin del juego de instrucciones de un entorno de ejecucin es un valor
que puede asumirse constante sin perdida de generalidad. No obstante a ese coste es necesario aadir
el de traer de la memoria cada operando, en lo que los modos de direccionamiento tienen un impacto
directo. De esta manera si T es el tiempo global de ejecucin de una operacin O, k el tiempo que tarda
en ejecutarse por la unidad central de proceso y Tcarga el tiempo de carga de un operando puede
asumirse que para una operacin de dos operandos se tiene que
T(O) = k + TCarga(O.operando1) + TCarga(O.operando2)

Coste

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

0
0
1
1
1
1

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

Ejemplo

Direccionamiento

La
estrategia
de
seleccin
de
direccionamientos para almacenar los
objetos de datos va dirigida por buscar
direccionamientos de coste 0 (registros)
frente a direccionamientos de mayor coste
(memoria). En este sentido el nmero de
registros de la mquina tiene un impacto
directo en el tiempo de ejecucin

Dado que no se trata de medir el tiempo en trminos absolutos


sino la escalabilidad del problema, el valor real de la constante k
en la frmula anterior es prescindible y puede decirse que el
tiempo de ejecucin es proporcional al direccionamiento de la
instruccin

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin del direccionamiento para la traduccin


Como acabamos de ver, en la medida de lo posible hay que tratar de asignar un direccionamiento a
registro a aquellos objetos de datos ms referenciados durante el programa dejando los menos
referidos en memoria. Para llevar esto a la prctica deben gestionarse los lugares donde reside cada
objeto y esto se hace definiendo descriptores de registro y memoria para el entorno de ejecucin
Descriptor de registro
El descriptor de un registro indica la coleccin
de objetos de datos variables globales o
locales, parmetros o temporales que dicho
registro
mantiene
en
la
actualidad.
Naturalmente si es ms de uno es porque
todos ellos comparten el mismo valor

Un descriptor de registro indica la coleccin de


objetos de datos que est almacenando en un
momento

concreto

dentro

del

tiempo

de

ejecucin

Descriptor de memoria
Los descriptores de memoria indican las
posiciones de memoria o registros donde cada
objeto se encuentra almacenado cada objeto
de datos en un momento determinado dentro
del tiempo de ejecucin. Naturalmente un
objeto puede estar en dos o ms posiciones
distintas

Un descriptor de memoria indica los lugares de


la memoria donde un objeto de datos est
almacenado incluyendo los registros del entorno
de ejecucin

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin del direccionamiento para la traduccin


Como acabamos de ver, en la medida de lo posible hay que tratar de asignar un direccionamiento a
registro a aquellos objetos de datos ms referenciados durante el programa dejando los menos
referidos en memoria. Para llevar esto a la prctica deben gestionarse los lugares donde reside cada
objeto y esto se hace definiendo descriptores de registro y memoria para el entorno de ejecucin
Descriptor de registro

El descriptor de un registro indica la coleccin


de objetos de datos variables globales o
locales, parmetros o temporales que dicho
registro
mantiene
en
la
actualidad.
Naturalmente si es ms de uno es porque
todos ellos comparten el mismo valor

Las tcnicas de optimizacin en este punto


consisten
en
seleccionar
siempre
preferentemente un registro a una posicin
de memoria como lugar de almacenamiento
dando prioridad a aquellos objetos que sean
ms referenciados. Para saber el nmero de
referencias se puede usar el GDA del bloque

[x, c]

[a, b]
1

Descriptor de memoria

Los descriptores de memoria indican las


posiciones de memoria o registros donde cada
objeto se encuentra almacenado cada objeto
de datos en un momento determinado dentro
del tiempo de ejecucin. Naturalmente un
objeto puede estar en dos o ms posiciones
distintas

Asimismo es necesario saber aplicar


movimientos de datos hacia la memoria
para conseguir liberar los registros puesto
que son un recurso limitado del entorno de
ejecucin

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin del direccionamiento para la traduccin

[t4]

Como acabamos de ver, en la medida de lo posible hay que tratar de asignar un


direccionamiento a registro a aquellos objetos de datos ms referenciados durante [f, t2] *
el programa dejando los menos referidos en memoria. Para llevar esto a la prctica
deben gestionarse los lugares donde reside cada objeto y esto se hace definiendo
f
descriptores de registro y memoria para el entorno de ejecucin

==

- [x, t3]
x

Ejemplo
C. Intermedio
E: MUL
MV
SUB
MV
EQ
BRF

t2
f
t3
x
t4
E

f x
t2
x 1
t3
x 0

C. Intermedio
E: MUL
MV
SUB
MV
EQ
BRF

t2
f
t3
x
t4
E

C. Final

f x
t2
x 1
t3
x 0

C. Final
E: MOVE .R0 /1001
MOVE .R1 /1000
MUL .R0 .R1

D. Memoria

D. Registro

x
f
t2
t3
t4
1
0

.R0
.R1
.R2
.R3
.R4
.R5

/1000
/1001
#1
#0

D. Memoria

D. Registro

x
f
t2
t3
t4
1
0

.R0
.R1
.R2
.R3
.R4
.R5

/1000, .R1
/1001
.R0
#1
#0

f, t2
x
-

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


Transformaciones dependientes del entorno de ejecucin

Seleccin del direccionamiento para la traduccin

[t4]

Como acabamos de ver, en la medida de lo posible hay que tratar de asignar un


direccionamiento a registro a aquellos objetos de datos ms referenciados durante [f, t2] *
el programa dejando los menos referidos en memoria. Para llevar esto a la prctica
deben gestionarse los lugares donde reside cada objeto y esto se hace definiendo
f
descriptores de registro y memoria para el entorno de ejecucin

==

- [x, t3]
x

Ejemplo
C. Intermedio
E: MUL
MV
SUB
MV
EQ
BRF

t2
f
t3
x
t4
E

f x
t2
x 1
t3
x 0

C. Intermedio
E: MUL
MV
SUB
MV
EQ
BRF

t2
f
t3
x
t4
E

f x
t2
x 1
t3
x 0

C. Final
E: MOVE
MOVE
MUL
MOVE
SUB

.R0
.R1
.R0
.R2
.R1

/1001
/1000
.R1
#1
.R2

C. Final
E: MOVE
MOVE
MUL
MOVE
SUB
MOVE
CMP
BZ

.R0
.R1
.R0
.R2
.R1
.R3
.R1
E

/1001
/1000
.R1
#1
.R2
#0
.R3

D. Memoria

D. Registro

x
f
t2
t3
t4
1
0

.R0
.R1
.R2
.R3
.R4
.R5

/1000, .R1
/1001
.R0
.R1
#1
#0

f, t2
x, t3
1
-

D. Memoria

D. Registro

x
f
t2
t3
t4
1
0

.R0
.R1
.R2
.R3
.R4
.R5

/1000, .R1
/1001
.R0
.R1
#1
#0

f, t2
x, t3
1
0
-

Javier Vlez Reyes jvelez@lsi.uned.es

Estrategias de optimizacin. Cdigo intermedio y cdigo final


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

Estrategias de optimizacin. Cdigo intermedio y cdigo final


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

S-ar putea să vă placă și