llvm talk 社内lt大会資料
TRANSCRIPT
LLVM Talk
自己紹介
• 先山賢一
–新卒3年目
• 好きなプログラミング言語
– C++、Rust、Haskell
• 並列コンピューティングとか好き
– SIMD、GPU
今日話すこと
普段はプロセッサのお話してる。
(新人研修とか)
たまにはソフトの話もしてみたい
今日話すこと
じゃあコンパイラの話をしよう!
今日話すこと
その前に。
実は私、最近悩みがあるんです
同じ悩みを持つ人に、共有したい
皆さん、
こんな方は周りにいませんか?
こんな方
• 普段の仕事はSQLとかshellscript。
• 趣味でアセンブリ等の低レイヤを嗜む。
– Intelの命令セットを眺めるのが好き。
• LLVMに興味がある。
–きつねさん本を一通り読んだ。
• よし、俺もコンパイラ自作する!
しかし週末には、
!?
<⌒/ヽ-、___
/<_/____/
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
目が覚めたら
月曜日になっている!
どうしてこうなった?
• 土日にC++を開発するパワーがない
– LLVMはC++
–普段の仕事で疲労している
–プライベートは楽しくプログラムしたい
–ちょっとの改修もC++はコストがでかい
–でもコンパイラは自作してみたい...
• LLVMでもPythonならクールに書ける!!
そもそもLLVMって?
Low Level Virtual Machine
コンパイラ共通基盤
そもそも
コンパイラってなんだっけ?
コンパイラとは?
• ソースコード解析して実行ファイル作成
ソースコード 実行ファイル
コンパイラのお仕事
代表的なコンパイラ
• GCC
– C/C++/Obj-C
• GHC
– Haskell
• Javac
– Java
LLVM
• LLVM IRという中間表現を生成
• IRを最適化して実行ファイルを出力
C++
Obj-C
Haskell
LLVM IR
x86
ARM
PowerPC
LLVMのお仕事
何が嬉しいの?
• おれおれ言語が簡単にできる
– LLVM IRへのトランスレータを書くだけ
• よい感じで最適化してくれる
–ベクトル化とか
• JITもできて動的コード生成
–非常に高速
広く利用されている
これがLLVMです!
このロゴはApple製
使ってみたい
+ llvmlite
やりたいこと
• Pythonの関数を作って
⇒ AST(抽象構文木)を作って
⇒ 型推論して
⇒ LLVM IRに変換して
⇒ JITで実行
• ね、簡単でしょ?
def add(x, y): return x + y
Function add
Arguments
x y
body
Return
x y
+
AST
Python
func
LLVM IR
define i32 @add(i32 %.1, i32 %.2) { .4: %res = add i32 %.1, %.2 ret i32 %res }
やってみた(デモ)
こんな感じで実装
@llvm_func(int, int)
def sample(x, y):
a = x
b = y
a = 100
b = 100
return a + b
def main():
ret = compiler.exe(sample, 111, 111)
print("result: " + str(ret))
こんな感じで実装
@llvm_func(int, int)
def sample(x, y):
a = x
b = y
a = 100
b = 100
return a + b
def main():
ret = compiler.exe(sample, 111, 111)
print("result: " + str(ret))
型がわかるように
アノテーション付けた
関数名を渡して
実行する
素だとこんなIRだが、、、
define i32 @sample(i32 %.1, i32 %.2) { .4: %.5 = alloca i32 store i32 %.1, i32* %.5 %.7 = alloca i32 store i32 %.2, i32* %.7 store i32 100, i32* %.5 store i32 100, i32* %.7 %.11 = load i32* %.5 %.12 = load i32* %.7 %res = add i32 %.11, %.12 ret i32 %res }
いい感じで最適化♪
define i32 @sample(i32 %.1, i32 %.2) #0 {
.4:
ret i32 200
}
さっきの例は
定数を返すだけ。
まとめ
• LLVM
–コンパイラ共通基盤
–ソースコード⇒LLVM IR⇒実行ファイル
• Pythonならトランスレータ簡単
– llvmliteすげー
– ast.NodeVisitorすばらしい