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

ジャンク・ラング・ヒット・アルファ

概要

  • jank はClojureの方言で、LLVMとC++インターフェースを持つ
  • Clojure の特徴を維持しつつ、C++のパフォーマンスを活用
  • JVMではなく LLVM をホストとし、C++とシームレスに連携
  • 永続的かつイミュータブルなデータ構造を採用
  • 現在は アルファ版 として開発中

jankとは何か

  • jank は、Clojureのインタラクティブで関数型、値指向な性質を受け継ぐプログラミング言語
  • LLVM をホストとし、 C++ との相互運用性を重視
  • Clojureとの高い互換性を目指す設計思想
  • Clojureが JVM とJavaの連携を前提とするのに対し、jankは LLVM とC++に重点
  • 汎用プログラミング言語としての用途

jankの特徴

  • コメントは ; で記述

  • 全ての組み込みデータ構造が 永続的かつイミュータブル

  • データはデフォルトで不変だが、副作用も柔軟に扱える

  • 関数定義データ操作 のための豊富なコア関数群

  • C++ とのシームレスな相互運用が可能

    • 例:C++のchronoやthis_threadなどの標準ライブラリとの連携

jankの基本例

  • 標準出力:(println "meow")
  • データ定義:(def george {:name "George Clooney"})
  • 関数定義と副作用:
    (defn say-hi [who]
      (println (str "Hi " (:name who) "!"))
      (assoc who :greeted? true))
    
  • イミュータブルなデータ操作例:(apply + (distinct [12 8 12 16 8 6])) ; => 42
  • C++連携例:
    (defn sleep [ms]
      (let [duration (cpp/std.chrono.milliseconds ms)]
        (cpp/std.this_thread.sleep_for duration)))
    

開発状況とドキュメント

  • アルファ版 として積極開発中
  • 詳細なドキュメントは jank book にて公開
  • オープンソースコミュニティによる活発な開発体制
  • スポンサーシップによるプロジェクト支援体制

関連情報

  • Clojure Conj 2023 などでの紹介実績
  • REPL言語紹介コンパイラ解説 などのリソースが充実

Hackerたちの意見

付随する本: https://book.jank-lang.org/

jank alphaに関することは、https://book.jank-lang.org/にリンクしてください。アルファ版を発表する準備がまだ整っていなかったけど、みんなが楽しみにしてくれてるのは嬉しいです。:) もう少しコンパイラの機能を統合したいと思ってるけど、本を参考にしてjankを試す準備は整ってるはずです。

こんにちは!jankにワクワクしてて、さっきリンクしてくれた本を読んでるところです。いくつか文法の間違いに気づいたんだけど、bookセクションへのPRを考えてもらえますか?それとも、他の形式でフィードバックをもらった方が、著者の声をより維持できると思いますか?

関わったみんなに大きな拍手を送るよ!

一瞬、読み間違えてこの人のことかと思った。https://en.wikipedia.org/wiki/Jack_Lang_(French_politician)

静的型システムは含まれているの?見つけられなかったんだけど。

Clojureを実装しているから、静的型付けはないと思う。

Clojureの方言として、動的型付けの言語です。でも、デザイナーは最終的に段階的型チェックを追加することに興味を示しています¹: 「ネイティブClojureが私の夢の言語への第一歩だと言いました。確かに、それだけでは終わりません。jankは常にClojureの方言ですが、さらに多くをオプションでサポートします。段階的型付け(もしかしたら線形型付け)、より明示的なメモリ管理、値ベースのエラー、強力なパターンマッチングなどの機能がClojureを改善します。これにより、プログラムの一部は完全に動的でガベージコレクトされる一方で、他の部分は徹底的に制御され、より最適化されるという別の制御軸が可能になります。これがプログラミングで私が求める制御です。-- 1: https://jank-lang.org/blog/2025-01-10-i-quit-my-job/

完全な静的型システムはないんだよね。jankはシームレスなC++との相互運用があって、すべての相互運用は静的型付けなんだけど、Clojureの世界に戻ると、全部動的型付けでめっちゃ多態的になる。将来的には、Carpみたいにjankのオプショナルな静的型付けモードを探っていくつもりだけど、今年は無理かな。

Jank Langって名前の誰かが投資のアルファを見つけたのかと思った。

アルファリリースおめでとう!もう1年もjankのブログをフォローしてるけど、こういうマイルストーンに到達するのを見るのは嬉しいね。Emacsユーザー向けの開発ツール(CIDERサポートとか)の現状はどうなってるの?それと、Welcomeセクションにタイプミス/壊れたリンクを見つけたよ。「foreward」のリンクがhttps://book.jank-lang.org/foreward.htmlになってるけど、正しくはhttps://book.jank-lang.org/foreword.htmlだよ。

nREPLサーバーは動いてるけど、まだjankリポジトリにはマージされてないんだ。https://github.com/kylc/try-jank 進捗を妨げてるClangのバグがあって、回避策を考えないといけない。いろいろ抱えてるけど、これは優先度高いよ。壊れたリンクの報告ありがとう。今は修正されてるはずだよ。

開発がClojureにできるだけ追随することを考えてるの?cljsがClojureをJSで実現するために考案されたように、単なるClojureっぽいJSじゃなくて。最終的には分岐すると思う?前に90%くらいClojureに似た言語を作ったけど、そのまま両方の言語で動くとは期待されないように呼ぶのをためらったんだ。ランディングページを見る限り、もっと簡単に置き換えられる感じを目指してるみたいだね。かっこいいね、頑張って!

jankは汎用プログラミング言語です。Clojureの方言で、Clojure自体はLispの方言です。jankはファンクショナルファーストだけど、アドホックな変異や効果もサポートしてます。すべてのデータ構造はデフォルトで永続的かつ不変で、jankはClojureのデザインに従って、安全な変異のためのメカニズムを提供して、簡単に並行処理ができるようにしています。 > Clojureを超えて、jankはC++の兄弟で、C++の新しい型や関数、テンプレートをランタイムで自由にアクセスしたり定義したりできます。これは、ClangとLLVMを使ってC++をJIT(ジャストインタイム)コンパイルすることで実現されます。その結果、ClojureのコードでCやC++のライブラリに簡単にアクセスできるようになります。これは、これまでこの言語を聞いたことがない人たちのための情報です。

面白いね。最後にC++を使ったときは、コンパイルがめっちゃ苦痛だった。Clojureは大好きだけど、ネイティブターゲットは魅力的だね。Jankのコンパイル/再コンパイルサイクルはどれくらい遅いのかな。