¿Qué es LLVM? Primeros pasos con LLVM

¿Qué es LLVM? Primeros pasos con LLVM

LLVM es un proyecto que proporciona una colección de un compilador modular y software y tecnologías de cadena de herramientas. El nombre “LLVM” no es un acrónimo que lo diferencie de otros proyectos de TI y Opensource. LLVM ha iniciado un proyecto de investigación en la Universidad de Illinois para crear un compilador y una cadena de herramientas que admita la compilación tanto estática como dinámica para diferentes lenguajes de programación. Incluso diferentes lenguajes de programación como C, C++, Java, C#, Kotlin, Delphi, Rust, Ruby son compatibles. Los lenguajes de programación más populares son C y C++ para el compilador y la cadena de herramientas LLVM.

Soporte de hardware y sistema operativo LLVM

Como proyecto de código abierto, LLVM es compatible con diferentes sistemas operativos, plataformas y hardware. LLVM puede ejecutarse en los sistemas operativos Linux, Solaris, FreeBSD, NetBSD, MacOSX y Windows. LVVM también admite diferentes arquitecturas de hardware y procesador como x86, amd64, x86_64, PowerPC, V9, ARM. Para hardware más específico y soporte operativo, consulte la siguiente tabla.

Lenguajes de programación compatibles con LLVM

Como se indicó al principio, LLVM admite una amplia gama de lenguajes de programación para compilar y enlazar. Incluso algunos lenguajes de programación no son totalmente compatibles con LLVM. Enumeraremos los lenguajes de programación admitidos y el nivel de soporte y las funciones admitidas.

C y C++ son los mejores lenguajes de programación para LLVM. Incluso LLVM se crea como un compilador dinámico y la cadena de herramientas C y C++ son los principales objetivos de soporte. Además, LLVM está desarrollado con C++.

Objective-C es otro lenguaje de programación completamente compatible similar a C y C++.

Arquitectura y componentes LLVM

LLVM proporciona una arquitectura completa donde hay diferentes componentes y piezas para completar la imagen. LLVM proporciona Front End, Passes y Back End. El siguiente gráfico ilustra cómo funciona LLVM en el código fuente y genera archivos ejecutables y binarios.

Front End tomará el código fuente y lo convertirá a intermediate representation o IR . Este es un proceso de preparación para los otros pasos y el compilador donde LLVM se ejecuta correctamente. Front End no es la parte central de LLVM y generalmente se utiliza un software auxiliar o una herramienta como Clang.

Pass o IR es la tarea central del LLVM donde se lleva a cabo el proceso de compilación. El código IR o intermedio se optimizará una y otra vez con múltiples fases.

Back End es el último paso donde el código IR optimizado se convertirá en el código de máquina que es específico para una arquitectura de CPU o sistema operativo.

A continuación, enumeraremos algunas herramientas y componentes importantes del LLVM.

Clang es el compilador creado específicamente para LLVM. Clang puede compilar el código IR en ejecutables y binarios. Además, Clang es casi 3 veces más rápido que el compilador GCC.

LLDB es el depurador creado para el proyecto LLVM. LLDB es más rápido y eficiente que GDB y está estrechamente integrado con el núcleo de LLVM y Clang.

libc++ y libc++ ABI son implementaciones de biblioteca estándar de C++.

compiler-rt es una utilidad de prueba dinámica para código de bajo nivel. Se puede usar para ejecutar y enviar mensajes de texto con el código de bajo nivel en tiempo real.

LLVM Core es el componente central de LLVM, donde las bibliotecas centrales brindan optimización y compatibilidad con la generación de código para diferentes arquitecturas de CPU y hardware.

LLVM frente a CCG

Gnu Compiler Collection o GCC es otro proyecto de compilador de código abierto popular y ampliamente utilizado. Antes de que surgiera LLVM, GCC era un compilador de facto para diferentes mundos de código abierto. Con LLVM las cosas empezaron a cambiar y con sus ventajas LLVM también se hizo popular. A continuación compararemos el LLVM y el GCC desde diferentes puntos de vista.

  • GCC admite lenguajes de programación más tradicionales como Ada, Fortran y Go que LLVM.
  • GCC admite más arquitecturas de hardware y CPU como RISC-V que LLVM.
  • GCC admite más extensiones de lenguaje y funciones de lenguaje ensamblador que LLVM.
  • LLVM es utilizado por lenguajes emergentes como Swift, Rust, Julia y Ruby, luego GCC.
  • LLVM cumple con los lenguajes de programación C y C++ más estrictamente que GCC.
  • LLVM proporciona información de diagnóstico más precisa y amigable que GCC.

Instalar LLVM

LLVM se puede instalar en los sistemas operativos Linux y Ubuntu como se muestra a continuación. Proporcionaremos los nombres de los paquetes llvm-10 y llvm-10-tools para instalar las bibliotecas y herramientas principales de LLVM versión 10.

$ sudo apt install llvm-10 llvm-10-tools clang

Primeros pasos con LLVM

Hemos instalado los paquetes necesarios llamados llvm-10, llvm-10-tools y clang. Ahora compilaremos un ejemplo simple de hola mundo con el LLVM como ejemplo de inicio. El código fuente de la aplicación hello world se proporciona a continuación.

#include <stdio.h>

int main()
{
   printf("Hello World From Poftut.com via LLVM");

   return 0;

}

Compilaremos y crearemos el ejecutable llamado hello_world con el comando clang como se muestra a continuación. El LLVM será ejecutado por el comando clang bajo el capó.

$ clang hello_world.c -o hello_world

El ejecutable hello_world recién creado se puede ejecutar desde la consola o desde la línea de comandos bash como se muestra a continuación.

$ ./hello_world