意味解析
構文的に正しいプログラムが、意味として通るかを調べる。
int x = "hello"; // 構文は正しいが型が合わない
y = 1; // y が宣言されていない
return 1; // 関数の外にあるいずれも構文解析は通る。
主な検査#
| 検査 | 内容 |
|---|---|
| 名前解決 | 識別子がどの宣言を指すか |
| 型検査 | 演算の型が整合するか |
| 定義前使用 | 使う前に宣言されているか |
| 到達可能性 | 到達しないコード、戻り値の欠落 |
| 制御フロー | break がループの中にあるか |
シンボルテーブル#
名前 → 宣言情報の対応表。スコープごとに入れ子になる。
大域スコープ
└ 関数 f のスコープ
└ ブロックのスコープ名前を探すとき、内側から外側へ辿る。 最初に見つかったものが束縛先になる(シャドーイング)。
静的スコープと動的スコープ#
| 静的(レキシカル) | 動的 | |
|---|---|---|
| 決まり方 | ソース上の位置 | 呼び出しの履歴 |
| 決定時期 | コンパイル時 | 実行時 |
| 採用 | ほぼすべての現代言語 | 初期 Lisp、シェル変数 |
静的スコープが主流なのは、 コードを読むだけで束縛先が分かるから。 クロージャが自然に定義できるのも静的スコープの帰結。
型推論との関係#
Hindley-Milner 型推論のような機構は、 名前解決と型検査を統合した形で行われる。 型システムを参照。
参考文献#
- Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools, 2nd ed. Pearson, 2006.
- Daniel P. Friedman, Mitchell Wand. Essentials of Programming Languages, 3rd ed. MIT Press, 2008.
- Benjamin C. Pierce. Types and Programming Languages. MIT Press, 2002.