狠狠撸

狠狠撸Share a Scribd company logo
LLVM Talk
自己紹介
? 先山賢一
– 新卒3年目
? 好きなプログラミング言語
– C++、Rust、Haskell
? 並列コンピューティングとか好き
– SIMD、GPU
今日话すこと
普段はプロセッサのお話してる。
(新人研修とか)
たまにはソフトの話もしてみたい
今日话すこと
じゃあコンパイラの話をしよう!
今日话すこと
その前に。
実は私、最近悩みがあるんです
同じ悩みを持つ人に、共有したい
皆さん、
こんな方は周りにいませんか?
こんな方
? 普段の仕事はSQLとかshellscript。
? 趣味でアセンブリ等の低レイヤを嗜む。
– Intelの命令セットを眺めるのが好き。
? LLVMに興味がある。
– きつねさん本を一通り読んだ。
? よし、俺もコンパイラ自作する!
しかし週末には、
!?
<⌒/ヽ-?___
/<_/____/
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
目
が
覚
め
た
ら
月
曜
日
に
な
っ
て
い
る
!
Llvm Talk 社内LT大会資料
どうしてこうなった?
? 土日にC++を開発するパワーがない
– LLVMはC++
– 普段の仕事で疲労している
– プライベートは楽しくプログラムしたい
– ちょっとの改修もC++はコストがでかい
– でもコンパイラは自作してみたい...
? LLVMでもPythonならクールに書ける!!
そもそも尝尝痴惭って?
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すばらしい

More Related Content

Llvm Talk 社内LT大会資料