# Lenguaje intermedio

En ciencias de la computación, un lenguaje intermedio es el lenguaje de una máquina abstracta diseñada para ayudar a realizar el análisis de un programa informático. El término proviene de su uso en compiladores, donde el código fuente de un programa es traducido a un modo más apropiado para transformaciones de mejora de código antes de generar el código objeto o código máquina para una máquina determinada. El diseño del lenguaje intermedio difiere típicamente del lenguaje de máquina de tres maneras fundamentales:
* Cada instrucción representa exactamente una operación fundamental; por ejemplo, los modos de direccionamiento "shift-add" (desplazar y añadir) comunes en microprocesadores no están presentes.
* La información de la estructura de control puede no estar incluida en el juego de instrucciones.
* El número de registros disponibles puede ser grande, incluso ilimitado.
Un formato popular para lenguajes intermedios es el de código de tres direcciones.
El término también es usado para referirse a lenguajes usados como intermedios por algunos lenguajes de alto nivel que no crean código objeto o código máquina por sí mismos, sino que solamente el lenguaje intermedio. Este lenguaje intermedio es enviado a un compilador para tal lenguaje, que genera el código objeto o código máquina finalizado. Esto se suele hacer para facilitar el proceso de optimización o para incrementar la portabilidad mediante el uso de un lenguaje intermedio que tenga compiladores para la mayoría de CPUs y sistemas operativos, como puede ser C. Los lenguajes usados para esto tienen una complejidad que se sitúa entre los lenguajes de alto y bajo nivel, como el lenguaje ensamblador.

## Representación intermedia

Una representación intermedia (RI) es una estructura de datos creada a partir de los datos de entrada de un programa informático y de la que parte o la totalidad de los datos de salida son construidos por turno. El uso del término suele implicar que la mayoría de la información presente en la entrada es guardada por la representación intermedia junto con más anotaciones o características de búsqueda rápida.
Un ejemplo canónico se encuentra en la mayoría de compiladores modernos, donde el texto linear entendible por los humanos es transformado en un grafo que permite el análisis del flujo de datos y recolocaciones antes de empezar a crear la lista de instrucciones del CPU que harán el trabajo. El uso de una representación intermedia permite a sistemas de compiladores como GNU GCC y LLVM poder tener como destino diferentes códigos fuente y admiten su generación para diferentes tipos de arquitectura.

## Lenguajes

Aunque no está específicamente diseñado como un lenguaje intermedio, la naturaleza de C como una abstracción del lenguaje ensamblador y su uso como lenguaje de sistema en Unix-like y otros sistemas operativos lo han convertido en un lenguaje intermedio popular: Eiffel, Sather, Esterel, algunos dialectos de Lisp (Lush, Gambit, Haskell, Glasgow Haskell Compiler), Squeak, Cython, Seed7, Vala y otros usan C como un lenguaje intermedio. Variantes de C han sido diseñadas para proveer a C de características como un lenguaje ensamblador portable, incluyendo C-- o el lenguaje intermedio de C.
El Common Intermediate Language de Microsoft es un lenguaje intermedio diseñado para ser compartido por todos los compiladores del .NET Framework antes de ser generado el código máquina.
El GNU Compiler Collection (GCC) usa varios lenguajes intermedios internamente para simplificar la portabilidad. Entre esos lenguajes están:
* el histórico Register transfer language (RTL)
* el lenguaje de árbol GENERIC
* el basado en SSA, GIMPLE
Mientras la mayoría de lenguajes son diseñados para soportar lenguajes escritos estáticamente, la representación intermedia de Parrot está diseñada para soportar lenguajes escritos dinámicamente (inicialmente Perl y Python).
El lenguaje intermedio ILOC es usado en clases de diseño de compiladores como un lenguaje destino simple.