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
xorphitus
January 26, 2016
Programming
0
75
AOT と direct linking
Clojure 1.8 の新機能である direct linking の解説です。
xorphitus
January 26, 2016
Tweet
Share
More Decks by xorphitus
See All by xorphitus
オリジナリティのあるGitLabを標準に近づける
xorphitus
1
700
マイクロサービスを作ろう
xorphitus
0
150
コンテナ起動への道
xorphitus
0
140
型システムを学ぼうとした結果
xorphitus
0
63
M-x doctor
xorphitus
0
140
型で数を表そう
xorphitus
0
92
CFS入門
xorphitus
0
75
HyperLogLog
xorphitus
0
92
immutable database
xorphitus
0
290
Other Decks in Programming
See All in Programming
あのころの iPod を どうにか再生させたい
orumin
2
260
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
670
令和最新版手のひらコンピュータ
koba789
8
4.5k
Comparing decimals in Swift Testing
417_72ki
0
160
Claude Code と OpenAI o3 で メタデータ情報を作る
laket
0
110
Workers を定期実行する方法は一つじゃない
rokuosan
0
140
What's new in Adaptive Android development
fornewid
0
130
リッチエディターを安全に開発・運用するために
unachang113
1
360
DynamoDBは怖くない!〜テーブル設計の勘所とテスト戦略〜
hyamazaki
0
180
Claude Code で Astro blog を Pages から Workers へ移行してみた
codehex
0
170
ワープロって実は計算機で
pepepper
1
820
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
280
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
430
Writing Fast Ruby
sferik
628
62k
GitHub's CSS Performance
jonrohan
1031
460k
Embracing the Ebb and Flow
colly
86
4.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
A designer walks into a library…
pauljervisheath
207
24k
Code Review Best Practice
trishagee
69
19k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
The Language of Interfaces
destraynor
158
25k
It's Worth the Effort
3n
185
28k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
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