意味解析

意味解析

執筆済 コンピュータ言語

構文的に正しいプログラムが、意味として通るかを調べる。

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.
ノート一覧を閉じる