読者です 読者をやめる 読者になる 読者になる

LLVM(ruby-llvm)とPEG(Treetop)で電卓作り

きつねさんの本を読んだので、LLVMを使ってお約束の電卓をゴソゴソと作ってみました。

authorNari/ttcalvm · GitHub

こんな感じで動きます。

$ cat /tmp/a.txt
1 + 2 + 3 * 2 * (3 + 2) % 6
$ ./bin/ttcalvm /tmp/a.txt
3

あ〜、これ、電卓だ〜。

LLVMとの連携にはruby-llvmを利用。

パースにはPEGを使ってみたかったので、Treetopを利用しました。
PEGの文法などについてはkmizushimaさんの記事がすごくわかりやすいです。
PEG基礎文法最速マスター - kmizuの日記

LLVMruby-llvmのインストール方法(Ubuntu 12.04)

llvm-3.0を入れる。llvm-devまでいるのかは不明。

$ sudo aptitude install llvm-3.0 llvm-3.0-dev

ruby-llvm入れる。

$ gem i ruby-llvm

拡張ライブラリをビルドするときのコマンドで「llvm-config」が必要だ!みたいな感じで怒られたので、llvm-config-3.0をllvm-configにaliasするなどしたような。

ruby-llvmでハマったとこ

  • addとかsubとか生成したはずなのにLLVM IRに現れてこない
    • それ、最適化。どうやって最適化を外すのかよくわかってない。PassManagerでゴニョゴニョすればいいのかなあ。
  • printfの関数定義どうすんの
    • '@module.functions.add("printf", [Pointer(LLVM::Int8)], Int, varargs: true)' こんな感じでいけた。
      • 可変長引数の指定の仕方がどこにも書いてなくて死ねた

ドキュメントの使用例もかなり不十分なruby-llvm。苦労します。
ruby-llvm-scriptというプロダクト(のコード)が結構参考になります。

おわり

LLVMで遊ぶのたのしかったので、暇ができたらもう少しなんか少し作ってみようかなと思います。

さて、このあたりの話を今週の土曜日にある大江戸Ruby会議03で話そう…などとは微塵も考えておりませんが、まだ席に若干の余裕があるようですので参加していただくといいのかなと思います。
懇親会もまだ余裕があるようです => 大江戸Ruby会議03 懇親会 - Asakusa.rb | Doorkeeper