Skip to content

はじめに

このドキュメントは、JavaScript エンジンを実際に開発する過程で得られた技術知見を、基礎から応用へと順に読み進められる技術書としてまとめたものです。ECMAScript の仕様そのものを解説するのではなく、その仕様をエンジンとして「どう実現するか」に焦点を当てます。字句解析からガベージコレクション、非同期処理、正規表現、そして品質保証まで、エンジンを構成する技術要素と設計上の選択肢、そのトレードオフを扱います。

このドキュメントの目的

JavaScript は言語仕様が広く公開されており、各機能が「どう振る舞うべきか」は容易に調べられます。一方で、その振る舞いを「どのような内部構造で実現するか」は、実装の内側に入らなければ見えてきません。値をどう表現するか、オブジェクトのプロパティをどう格納するか、関数呼び出しやクロージャをどう実行するか、到達不能になったメモリをどう回収するか。こうした問いには複数の答えがあり、それぞれに速度・メモリ使用量・実装コスト・移植性・仕様適合の容易さといった観点での得失があります。

本書は、こうした「実現方法の選択肢とトレードオフ」を体系立てて示すことを目的とします。読み終えたとき、読者が自分でエンジンの設計判断を下せるだけの土台を得られることを目指します。

対象読者

JavaScript を日常的に使いこなしている開発者で、その言語を動かしているエンジンの内部に関心がある方を想定しています。言語仕様の暗記は前提としませんが、JavaScript の基本的な言語機能(オブジェクト・プロトタイプ・クロージャ・Promise など)には親しんでいることを前提とします。

低レベルの話題(メモリレイアウト・ポインタ・並行性など)も登場しますが、その都度必要な範囲で説明します。特定のシステムプログラミング言語の知識は前提としません。

扱う範囲と扱わない範囲

  • 扱う: エンジンを支える基礎技術要素、実装上の設計選択肢、各選択肢のメリット・デメリットとトレードオフ、実装で陥りやすい罠とその対策。
  • 扱わない: ECMAScript 仕様条文の網羅的な解説。個々の API の仕様上の振る舞いは、必要な範囲でのみ触れます。仕様そのものは一次資料(ECMA-262)を参照してください。

編集方針

  • 実現方法を中心に据える: 「仕様がどうなっているか」ではなく「その仕様をどう作るか」を軸にします。
  • 基礎から応用への一本道: 前から順に読むと、全体像から各コンポーネント、メモリ管理、言語機能の実現、応用トピック、品質保証へと知識が積み上がる構成にしています。各章は前の章で導入した用語を前提にすることがあります。
  • 特定エンジンに依存しない: 記述は技術的な性質(たとえば「参照カウント方式」「非移動型 GC」「バックトラッキング型の正規表現」)で行い、特定のエンジン名は原則として挙げません。個々のエンジンの実装詳細は将来変わりうるためです。
  • トレードオフを重視する: 技術要素ごとに、複数の方式を速度・メモリ・実装コスト・移植性・仕様適合の容易さといった軸で比較します。
  • 実装経験に基づく: 机上の整理にとどまらず、実際の開発で踏んだ設計判断・計測・不具合とその修正から一般化できる知見を盛り込みます。
  • 参考文献を明示する: 各トピックには、その分野で広く認知された一次資料(公式仕様・標準化団体・原著者による解説など)への参照を可能な範囲で付します。

本書の構成

  • 第I部 全体像と基礎: エンジンのパイプライン全体像、字句解析、構文解析、値の表現。
  • 第II部 ランタイム中核: オブジェクトモデル、文字列表現、バイトコードとコンパイラ、インタプリタ実行。
  • 第III部 メモリ管理: GC 方式の選択、ルート集合と到達可能性、ネイティブコードとの相互作用、弱い参照とファイナライザ。
  • 第IV部 言語機能の実現: 例外処理、関数呼び出し、ジェネレータと async/await、イベントループ、モジュール、メタプログラミング。
  • 第V部 応用トピック: 正規表現エンジン、数値と精度、日付・時刻、埋め込みと C API、パフォーマンス。
  • 第VI部 品質保証: 準拠性テスト、差分テスト、ファジング、メモリ安全性の検出、ベンチマーク。

はじめて読む場合は、この順に読み進めることをおすすめします。特定の話題だけを知りたい場合も、その章が前提とする基礎章(特に第I部の「値の表現」と第III部の「GC 方式の選択」)に目を通しておくと理解が容易になります。

表記について

本文中のコードは、特定の実装言語に依存しない擬似コード、または概念を示す最小限の断片で示します。実際のエンジンのソースをそのまま引用することは避け、要点が伝わることを優先します。図が理解を助ける箇所では図を用います。

参考文献