llvm talk 社内lt大会資料
TRANSCRIPT
![Page 1: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/1.jpg)
LLVM Talk
![Page 2: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/2.jpg)
自己紹介
• 先山賢一
–新卒3年目
• 好きなプログラミング言語
– C++、Rust、Haskell
• 並列コンピューティングとか好き
– SIMD、GPU
![Page 3: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/3.jpg)
今日話すこと
普段はプロセッサのお話してる。
(新人研修とか)
たまにはソフトの話もしてみたい
![Page 4: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/4.jpg)
今日話すこと
じゃあコンパイラの話をしよう!
![Page 5: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/5.jpg)
今日話すこと
![Page 6: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/6.jpg)
その前に。
実は私、最近悩みがあるんです
同じ悩みを持つ人に、共有したい
![Page 7: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/7.jpg)
皆さん、
こんな方は周りにいませんか?
![Page 8: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/8.jpg)
こんな方
• 普段の仕事はSQLとかshellscript。
• 趣味でアセンブリ等の低レイヤを嗜む。
– Intelの命令セットを眺めるのが好き。
• LLVMに興味がある。
–きつねさん本を一通り読んだ。
• よし、俺もコンパイラ自作する!
![Page 9: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/9.jpg)
しかし週末には、
![Page 10: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/10.jpg)
!?
<⌒/ヽ-、___
/<_/____/
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
![Page 11: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/11.jpg)
目が覚めたら
月曜日になっている!
![Page 12: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/12.jpg)
![Page 13: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/13.jpg)
どうしてこうなった?
• 土日にC++を開発するパワーがない
– LLVMはC++
–普段の仕事で疲労している
–プライベートは楽しくプログラムしたい
–ちょっとの改修もC++はコストがでかい
–でもコンパイラは自作してみたい...
• LLVMでもPythonならクールに書ける!!
![Page 14: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/14.jpg)
そもそもLLVMって?
![Page 15: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/15.jpg)
Low Level Virtual Machine
![Page 16: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/16.jpg)
コンパイラ共通基盤
![Page 17: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/17.jpg)
そもそも
コンパイラってなんだっけ?
![Page 18: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/18.jpg)
コンパイラとは?
• ソースコード解析して実行ファイル作成
ソースコード 実行ファイル
コンパイラのお仕事
![Page 19: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/19.jpg)
代表的なコンパイラ
• GCC
– C/C++/Obj-C
• GHC
– Haskell
• Javac
– Java
![Page 20: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/20.jpg)
LLVM
• LLVM IRという中間表現を生成
• IRを最適化して実行ファイルを出力
C++
Obj-C
Haskell
LLVM IR
x86
ARM
PowerPC
LLVMのお仕事
![Page 21: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/21.jpg)
何が嬉しいの?
• おれおれ言語が簡単にできる
– LLVM IRへのトランスレータを書くだけ
• よい感じで最適化してくれる
–ベクトル化とか
• JITもできて動的コード生成
–非常に高速
![Page 22: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/22.jpg)
広く利用されている
![Page 23: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/23.jpg)
これがLLVMです!
このロゴはApple製
![Page 24: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/24.jpg)
使ってみたい
![Page 25: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/25.jpg)
+ llvmlite
![Page 26: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/26.jpg)
やりたいこと
• Pythonの関数を作って
⇒ AST(抽象構文木)を作って
⇒ 型推論して
⇒ LLVM IRに変換して
⇒ JITで実行
• ね、簡単でしょ?
![Page 27: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/27.jpg)
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 }
![Page 28: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/28.jpg)
やってみた(デモ)
![Page 29: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/29.jpg)
こんな感じで実装
@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))
![Page 30: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/30.jpg)
こんな感じで実装
@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))
型がわかるように
アノテーション付けた
関数名を渡して
実行する
![Page 31: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/31.jpg)
素だとこんな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 }
![Page 32: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/32.jpg)
いい感じで最適化♪
define i32 @sample(i32 %.1, i32 %.2) #0 {
.4:
ret i32 200
}
さっきの例は
定数を返すだけ。
![Page 33: Llvm Talk 社内LT大会資料](https://reader031.vdocuments.net/reader031/viewer/2022021918/58ac35991a28ab145e8b55c1/html5/thumbnails/33.jpg)
まとめ
• LLVM
–コンパイラ共通基盤
–ソースコード⇒LLVM IR⇒実行ファイル
• Pythonならトランスレータ簡単
– llvmliteすげー
– ast.NodeVisitorすばらしい