TL;DR

Clojure のランタイムの 1 つ。Clojure でスクリプトを手軽に作成・実行できる。

なぜ必要か

Babashka はネイティブバイナリなので、JVM で動かす Clojure と比べて処理時間が短く、メモリの消費も少ない。

仕組み

Babashka は SCI(Small Clojure Interpreter)というインタプリタを内蔵しており、GraalVM でネイティブバイナリにコンパイルされている。

bb.edn には、Makefile や npm scripts のようなタスクの定義と、依存関係の追加を書ける。書式は edn である。

{:paths ["src"]
 :tasks {:requires ([babashka.fs :as fs]
                    [journal.list :as list])
         welcome (println "ようこそ")
         clear (fs/delete-if-exists "entries.edn")
         list (list/list-entries nil)
         add (exec 'journal.add/add-entry)}}

依存関係はスクリプトに直接追加することもできる。

(require '[babashka.deps :as deps])
(deps/add-deps '{:deps {medley/medley {:mvn/version "1.3.0"}}})

REPL もサポートしており、Calva からも使える。

Babashka Pods を使うと、Pods プロトコルに従って Babashka と外部のプログラムの間でデータをやり取りできる。使えるプログラムは pod-registry にまとまっている。

例

.clj ファイルを直接スクリプトとして実行できる。1 ファイルで完結するなら、名前空間の宣言(ns)は省略できる。

(require '[clojure.string :as str])
 
(prn (str "Hello from " *ns* ", inner world!"))
bb script.clj

Shebang を書けば、ファイルを直接実行できる。

#!/usr/bin/env bb
(prn (str "Hello from " *ns* ", inner world!"))

式をその場で評価することもできる。

bb -e '(+ 1 2 3)'

CLI を作るための cli や、ファイル操作のための fs など、ユーティリティのライブラリも豊富である。bbin を使うと、Babashka のスクリプトやプロジェクトを PATH にインストールできる。

bbin install io.github.babashka/neil
bbin install https://github.com/bhauman/clojure-mcp-light.git

注意点

当然ながら、コンパイル済みのコードを実行するほどの性能は出ない。スクリプトの実行に数秒以上かかる場合や、ループが多い場合は、JVM で動かすほうが良いこともある。

関連

出典