LLVM
# LLVM

LLVM (anteriormente conocido como Low Level Virtual Machine, o Máquina Virtual de Bajo Nivel) es una infraestructura para desarrollar compiladores, escrita a su vez en el lenguaje de programación C++, que está diseñada para optimizar el tiempo de compilación, el tiempo de enlazado, el tiempo de ejecución y el "tiempo ocioso" en cualquier lenguaje de programación que el usuario quiera definir. Implementado originalmente para compilar C y C++, el diseño agnóstico de LLVM con respecto al lenguaje, y el éxito del proyecto han engendrado una amplia variedad de lenguajes, incluyendo Objective-C, Fortran, Ada, Haskell, bytecode de Java, Python, Ruby, ActionScript, GLSL, Clang, Rust, Gambas y otros.

El proyecto LLVM comenzó en 2000 en la Universidad de Illinois en Urbana-Champaign, bajo la dirección de Vikram Adve y Chris Lattner. LLVM fue desarrollado inicialmente bajo la Licencia de código abierto de la Universidad de Illinois, una licencia de tipo BSD. En 2005, Apple Inc. contrató a Lattner y formó un equipo para trabajar en el sistema de LLVM para varios usos dentro de los sistemas de desarrollo de Apple. LLVM es parte integrante de las últimas herramientas de desarrollo de Apple para Mac OS X e iOS.

El nombre "LLVM" era en principio las iniciales de "Low Level Virtual Machine", pero esta denominación causó una confusión ampliamente difundida, puesto que las máquinas virtuales son solo una de las muchas cosas que se pueden construir con LLVM. Cuando la extensión del proyecto se amplió incluso más, LLVM se convirtió en un proyecto paraguas que incluye una multiplicidad de otros compiladores y tecnologías de bajo nivel, haciendo el nombre aún menos adecuado. Por tanto, el proyecto abandonó las iniciales. Actualmente, LLVM es una "marca" que se aplica al proyecto paraguas, la representación intermedia LLVM, el depurador LLVM, la biblioteca estándar de C++ definida por LLVM, etc.

## Descripción

LLVM suministra las capas intermedias de un sistema de compilado completo, tomando el código en lenguaje intermedio llamado "forma intermedia" (también conocida como IF, por sus siglas en inglés, de Intermediate Form) de un compilador y emitiendo un IF optimizado. Este nuevo IF puede ser convertido y enlazado en un código ensamblador dependiente de la máquina concreta para una plataforma objetivo. LLVM puede aceptar el IF generado por la cadena de herramientas GCC, permitiendo así que sea utilizado con todos los lenguajes que a su vez son aceptados por GCC.

LLVM también puede generar código máquina relocalizable en el momento de compilación o de enlazado, o incluso código máquina binario en el momento de ejecución.

LLVM permite un conjunto de instrucciones y sistema de tipos independientes del lenguaje. Cada instrucción está en una forma estática de asignación única (SSA, en inglés, static single assignment), es decir, que cada variable (llamado un registro tipado) es asignada una sola vez y congelado. Esto ayuda a simplificar el análisis de las dependencias entre variables. LLVM permite que el código sea compilado estáticamente, al igual que lo es bajo el sistema GCC tradicional, o por el contrario que se deje para una compilación tardía desde la IF a código máquina en una compilación en tiempo de ejecución de manera similar a como lo hace Java. El sistema de tipos consiste de tipos básicos como entero, números de coma flotante y cinco tipos de datos compuestos (en inglés): punteros, vectores, matrices, tuplas y funciones. Un constructo tipado en un lenguaje concreto puede ser representado combinando estos tipos básicos en LLVM. Por ejemplo, una clase en C++ puede ser representada por una combinación de estructuras, funciones y matrices de punteros a funciones.

El compilador de tiempo de ejecución puede optimizar ramales estáticos no utilizados de un programa durante la ejecución, y por tanto es útil para la evaluación parcial en los casos en los que un programa tiene muchas opciones, muchas de las cuales pueden ser determinadas como innecesarias en un entorno específico. Esta característica es usada en la pipeline de OpenGL en el Mac OS X Leopard (v10.5) para proporcionar soporte a características ausentes del hardware. El código de gráficos dentro de la pila de OpenGL se dejó en forma intermedia, y después compilado cuando se ejecuta en la máquina de destino. En sistemas con GPUs de gama alta, el código resultante era bastante escaso y redirigía las instrucciones a la GPU con cambios mínimos. En sistemas con GPUs de gama baja, LLVM compilaba procedimientos opcionales para que se ejecutaran en la unidad central de procesamiento (CPU) local que emularan las instrucciones que la GPU no podía ejecutar internamente. LLVM mejoró el rendimiento de las máquinas de gama baja que usaban conjuntos de chips Intel GMA. Un sistema similar fue desarrollado bajo la Gallium3D LLVMpipe e incorporado en la shell de GNOME para permitir que se ejecute sin una GPU.

Por contraste, en los casos en que el rendimiento puro es medido como referencia, LLVM 2.9 va por detrás de GCC 4.6.1 en calidad del código, entendida como velocidad de los programas compilados, en torno al 10% de media, a la vez que compila de 20 a 30% más rápido.

## Frontales

LLVM fue escrito originalmente como un sustituto de un generador de código ya existente dentro de la pila GCC, y muchos de los frontales para GCC han sido modificados para trabajar con él. Algunos de los frontales actualmente incluidos en LLVM fueron derivados de las versiones 4.0.1 y 4.2 de la GNU Compiler Collection.

El amplio interés que ha recibido LLVM ha llevado a una serie de tentativas para desarrollar frontales totalmente nuevos para una variedad de lenguajes. El que ha recibido la mayor atención es Clang, un nuevo compilador que soporta C, Objective-C y C++. Apoyado principalmente por Apple, Clang aspira a reemplazar al compilador de C y Objective-C en el sistema GCC con un sistema más moderno que sea más fácil de integrar con entornos de desarrollo integrado (IDEs), y que tenga un soporte más amplio para multihilo. El desarrollo de Objective-C bajo GCC estaba estancado y los cambios de Apple en el lenguaje eran soportados en una rama mantenida por separado. Crear su propio compilador les permitió abordar muchos de los mismos problemas que LLVM abordó para la integración con IDEs y otras características modernas, a la vez que hacer la rama principal de desarrollo la rama de implementación de Objective-C.

El compilador de Haskell de Utrecht puede generar código para LLVM que, a pesar de que el generador está en las primeras etapas de desarrollo, ha demostrado en varias ocasiones ser más eficiente que el generador de código C. El Glasgow Haskell Compiler (GHC) tiene un sistema de back-end de LLVM en funcionamiento que consigue una aceleración del 30% en el código compilado comparado con código nativo compilado mediante GHC o generación de código C seguida de compilación, faltando solo una de las muchas técnicas de optimización realizadas por GHC.

Existen muchos otros componentes en varios estados de desarrollo; incluyendo, sin ser exhaustivos, un frontal para bytecode de Java, un frontal para CPython la implementación de Ruby 1,9 para Mac (MacRuby), varios frontales para Standard ML, y un nuevo asignador de registros de coloración de grafos.

