【いみかいせき】

意味解析(コンパイラ) とは?

💡 文法は合っているけど「意味が通るか」を最終チェックする番人
📌 このページのポイント
意味解析の役割 AST 構文解析の出力 意味解析器 型検査・スコープ解決 シンボルテーブル構築 装飾付きAST 各ノードに型情報が付与 → コード生成・最適化へ 意味解析が検出するエラー ❌ "hello" + 42 型の不一致 ❌ 未宣言の変数を使用 スコープ ❌ func(a, b) に引数3つ 引数 ❌ private メンバーに外部アクセス 可視性 ❌ 戻り値のない関数で return 使用 シンボルテーブル 名前 スコープ x int main name string main calc func global
意味解析のイメージ
ひよこ ひよこ

意味解析って構文解析とは何が違うの?

ペンギン先生 ペンギン先生

構文解析は「文法的に正しいか」をチェックするけど、意味解析は「意味的に正しいか」をチェックするよ。たとえば「文字列 + 整数」は文法的にはOKでも、型が合わないから意味解析でエラーになるんだ。

ひよこ ひよこ

型チェック以外にはどんなことをするの?

ペンギン先生 ペンギン先生

変数が宣言される前に使われていないかとか、関数の引数の数が合っているかとか、アクセス修飾子の違反がないかなども確認するよ。シンボルテーブルという名前と情報の対応表を作るのもこの段階だね。

ひよこ ひよこ

シンボルテーブルって何なの?

ペンギン先生 ペンギン先生

プログラム中の変数名・関数名・型名などを登録して、その型やスコープの情報を管理する表だよ。意味解析ではこの表を見ながら「この変数はここで有効か」「型は正しいか」を判定するんだ。

ひよこ ひよこ

構文解析でAST(抽象構文木)を作った後に意味解析をするんだね!

ペンギン先生 ペンギン先生

そのとおり!ASTを走査しながら各ノードに型情報を付けたり、エラーを検出したりするよ。この処理を「装飾付きAST」を作るとも言うんだ。

ひよこ ひよこ

意味解析が終わった後はどうなるの?

ペンギン先生 ペンギン先生

中間コード生成やコード最適化に進むよ。意味解析がしっかり型情報を付けてくれるおかげで、最適化器は安全に効率の良いコードを生成できるんだ。TypeScriptの型チェッカーやRustの借用チェッカーも、広い意味では意味解析の一種と言えるね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「意味解析」って出てきたら「構文は正しいけど意味的におかしい部分を見つける処理」と思えればだいたいOK!
📖 おまけ:英語の意味
「Semantic Analysis」 = 意味の解析
💬 semantic は「意味の」という意味で、プログラムの意味レベルの正しさを分析する工程だよ
← 用語集にもどる