Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Llvm Talk 社内LT大会資料

2,232 views

Published on

社内LT大会で、LLVMについて発表した資料です。

Published in: Technology
  • Be the first to comment

Llvm Talk 社内LT大会資料

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

×