第1章 はじめに

1.1 本書の構成

ここで本書の構成について説明しておきます.

第1章,つまり本章では本書の構成や目的,次章以降の文章表記について説明します.本書のターゲットや位置づけ的なもの,お断り(という名の言い訳)が書いてあるのでとりあえず目を通してもらえると幸いです.

第2章ではLLVMプロジェクトの概要を説明します.LLVMが何かということやLLVMのサブプロジェクトについて説明します.既にご存知の方は読み飛ばして頂いて構いません.

第3章ではLLVMのインストール方法,各種コマンドの説明や動作確認を行います.

第4章ではLLVMの中間表現について説明します.ここでは幾つかのC言語のソースコードをLLVMの中間表現に変換し,どのような構成になっているか確認しながら解説を進めます.

第5章ではLLVMのフロントエンドの作成について説明します.C言語のサブセットである簡易言語を定義し,その言語に対するLLVMフロントエンドの作成過程を順を追って説明します.

第6章ではLLVMの解析や最適化について説明します.この章では、解析/最適化の実装手順を解説した後、簡単な解析/最適化を独自に実装する際の過程を順を追って説明しています

第7章で,LLVMのバックエンドの実装方法について説明します.バックエンドでどのようにデータ形式を変化させていくかを説明し,実際にオリジナルのバックエンドを実装してアセンブリとオブジェクトが生成できるようにします.

なお,最初の本章から第6章までを柏木餅子が,そして第7章を風薬が執筆しています.

1.2 この本で何ができるようになるの?

本書は,LLVMに興味はあるけどよくわからない,遊んでみたいけどドキュメントは英語だし面倒だ!などという人が迷走しつつもLLVMの使い方を覚えてコンパイラを実装できるようになるための本です.少なくとも筆者はそれを目指しています.逆に言うとそれ以上のことは書いていません.例えばLLVM内部で○○はどう実装されているか,といった話は基本的にありません.

1.3 本書の目的とターゲット層

大事なことなので二度言います.本書は,LLVMって単語を聞いたことあるなーという程度の人になんとなくでもLLVMで何か作ってみよう!って思ってもらい,LLVMで遊べるようになってもらうための本です.

1.4 本書を読むにあたって必要となるもの

本書を読むのに必要となる物やスキルを記載します.“必須なもの”と“あった方が良い程度のもの”に分けて記載しますが,基本的には全部揃えておいた方が良いと思います.

1.4.1 必須なもの

C/C++の基本的な知識

本書は説明のためのサンプルコードや,フロントエンドの実装にC/C++を用いています.そのため,本書を読み進める上では最低限C/C++の読み書きが出来ることが求められます.

1.4.2 あった方がよいもの

実行/開発環境

本書のLLVMの説明では,実際にLLVMをマシン上にインストールし,使用しながら学んでいくことを想定しています.本書だけでもある程度理解できるよう心がけてはいますが,本書の内容を理解するためにはLLVMをインストールし,実行/開発するための環境を用意した方が良いでしょう.

コンパイラに関する基本的な知識

本書はLLVMの概要を説明した後,実際にLLVMを用いてコンパイラを実装することでその使用方法を解説していきます.しかしあくまでLLVMの使用方法がメイントピックとなりますので,基本的なコンパイラの説明については極力省いています.ですのでコンパイラの基本的な知識については,予め知っておいた方が良いでしょう.各種最適化のアルゴリズムや実装などを知っている必要はないですが,コンパイラが何をして何を出力してくるのか程度は知っておいて頂きたいです.

折れない心

実は一番大事かもしれないのがこの要素.基本的にLLVMのドキュメントは英語ですし,有用な情報も海外サイトが圧倒的に多いです.*1そして,行き詰ったときに最も参考になるのはDoxygenとソースコードです.本気で何かしようと思った際は少なからずソースコードを読むことになります.割と面倒なことが多いですが,最後まで頑張ってください.

なお,どうしても英語を読む気になれないという場合は,まず@nothingcosmosさんがLLVMについてまとめているページ[1]やIBMによる日本語訳版のLLVM解説ページ[5]を見ることをお勧めします.

読解力

可能な限りわかりやすい文章を心がけてはいますが,筆者の知識や語彙力などの不足もあり,やや表現が難しくなる部分もあります.読者の皆さんの読解力を駆使し,なんとか意図を汲み取っていただけると助かります.

1.5 本書内の記載について

本書内での記載ルールについて説明します.まず,コマンドの入力や出力結果は下記の様に四角い枠で囲って表記します.

# コメントです
$ コマンドです

この枠の中では,$で始まる行は投入するコマンドであり,#で始まる行はコメントとなります.

また,LLVMの各種ライブラリのAPI等は下記のような枠で囲います.

メソッド名等を書きます

APIの定義を書きます

枠の上部分にはメソッド名等を記載し,中には実際の定義を記載します.

1.6 お断り

本書はLLVMの一ユーザが書いた書籍です.極力記載内容に誤りが無いよう努力していますが,誤記,誤認識による誤った情報が含まれる可能性があります.ご了承ください.本書を利用したことにより何かしらの損失があったとしても,筆者は補償できません.もし本書の内容に誤りを発見した場合は,そっと指摘して頂けると幸いです.

[*1] 最近は日本語である程度まとまった情報が得られますが