Documente Academic
Documente Profesional
Documente Cultură
Generacin de cdigo
intermedio I
Sentencias y expresiones
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED
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
El cdigo intermedio es una representacin abstracta del programa cercana a
los lenguajes objetivos potenciales pero independiente de cualquier
consideracin especfica de una arquitectura fsica concreta
S
WHILE
DO
E > E
WHILE
DO
E > E
LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1
Cdigo final
<WHILE, PR>
Cdigo intermedio
eli hw
Analizador lxico
While ( a > b ) do
a := a + 1;
Analizador
semntico
Etapa de sntesis
Analizador sintctico
Etapa de anlisis
0000 0011
0000 0011
0100 0001
0100 0000
0001 0010
Expertos en lenguajes
Expertos en arquitecturas
Independencia de arquitectura
Dependencia de arquitectura
Dependencia de lenguaje
Independencia de lenguaje
Optimizacin de lenguajes
Optimizacin de ejecucin
Javier Vlez Reyes jvelez@lsi.uned.es
while ( a > b )
a++;
Equipo de Lenguaje
Pascal
Analizador lxico
Analizador lxico
Analizador sintctico
Analizador sintctico
Analizador semntico
Cdigo intermedio
arquitectura
Equipo de
Cdigo intermedio
LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1
Cdigo
intermedio
Analizador semntico
Intel
Optimizacin Cdigo
intermedio
Cdigo final
Solaris
Optimizacin Cdigo
intermedio
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
Lenguajes intermedios
I. Representaciones jerrquicas
Foco de
atencin
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
>
Cdigo intermedio
SWhile
WHILE
transformacin
DO
WHILE
>
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
Cdigo intermedio
Asignacin
:=
ID
E
E
:=
transformacin
+
E
a := b * c + b * c
ID
E
E
*
E
ID
ID
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
I. Valores literales
II. Variables
Los
valores
literales
utilizados
como
de los
Las
variables
representan
las
de
cdigo
constantes,
intermedio
variables
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
final
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
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de
operacin, un operando de entrada y otro de entrada y
salida para almacenar el resultado
ADD
Cdigo de operacin
El cdigo de operacin es un
acrnimo que representa el tipo
de operacin que se aplican
entre los operandos del terceto
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
tercetos estn formados por una secuencia de
instrucciones constituida por 3 elementos: un cdigo de
operacin, un operando de entrada y otro de entrada y
salida para almacenar el resultado
ID
(a)
E
ID
(b)
a := b * c
Cdigo intermedio
E
*
transformacin
E
ID
(c)
LOAD t0 b
LOAD t1 c
MUL t1 t0
STORE t1 a
t0
t1
t1
t1
b
c
t1 * t0
a
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
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de
operacin, dos operando de entrada y otro de salida
para almacenar el resultado
ADD
Cdigo de operacin
El cdigo de operacin es un
acrnimo que representa el tipo
de operacin que se aplican
entre los operandos del terceto
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
cuartetos estn formados por una secuencia de
instrucciones constituida por 4 elementos: un cdigo de
operacin, dos operando de entrada y otro de salida
para almacenar el resultado
ID
(a)
E
ID
(b)
a := b * c
Cdigo intermedio
E
*
transformacin
E
ID
(c)
LOAD t0 b
LOAD t1 c
MUL t2 t1 t0
STORE t2 a
t0
t1
t2
t2
b
c
t1 * t0
a
a := b * c
< uses
IntermediateCodeBuilder
Scope
Create >
SymbolTable
TypeIF
SymbolIF
Quadruple
OperandIF
LabelFactory
TemporalFactory
Create >
Create >
Label
Variable
Temporal
Value
Reference to >
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
+ String getOperation ()
+ void setOperation ()
+ OperandIF getFirstOperand ()
+ void setFirstOperand (OperandIF o)
+ OperandIF getSecondOperand ()
+ void setSecondOperand (OperandIF o)
+ OperandIF getResult ()
+ void setResult (OperandIF o)
Quadruple
Label
-String name
-String name
-ScopeIF scope
-ScopeIF scope
-Boolean isGlobal
Temporal
-String name
Value
-Integer value
-ScopeIF scope
-Integer address
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
-ScopeIF scope
-List <TemporalIF> temporals
+ ScopeIF getScope ()
+ TemporalTable (ScopeIF scope)
+ List <TemporalIF> getTemporals ()
+ void addTemporal (TemporalIF temporal)
+ boolean containsTemporal (TemporalIF temporal)
TemporalTable
TemporalFactory
LabelFactory
+ LabelFactory (ScopeIF scope)
+ LabelIF create (String name)
+ LabelIF create ()
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
Si es de tipo String
Primero se instancia el code builder pasndole
como argumento de constructo el mbito. Despus
se utilizan los mtodos addQuadruple para ir
acumulando cuartetos internamente. Al finalizar la
accin semntica el cdigo se obtiene invocando el
mtodo create ()
Descripcin
NOP
Cuarteto
Nada
NOT
Descripcin
x := !y
ADD
x := y + z
BR
SUB
x := y z
BRT
Si x, salto a L
MUL
x := y * z
BRF
Si !x, salto a L
DIV
x := y / z
INL
MOD
x := y % z
MV
:= y
INC
x := y + 1
MVP
:= *y
DEC
x := y 1
MVA
:= &y
NEG
x := y
STP
*x := y
GR
x := (y > z)
STA
&x := y
EQ
x := (y == z) ? 1 : 0
PUSH
*SP := x ; SP++
LS
x := (y < z)
POP
x := *SP ; SP --
AND
x := y && z
CALL f
Llamada a funcin f
OR
x := y || z
RET x
XOR
x := y ^ z
HALT
Stop
? 1 : 0
? 1 : 0
Salto a L
Insertar L:
Expresiones
{: ... :}
{: ... :}
...
{: ... :}
{: ... :}
:}
Expresiones
exp:e2
e.setTemporal (temp);
e.setCode (cb.create());
e.setTemporal (temp);
RESULT = e
e.setCode (cb.create());
RESULT = e :}
Expresiones
exp ::= MENOS exp:e1 {:
Expresiones
exp ::= PI exp:e1 PD {:
RESULT = e1;
:}
<<Comprobacin de tipos>>
e.setTemporal (temp);
e.setCode (cb.create());
RESULT = e;
e.setTemp (temp);
e.setCode (cb.create ()):
:}
RESULT = e;
:}
Expresiones
exp ::= referencia:r {:
Referencias
referencia ::= ID:id {:
<<Comprobacin de tipos>>
e.setTemp (temp);
referencia.setTemporal (temp);
RESULT = e;
:}
:}
D3
D2
<<Comprobacin de tipos>>
ScopeIF scope = scopeManager.getCurrentScope();
D1
V [i][j][k]
t1 := 0
referencia.setTemporalIndex (tempI);
+ j x (D3 x size)
+ k x size
RESULT = referencia;
:}
size
t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
t5 := &v + t4 x size
<<comprobacin de tipos>>
TypeIF
D3
D2
rType = r.getType();
D1
size
V [i][j][k]
t1 := 0
+ j x (D3 x size)
+ k x size
t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
t5 := &v + t4 x size
D3
D2
D1
rType = r.getType();
size
V [i][j][k]
+ j x (D3 x size)
+ k x size
t1 := 0
t2 := t1 x D1 + i
t3 := t2 x D2 + j
t4 := t3 x D3 + k
t5 := &v + t4 x size
e.setCode (cb.create());
RESULT = e; :}
<<comprobacin de tipos>>
<<comprobacin de tipos>>
TypeIF
(name);
rType = r.getType();
rn.setTemporal (rTemp);
rn.setTemporalIndex (rTempI);
rn.setTemporalOffset (rTempO) ;
RESULT = e; :}
Sentencia asignacin
sentenciaAsignacion ::= referencia:r IGUAL exp:e {:
Sentencia If
sentenciaIF ::= IF PI exp:e PD s:s1 ELSE s:s2 {:
<<comprobacin de tipos>>
<<comprobacin de tipos>>
RESULT = sIF; :}
Sentencia While
sentenciaWhile ::= WHILE PI exp:e PD s:s1 {:
Sentencia For
sentenciaFor ::= FOR sAsignacion:sa TO exp:e DO s:s1 {:
<<comprobacin de tipos>>
<<comprobacin de tipos>>
RESULT = sWhile; :}
Ejecutar el finalTestCase
Material de estudio
Bibliografa bsica
Construccin de compiladores: principios y prctica
Kenneth C. Louden International Thomson Editores,
2004 ISBN 970-686-299-4
Material de estudio
Bibliografa complementaria
Compiladores: Principios, tcnicas y herramientas.
Segunda Edicin Aho, Lam, Sethi, Ullman
Addison Wesley, Pearson Educacin, Mxico 2008