4 puntos por miniex 2025-11-11 | Aún no hay comentarios. | Compartir por WhatsApp

Hola, un conocido mío desarrolló recientemente un backend de compilador y me pareció bastante interesante, así que lo comparto.

  1. Introducción al proyecto

Lamina es un backend de compilador multiarquitectura que genera código nativo directamente desde un IR basado en SSA, sin dependencias pesadas como LLVM. Soporta x86_64, AArch64, RISC-V y WebAssembly con un solo IR.

Cuenta que cada vez que hacía un DSL simple o un lenguaje experimental, sentía que era demasiado pesado tener que compilar LLVM y administrar dependencias de varios GB. Empezó con la idea de “hagamos algo ligero donde solo metas el IR y salga ensamblador”.

  1. Características principales

▸ Cero dependencias externas
Convierte directamente de IR a código máquina sin LLVM ni Cranelift.
El tiempo de compilación también es corto y la distribución es simple.

▸ IR basado en SSA
Al estar en forma de Static Single Assignment, la composición del pipeline de optimización queda limpia.

▸ Modelo de memoria explícito
Distingue claramente la asignación en stack/heap a nivel de IR, lo que facilita el análisis de memoria.

▸ Multiarquitectura
Soporte para múltiples targets con un solo IR:

  • x86_64 (Linux, macOS, Windows)
  • AArch64/ARM64 (Linux, macOS, Windows)
  • RISC-V (RV32/64/128)
  • WebAssembly (32/64-bit)

▸ API de IRBuilder
Ofrece una API para construir IR con un estilo funcional.
Según comenta, permite expresar flujo de control u operaciones de memoria con seguridad de tipos.

  1. Estado actual

Ya funcionan operaciones aritméticas básicas, flujo de control como condiciones/ramificaciones/bucles, llamadas a funciones no recursivas y optimizaciones simples.

No está listo para producción, pero dice que es más que suficiente para experimentar con un toy language o como backend para un DSL.

  1. Flujo de trabajo de uso

Más o menos se usa así:

  1. Se analiza el lenguaje fuente y se crea el AST
  2. El AST se convierte a Lamina IR con IRBuilder
  3. Lamina optimiza y genera código nativo para cada target

Si se implementa bien la parte de generación de IR, Lamina se encarga del resto.

  1. Cierre.

Personalmente, eso de “hacer un backend de compilador” siempre me había parecido algo muy lejano, pero ver que un conocido realmente lo hizo me resultó sorprendente.

Claro, no tiene el nivel de madurez ni las optimizaciones de LLVM, pero para experimentar de forma ligera o usarlo con fines educativos, se ve bastante bien.

Yo también desarrollé en la práctica un compilador para Eom Jun-sik Lang usando lamina.

Si les interesa, creo que vale la pena echarle un vistazo.

Aún no hay comentarios.

Aún no hay comentarios.