Category
Rustで自作プログラミング言語処理系開発
静的型付けの自作プログラミング言語処理系をRustでゼロから実装します。字句解析・構文解析・型検査からバイトコードコンパイラ・VMまで、インタプリタの内部構造を段階的に組み上げていく過程を扱います。
6件の記事
スタックマシンVMを実装する——バイトコードを解釈実行するfetch-decode-executeループ
静的型付けの自作プログラミング言語処理系において、コンパイルしたバイトコードを実際に解釈実行するスタックマシンVMをRustで実装します。命令ポインタとスタックだけで完結するfetch-decode-executeループの作り方、演算子をランタイムの値の種類で分岐させる設計、整数オーバーフロー・ゼロ除算・配列の範囲外アクセスをランタイムエラーとして扱う理由、そして代入文もprint文もまだ無い言語でVMの実行結果をどうテストで検証するかという工夫までを扱います。
続きを読むバイトコードコンパイラを実装する——スタックスロットとバックパッチングでASTを命令列に変換する
静的型付けの自作プログラミング言語処理系において、型検査を通過したASTをバイトコードにコンパイルする処理をRustで実装します。オペコードとオペランドをバイト列に詰め込む標準的な表現形式、ローカル変数をすべてスタックスロットで解決する設計、if/while/forの制御フローをジャンプ命令とバックパッチングで組み立てる方法、for-inループをインデックスループへ脱糖する処理、break/continueがスコープをまたぐ際のスタック整合性の取り方までを扱います。
続きを読む静的型検査器を実装する——スコープ付き環境と「Unknown型」で不正な演算を検出する
静的型付けの自作プログラミング言語処理系において、構文解析で得られたASTに対する静的型検査(Type Checker)をRustで実装します。ブロックスコープを持つ型環境の設計、letの型推論、配列要素の型統一といった基本的な型検査に加え、関数宣言がまだ存在しない現段階で関数呼び出しをどう扱うかという設計判断(「Unknown型」による型システムからの隔離)を扱います。
続きを読むif/while/forを構文解析する——文のASTでプログラム全体を組み立てる
静的型付けの自作プログラミング言語処理系において、if/else・while・for・let・returnといった文(Statement)を構文解析し、プログラム全体を表現する抽象構文木(AST)を完成させます。式のパースとは異なる再帰下降パースの実装と、波括弧を必須にしてdangling else問題を構文レベルで排除する設計を扱います。
続きを読むPratt Parsingで式を構文解析する——演算子の優先順位をbinding powerで表現する
静的型付けの自作プログラミング言語処理系において、字句解析で得られたトークン列を抽象構文木(AST)に変換する構文解析器(Parser)をRustで実装します。Pratt Parsingという手法を使い、演算子の優先順位と結合方向を「binding power」という数値のペアで表現し、再帰呼び出しの深さに変換する仕組みを扱います。
続きを読む字句解析器(Lexer)の実装——ソースコードをトークン列に変換する
静的型付けの自作プログラミング言語処理系において、ソースコード文字列をトークン列に変換する字句解析器(Lexer)をRustで実装します。数値・文字列・識別子・キーワード・演算子の読み取りと、エラー報告用の行・列位置の管理を扱います。
続きを読む