El 3-address code es una representación intermedia de código utilizada por los compiladores para facilitar la optimización y la generación de código máquina. Cada instrucción en 3-address code tiene la forma `resultado = operando1 operador operando2`, o una variante unaria como `resultado = operador operando1`. Esto significa que cada operación aritmética o lógica se descompone en una instrucción separada, y los resultados intermedios se almacenan en variables temporales explícitas. Esta granularidad simplifica el análisis de flujo de datos y el análisis de dependencia, lo que es crucial para aplicar diversas optimizaciones de compilador.
Esta representación es fundamental en la mayoría de los compiladores modernos. Por ejemplo, el compilador GCC utiliza una representación intermedia llamada 'GIMPLE' que es una forma de 3-address code. El compilador LLVM también emplea una representación intermedia (LLVM IR) que comparte muchas características con el 3-address code, permitiendo optimizaciones independientes del lenguaje fuente y de la arquitectura de destino. Otros ejemplos incluyen el bytecode de Java (JVM bytecode) y el Common Intermediate Language (CIL) de .NET, que, aunque no son estrictamente 3-address code, operan con un nivel de abstracción similar que facilita la optimización y la portabilidad.
Para un Arquitecto de Sistemas, entender el 3-address code es clave para apreciar cómo los lenguajes de alto nivel se traducen y optimizan. Permite comprender los trade-offs en el diseño de lenguajes y runtimes. Por ejemplo, un lenguaje que se compila a una forma de 3-address code puede beneficiarse de un ecosistema de optimizaciones maduro, lo que lleva a un mejor rendimiento. Al diseñar sistemas que involucran compilación Just-In-Time (JIT) o transpilación, la elección de una representación intermedia similar al 3-address code puede simplificar enormemente la implementación de optimizaciones y la generación de código eficiente para múltiples arquitecturas. La capacidad de razonar sobre el rendimiento a nivel de instrucción y el impacto de las optimizaciones del compilador es un activo estratégico para la toma de decisiones sobre plataformas y herramientas.