Académique Documents
Professionnel Documents
Culture Documents
FACULTAD DE INGENIERIA
ORGANIZACIÓN DE LENGUAJES Y COMPILADORES 2
ING. BAYRON LOPEZ
AUX. BYRON BOBADILLA
SECCION A
REPORTE
INTRODUCCION
Por lógica, el código intermedio debe ser un código de nivel mas bajo que el código
fuente, y cabe mencionar que en algunos compiladores, dicho código no es generado,
sino se genera directamente el código máquina.
Uno de los códigos intermedios más utilizados es el código de tres direcciones, que no
se describirá en este documento, sino mas bien, se irá a la búsqueda de otros tipos de
código intermedio, que se pueden utilizar y que, de hecho, utilizan algunos
compiladores para algunos lenguajes de programación.
2
FORMAS DE CODIGO INTERMEDIO
OBJETIVOS
OBJETIVO GENERAL:
Encontrar algunas otras formas de Código Intermedio aparte del muy conocido
código de tres direcciones.
OBJETIVOS ESPECIFICOS:
3
FORMAS DE CODIGO INTERMEDIO
Este documento no pretende ser un exhaustivo manual de cómo implementar todos los
tipos de código intermedio que existen y la forma en que se genera en una gramática,
sino mas bien pretende responder a la pregunta de si existen más tipos de código
intermedio diferente al de 3 direcciones, sus características comparadas con dicho
código y algunos lenguajes que le utilicen.
En este caso nos centraremos en describir brevemente tres tipos de Codigo Intermedio:
Uno del tipo gráfico (se representa gráficamente pero se implementa con estructuras de
datos), otro que ha sido estandarizado y por último un tipo de código de máquina
virtual.
MARCO TEORICO
4
FORMAS DE CODIGO INTERMEDIO
Los árboles sintácticos abstractos o AST (Abstract Syntax Trees por sus siglas en
inglés) es un tipo de representación intermedia, construida en forma de árbol. En este
árbol, todos los operadores vienen representados por nodos, y sus hijos son los
operandos. Trabajar con un árbol sintáctico abstracto es una forma fácil y efectiva de
manejar lo esencial del lenguaje, pues se abstraen las instrucciones y se eliminan todos
los elementos que vienen de sobra o extras.
Se trabaja con una estructura del tipo árbol, ya que esta estructura es la que se utiliza en
el análisis sintáctico, y es la que resulta más fácil de construir utilizando una gramática.
Por ejemplo a la hora de analizar las expresiones aritméticas, teniendo una línea de
código como la siguiente: 2 + 3 * (7 + 5). El árbol resultante para dicha expresión sería
el siguiente:
EE+E
|E–E
|E*E
|E/E
| (E)
| num
| id
Gramática para Expresiones Aritméticas
+ +
2 3 7 5
AST resultante para la expresión 2 + 3 * (7 + 5)
En un árbol sintáctico abstracto, los nodos vienen representados por los símbolos no
terminales. Entonces el AST se construye en base a una definición dirigida por la
sintaxis, es decir, es necesario hacer una gramática para generarlo, tal y como se hace
con el código de tres direcciones.
5
FORMAS DE CODIGO INTERMEDIO
a:double;
if (a>2) then
write a;
else
write g(5, a) + 8;
endif
write f(a * 2);
Entre los compiladores que generan un AST como representación intermedia, están los
de los lenguajes del .net Framework (C#, Visual Basic, J#, etc). Ya que el compilador
de dichos lenguajes hace uso de esta técnica para la generación de código intermedio y
posteriormente se genera un código llamado CIL.
6
FORMAS DE CODIGO INTERMEDIO
Código CIL
CIL es un código intermedio de bajo nivel y su nombre viene dado por las siglas
Common Intermediate Language (Lenguaje Intermedio Común). Básicamente, el CIL
es un lenguaje ensamblador orientado a objetos, y fue originalmente desarrollado por
Microsoft. Es por ello que muchos le conocen como MSIL, pero mas tarde fue
estandarizado para poder utilizarlo en otros lenguajes.
El código CIL trabaja en base a pilas y es utilizado por los lenguajes del .NET
Framework como código intermedio antes de pasarlo a lenguaje objeto.
CIL trabaja en base a pilas, es así como por ejemplo para mandar a ejecutar una función
o procedimiento, sus parámetros son colocados en la pila para poder llamarlos desde
ahí. Esto es exactamente lo que hace el código de tres direcciones, por su similitud con
el código ensamblador que trabaja directamente con la memoria de la computadora.
Por ejemplo, para las expresiones aritméticas, suponiendo que se quiere hacer la
siguiente suma: 2 + 3. Se introducen a la pila los dos valores (2 y 3), y con la directiva
“add” del lenguaje, toma esos dos valores de la pila y los suma, los saca y apila el valor
del resultado.
Para las estructuras de control (if, while, for, etc.) se hace uso de los saltos y etiquetas,
como en el lenguaje ensamblador, validando cada una de las condiciones y dando los
saltos respectivos (como el goto de código de tres direcciones).
7
FORMAS DE CODIGO INTERMEDIO
public class X {
public static void main(String[] args) {
add(1, 2);
}
public static int add(int a, int b) {
return a+b;
}
}
Traducción:
En realidad lo que hace este proceso es una pre-compilación para luego realizar una
interpretación con intérpretes llamados Just in time, que van procesando todas las líneas
de código conforme las va leyendo para una mejor ejecución (más óptima).
8
FORMAS DE CODIGO INTERMEDIO
CONCLUSIONES
No por nada el código de tres direcciones es uno de los más utilizados y más
famosos, dado que es muy práctico y sencillo de aprender, y está basado en un
principio sencillo y concreto: cada sentencia debe de apuntar a tres direcciones
de memoria o menos. Además es muy estándar y no es tan complejo como
varios lenguajes intermedios que son muy parecidos al código ensamblador que
puede resultar muy complejo y engorroso para la mayoría de programadores
modernos.
9
FORMAS DE CODIGO INTERMEDIO
RECOMENDACIONES
Al lector de este documento que se haya interesado por los códigos intermedios,
le recomiendo documentarse sobre el código intermedio de máquina virtual.
Obtener una más amplia información acerca del código Bytecode de Java e
investigar acerca de el código-P que en su tiempo utilizaron los compiladores de
pascal en los años 70’s y parte de los 80’s.
Recomiendo también el estudio del código intermedio común o código CIL, que
fue originalmente creado por Microsoft Corporation (por eso también llamado
MSIL), pero que fue posteriormente estandarizado y ahora utilizado por el
proyecto MONO de software libre que contiene compiladores de varios
lenguajes de programación, entre ellos C#.
10
FORMAS DE CODIGO INTERMEDIO
FUENTES BILIOGRAFICAS
Kenneth C. Louden
Construccion de compiladores: Principios y prácticas
2004, Editorial Thompson
Fuentes Web:
http://www.di.uniovi.es/procesadores/Apuntes/GeneracionCodigo/trans.LRI.pdf
http://ccia.ei.uvigo.es/docencia/PL/T8.pdf
http://rua.ua.es/dspace/bitstream/10045/3848/1/cil-para-pl.pdf
http://www.uco.es/~ma1fegan/pl/practicas/ANTLR/Arboles-de-sintaxis-abstracta.pdf
http://www.dsic.upv.es/~jsilva/uned/compiladores/Apuntes06.pdf
11