アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

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::LLVMLLVM 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

  1. git clone https://github.com/Code-Hex/p5-Compiler-Lexer.git
  2. cd p5-Compiler-Lexer && minil install --no-test

https://github.com/Code-Hex/p5-Compiler-Parser

  1. git clone https://github.com/Code-Hex/p5-Compiler-Parser.git
  2. 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 のインストールは次のように行う。

  1. git clone https://github.com/Code-Hex/p5-Compiler-CodeGenerator-LLVM.git
  2. cd p5-Compiler-CodeGenerator-LLVM && git checkout improvement/llvm-5.0.1
  3. perl Makefile.PL
  4. make install

これで完了。

実際にサンプルを動かす

p5-Compiler-CodeGenerator-LLVM ディレクトリの中に example ディレクトリが入っている。 おすすめなのは example ディレクトリへ cd し、そこで実行すること。実行が完了すると結果が出力され、実行したカレントディレクトリに Perl コードから生成された LLVM IR のファイルがあるはず。

例えば fib.pl というファイルがあるが、これを実行すると以下の画像のように出力され fib.ll といったファイルが作成される。

f:id:codehex:20180116221007p:plain

これをお気に入りのエディタで見るのも楽しいし、lli fib.ll といったように LLVM IR のコードのみを実行することもできる。

今の目標として、この LLVM IR を用いて WebAssembly を生成することであるため、今回はここまで。