世界を動かす技術を、日本語で。

ジャンクプログラミング言語

2025年7月7日原文(jank-lang.org)

概要

jank は、 Clojure のインタラクティブ性と ネイティブコンパイル の両立を目指す汎用プログラミング言語。 C++ をホストとし、 LLVMベースJIT で高性能とREPL開発を実現。 Clojureと高い互換性を持ち、 コード-as-データ 哲学と強力なマクロシステムを継承。 ネイティブコードとのシームレスな連携や ツーリング への配慮も特徴。 現在も積極的に開発中で、多くの機能が計画・実装段階。

jankの特徴と概要

  • Clojure と互換性を持つ 方言 として設計
  • C++ 上で動作し、 LLVM JIT による高速な実行環境
  • REPL によるインタラクティブ開発体験
  • ネイティブコード へのシームレスなアクセス
  • コード-as-データ の哲学、強力な マクロシステム
  • 不変データ構造 を標準装備、関数型プログラミング重視
  • ソフトウェアトランザクションメモリリアクティブエージェント によるスレッド安全な設計

Clojureライクなイテレーション

  • REPL で反復的にプログラム構築が可能
  • エディタから離れずに開発体験
  • 例:(defn -main [& args] (loop [game-state (new-game!)] (if (done? game-state) (end-game! game-state) (recur (next-state game-state)))))

ネイティブ連携とインラインC++

  • C++ コードを Clojure ソース内にインラインで記述可能
  • Clojureコードと 相互運用性 を保持
  • 例:(defn create-vertex-shader! [] (c++/glCreateShader c++/GL_VERTEX_SHADER))

マシンコードへのコンパイル

  • LLVMベースJIT による高速なAOTコンパイル
  • 静的・動的リンク な実行ファイル生成に対応
  • 起動時間メモリ使用量 が非常に少ない
    • jank: real 0m0.086s, user 0m0.045s, sys 0m0.040s

エラー報告とツール連携

  • 高品質なエラー報告、分かりやすいエラーメッセージ
  • JVM由来の冗長なスタックトレース が不要
  • :jankリーダー条件 でClojure JVM/ClojureScriptとの互換性
  • nREPLLeiningenLSP などツール連携を重視した設計

データ変換・操作の例

  • reducezipmaprepeatmerge-with で複雑なデータ変換も簡潔に記述

  • ネストしたデータも lenses 不要で扱いやすい

  • 例:ジャンルから映画IDへのインデックス生成

    • (def movies {...})
    • (def genre->movie (reduce ...))
    • (->> (genre->movie :thriller) (map movies) (sort-by :tomatometer))

バイト数の人間可読変換

  • loop マクロによる命令型ループもサポート
  • 例:(defn size->human-readable ...)

文字列の最大長切り詰め

  • 文字列やデータ構造の不変性 を維持
  • 強力なデータ操作ツールで 可変性の必要性を低減
  • 例:(defn truncate ...)

varの再定義とテスト

  • def/defn は全てvarとして管理
  • with-redefs で一時的な再定義が可能
  • 副作用の排除やテスト容易化 に役立つ
  • 例:(with-redefs [post! ...] ...)

このように、 jank はClojureの強みを活かしつつ、 ネイティブパフォーマンスツール連携高い拡張性 を実現する 新世代Lisp方言。今後の発展にも注目。

Hackerたちの意見

JVMがない以外に、JankがClojureの代替として普及しない理由は何?

必要な機能がすべて実装されれば、唯一の障害はJVMとの相互運用になるでしょう。「純粋なClojure」コード(つまり、相互運用なし)であれば、jankのコードとしても有効であるはずです。

みんな、こんにちは。私がjankの作成者です。今日はHNに登場するとは思ってなかったけど、興味を持ってくれて嬉しいです。簡単に言うと、jankはClojureだけど、LLVM上で動いて、C++との相互運用がシームレスです。nREPLの機能もフルに使えるし、何でもその場で再定義できるし、Clojureと一緒にC++コードをJITコンパイルすることもできるんです。C++とのシームレスな相互運用は、リスプでは初めての試みで、jankのために生成したLLVM IRとC++をJITコンパイルして、一つのIRモジュールにまとめているんですよ。なお、jankはまだリリースされていません。今年の終わりに最初のアルファ版を出す予定です。jankのブログで毎月開発の進捗を更新していて、次の更新は今週中に出る予定です。

すごく美しい作品ですね。Clojureはとても良いです。私が今まで見た中で最も影響力のあるトークの一つは、Rich Hickeyの「シンプルを簡単に」でした。ただ、Clojureは最初は書きやすく理解しやすいけど、読むのが難しいのが唯一の不満です。結局、私たちの時間のほとんどはコードを読むことに使うのに。でも、もしかしたら私の脳の力が足りないだけかも。

Clojureを実装しているのに、なぜ別の言語として実装したのかちょっと気になります(ClojureのバックエンドやC++の構文拡張の代わりに)。Windowsサポートを第一級にする予定はありますか?LLVMベースの言語を見ている多くの人が、ゲーム用のC++の代替に興味を持っていると思います。

最初の例は「when」じゃなくて「if」じゃないの?

このプロジェクトが大好きです。去年の終わりからGitHubでスポンサーをしています。でも、お願いだから別の名前にしてほしい。企業やチームがJankを仕事で使わせない理由があったとしても、名前がその理由にならないようにしてほしいです。

Jankの開発者の呼称は何ですか?ジャンクer?

ラッキーだね ;) https://jank-lang.org/blog/2025-04-01-jank-has-been-renamed/

名前に対する反対意見は何なの?よくわからないんだけど。

これは目玉機能のように見えるので(評判の良いClojureと比べて)、JVMとLLVMのバージョンを比較したベンチマークが見たいですね。これにより、jankはREPLベースの開発の利点を提供しつつ、ネイティブな世界にシームレスにアクセスでき、JVMのパフォーマンスと真剣に競争できるようになります。

いろんなベンチマークや最適化についてのブログ記事はあるけど、今は言語の開発にほとんどの時間を使ってるんだ。実装の流動性もあって、去年のベンチマークはもうあまり当てにならない。パフォーマンスの測定や最適化はすごく楽しんでるし、jankがClojureと同じくらい安定して、パフォーマンスを優先する価値が出てきたら、そこに集中できるのを楽しみにしてるよ。

Hacker Newsで議論の続きを見る