試験公開中

このエントリーをはてなブックマークに追加

インタプリタの作り方 -言語設計/開発の基本と2つの方式による実装-

インプレス

5,940円 (5,400円+税)

本書はインタープリタのプログラミングを材料にプログラミング言語の開発を学ぶものです。プログラミング言語を構成する「字句解析」「式評価」「制御フロー」「関数」などの要素、さらに本書では「クロージャ」「スーパークラス」「ガベージコレクション」などモダンな言語における定番の要素も取り扱います。

【注意】本書のEPUB版は固定レイアウト型になっております。文字の大きさの変更や検索、引用などはお使いいただけません。画面の大きい端末でご利用ください。

関連サイト

本書の関連ページが用意されています。

内容紹介

●言語を書く

本書はインタープリタのプログラミングを材料に、プログラミング言語の開発を学ぶものです。プログラミング言語を構成する「字句解析」「式評価」「制御フロー」「関数」などの要素、さらに本書では「クロージャ」「スーパークラス」「ガベージコレクション」などモダンな言語における定番の要素も取り扱います。

現代における言語の開発はプログラミングのテクニックだけでなく、様々なツールを駆使して見通しよく進めることが可能です。本書は筆者の豊富な開発経験をもとに、その基本的な技法や知識を学ぶことができます。

●2つの実装による解説 ここでは、Loxという本書用に考案されたモダンな仕様の言語を想定し、それをもとにインタプリタを実装します。インタプリタはJavaおよびC言語で作られた仮想マシン(VM)を使って動作するため、開発者は言語開発のコアとなる部分を集中的に実装することになります。まず、Javaを使ったLoxの実装(jlox)で基本的な部分を作り、その後はC言語を使ってパフォーマンスや高度な動作を考慮した実装(clox)に進みます。また、執筆者の豊富なプログラミング経験による解説は、ときに言語の歴史に触れ、ときにコンピュータサイエンスのエッセンスにも言い及ぶもので、読み応えがあります。

●言語開発は怖くない 本書は、言語の開発に興味がある方、プログラミングの知識や技術をさらに磨きたい方、コンピュータの処理系を詳しく知りたい方に最適な書籍です。言語開発は難易度の高さから敬遠されがちな技術分野ですが、本書ではそれらがじつはさまざまな要素の集合体であることを紹介し、シンプルな技術の積み重ねとして、楽しんで学べるものとなっています。

書誌情報

  • 著者: Robert Nystrom(著), 吉川邦夫(訳)
  • 発行日: (紙書籍版発行日: 2023-09-26)
  • 最終更新日: 2023-09-26
  • バージョン: 1.0.0
  • ページ数: 776ページ(PDF版換算)
  • 対応フォーマット: PDF, EPUB
  • 出版社: インプレス

対象読者

プログラマーを実践的にされている方、プログラミング技術の向上を図りたい方、プログラミング言語の開発を学びたい方、プログラミングについての知識をつけたい方

著者について

Robert Nystrom

プロフェッショナルプログラマーとして20年の経歴を持つ。そのうち10年はゲームプログラミングに従事。米国大手ゲーム会社のエレクトロニック・アーツに8年間在籍。大規模ゲームから小型のアドベンチャー&パズルゲームまで幅広く開発に携わり、それらのゲームはPC、GameCube、PlayStation 2、Xbox、Xbox 360、Nintendo DS向けに出荷された。しかし著者は、そうした製品のリリースよりも、開発者向けのツールや共有ライブラリを作ることにプライドを持っている。美しく有用なコードを眺めることや、開発者の創造力の拡大に寄与することを、なによりも好む。

吉川邦夫

1957年生まれ。ICU(国際基督教大学)卒。おもに制御系のプログラマとして、ソフトウェア開発に従事した後、翻訳家として独立。英文雑誌記事の和訳なども手掛ける。訳書は、Scott Meyersらによる「Effective」ソフトウェア開発シリーズ(アスキー、翔泳社)、『詳解 Rustプログラミング』(翔泳社)、『Unity 3Dゲーム開発ではじめるC#プログラミング』(インプレス)、『Rustプログラミング完全ガイド』(インプレス)など多数。

目次

謝辞

目次

第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 主な参考文献

索引

Home 書籍一覧 インタプリタの作り方 -言語設計/開発の基本と2つの方式による実装- ▲ ページトップへ戻る