c010rNews
Infraestructura

LLGo: compilador Go basado en LLVM que integra nativamente el ecosistema C

LLGo, proyecto de XGo, permite compilar Go 1.20‑1.27 con ABI C sin cgo, ofreciendo soporte para WebAssembly y sistemas embebidos.

2 min de lecturaConsole.dev0 vistas

LLGo es un compilador de Go construido sobre LLVM que busca cerrar la brecha entre Go y el ecosistema C. El proyecto forma parte de XGo y se promociona como una forma de usar Go 1.20‑1.27 con compatibilidad total de sintaxis y cgo, pero sin la sobrecarga típica de las llamadas a C.

Compatibilidad y runtime

El compilador acepta código fuente Go 1.20+ y cubre la sintaxis completa de Go 1.27. Las pruebas de compatibilidad se ejecutan contra el toolchain de Go 1.27 y contra versiones intermedias hasta 1.20, registrando diferencias en xfail.yaml. En tiempo de ejecución, LLGo usa un runtime propio: los goroutine se mapean 1:1 a hilos del SO con pilas nativas, lo que elimina la transición de pila y scheduler que implica cgo. El recolector de basura por defecto es el conservador BDWGC (libgc); en objetivos bare‑metal se emplea un colector derivado de TinyGo y es posible desactivar la GC con la etiqueta nogc.

Interoperabilidad C/C++

LLGo permite importar y llamar a librerías C/C++ directamente mediante la directiva go:linkname. No se necesita generar wrappers ni usar cgo, por lo que las llamadas son tan rápidas como una función nativa. El proyecto incluye bindings manuales para gran parte de la biblioteca estándar de C y C++ (syscall, math, pthread, std::…); entre los paquetes disponibles están c/math, c/openssl, cpp/llvm y c/libuv. Los bindings se mantienen a mano, aunque se menciona que en el futuro se automatizará el proceso, como ya ocurre para importaciones de Python.

Targets soportados

Actualmente LLGo cubre:

  • Linux y macOS nativos (amd64/arm64).
  • WebAssembly (js/wasm y wasip1/wasm) con artefactos que generan módulos WASI y Emscripten.
  • Plataformas embebidas mediante configuraciones ‑target para boards y MCUs, con pruebas en QEMU.

Los artefactos de release incluyen binarios para Linux y macOS, además de builds para WASM y WASI. Los tests de CI verifican la compatibilidad de la biblioteca estándar y de cada paquete público contra las versiones de Go soportadas.

Cómo probarlo

El repositorio ofrece ejemplos en el directorio _demo. Un caso típico es llamar a printf de C desde Go:

import "github.com/goplus/lib/c"
func main() { c.Printf(c.Str("Hello world\n")) }

Para ejecutar el demo basta con llgo run . dentro del directorio correspondiente. Otros ejemplos muestran el uso de qsort con callbacks y la interacción con APIs de Windows mediante la convención stdcall.

LLGo aún está en fase de desarrollo activo, pero ya permite compilar aplicaciones Go que requieren llamadas frecuentes a código C sin el coste de cgo, lo que lo hace atractivo para proyectos de juegos, IA, ciencia de datos, WebAssembly y desarrollo embebido. La comunidad deberá observar cómo evoluciona el soporte de paquetes y la estabilidad del runtime en los próximos lanzamientos.

Relacionado