Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AOT と direct linking
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
xorphitus
January 26, 2016
Programming
82
0
Share
AOT と direct linking
Clojure 1.8 の新機能である direct linking の解説です。
xorphitus
January 26, 2016
More Decks by xorphitus
See All by xorphitus
オリジナリティのあるGitLabを標準に近づける
xorphitus
1
780
マイクロサービスを作ろう
xorphitus
0
150
コンテナ起動への道
xorphitus
0
160
型システムを学ぼうとした結果
xorphitus
0
76
M-x doctor
xorphitus
0
170
型で数を表そう
xorphitus
0
100
CFS入門
xorphitus
0
83
HyperLogLog
xorphitus
0
120
immutable database
xorphitus
0
310
Other Decks in Programming
See All in Programming
[KCD Czech] eBPF Meets the GPU: Future of AI Infra Observability
doniacld
0
130
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
18
7.6k
誰も頼んでない機能を出荷した話
zekutax
0
150
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
400
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
1
210
さぁV100、メモリをお食べ・・・
nilpe
0
120
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
230
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
1.8k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
310
TSKaigi2026-静的解析への投資がAI時代のコード品質を支える ── カスタムESLintルールの設計と運用
hayatokudou
7
1.3k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
430
3Dシーンの圧縮
fadis
1
540
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
230
Information Architects: The Missing Link in Design Systems
soysaucechin
0
950
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Technical Leadership for Architectural Decision Making
baasie
3
380
WENDY [Excerpt]
tessaabrams
11
38k
The Language of Interfaces
destraynor
162
26k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
190
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
180
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
420
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
HDC tutorial
michielstock
2
680
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Transcript
AOT と direct linking @xorphitus (2016-01)
Clojure のコンパイル・モデル 新機能 direct linking の前に Clojure のコンパイル (Java バイトコードへの変換)
は、だいたい2種類 • ソースコードを Clojure の処理系がロードする時に行う ◦ えーと、ここボヤっとしてるんだけど、 JIT ってことなのかなと ◦ ってことは、JVM が JIT しているのでダブル JIT ですね • 先にコンパイルしておいてから処理系に渡す ◦ ahead-of-time compilation (AOT) ◦ direct linking が有効になるのはこっち ※ちなみに、ランタイムにコンパイルを実行する関数も用意されている
JIT vs AOT (Java バイトコードコンパイル時) • JIT の利点 (たぶん) ◦
動的コンパイルが許されるがゆえの REPL 駆動開発 ◦ プログラムが全て REPL の上に乗るので、実際のプロセスの中に入って改変・実行しながら開発が できる ◦ ところで、REPL 駆動駆動って Haskell 辺りとも相性いいと思うのだがどうだろう • AOT の利点 (公式より転載) ◦ ソースコードなしでアプリケーションを配布できる ◦ アプリケーションの起動速度を向上させられる ◦ Java から呼び出し可能な名前付きクラスを生成できる ◦ ランタイムのバイトコード生成と、カスタムクラスローダのどちらも不要なアプリケーションを作れる
JIT vs AOT 体感してみよう • 実演: REPL 駆動開発および速度比較 ◦ https://github.com/xorphitus/aot-experiments
• 参考 ◦ http://qiita.com/ayato_p/items/56595ece48837438d97f ◦ というか、ほぼパクっている
さて、direct linking だが
direct linking とは 三行で言うと • AOT 時のコンパイルオプションで • 関数実行のオーバーヘッドを小さくできて •
コードサイズも削減されて起動速度が上がるもの この理解には、まず Clojure の関数実行の仕組みを知る必要がある
direct linking は Var の存在を消す こんなコードがあったとして (defn add [a b]
(+ a b)) add (λ (+ a b)) シンボル Var 関数 mutable なポインタみたいなもの ポインティング先は immutable 可変ゆえに REPL 駆動開発中は 再定義して動作確認ができる direct linking しない場合は 赤矢印のフローで関数実行される つまり、Var の dereference の コストが発生する direct linking する場合は AOT 時に Var が解決されて 関数実行が青矢印で行われる ついでに不要な Var は一掃され class ファイルは小さくなる
実行してみる • が、コードが小さすぎてぶっちゃけ意味ないかも • direct linking すると JVM の JIT
の最適化がされやすくもなるっぽい
じゃあ Java バイトコードを見よう
Var の減を確認してみる $ find simple-aot/target/classes/simple_aot -type f | xargs javap
| grep Var $ find direct-linking/target/classes/direct_linking -type f | xargs javap | grep Var ちなみに消えない Var もある Var は動的スコープを作ることもできて 例えば、スレッド毎に動的スコープを作り、並行処理を行うのに使われる こういう場合は流石に Var を消したらマズいわけで なお、今回残っている Var が何なのかはよく分からn(ry