Babashka 1.13.220、ネイティブライブラリを呼ぶFFIを追加
Babashka 1.13.220が、JavaのPanama APIを土台にしたFFI(外部関数インターフェース)を追加しました。podもJavaも書かずに、ClojureスクリプトからCのライブラリを直接呼べます。
3 分で読めます

起動の速いClojureスクリプト実行環境Babashkaが、ネイティブのCライブラリを直接呼べるようになりました。バージョン1.13.220は2026年8月31日にFFI(外部関数インターフェース)付きで公開され、作者のMichiel Borkent氏が自身のブログで設計を解説しています。これまでBabashkaのスクリプトからネイティブコードに触れるには、podを書く必要がありました。podとは、Babashkaがソケット越しに会話する別プログラムのことです。新しいFFIはこの手順をなくします。
FFIは、ある言語から別の言語を呼び出すための配管です。ここではClojureがCを呼びます。
新しいインターフェースがすること
実装はProject Panama経由でJDKに入ったjava.lang.foreign、すなわちForeign Function and Memory APIの上に作られています。Borkent氏は、既存のライブラリcoffiも同じ土台の上にあると述べています。つまり独自の仕組みではなく、JVM自身が公式に用意したネイティブコードへの経路を、スクリプトから使えるようにしたものです。
このリリースは単純な関数呼び出しにとどまりません。GitHubのリリースノートによると、作業はプルリクエスト#2031から#2077にまたがり、メモリセグメント、アリーナ管理、構造体と共用体のレイアウト、そしてコールバックを含みます。コールバックは重要です。Cのライブラリ側から自分のClojureコードを呼び戻せるようになります。
注意が要るのはメモリです。ネイティブメモリはガベージコレクタの外側にあるため、Babashkaではアリーナを使って明示的に管理します。アリーナはネイティブメモリの区画を保持し、閉じられたときに解放します。Clojureのwith-openを使えば、ブロックの終わりで自動的に後始末が行われます。ここを誤っても例外は出ません。segfaultになります。
最初の呼び出しは小さなものです。zlibを読み込んでバージョンを尋ねると、文字列1.3.1が返ります。
SQLiteの例が重要な理由
Borkent氏が挙げる例は、おもちゃではありません。このFFIを使うと、Clojureの関数を定義してネイティブのデータベースに登録し、SQLiteのクエリが実行中にその関数を呼べます。
podではこれができませんでした。podは自分のプロセスで動きますが、SQLiteはクエリの評価の途中でソケットの向こう側に手を伸ばせません。関数はデータベースエンジンと同じプロセスに存在する必要があります。直接のFFIがそれを可能にします。
これがこの変更の全体像です。自分のコードとネイティブライブラリが1つのプロセスと1つのメモリ空間を共有する必要があるものは、これまで手が届きませんでした。コールバック、独自のアロケータ、プロセス内の拡張点が、ここで使えるようになります。
Linuxバイナリへの静かな変更
リリースの中の一行は、FFIを使わない人にも影響します。LinuxではBabashkaの既定ビルドが完全な静的リンクから「ほぼ静的」に変わり、glibcが動的リンクになりました。macOSとWindowsのビルドは以前からこの方式です。
理由はFFIそのものです。任意のネイティブライブラリを実行時に読み込むことは、完全な静的バイナリとは相性がよくありません。代償は可搬性です。完全な静的バイナリはどこでも動きますが、ほぼ静的なバイナリはホスト側に互換性のあるglibcを期待します。最小構成のコンテナやAlpineのイメージにBabashkaを入れているなら、アップグレード前に動作を確認してください。
これが開発者にとって意味すること
すでにBabashkaでスクリプトを書いていて、Cライブラリが必要なために避けてきた作業があるなら、もう一度見直す価値があります。podという回避策は本物の摩擦であり、それがなくなりました。
podを保守しているなら、この変更はよく読んでおくべきです。podは隔離のため、また大きなネイティブSDKを包むためには今も有効です。Cの関数をいくつか呼ぶためだけに使う理由は、もうありません。
これから始めるなら、呼び出しの書き方よりアリーナの規則から入ってください。zlibVersionを呼ぶのは簡単です。どのメモリを自分が所有し、いつ解放されるのかを把握できるかどうかが、動くスクリプトと不定期にクラッシュするスクリプトを分けます。理由がない限り、すべてのアリーナをwith-openで包んでください。
コンテナでBabashkaを配布しているなら、1.13.220に上げる前にベースイメージのglibcを確認してください。この変更は、新しいインターフェースを使うかどうかに関係なく付いてきます。
出典
- Babashka FFI - Michiel Borkent
- Babashka releases: v1.13.220 - GitHub
関連記事

TryNix、ブラウザのタブで任意のNixパッケージを実行
TryNixはWebAssemblyにコンパイルしたLinuxカーネルを起動し、310,083件のnixpkgsバージョンのどれでもタブ内で動かします。python3は初回7.5秒です。

Asahi Linux、M3シリーズのMacを正式サポート
Asahi LinuxがM3、M3 Pro、M3 Maxのサポートをインストーラに取り込みました。Wi-Fi、USB 3、AV1デコードは動作します。スリープ、HDMI、高速な3Dは未対応です。

Kubernetes 1.37、rootlessモードがベータに昇格
Kubernetes 1.37でKubeletInUserNamespaceがベータになりました。kubelet、コンテナランタイム、CNIプラグイン、kube-proxyのすべてを非rootユーザーで動かせます。