33
LLVM T alk

Llvm Talk 社内LT大会資料

Embed Size (px)

Citation preview

Page 1: Llvm Talk 社内LT大会資料

LLVM Talk

Page 2: Llvm Talk 社内LT大会資料

自己紹介

• 先山賢一

–新卒3年目

• 好きなプログラミング言語

– C++、Rust、Haskell

• 並列コンピューティングとか好き

– SIMD、GPU

Page 3: Llvm Talk 社内LT大会資料

今日話すこと

普段はプロセッサのお話してる。

(新人研修とか)

たまにはソフトの話もしてみたい

Page 4: Llvm Talk 社内LT大会資料

今日話すこと

じゃあコンパイラの話をしよう!

Page 5: Llvm Talk 社内LT大会資料

今日話すこと

Page 6: Llvm Talk 社内LT大会資料

その前に。

実は私、最近悩みがあるんです

同じ悩みを持つ人に、共有したい

Page 7: Llvm Talk 社内LT大会資料

皆さん、

こんな方は周りにいませんか?

Page 8: Llvm Talk 社内LT大会資料

こんな方

• 普段の仕事はSQLとかshellscript。

• 趣味でアセンブリ等の低レイヤを嗜む。

– Intelの命令セットを眺めるのが好き。

• LLVMに興味がある。

–きつねさん本を一通り読んだ。

• よし、俺もコンパイラ自作する!

Page 9: Llvm Talk 社内LT大会資料

しかし週末には、

Page 10: Llvm Talk 社内LT大会資料

!?

<⌒/ヽ-、___

/<_/____/

 ̄ ̄ ̄ ̄ ̄ ̄ ̄

Page 11: Llvm Talk 社内LT大会資料

目が覚めたら

月曜日になっている!

Page 12: Llvm Talk 社内LT大会資料
Page 13: Llvm Talk 社内LT大会資料

どうしてこうなった?

• 土日にC++を開発するパワーがない

– LLVMはC++

–普段の仕事で疲労している

–プライベートは楽しくプログラムしたい

–ちょっとの改修もC++はコストがでかい

–でもコンパイラは自作してみたい...

• LLVMでもPythonならクールに書ける!!

Page 14: Llvm Talk 社内LT大会資料

そもそもLLVMって?

Page 15: Llvm Talk 社内LT大会資料

Low Level Virtual Machine

Page 16: Llvm Talk 社内LT大会資料

コンパイラ共通基盤

Page 17: Llvm Talk 社内LT大会資料

そもそも

コンパイラってなんだっけ?

Page 18: Llvm Talk 社内LT大会資料

コンパイラとは?

• ソースコード解析して実行ファイル作成

ソースコード 実行ファイル

コンパイラのお仕事

Page 19: Llvm Talk 社内LT大会資料

代表的なコンパイラ

• GCC

– C/C++/Obj-C

• GHC

– Haskell

• Javac

– Java

Page 20: Llvm Talk 社内LT大会資料

LLVM

• LLVM IRという中間表現を生成

• IRを最適化して実行ファイルを出力

C++

Obj-C

Haskell

LLVM IR

x86

ARM

PowerPC

LLVMのお仕事

Page 21: Llvm Talk 社内LT大会資料

何が嬉しいの?

• おれおれ言語が簡単にできる

– LLVM IRへのトランスレータを書くだけ

• よい感じで最適化してくれる

–ベクトル化とか

• JITもできて動的コード生成

–非常に高速

Page 22: Llvm Talk 社内LT大会資料

広く利用されている

Page 23: Llvm Talk 社内LT大会資料

これがLLVMです!

このロゴはApple製

Page 24: Llvm Talk 社内LT大会資料

使ってみたい

Page 25: Llvm Talk 社内LT大会資料

+ llvmlite

Page 26: Llvm Talk 社内LT大会資料

やりたいこと

• Pythonの関数を作って

⇒ AST(抽象構文木)を作って

⇒ 型推論して

⇒ LLVM IRに変換して

⇒ JITで実行

• ね、簡単でしょ?

Page 27: Llvm Talk 社内LT大会資料

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大会資料

やってみた(デモ)

Page 29: Llvm Talk 社内LT大会資料

こんな感じで実装

@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大会資料

こんな感じで実装

@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大会資料

素だとこんな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大会資料

いい感じで最適化♪

define i32 @sample(i32 %.1, i32 %.2) #0 {

.4:

ret i32 200

}

さっきの例は

定数を返すだけ。

Page 33: Llvm Talk 社内LT大会資料

まとめ

• LLVM

–コンパイラ共通基盤

–ソースコード⇒LLVM IR⇒実行ファイル

• Pythonならトランスレータ簡単

– llvmliteすげー

– ast.NodeVisitorすばらしい