Compiladores

{

Lenguaje Intermedio:
TAC y Representaciones

}

x = (a + b) * (c - d)⟶t1 = a + b  ·  t2 = c - d  ·  …

Andrés Felipe Ramírez Mackenzie  ·  Keiner Zúñiga Romero  ·  Mateo Villarreal Garnica

Hoja de ruta

¿Qué vamos a ver?

  1. 01
    Propósito, ventajas y rolde la representación intermedia (IR)
  2. 02
    Código de tres direccionesTAC: la IR lineal más usada
  3. 03
    Estructuras de datosAST, DAG, cuádruplas y triples
  4. 04
    Ejemplos en vivoexpresiones, if / else y while
  5. 05
    Buenas prácticasy problemas comunes
  6. 06
    Mini app y actividadgenerador de TAC y cuádruplas
Compiladores · Lenguaje intermedio

Ubicación en el compilador

¿Dónde entra la Representación Intermedia?

Propósito

¿Por qué no traducir directo a código máquina?

Rol de la IR

Ventajas y desventajas

+Ventajas

  • PortabilidadNuevo lenguaje o nueva máquina = una sola pieza nueva.
  • Optimización independiente de la máquinaSe optimiza una vez y sirve para todos los destinos.
  • ModularidadFront-end y back-end se construyen y prueban por separado.
  • Fácil de analizarInstrucciones simples: un operador cada una.

−Desventajas

  • Una fase másAumenta el tiempo de compilación.
  • Más memoriaTemporales y estructuras adicionales.
  • Pérdida de informaciónAl bajar de nivel se pierden tipos y estructura del fuente.
  • Difícil de diseñarUn nivel de abstracción mal elegido limita las optimizaciones.
Compiladores · Lenguaje intermedio

Representaciones

Tipos de representación intermedia

Gráficas

estructura del programa

* a − b c

AST · DAG

Lineales

secuencia de instrucciones

TAC
t1 = b - c
t2 = a * t1
Pila
push a
push b
push c
sub
mul

TAC · código de pila

Híbridas

grafo + código lineal

B1 B2 B3

CFG: bloques básicos con TAC

Alto nivelcerca del lenguaje fuente
ASTDAGTACEnsamblador
Bajo nivelcerca de la máquina
En compiladores reales: GCC GENERIC → GIMPLE (TAC) → RTL LLVM IR TAC en forma SSA JVM / .NET bytecode de pila
Compiladores · Lenguaje intermedio

Foco del tema

¿Qué es el Código de Tres Direcciones (TAC)?

Como máximo un operador a la derecha y hasta tres direcciones.

t1resultado = barg1 +operador carg2

Una dirección puede ser:

  • Nombrevariable del programa: a, x
  • Constantevalor literal: 4, 3.14
  • Temporalcreado por el compilador: t1, t2
Formas de instrucción
x = y op zoperación binaria
x = op yoperación unaria (minus)
x = ycopia
goto Lsalto incondicional
ifFalse x goto Lsalto condicional
if x < y goto Lsalto con comparación
param x · call p, nllamada a procedimiento
x = y[i] · x[i] = yarreglos
x = &y · x = *ydirecciones y punteros
Formas según Aho et al. (2006), §6.2.1

Demo 1 · Estructura

De la expresión al AST

Demo 2 · Del árbol al código

Del AST al TAC: recorrido en postorden

Demo 3 · Subexpresiones comunes

AST vs. DAG

Demo 4 · Estructuras de datos

Cuádruplas, triples y triples indirectos

Cara a cara

¿Cuál estructura conviene?

CriterioCuádruplasTriplesTriples indirectos
Camposop, arg1, arg2, resultop, arg1, arg2triples + lista de punteros
Referencia a un resultadopor nombre (temporal)por posición (n)por posición, vía la lista
Memoriamayormenorintermedia
Al reordenar / optimizarno cambia nadarenumerar referenciassolo se reordena la lista

Por eso los compiladores que optimizan mucho prefieren cuádruplas o triples indirectos.

Aho et al. (2006), §6.2.2 – 6.2.3

Demo 5 · Control de flujo

if / else en TAC

Demo 6 · Ciclos

while en TAC: el salto hacia atrás

Buenas prácticas y problemas comunes

Errores típicos y cómo evitarlos

Demasiados temporales

Reutilizar temporales libres y usar el DAG para no recalcular.

Copias innecesarias

t3 = t1 * t2; x = t3 → asignar directo: x = t1 * t2.

Ignorar precedencia o asociatividad

Generar el TAC desde el AST, nunca desde el texto plano.

Saltar a una etiqueta que aún no existe

Backpatching: dejar el destino pendiente y completarlo después.

Mezclar tipos (int + float)

Conversión explícita: t1 = inttofloat i.

Reordenar triples rompe referencias

Usar cuádruplas o triples indirectos si se va a optimizar.

Compiladores · Lenguaje intermedio

Mini app

{

Generador de TAC
y Cuádruplas

}

Escribe una expresión algebraica → obtén su AST, TAC, cuádruplas y triples.

Actividad interactiva

{ ¡Ahora les toca! }

5 retos rápidos sobre lo que acabamos de ver. Gana quien más acierte… y más rápido.

  1. 1
    Escanea el códigocon la cámara del teléfono
  2. 2
    Escribe tu nombreasí apareces en el ranking
  3. 3
    Resuelve los 5 retossolo toques · unos 2 minutos
Código QR para entrar a la actividad: actividad-tac.pages.dev
actividad-tac.pages.dev
Compiladores · Lenguaje intermedio

Para llevar

Ideas clave

  1. 1

    La IR es el puente entre front-end y back-end: m × n → m + n.

  2. 2

    TAC: un operador y hasta tres direcciones por instrucción, usando temporales.

  3. 3

    El AST se traduce a TAC en postorden; el DAG evita recalcular subexpresiones.

  4. 4

    Cuádruplas nombran resultados; triples usan posiciones; los indirectos facilitan reordenar.

  5. 5

    El control de flujo se traduce con saltos y etiquetas.

Compiladores · Lenguaje intermedio

Fuentes

Referencias

  1. A. V. Aho, M. S. Lam, R. Sethi y J. D. Ullman, Compilers: Principles, Techniques, and Tools, 2.ª ed. Addison-Wesley, 2006. Cap. 6: Intermediate-Code Generation. (Ed. en español: Compiladores: principios, técnicas y herramientas, Pearson, 2008.)
  2. K. D. Cooper y L. Torczon, Engineering a Compiler, 2.ª ed. Morgan Kaufmann, 2012. Cap. 5: Intermediate Representations.
  3. C. Lattner y V. Adve, “LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation”, en Proc. CGO 2004, pp. 75–86. llvm.org/pubs/2004-01-30-CGO-LLVM.html
  4. LLVM Project, LLVM Language Reference Manual. llvm.org/docs/LangRef.html
  5. Free Software Foundation, GNU Compiler Collection Internals, sección “GIMPLE”. gcc.gnu.org/onlinedocs/gccint/GIMPLE.html
  6. W3C, Web Content Accessibility Guidelines (WCAG) 2.2, 2023 — criterios de contraste usados en el diseño. w3.org/TR/WCAG22
Ejemplos de las demos 3 y 4: Aho et al. (2006), Ej. 6.1 y Figs. 6.10 – 6.12

Compiladores

{

¡Gracias!
¿Preguntas?

}
Lenguaje Intermedio: TAC y Representaciones