ディスカッション (4件)
Clojure系言語のJankが、独自のIR(中間表現)を採用しました。これにより最適化の幅が広がり、パフォーマンス向上に期待が持てそうです。Jankの内部構造が大きく進化しています。
jankを使ってJVMに対抗するための最適化を行っている
JVMは何かと叩かれがちだけど、到達するにはかなり高いハードルだよ。JVMは本当に完成されたすごい代物だからね。jankが成功することを願ってるよ。実際のプロジェクトでも使ってみたいし。
もう少し詳しく知りたいんだけど:
Clojureの動的性は、多態性(ポリモーフィズム)と間接参照の両方に多くを依存している。しかし、これはjankから出力されるLLVM IRを扱う際に、LLVMが最適化できる機会がほとんどないことを意味する。
自分の認識では、ここで起きているのはClojureのコードをLLVMに落とし込む際に、大量のランタイム呼び出し(例えば jank::runtime::dynamic_call など。C ABI経由でランタイムを呼び出すようなもの)を挟んでいるという理解で合ってる?
もしそうなら、LLVMが恩恵をもたらしてくれるような最適化って何かあるの?例えばDCE(デッドコード除去)とか?すぐには判断できなかったから、答えが気になってる。
(もちろん、これはIR生成前の状態についての質問ね)
今回も素晴らしい記事だね。
インライン化について議論する際、特にClojureの文脈で心に留めておくべき大事なことが一つあると思ってる。それは、一度関数がインライン化されると、REPLでその関数の定義を更新しても、それを使っている関数の挙動には反映されなくなるってこと。再コンパイルしない限りね。もちろん批判じゃないよ、動的性とパフォーマンスのトレードオフにおいて避けては通れない自然な現象だね。