Babashka 1.13.220 lanza FFI y cambia su binario a casi‑estático
La nueva versión de Babashka incluye un namespace babashka.ffi para llamar librerías C, y cambia el binario de Linux a una variante casi‑estática que enlaza dinámicamente solo glibc.
Babashka 1.13.220 llega con FFI
La última release de Babashka, 1.13.220, introduce el namespace babashka.ffi. Con él, los scripts de Babashka pueden cargar directamente librerías C y llamar a sus funciones. El API sigue siendo experimental y no se planean cambios futuros, aunque el autor solicita retroalimentación.
Primeros pasos con la nueva capa
Para usar FFI basta con requerir el namespace y declarar la función:
(require '[babashka.ffi :as ffi :refer [defcfn]])
(def zlib (ffi/load-system-library "z"))
(def zlib-version (ffi/cfn zlib "zlibVersion" [] :string))
(zlib-version) ;; => "1.3.1"
El mismo patrón funciona con cualquier librería del sistema:
(ffi/load-library {:mac "libm.dylib" :linux "libm.so.6" :windows "ucrtbase.dll"})
(defcfn cos "cos" [:double] :double)
(defcfn pow "pow" [:double :double] :double)
(cos 0.0) ;; => 1.0
(pow 2.0 10.0) ;; => 1024.0
La API se inspira en coffi, pero añade la posibilidad de pasar una función o un delay que resuelva la librería, y un concepto de place (inspirado en Specter) que permite leer y escribir estructuras de forma eficiente. El manejo de memoria se hace a través de arenas de java.lang.foreign, lo que evita segfaults y permite usar with-open para liberar recursos.
Cambios en el binario de Linux
Antes, la distribución de Linux era estática por defecto para evitar dependencias con la libc del host. Con esta release se invierte la política: el binario es mayormente estático, enlazando solo glibc dinámicamente. El binario aarch64 ya estaba en esta forma. En contenedores, el proceso pincha la versión mínima de glibc para asegurar compatibilidad con todas las LTS actuales. Si prefieres la variante 100% estática, el instalador permite pasar --static.
Instalación y compatibilidad
Para habilitar FFI necesitas el binario dinámico. Si usas un gestor de paquetes o una acción de GitHub, puede que todavía apunte a la versión antigua; abre un issue en el repositorio de Babashka y se ajustará. También puedes usar el instalador directamente:
curl -sLO https://raw.githubusercontent.com/babashka/babashka/master/install
bash install --dir /tmp/bb-test
/tmp/bb-test/bb -e "(require '[babashka.ffi :as ffi]) (ffi/load-system-library \"z\")"
El script detecta la versión de glibc y selecciona la variante adecuada.
Bibliotecas y demos
Se lanzaron nuevas bibliotecas que utilizan FFI: babashka.sqlite, babashka.duckdb, babashka.postgres y filewatcher. Con babashka.sqlite por ejemplo, puedes crear funciones Clojure dentro de SQLite:
(require '[babashka.sqlite :as sq])
(sq/with-conn [db nil]
(sq/create-function! db "initials" (fn [s] (apply str (map first (clojure.string/split s #" ")))))
(sq/query db ["select initials(?) i" "gerald jay sussman"])) ;; => [{:i "gjs"}]
Los demos como pacman.clj, doom.clj y gtk4.clj muestran la potencia de FFI combinada con librerías gráficas.
Mejoras en el sistema de tareas
Se introducen mejoras en los :exec-fn de Babashka: ahora se componen a través de :depends, se heredan opciones de la dependencia y se puede pasar :exec-args directamente. Además, un árbol de :cmd puede definirse mediante una var que se carga bajo demanda.
Por qué importa
Para administradores y arquitectos, la disponibilidad de FFI abre posibilidades de integrar código nativo sin abandonar la comodidad de los scripts de Babashka. La nueva política de binario reduce el riesgo de incompatibilidades con glibc y facilita la distribución en entornos controlados. El hecho de que la API sea experimental no impide su uso práctico; basta con revisar la documentación y aportar feedback.
Conclusión
Babashka 1.13.220 expande el ecosistema con una capa de FFI robusta y mejora la compatibilidad en Linux. Los usuarios de scripts y los desarrolladores de librerías Clojure tendrán ahora una herramienta más para combinar lo mejor de ambos mundos.