Llvm Talk 社内LT大会資料

Preview:

Citation preview

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すばらしい