概要
小さなプログラミング言語から本格的なプログラミング言語へ……ステップバイステップでの開発を通して,プログラミングそのものへの理解を深めよう!
こんな方におすすめ
- コンピュータサイエンス,とくにプログラミング言語そのものやコンパイラについての素養を得たいと考えている人
- 他言語でのプログラミング経験があり,Rustの習得に興味のある人。とくに,学習のための題材を探している人
目次
第1章:プログラミング言語概論
- プログラミング言語の分類
- 他の切り口での分類方法
- コンパイルパイプライン
第2章:スタックベース仮想マシン
- 仮想マシン概論
- Rustでの実装
- 標準入力からの読み込み
- パースとコマンドの実行
- ブロックとネスト構造
- if制御構文
- 変数の定義
- 複数行のソースコードへの対応
- 関数呼び出し
- 関数の再帰呼び出し
- WebAssemblyへのコンパイルとブラウザでの実行
第3章:プログラミング言語の構文解析
- 構文解析が解決する課題
- 構文へのマッチ
- トークンの切り出し
- 括弧によるグループ化
- 木構造の構築
- 式の構文木
- パーサコンビネータnom
- Parsing Expression Grammarによる構文解析
- ASTインタプリタ
- 関数呼び出しの構文と評価
- 設定ファイルへの応用
第4章:スクリプト言語ランタイム
- 本章で設計する言語
- 構文と意味論
- AST実行モデル
- 文(Statement)の導入
- 変数宣言
- 代入文
- 条件分岐
- ループ
- 関数定義
- その他の制御構文
- 動的型の導入
第5章:静的型付けと型チェック
- 静的型システムの概要
- 型チェックの基本構成法
- 型宣言
- 式と文の型チェック
- 組み込み関数の型定義
- エラー位置の報告
第6章:バイトコードへのコンパイル
- バイトコードとネイティブコード
- スタックマシンとレジスタマシン
- 命令セットの特徴と設計
- バイトコードの構成
- 最小限のバイトコードの定義と実行
- バイトコードへのコンパイル
- リテラルテーブルの実装
- 任意のソースコードをパースしてバイトコードへ翻訳
- 完全な式のコンパイルと実行
- 条件分岐式のコンパイルと実行
- ループ制御のコンパイルと実行
- ユーザー定義関数
- 型チェッカーとの統合
- 状態マシンとコルーチン
- コルーチンオブジェクトとジェネレータ
- 応用例
第7章:LLVMを使ったネイティブコードへのコンパイル
- llvm-sysとinkwell
- inkwellでのHello, world!
- ネイティブコードによるパフォーマンスの向上
サポート
正誤表
本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。
「はじめに」 P.vi:4行目
誤 |
ほとんど扱いませんません。 |
正 |
ほとんど扱いません。 |
第1章 P.13:図1.4
誤 |
|
正 |
|
第2章 P.48:1行目
第2章 P.60:下から3つめのコードブロック
誤 |
/vec2sqlen { square exch square exch + }
|
正 |
/vec2sqlen { square exch square exch + } def
|
第4章 P.161:2つめのコードブロック1行目
第4章 P.184:箇条書き
誤 |
⑦break文が出現した場合は、EvalResult::Break(BreakResult::Continue)を返す |
正 |
⑦continue文が出現した場合は、EvalResult::Break(BreakResult::Continue)を返す |
第5章 P.234:1行目
誤 |
6行目の16列目で生じている |
正 |
5行目の16列目で生じている |