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

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

概要

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と同じくらい安定して、パフォーマンスを優先する価値が出てきたら、そこに集中できるのを楽しみにしてるよ。

jankのエラーレポートが特に楽しみなんだ。ブログ記事が期待通りのものになるといいな。Clojureを試してもらった人たちからは、エラーメッセージに全く混乱してるって言われることが多いんだよね。

ほんとにエラーメッセージが役に立たないのはすごいよね。まさに偉業だわ。それでもClojureは好きだけど、ほんとに驚く。

ClappっていうLLVMを使ったC++のCommon Lispを覚えてるよ。Clappは期待されてたけど、進展がすごく遅かったんだ。ClojureがCLに似てるから、Jankも似たような問題に直面するんじゃないかって思う。Jankの作者にClappのことを知ってるか聞いてみてもいいかな?もし知ってたら、このプロジェクトが停滞しないためにどうするつもりか教えてほしい。編集:ここに2014年のClappについてのHNの投稿があるよ。 https://news.ycombinator.com/item?id=8367404 その投稿やコメントでは、Clappがsbclより100倍遅いって書いてあったし、Clappの作者は「LLVMはCやC++を実装するのに素晴らしいライブラリだけど、クロージャやファーストクラス関数のようなLispの機能をサポートするためにはもっと作業が必要だ。今それに取り組んでいる」と主張してた。Clappの作者の11年間の努力が今の取り組みに役立つことを願ってるよ。今のLLVMは11年前のものとは違うしね。とにかく、C++、Lisp、ClojureをLLVMで使うプロジェクトには、知識を共有することが生産的だと思う。確か、Clappをコンパイルするのに丸一日かかるって聞いたことがあるけど、それはあまり良い印象を与えないよね。幸運なことに、JuliaはLLVMにトランスパイルできると思うけど、Juliaは多くの人が何年もかけて作り上げたものだからね。正直、一人のプログラマーがC++でパフォーマンスの良いClojureを作るのは難しいと思うし、コードをすぐにコンパイルできる能力もないだろうね。sbclの速度とコンパイル速度を達成するのは並外れた偉業だよ!Goでは高速なコンパイルを実現するために大きな犠牲があったし、ジェネリクスを含める問題はNP完全だから、コンパイルが膨れ上がるのを避けるのが大変なんだ。ECL、Cで書かれたLispも、パフォーマンスやコンパイル速度を向上させるヒントをくれるかもしれない。もしかしたら、私は新しい夢に対してオープンすぎるのかもしれないけど、とにかくこのプロジェクトがうまくいくことを願ってるし、Clojurists Togetherに感謝してる。お気に入りのプログラミング言語を拡張・改善するプロジェクトに関わるのは、知的にとてもやりがいのあることだと思う。でも、旅は簡単ではないだろうね、確かに。

Claspだよ、Clappじゃなくて。まだリリースされてるし。2.7.0は1月にリリースされたし、2.8.0も控えてるよ。 https://github.com/clasp-developers/clasp

Jankの作者に聞いてみたいんだけど、Clappのこと知ってる?もし知ってたら、このプロジェクトはどうやって停滞を避けるつもりなの?Claspのことは知ってるし、jankの初期にdrmeisterとも話したことがある。結局、jankとClaspは大きく異なる。jankはClojureで、ClaspはCommon Lispだし、C++との相互運用のアプローチも違う。 > 確か、Clappのコンパイルには丸一日かかるって聞いたけど、それはあまり良い印象じゃないね。Claspのコンパイル時間はわからないけど、一般的にC++はコンパイルが遅いから。jankのコンパイラは、うちのマシンで何もない状態から約1分でビルドできるよ。大きなClojureプロジェクトをjankコンパイラがどう扱うかはまだわからないけど、Clojure JVMより遅くなると思ってる。 > あの投稿とコメントで、Clappはsbclより100倍遅いって読んだよ。それは古い投稿だから、今はClaspの方が速いと思う。私のベンチマークでは、jankはClojure JVMより100倍遅くはないよ。 > もしかしたら新しい夢にオープンになれない年齢なのかもしれないけど、このプロジェクトがうまくいくことを願ってるし、Clojurists Togetherに感謝してる。このプロジェクトに関わるのは、好きなプログラミング言語を拡張・改善することを目指してるから、すごく知的にやりがいがあるはず。でも、道のりは簡単じゃないだろうね、確かに。興味を持ってくれて、優しい言葉をありがとう。簡単じゃないけど、できるよ!

Clojureで複数のプラットフォーム(JVM、JS、CLR、LLVMなど)をターゲットにしたプログラミングってどうなってるの?JVM(/JS/...)特有のものを使わないClojureライブラリって、どのClojureプラットフォーム/方言でも使えるのかな?そういうライブラリはJankでそのまま使えるの?それとも、ライブラリの作者が特定のプラットフォーム/方言で使えるように何か明示的にしなきゃいけないの?

JVM(/JS/...)特有のものを使わないClojureライブラリって、どのClojureプラットフォーム/方言でも使えるのかな?そういうライブラリはJankでそのまま使えるの? その通り。Interopを使わないClojureコードは、一般的にClojure、ClojureScript、Clojure CLR、jankなどで動くよ。いくつか例外はあるけど、ほとんどの場合はそうだね。 > ライブラリの作者が特定のプラットフォーム/方言で使えるように何か明示的にしなきゃいけないの? Clojureは特定の方言用のフォームを有効にするためにリーダーマクロもサポートしてるよ。これはCの世界での#ifdefみたいなもので、ライブラリ開発者が現在コンパイルされているのがClojure、ClojureScript、jankなどかをチェックできるんだ。これによって、例えば、内部でリーダー条件を使って正しいことをするパブリック関数を持つことができる。例えば: (defn sleep [ms] #?(:clj (Thread/sleep ms) :jank (let [s (/ ms 1000) ns (* (mod ms 1000) 1000000) t (cpp/timespec. (cpp/long. s) (cpp/long. ns))] (cpp/nanosleep (cpp/& t) cpp/nullptr)))) これは現在動作しているCとC++のinteropを使ってPOSIX C関数を呼び出してるよ。同じことをC++バージョンでもできる。この関数は、Clojureとjankの両方で消費者にとって違いなく使えるようになってるんだ。

すごい仕事だね!それに、エラーメッセージもいい感じだよ!

誰か「基本的にClojureだけど、括弧の代わりにホワイトスペースを使う」ものを作ってくれないかな。括弧はどうでもいいけど、値に名前を付けることでインデントが生じるのは我慢できない。ターミナルの中間値名を付ける人間としてはね。追記:それと「ちゃんとした」マルチラインコメントもお願い!ありがとう!

これをjankの潜在的な方言として探求してみたいな。最もシンプルなアプローチでは、ただのレキサーの変更なんだけど。マクロがどう機能するかには影響がある。Clojureではマクロがs式を生成するけど、ホモアイコニシティを広げたいならホワイトスペースブロックを生成する必要があるからね。この作業に資金提供したり、デザインを手伝ったりしたい人がいたら、ぜひ連絡してね。その間に、Rhombusもチェックしてみて。 https://rhombus-lang.org/

これ、存在するよ。 https://yamlscript.org/blog/2025-06-24/how-does-ys-work/ https://yamlscript.org/about/ - YAMLScript(YS)BabashkaのようなGraalの事前コンパイルされたClojure環境だけど、異なる、緩い構文(yamlベース)を使ってる。コマンドラインから実行できるよ。もっと良いPythonみたいな感じ?

自分はもうほとんどの人生でjankをコーディングしてきた気がする。