Escolar Documentos
Profissional Documentos
Cultura Documentos
Generacin de cdigo
intermedio I
Sentencias y expresiones
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED
Generacin de cdigo intermedio. Sentencias y expresiones
Objetivos
Objetivos
Aprender en qu consiste la generacin de cdigo intermedio
Aprender qu es el cdigo intermedio
Conocer los distintos tipos de lenguajes intermedios
Valorar la importara de realizar una buena eleccin del lenguaje intermedio
Conocer cmo son los lenguajes intermedios lineales
Entender el significado de las variables temporales en el cdigo intermedio lineal
Entender el significado de las etiquetas en el cdigo intermedio lineal
Aprender a construir esquemas de traduccin para generar cdigo intermedio
Conocer los artefactos computacionales que son necesarios para darles soporte
Aprender a generar cdigo intermedio para expresiones
Aprender a generar cdigo intermedio para sentencias de control
ndice
Introduccin
Qu es el cdigo intermedio
La fase de generacin de cdigo intermedio
El cdigo intermedio como punto de desacoplamiento
Lenguajes intermedios
Representaciones jerrquicas de cdigo intermedio
Representaciones lineales de cdigo intermedio
Generacin de cdigo intermedio en la prctica
Artefactos para la generacin de cdigo intermedio
Generacin de cdigo intermedio para expresiones
Generacin de cdigo intermedio para sentencias
Desarrollo paso a paso
Bibliografa
Qu es el cdigo intermedio?
Una vez superadas todas las fases de anlisis del cdigo fuente, el compilador debe ser capaz de
generar una representacin simblica del programa lo ms aproximada a los potenciales lenguajes
objetivos al que se va a traducir el mismo pero lo suficientemente distante de stos como para
garantizar su aplicabilidad en distintas arquitecturas fsicas finales
While ( a > b ) do
a := a + 1; Analizador sintctico
Cdigo intermedio
Analizador lxico
Cdigo final
Analizador
semntico
eli hw <WHILE, PR> S
S
LD a t1 0000 0011
WHILE E DO S WHILE E DO S LD b t2 0000 0011
GRT t3 t1 t2 0100 0001
E > E E > E
BRZ t3 L1 0100 0000
0001 0010
M
Analizador semntico Analizador semntico
LD a t1
Cdigo LD b t2
GRT t3 t1 t2
intermedio BRZ t3 L1
Intel Solaris
Optimizacin Cdigo Optimizacin Cdigo
arquitectura
Equipo de
intermedio intermedio
N Cdigo final
Cdigo final
Lenguajes intermedios
El primer paro para la generacin de cdigo intermedio consiste en el diseo de un lenguaje intermedio
que permita representar de forma fiel y suficientemente abstracta los programas de un compilador.
Existen distintas alternativas que describiremos a continuacin
Representaciones jerrquicas
Las representaciones jerrquicas describen el cdigo fuente de un programa como una coleccin de
nodos relacionados entre s a travs de arcos con el mismo nivel de abstraccin que lo hacen los
rboles de anlisis sintctico
WHILE ( E ) DO S > ++
E > E ID ID ID
Representaciones jerrquicas
Las representaciones jerrquicas describen el cdigo fuente de un programa como una coleccin de
nodos relacionados entre s a travs de arcos con el mismo nivel de abstraccin que lo hacen los
rboles de anlisis sintctico
ID := E
transformacin ID +
E + E
*
E * E E * E
ID ID
a := b * c + b * c a := b * c + b * c
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. Para articular el proceso de
secuenciamiento se utilizan varios elementos como operandos de dichas instrucciones que sern
utilizados en lo venidero a lo largo del tema
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. Para articular el proceso de
secuenciamiento se utilizan varios elementos como operandos de dichas instrucciones que sern
utilizados en lo venidero a lo largo del tema
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales
Lenguajes de tercetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, un operando de entrada y otro de entrada y Complejidad en la traduccin de construcciones
salida para almacenar el resultado
Resultado
En los lenguajes de tercetos uno de los
operandos hace de almacn para el resultado
de la operacin lo que supone que el
operando de entrada se pierde tras su
ADD x y ejecucin
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales
Lenguajes de tercetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, un operando de entrada y otro de entrada y Complejidad en la traduccin de construcciones
salida para almacenar el resultado
ID := E LOAD t0 b t0 b
transformacin LOAD t1 c t1 c
(a)
E * E MUL t1 t0 t1 t1 * t0
STORE t1 a t1 a
ID ID
(b) (c)
a := b * c
a := b * c
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales
Lenguajes de cuartetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, dos operando de entrada y otro de salida Mayor sencillez en la traduccin de construcciones
para almacenar el resultado
Resultado
En los lenguajes de cuartetos el almacn
para el resultado de la operacin es un
operando de salida independiente lo que
supone que no hay perdida de informacin
ADD x y z tras la ejecucin de la operacin
Representaciones lineales
Las representaciones lineales suponen un secuenciamiento de la informacin codificada en los rboles
de anlisis sintcticos en forma de una coleccin de instrucciones abstractas de bajo nivel pero
manteniendo las referencias simblicas introducidas por el programador. A continuacin describimos los
2 tipos de representaciones lineales
Lenguajes de cuartetos
Las representaciones de cdigo intermedio basadas en Apto para la etapa de sntesis
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de Representacin cercana al lenguaje objetivo
operacin, dos operando de entrada y otro de salida Mayor sencillez en la traduccin de construcciones
para almacenar el resultado
ID := E LOAD t0 b t0 b
transformacin LOAD t1 c t1 c
(a)
E * E MUL t2 t1 t0 t2 t1 * t0
STORE t2 a t2 a
ID ID
(b) (c)
a := b * c
a := b * c
ScopeManager
TypeTable TypeIF
OperandIF
Create >
TemporalFactory Temporal Value
Cudruplas
Las cudruplas son el elemento central de la arquitectura. Representan cada una de las operaciones
atmicas que pueden ser referenciadas dentro del cdigo intermedio para que surtan cierto efecto o
realicen cierto clculo a partir de los operandos
Los objetos de tipo Quadruple se utilizan para
Quadruple
representar operaciones atmicas del cdigo
+ String getOperation () intermedio. Una cuadrupla est formado por un cdigo
+ void setOperation () de operacin, un operando opcional resultado y a lo
sumo dos operandos de entrada tambin opcionales.
+ OperandIF getFirstOperand ()
En efecto, en funcin del tipo de operacin el numero
+ void setFirstOperand (OperandIF o) de operandos puede variar. Puede haber
+ OperandIF getSecondOperand () instrucciones con ningn operando ni resultado, como
+ void setSecondOperand (OperandIF o) HALT. Puede haber otras con un slo operando como
los saltos del tipo BR L. O puede haber instrucciones
+ OperandIF getResult ()
con un resultado y dos operandos como en la suma
+ void setResult (OperandIF o) ADD t3 t1 t2.
Variable Label
Temporal Value
Tabla de temporales
Los temporales que se van generando a medida que el compilador procesa las expresiones del
lenguaje deben almacenarse en una tabla de temporales asociada a cada mbito. Este es un aspecto
importante para las fases posteriores. El artefacto TemporalTable gestiona los temporales de un
mbito
TemporalTable
Cada tabla de temporales se crea de forma
automtica asociada a un mbito cuando este
-ScopeIF scope es abierto a travs del gestor de mbitos. Por
-List <TemporalIF> temporals tanto existe una tabla de temporales para cada
mbito. La responsabilidad de este artefacto es
+ ScopeIF getScope () gestionar la coleccin de temporales
generados durante el proceso de compilacin
+ TemporalTable (ScopeIF scope)
del bloque sintctico asociado al mbito. Los
+ List <TemporalIF> getTemporals () mtodos addTemporal y getTemporals sirven
+ void addTemporal (TemporalIF temporal) para registrar y tener acceso a los temporales
+ boolean containsTemporal (TemporalIF temporal) respectivamente y son de utilidad en sta y en
las fases posteriores de generacin de cdigo
final
TemporalFactory
La factora de temporales es un artefacto asociado a
un mbito pasado como argumento en el constructor
+ TemporalFactory (ScopeIF scope) que se utiliza para crear temporales. El primer mtodo
+ TemporalIF create (String name) create construye un temporal con nombre propio y lo
+ TemporalIF create () registra automticamente en la tabla de temporales. La
diferencia del segundo create, es que ste mtodo
construye el temporal con un nombre autogenerado
que garantiza la unicidad dentro del mbito
LabelFactory
La factora de etiquetas es un que se utiliza para crear
etiquetas. El primer mtodo create construye una
+ LabelFactory (ScopeIF scope) etiqueta con nombre propio. La diferencia del segundo
+ LabelIF create (String name) create, es que ste mtodo construye la etiqueta con
+ LabelIF create () un nombre autogenerado que garantiza la unicidad
IntermediateCodeBuilder
La construccin de las cudruplas que componen el cdigo intermedio puede realizarse por
invocacin de sus constructores de clase. No obstante, resulta ms sencillo y econmico utilizar
instancias de IntermediateCodeBuilder para realizar esta labor
IntermediateCodeBuilder
Las operaciones addQuadruple se encargan de
insertar un nuevo cuarteto dentro de la lista
+ void addQuadruple (String op, r) interna de cdigo intermedio. Sin embargo su
+ void addQuadruple (String op, r, o1) semntica depende del tipo y formato de los
+ void addQuadruple (String op, r, o1, o2) operandos
+ void addQuadruple (QuadrupleIF q)
Si es de tipo OperandIF se inserta tal cual
+ void addQuadruples (List <QuiadrupleIF> code)
Si es de tipo int se crea un Value y se inserta
+ List <QuadrupleIF> create ()
Si es de tipo String
Material de estudio
Bibliografa bsica
Material de estudio
Bibliografa complementaria