Generador de código intermedio

El código intermedio es una representación abstracta de un programa que se genera después del análisis léxico y sintáctico, pero antes de la generación de código máquina. Sirve como un paso intermedio en el proceso de compilación.

En este paso:

  • El programa se traduce a un conjunto de instrucciones simples.
  • Estas instrucciones son más fáciles de interpretar o traducir a lenguaje ensamblador o máquina.
  • El código intermedio es independiente de la arquitectura de hardware específica, lo que facilita su portabilidad.

Formas de representar el código intermedio

Código de Tres Direcciones (TAC)

Es una representación basada en operaciones simples, donde cada instrucción tiene como máximo tres operandos:

  1. Un destino (el resultado de la operación).
  2. Dos operandos (pueden ser variables, constantes o temporales).
  3. Un operador (como +, -, *, /, etc.).
Se muestra un ejemplo de TAC en la siguiente Figura:
Figura 11 Ejemplo general (en TAC).


Pseudocódigo de Pila
Este enfoque utiliza una estructura de pila para evaluar las operaciones. Las instrucciones empujan y sacan valores de la pila según sea necesario.Como se muestra en la Figura 12:

Figura 12 Ejemplo general (en pseudocódigo de pila).


Representación en Árboles de Sintaxis Abstracta (AST)

El código se organiza como un árbol donde los nodos representan operadores, y las hojas, operandos. Este enfoque es útil para análisis y optimización.Se muestra un ejemplo en la siguiente figura:

Figura 13 Ejemplo general (AST).



Nuestro lenguaje en español

Recordemos la gramática que hemos definido en el mini lenguaje para las asignaciones y expresiones:


Figura 14 Gramática lenguaje en español.

La Figura 14 muestra la estructura gramatical de nuestro lenguaje en español.Esta gramática nos permite escribir y procesar instrucciones como:

x = x + 1;
y = x * 2;



Generación de Código Intermedio con Ejemplos

Asignación simple:
Entrada en el mini lenguaje: x = x + 1;

Paso 1: Identificar las partes de la asignación

  • x es el lado izquierdo (variable asignada).
  • x + 1 es una expresión que necesita evaluación.
  • El operador de asignación = indica que el resultado debe almacenarse en x.

Paso 2: Generar código intermedio (TAC)

  1. Evaluamos x + 1 y almacenamos el resultado en un temporal t1.
  2. Asignamos el valor de t1 a x.
Código Intermedio (TAC):
t1 = x + 1
x = t1

Código Intermedio (Pseudocódigo de pila):
PUSH x
PUSH 1
ADD
POP x


Construcción del Código Intermedio

La construcción del código intermedio requiere recorrer el Árbol de Sintaxis Abstracta (AST) generado durante el análisis sintáctico.

Pasos:

  1. Recorrido en postorden del AST:
    Procesamos primero las hojas (operandos) y luego los nodos internos (operadores).

  2. Generación de temporales:
    Cada operación genera un temporal para almacenar resultados intermedios.

  3. Emisión de instrucciones TAC o de pila:
    Las instrucciones se generan en el orden en que se recorren los nodos.



Dejo el link de un video para una mayor explicación del tema:
GUTIERREZ ROMERO DIANA. (2021, 28 octubre). GENERACION DE CODIGO INTERMEDIO [Vídeo]. YouTube. https://www.youtube.com/watch?v=mvXNeTvOSVQ




Referencias:

Silvino, A. C. J. J. E. H. E. I. G. R. G. G. N. G. y. R. G. (s. f.-b). UNIDAD VIII.-Generación de código intermedio. http://cursocompiladoresuaeh.blogspot.com/2010/11/unidad-viii-generacion-de-codigo.html



Compilador Diseño - Generación de código intermedio. (s. f.-c). https://www.tutorialspoint.com/es/compiler_design/compiler_design_intermediate_code_generations.htm










Comentarios

Entradas más populares de este blog

INTRODUCCION