きつねさんでもわかるLLVM ‐コンパイラを自作するためのガイドブック‐

きつねさんでもわかるLLVM  ‐コンパイラを自作するためのガイドブック‐

2,640円(本体 2,400円+税10%)

品種名
書籍
発売日
2013/6/21
ページ数
312
サイズ
B5変形判
著者
柏木 餅子、風薬
ISBN
9784844334156

コミケ発!フロントエンドからバックエンドまで、LLVMがもっとわかる!日本初の解説書。

本書は、コミックマーケット(通称:コミケ)より発掘された、秀逸なLLVMの技術書です。
Clangをはじめ、LLVMを利用した言語処理系は多く存在していますが、まだ世の中には技術情報が非常に少ないのが現状です。そのLLVMを、著者2名が自ら解読しながら、フロントエンドからミドルエンド・バックエンドにいたるまでを丁寧に解説しました。
フロントエンドの作り方を字句解析から順に説明し、LLVMのコアである最適化を行うパスの作り方、オブジェクト生成までを解説したバックエンドの作り方など、LLVMを使用してコンパイラを作成するうえで必要になることを一通り網羅しています。
本書を通して、LLVMがさらに技術者の皆様に広まり、活用されることを祈ります。

本書の元になった電子書籍は【達人出版会】にて販売中
※ 電子書籍版は株式会社達人出版会の商品です

「読者アンケートに答える」「読者プレゼントに応募」の場合もこちらをご利用ください。

アンケートに答える

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

学校・法人一括購入に関するお問い合わせはこちらへ。

一括購入窓口

詳細

著者プロフィール

◎ 柏木 餅子(かしわぎ・もちこ)

本書のフロントエンド担当、いわゆる言い出しっぺ。
【Twi tter 】 @sui _moti
【GitHub】 https://github.com/Kmotiko
【Web】 http://d.hatena.ne.jp/motipizza/

◎ 風薬(かぜぐすり)

本書のバックエンド担当、巻き添えその1。
【Twitter】 @kazegusuri
【GitHub】 https://github.com/sabottenda/
【Web】 http://d.hatena.ne.jp/sabottenda/

◎ 矢上 栄一(やがみ・えいいち)

本書のイラスト担当、巻き添えその2。
【Twitter】 @re_sonanz
【Tumblr】 https://amphase.tumblr.com/
【Web】 http://rezonanz.web.fc2.com/

目次

第1章 はじめに
1.1 本書の構成
1.2 この本で何ができるようになるの?
1.3 本書の目的とターゲット層
1.4 本書を読むにあたって必要となるもの
1.5 本書内の記載について

第2章 コンパイラとLLVM
2.1 一般的なコンパイラのお話
2.2 LLVMプロジェクト

第3章 環境構築
3.1 本章の概要と構成
3.2 環境
3.3 インストール
3.4 ツールの種類と確認
3.5 opt

第4章 LLVM IR
4.1 本章の概要と目的
4.2 LLVM IRの特徴
4.3 LLVM IRの構成
4.4 LLVMの型とLLVMアセンブリの主な命令
4.5 基本的なLLVMの中間表現
4.6 条件文
4.7 ループ文
4.8 合成型へのアクセス
4.9 Metadata

第5章 フロントエンドの作成
5.1 本章の概要
5.2 構文規則の定義
5.3 目標の設定
5.4 字句解析
5.5 構文解析
5.6 意味解析
5.7 コード生成
5.8 mainの作成
5.9 コンパイルと動作確認
5.10 mem2regの適用と組み込み関数の導入
5.11 JITをやってみる
5.12 Metadataを埋め込みたい場合
5.13 CommandLineライブラリ

第6章 Passの概要と実装方法
6.1 Passの概念
6.2 Passの種類
6.3 Passに実装すべきその他のもの
6.4 簡単なPassを実装してみる
6.5 無用命令の削除を実装してみる
6.6 ループの繰り返し回数のカウント
6.7 適用されるPassを確認する

第7章 バックエンドを作る
7.1 LLVMのバックエンドを学ぶ前に
7.2 LLVMのバックエンドは何をするものか
7.3 バックエンドの流れ
7.4 目標を決める
7.5 ターゲットの仕様を決める
7.6 TableGen
7.7 ターゲットのクラス構成
7.8 TableGenの記述(Sample.td)
7.9 共通クラスの実装
7.10 SelectionDAGISelパスの実装
7.11 フレーム処理(PEIパス)の実装
7.12 AsmPrinterの実装
7.13 SampleMCAsmInfoクラス
7.14 Disassemblerの実装
7.15 その他の実装
7.16 コンパイルする
7.17 バックエンドを作ってみて

ダウンロード

本製品の読者さまを対象としたダウンロード情報はありません。

お詫びと訂正

誤記のためにご迷惑をおかけし、誠に申し訳ございません。

  • 6ページ 上から10行目
    • [誤]
      コンパイラじゃなければあれは何だったのでしょうか? 実はあれはコンパイラというものなのです。
    • [正]
      コンパイラじゃなければあれは何だったのでしょうか? 実はあれはコンパイラドライバというものなのです。
  • 15ページ 表3.2
    • [誤]
      Alpha(UltraSPARC)
    • [正]
      Alpha
  • 19ページ 本文の上から3行目
    • [誤]
      Debugnシンボル
    • [正]
      Debugシンボル
  • 21ページ Clangの使用例の3行目
    • [誤]
      $ clang -emit-llvm -o hoge.bc hoge.c
    • [正]
      $ clang -emit-llvm -c -o hoge.bc hoge.c
  • 21ページ lliの使用例の2行目
    • [誤]
      $ clang -emit-llvm -o hoge.bc hoge.c
    • [正]
      $ clang -emit-llvm -c -o hoge.bc hoge.c
  • 34ページ 表4.7の「insertvalue」行の「概要」列のセル
    • [誤]
      次の例では%agg_valのi32型要素に0を挿入する。
    • [正]
      次の例では%agg_valのi32型要素に1を挿入する。
  • 40ページ 表4.14の下から2行目
    • [誤]
      a0:0:1
    • [正]
      a0:0:64
  • 40ページ 表4.14の最下行
    • [誤]
      s0:64:64 | スタックオブジェクトを64 ビットアラインメントで配置することを規定する
    • [正]
      S0 | スタックオブジェクトのアラインメントは規定しない
  • 63ページ 上から12行目
    • [誤]
      4.、5.、6.は構文解析部からのアクセスを容易にするためにTokenクラスのgetterをラップします。また、7.はデバッグ用です。
    • [正]
      5.、6.、7.は構文解析部からのアクセスを容易にするためにTokenクラスのgetterをラップします。また、8.はデバッグ用です。
  • 71ページ 本文最下行
    • [誤]
      returnと二項演算でjump_statement(return文)を
    • [正]
      returnと戻り値でjump_statement(return文)を
  • 119ページ リスト5.40の行番号14
    • [誤]
      //if args alloca
    • [正]
      //if alloca is used for function arguments
  • 143ページ リスト5.63の行番号17
    • [誤]
      if(!(llvm::F=Mod->getFunction("main")))
    • [正]
      if(!(F=Mod->getFunction("main")))
  • 175ページ 本文下から4行目
    • [誤]
      BasicBlockPassは、FunctionPassが持つdoInitialization(Module)やdoFinalization(Module)をオーバーライドすることができるほか、
    • [正]
      BasicBlockPassは、FunctionPassと同様にdoInitialization(Module)やdoFinalization(Module)をオーバーライドすることができるほか、
  • 176ページ 上から1行目
    • [誤]
      doInitializationメソッドは、BasicBlockPassで禁止されておらず、FunctionPassで許可されている処理はほとんど実行できます。
    • [正]
      doInitializationメソッドはBasicBlockPassで許されていないが,FunctionPassで許可されている処理はほとんど実行することが出来ます。
  • 179ページ 本文下から3行目
    • [誤]
      ID型
    • [正]
      char型
  • 181ページ リスト6.6の行番号2
    • [誤]
      llvm::errs() << "Function Name" << F.getName().str() << "¥n";
    • [正]
      llvm::errs() << "Function Name:" << F.getName().str() << "¥n";
  • 214ページ 本文下から4行目
    • [誤]
      MachineFunctinPass
    • [正]
      MachineFunctionPass
  • 216ページ 下から5行目
    • [誤]
      MachineCodeとMCInstrの違い
    • [正]
      MachineCodeとMCInstの違い
  • 286ページ 本文上から2行目
    • [誤]
      c83というtagを付け
    • [正]
      llvm-3.2というtagを付け

お問い合わせ

書籍の内容に関するお問い合わせはこちら。お答えできるのは本書に記載の内容に関することに限ります。

お問い合わせフォーム