LLVM (Low Level Virtual Machine) es una infraestructura de compiladores que permite transformar y optimizar código de distintos lenguajes de programación. No es un compilador único, sino un conjunto de herramientas que sirven para crear compiladores, analizadores y optimizadores de código.
En este blog ya hemos hablado, burdamente, de lo que conforma un lenguaje de programación. Sin embargo, sería importante recordar algunos detalles.
Un compilador es un programa que traduce el código que escribes (por ejemplo en C, Rust o Java) a un lenguaje que la computadora entiende directamente: el código máquina. Ejemplo, tú escribes una receta en español, el compilador la traduce al "idioma" de la computadora para que pueda cocinarla.
Un analizador de código es la parte del compilador que lee y entiende tu código fuente. Verifica que lo que escribiste tenga sentido (sintaxis correcta, variables bien usadas, etc.). Es como un profesor que revisa tu redacción y te dice si las frases están bien construidas antes de publicarlas.
Un optimizador de código es una herramienta que mejora el código para que sea más rápido o consuma menos recursos. Reorganiza instrucciones, elimina pasos innecesarios y aprovecha mejor el hardware. Llanamente, el optimizador busca el camino más corto y rápido para llegar a algo.
Estos tres se relacionan de esta manera:
- Analizador: entiende tu código y lo valida.
- Compilador: traduce ese código a instrucciones que la máquina entiende.
- Optimizador: pule esas instrucciones para que se ejecuten de la mejor manera posible.
LLVM al ser un conjunto de bibliotecas y herramientas que permiten construir compiladores y optimizadores no está limitado a un lenguaje específico; se usa en C, C++, Rust, Swift, Julia, Haskell, entre otros. Está diseñado como bloques reutilizables (frontends, optimizadores, backends).
¿Para qué sirve LLVM?
- Compilación: Convierte código fuente en código máquina optimizado.
- Optimización: Mejora el rendimiento del código en tiempo de compilación y ejecución.
- Portabilidad: Permite que un mismo lenguaje se ejecute en múltiples plataformas.
- Experimentación: Ideal para investigadores y desarrolladores que quieren crear nuevos lenguajes o probar técnicas de optimización.
- Ejemplo real: El compilador Clang (para C/C++/Objective-C) está construido sobre LLVM.
¿Qué hace LLVM?
- Traduce código a un lenguaje intermedio (LLVM IR) que es más fácil de analizar y optimizar.
- Optimiza ese código para que sea más rápido y eficiente.
- Genera código máquina para distintas arquitecturas (x86, ARM, etc.), lo que permite que tu programa corra en diferentes dispositivos.
LLVM es como el motor universal que hace funcionar muchos lenguajes modernos (Rust, Swift, Julia, Haskell).
Como desarrollador, puedes usarlo para compilar, optimizar y experimentar con lenguajes modernos o incluso crear el tuyo propio.
Probando LLVM
Vamos a comenzar instalandolo:
Linux:
$ sudo apt update $ sudo apt install llvm clang
Windows:
$ choco install llvm
Vamos a crear un sencillo programa que verifique si un número entero es mayor a 100.
mayor.c
#include <stdio.h> int main() { printf("\t Determinar si un número es mayor a 100 \n");
int numero = 120; if (numero > 100) { printf("El número es mayor que 100\n"); } else { printf("El número es menor o igual a 100\n"); } return 0; }
Compilams con la herramienta ``clang``:
$ clang mayor.c -o mayor
Creará un ejecutable:
$ ./mayor
Salida:
El número es mayor que 100
Ahora usaremos LLVM para ver el código intermedio (LLVM IR):
$ clang -S -emit-llvm mayor.c -o mayor.ll
Esto genera un archivo ``mayor.ll`` con el Intermediate Representation (IR). En ese archivo verás instrucciones más “básicas” que LLVM entiende, por ejemplo:
define i32 @main() { entry: %numero = alloca i32, align 4 store i32 120, i32* %numero, align 4 %0 = load i32, i32* %numero, align 4 %cmp = icmp sgt i32 %0, 100 br i1 %cmp, label %if.then, label %if.else ... }
Optimizamos el código:
$ clang -S -emit-llvm mayor.c -o mayor.ll
Esto genera una versión optimizada del IR, eliminando redundancias y mejorando el rendimiento.
Enlaces:
https://llvm.org/https://codemonkeyjunior.blogspot.com/2024/02/lo-que-conforma-un-lenguaje-de.html
https://clang.llvm.org/
https://es.wikipedia.org/wiki/LLVM
https://www.reddit.com/r/ProgrammingLanguages/comments/kl7n03/what_is_meant_by_llvm_and_a_language_frontend/
https://aosabook.org/en/index.html


No hay comentarios:
Publicar un comentario