Perl で Compiler::CodeGenerator::LLVM を用いて LLVM IR を出力する
約 4 年前になると思うが、@goccy54 さんが LLVM のライブラリを用いて、Perl のコードから LLVM IR を生成するといった夢のようなモジュールを作成されていた。
それが Compiler::CodeGenerator::LLVM である。
これをどのような感じで使うのかは、@papix さんによって以下のリンクで解説されている。
Compiler::CodeGenerator::LLVMで遊ぼう! | Hachioji.pm 日めくりテックトーク
上の記事が Publish されてから 1 年後に僕は Perl をやり始めて、Perl に関する情報を仕入れる中でこの記事に出会い、こういうことをやってみたいなーと強く憧れていたのを今でも覚えている...
それは置いといて、約 4 年間更新が止まった Compiler::CodeGenerator::LLVM を LLVM 5.0.1 に対応させることができたため記録を取る。
なお、当時は LLVM 3.2 を用いていた。
まず必要なのが、最新版の Compiler::Lexer, Compiler::Parser, Compiler::CodeGenerator::LLVM である。
しかし執筆時点ではまだ公式の方へマージされていないため以下のリンクからそれぞれ git clone
し、指定のブランチへ切り替えたものをインストールする。
Compiler::Lexer, Compiler::Parser は Minilla を使ってインストールする。
https://github.com/Code-Hex/p5-Compiler-Lexer
git clone https://github.com/Code-Hex/p5-Compiler-Lexer.git
cd p5-Compiler-Lexer && minil install --no-test
https://github.com/Code-Hex/p5-Compiler-Parser
git clone https://github.com/Code-Hex/p5-Compiler-Parser.git
cd p5-Compiler-Parser && minil install --no-test
https://github.com/Code-Hex/p5-Compiler-CodeGenerator-LLVM
これをインストールするためには執筆時点で最新の LLVM 5.0.1 をインストールしなければならない。
Mac ユーザーの場合は次のようにインストールすることができる。
brew install llvm --with-shared-libs
ここで注意だが、LLVM のインストールにはもの凄く時間がかかるため、時間を用意する必要がある。(大体 1 時間半で終わる)
そのあとの Compiler::CodeGenerator::LLVM のインストールは次のように行う。
git clone https://github.com/Code-Hex/p5-Compiler-CodeGenerator-LLVM.git
cd p5-Compiler-CodeGenerator-LLVM && git checkout improvement/llvm-5.0.1
perl Makefile.PL
make install
これで完了。
実際にサンプルを動かす
p5-Compiler-CodeGenerator-LLVM
ディレクトリの中に example
ディレクトリが入っている。
おすすめなのは example
ディレクトリへ cd
し、そこで実行すること。実行が完了すると結果が出力され、実行したカレントディレクトリに Perl コードから生成された LLVM IR のファイルがあるはず。
例えば fib.pl
というファイルがあるが、これを実行すると以下の画像のように出力され fib.ll
といったファイルが作成される。
これをお気に入りのエディタで見るのも楽しいし、lli fib.ll
といったように LLVM IR のコードのみを実行することもできる。
今の目標として、この LLVM IR を用いて WebAssembly を生成することであるため、今回はここまで。