Está en la página 1de 19

Programación de Sistemas de Base I

Facultad de Medicina e Ingeniería en Sistemas Computacionales de Matamoros

Abril 2023
Generación de Código Intermedio
• Después de haber conducido el análisis semántico el compilador genera
un código intermedio entre el código fuente y el código de la maquina
objetivo (unos y ceros).

• Este representa un programa para una máquina abstracta. Esta en medio


de un lenguaje de alto nivel y un lenguaje de máquina. Este código
intermedio debe ser generado de tal manera que es fácilmente traducido a
un lenguaje de máquina de bajo nivel.
Etapa Inicial y final de un compilador
Generación de Código Intermedio
• La administración de la memoria se da en esta etapa.

• Se debe considerar tanto la memoria estática como dinámica, y en esta se


usan varias pilas.

• Los lenguajes intermedios suelen tener árboles de derivación más pequeños


que su contraparte original.

• Se puede representar un árbol sintáctico con un Grafo Dirigido Acíclico (GDA).

• Los lenguajes intermedios nos sirven para representar la producción final de


nuestro lenguaje fuente.
Notaciones
• Las notas servidas de base para expresar
sentencias bien definidas. El uso más
extendido de las notas sirve para identificar
operaciones aritméticas. Las expresiones
aritméticas se pueden identificar de tres
formas distintas: infija, prefija y postfija.

• La diversidad de notas corresponde en


algunos casos es más sencillo un tipo de
notación. Las notas también dependen de
cómo se registran el árbol sintáctico, el cual
puede ser en inorden, preorden o postorden;
teniendo una relación de uno a uno con la
notación de los operadores.
Prefija
• La notación prefija pone el operador
primero que los dos operandos, por lo
que la expresión anterior queda: + ab-

68
5.

+ • Esto se representa con una estructura


del tipo FIFO (cola adentro). Las
estructuras FIFO son técnicas
utilizadas pero tienen problemas con
el anidamiento aritmético
Infija
• La notación infija es la más
utilizada por los humanos
porque es la más comprensible
ya que puede poner el operador

6 +8
entre los dos operandos.

• Por ejemplo a + b-5 .

• No existe una estructura simple


para representar este tipo de
notación en la computadora por
esta razón se utilizan otras notas.
Postfija
• La notación postfija pone el
operador al final de los dos
operandos, por lo que la

68
expresión queda: ab + 5-.

+ • La notación posterior utiliza una


estructura del tipo LIFO pila, la
cual es la más utilizada para la
implementación.
Generación de Código Intermedio
• Debería reunir las siguientes características :

• 1. Parecerse al código objeto final.


• 2. Ser fácil de generar a partir del árbol sintáctico.
• 3. Ser independiente del entorno de ejecución.
REPRESENTACIONES DE CÓDIGO INTERMEDIO

• Existen formas formales para identificar código intermedio.

• Estas notas simplifican la traducción de nuestro código fuente a


nuestro código objeto ya que ahorran y acotan símbolos de la tabla de
símbolos

• NOTACIÓN POLACA
• CÓDIGO P
• CÓDIGO DE 3 DIRECCIONES
Notación Polaca
• La notación polaca es la originada por un
Autómata con pila, en la que los operadores
siempre preceden a los operadores sobre los
que actúan, y que tiene la ventaja de no
necesitar paréntesis:
• Se utiliza principalmente para la
representación de expresiones aritméticas.
• Expresión a notación polaca inversa.
• Algoritmo ü representa la expresión en forma
de árbol sintáctico.
• ü Recorrer el árbol en postorden
• Ejemplo: a + b * cd
Ventajas Notación Polaca

Ventajas Desventajas
• Generación de código: simple, • Optimización: es difícil de
no utiliza registros. reordenar ya que hay que
• Interpretación rápida: es muy considerar el contenido de la
fácil de interpretar ya que solo pila.
necesita una pila.
• Transportable: si, ya que todos
los procesadores implementan
una pila.
Código P
• La máquina de código-p, la cual es una máquina virtual, ejecuta
códigos binarios de un procesador hipotético, es decir, el diseñador,
en lugar de usar el conjunto de instrucciones de un procesador como
podría ser el Pentium, etcétera.

Utiliza una serie de códigos de un procesador que no existe en el mundo


real, pero que se simula a través de un programa de computadora, es
decir, de un intérprete que ejecuta las instrucciones de un programa en
código-p o pseudo-código.

• Ejemplos de máquinas virtuales son la Java o el código precompilado


de lenguas como MatLab.
Código de tres direcciones
• Las instrucciones utilizan tres direcciones de memoria o registros: dos para los
operandos y una para el resultado.

• Normalmente las operaciones se representan de la manera siguiente: resultado =


operando1 operador operando2

• Es la representación intermedia más extendida.


Formas de implementar el código de tres
direcciones

•Cuádruplas
•Tripletas
Cuádruplas
• Una cuádrupla es una estructura de tipo registro con cuatro campos: op, result,
arg1 y arg2.

– Por ejemplo, la proposición de tres direcciones x = y + z se representaría como:


(suma, x, y, z).

• En general, las instrucciones que no requieren todos los campos dejan vacíos los
que no utilizan: –

Ej: Las proposiciones con operadores unarios no utilizan arg2


Tripletas
• Como las cuádruplas pero utilizando sólo 3 campos: (op, arg1, arg2)

• Para evaluar una expresión compleja, hay que dividirla en una secuencia
equivalente de expresiones simples.

• Ejemplo: evaluar x = y + 2 requiere dos instrucciones:


(suma, y, 2)
(asigna, x, <resultado_de_la_suma_anterior>)
Tripletas
• Para evitar introducir identificadores temporales en la tabla de símbolos, se hace
referencia a un valor temporal según la posición (línea) de la proposición que lo calcula.

• Originalmente, el resultado de una tripleta anterior se asignaría a una variable temporal


creada por el compilador:

– tmp1 = (suma, y, 2)
– (asigna, x, tmp1)

• Pero es posible evitar identificadores temporales, usando las propias instrucciones para
representan el valor del nombre temporal, eliminando el campo “tmp1” en el que se
guardaba temporalmente el resultado (por innecesario):
(1) (suma, y, 2)
(2) (asigna, x, (1))
Bibliografía
• https://kataix.umag.cl/~jaguila/Compilers/T01_Fases_Compilador.pdf

• http://www.cc.uah.es/ie/docencia/ProcesadoresDeLenguaje/ProcesadoresDeLen
guajeTema7_1xpagina.pdf

• https://5d5eec0cb105c.site123.me/unidades/unidad-2-generaci%C3%B3n-de-
c%C3%B3digo-intermedio

También podría gustarte