手でBrainf**kのインタープリタを書いて最適化しようとしても、小手先の改善の組み合わせでLLVMレベルの最適化するのは難しいでしょう。素朴に命令列を吐いて、最適化をおまかせしてしまえば速度が出るとてもうれしいですね。IRを正しく吐くことさえできれば実行ファイル生成まで面倒見てくれるのはLLVMの素晴らしいところですね。IRの命令と親しむところにあります。多くのチュートリアルでは、難しい言語をC++でパースして構文木を作ってIRを吐いてという説明から始まります。できる人にはできるのでしょうが、私には理解が追いつきませんでした。IRを初めて触った人が、いきなりIRBuilderからコード生成できるのでしょうか。LLVM素人がいきなりIRBuilderのメソッド一覧を眺めて、これを使えばいいなみたいにすぐに分かるものなのでしょうか。そんな人にとって、clangは良い先生だと思います。IRの命令列になるか教えてくれます。IRを見比べながら、自分でも命令列を吐くコードを書いてみて、徐々に分かっていくものだと思います。それはIRBuilderを使ったコードに比べたら泥臭いコードかもしれませんが、入門の壁を超える大事な一歩だと思います。この記事は、実際に私自身が一歩ずつ理解を深めながら、同時並行して書き進めてきました。私はLLVMについてはド素人で、Kaleidoscopeレベルにすら到達していません。そんな私だからこそ、この記事を書こうと思った時には今の私に書ける「Kaleidoscopeの手前のLLVM入門記事にしよう」という思いがありました。LLVMを触ってみたいけど、最初の壁が超えられない、そういった人に届けばいいなと思います。いくつかの命令についてあまり説明せずに通り過ぎたところがありました。命令の正確な意味や引数などの理解を深めるためには、言語マニュアルを参照してください。用語や記述には気をつけて書いていますが、誤りがあればご指摘ください。LLVMのページを開いた時、命令の説明書をぼーっと眺めている時、このツールは私に使えるものなのだろうかという不安がありました。今の気持ちは全く違います。実際に触って試行錯誤したら、コツが分かってきました。LLVMの世界の入り口に立った気持ちです。IRの命令の雰囲気が掴めてきたので、次はIRBuilderを使ったコード生成や、実用的な言語のコンパイラ作成に挑戦してみようと思います。今後も理解を深め、コンパイラ技術の勉強を続けていこうと思います。10はてなブログをはじめよう!itchynyさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。