インタプリタの作り方 -言語設計/開発の基本と2つの方式による実装-
インプレス
- Robert Nystrom(著者)、 吉川邦夫(翻訳)
実践!モダン言語実装の基礎を知る
●言語を書く
本書はインタープリタのプログラミングを材料に、プログラミング言語の開発を学ぶものです。プログラミング言語を構成する「字句解析」「式評価」「制御フロー」「関数」などの要素、さらに本書では「クロージャ」「スーパークラス」「ガベージコレクション」などモダンな言語における定番の要素も取り扱います。
現代における言語の開発はプログラミングのテクニックだけでなく、様々なツールを駆使して見通しよく進めることが可能です。本書は筆者の豊富な開発経験をもとに、その基本的な技法や知識を学ぶことができます。
●2つの実装による解説
ここでは、Loxという本書用に考案されたモダンな仕様の言語を想定し、それをもとにインタプリタを実装します。インタプリタはJavaおよびC言語で作られた仮想マシン(VM)を使って動作するため、開発者は言語開発のコアとなる部分を集中的に実装することになります。まず、Javaを使ったLoxの実装(jlox)で基本的な部分を作り、その後はC言語を使ってパフォーマンスや高度な動作を考慮した実装(clox)に進みます。また、執筆者の豊富なプログラミング経験による解説は、ときに言語の歴史に触れ、ときにコンピュータサイエンスのエッセンスにも言い及ぶもので、読み応えがあります。
●言語開発は怖くない
本書は、言語の開発に興味がある方、プログラミングの知識や技術をさらに磨きたい方、コンピュータの処理系を詳しく知りたい方に最適な書籍です。言語開発は難易度の高さから敬遠されがちな技術分野ですが、本書ではそれらがじつはさまざまな要素の集合体であることを紹介し、シンプルな技術の積み重ねとして、楽しんで学べるものとなっています。
発売日:2023-09-26
ページ数:776ページ
目次
表紙
クレジット・正誤情報
謝辞
目次
第I部 導入編
第1章 はじめに
1.1 なぜこれを学ぶのか
1.2 この本の構成
1.3 第1のインタプリタ
1.4 第2のインタプリタ
第2章 領域の地図/2.1 言語のパーツ
2.2 ショートカットと別ルート
2.3 コンパイラとインタプリタ
2.4 我らの旅
第3章 Lox言語/3.1 Hello, Lox
3.2 高いレベルの言語
3.3 データの型
3.4 式(Expressions)
3.5 文(Statements)/3.6 変数
3.7 制御の流れ
3.8 関数
3.9 クラス
3.10 標準ライブラリ
第II部 木の巡回によるインタプリタ
第4章 字句解析(スキャニング)/4.1 インタプリタのフレームワーク
4.2 字句とトークン
4.3 正規言語と正規表現
4.4 Scannerクラス
4.5 字句を認識する
4.6 もっと長い字句
4.7 予約語と識別子
第5章 コードを表現する
5.1 文脈自由文法
5.2 構文木を実装する
5.3 構文木を使う
5.4 プリティプリンタ(に似たもの)
第6章 式の構文を解析する
6.1 多義性と構文解析のゲーム
6.2 再帰下降の構文解析
6.3 構文エラー
6.4 パーサを接続する
第7章 式を評価する
7.1 値を表現する
7.2 式を評価する
7.3 ランタイムエラー
7.4 インタプリタを接続する
第8章 文と状態
8.1 文(ステートメント)
8.2 グローバル変数
8.3 環境
8.4 代入
8.5 スコープ
第9章 制御フロー/9.1 チューリングマシンについて(簡単に)
9.2 条件付きの実行
9.3 論理演算子
9.4 whileループ
9.5 forループ
第10章 関数/10.1 関数コール
10.2 ネイティブ関数
10.3 関数宣言
10.4 関数オブジェクト
10.5 return文
10.6 ローカル関数とクロージャ
第11章 解決と束縛/11.1 静的スコープ
11.2 意味解析
11.3 Resolverクラス
11.4 解決した変数を解釈する
11.5 解決エラー
第12章 クラス
12.1 OOPとクラス
12.2 クラス宣言
12.3 インスタンスを作る
12.4 インスタンスのプロパティ
12.5 クラスのメソッド
12.6 this
12.7 オブジェクトの構築と初期化
第13章 継承
13.1 スーパークラスとサブクラス
13.2 メソッドを継承する
13.3 スーパークラスのメソッドを呼び出す
13.4 まとめ
第III部 バイトコード式仮想マシン
第14章 バイトコード
14.1 バイトコード?
14.2 手始めに
14.3 命令のチャンク
14.4 チャンクの逆アセンブル
14.5 定数
14.6 行情報
第15章 仮想マシン/15.1 命令を実行する機械
15.2 値のスタックを操作する
15.3 算術演算
第16章 オンデマンドの字句解析
16.1 インタプリタを始動する
16.2 トークンを1個ずつ
16.3 Loxの字句文法
16.4 識別子とキーワード
第17章 式をコンパイルする
17.1 シングルパスのコンパイル
17.2 トークンを解析する
17.3 バイトコードを出力する
17.4 前置式を解析する
17.5 中置式を解析する
17.6 プラットパーサ
17.7 チャンクのダンプを取る
第18章 値の型/18.1 タグ付き共用体
18.2 Loxの値とCの値
18.3 動的に型付けされる数値
18.4 2つの型を追加する
第19章 文字列
19.1 値とオブジェクト
19.2 構造体継承
19.3 文字列
19.4 文字列演算
19.5 オブジェクトを解放する
第20章 ハッシュ表
20.1 バケットの配列
20.2 衝突処理法
20.3 ハッシュ関数
20.4 ハッシュ表の構築
20.5 文字列のインターン化
第21章 グローバル変数
21.1 文(ステートメント)
21.2 変数宣言
21.3 変数を読む
21.4 代入
第22章 ローカル変数
22.1 ローカル変数の表現
22.2 ブロック文
22.3 ローカル変数を宣言する
22.4 ローカル変数を使う
第23章 前後にジャンプする
23.1 if文
23.2 論理演算子
23.3 while文
23.4 for文
第24章 コールと関数/24.1 関数オブジェクト
24.2 コンパイルして関数オブジェクトを作る
24.3 コールフレーム
24.4 関数宣言
24.5 関数コール
24.6 return文
24.7 ネイティブ関数
第25章 クロージャ
25.1 クロージャオブジェクト
25.2 上位値(upvalue)
25.3 上位値オブジェクト
25.4 上位値を閉じ込める
第26章 ごみ集め
26.1 到達可能性
26.2 マーク&スイープによるごみ集め
26.3 ルートにマークを付ける
26.4 オブジェクト参照をトレースする
26.5 使わないオブジェクトをスイープする
26.6 ごみを、いつ集めるか
26.7 GCのバグ
第27章 クラスとインスタンス
27.1 クラスオブジェクト
27.2 クラス宣言
27.3 クラスのインスタンス
27.4 Get式とSet式
第28章 メソッドと初期化子/28.1 メソッド宣言
28.2 メソッド参照
28.3 this
28.4 インスタンス初期化子
28.5 呼び出しの最適化
第29章 スーパークラス/29.1 メソッドを継承する
29.2 スーパークラスを格納する
29.3 スーパーコール
29.4 完成した仮想マシン
第30章 最適化/30.1 性能を計測する
30.2 より高速なハッシュ表探針
30.3 NaNボクシング
30.4 その次は?
付録 I/I 文法
II 式と文
付録 II(日本語版の付録)/I READMEの概要
II 主な参考文献
索引
奥付
著者プロフィール
-
Robert Nystrom(著者)
■著者
●Robert Nystrom(ロバート・ナイストロム )
プロフェッショナルプログラマーとして20年の経歴を持つ。そのうち10年はゲームプログラミングに従事。米国大手ゲーム会社のエレクトロニック・アーツに8年間在籍。大規模ゲームから小型のアドベンチャー&パズルゲームまで幅広く開発に携わり、それらのゲームはPC、GameCube、PlayStation 2、Xbox、Xbox 360、Nintendo DS向けに出荷された。しかし著者は、そうした製品のリリースよりも、開発者向けのツールや共有ライブラリを作ることにプライドを持っている。美しく有用なコードを眺めることや、開発者の創造力の拡大に寄与することを、なによりも好む。
■翻訳
●吉川 邦夫(よしかわ・くにお)
1957年生まれ。ICU(国際基督教大学)卒。おもに制御系のプログラマとして、ソフトウェア開発に従事した後、翻訳家として独立。英文雑誌記事の和訳なども手掛ける。訳書は、Scott Meyersらによる「Effective」ソフトウェア開発シリーズ(アスキー、翔泳社)、『詳解 Rustプログラミング』(翔泳社)、『Unity 3Dゲーム開発ではじめるC#プログラミング』(インプレス)、『Rustプログラミング完全ガイド』(インプレス)など多数。
絶賛!発売中!
-
- 自分専用AIを作ろう!カスタムChatGPT活用入門
-
- 清水 理史(著者)
- 開発技法
- カスタムChatGPTの最新機能が1冊でわかる!
Copyright © Mynavi Publishing Corporation