【いみかいせき】

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

最終更新:
💡 文法だけでなく、型や名前のルールも確かめる番人

意味解析は、プログラムの型や名前の使い方などが言語の規則に合うかを調べる処理です。構文解析との違い、TypeScriptの型エラーの例、見つけられる誤りと限界を説明します。

📌 このページのポイント
文の形と、型のルールは別TypeScriptの型エラーの例let n: number = "hello";構文の形✓ 文として読める型のルール× 数値型に文字列型が合うことと、目的が合うことは別面積を求めたいのに「5 + 4」型は正しくても、計算の意図は違う
型や名前など、言語で定めた規則を確かめます。構文解析と意味解析が独立した順番で行われるとは限らず、目的に合うプログラムかはテストも必要です。
ひよこ ひよこ
構文解析とは何が違うの?
ペンギン先生 ペンギン先生
構文解析は、式や文の並びが文法に合うかを調べる。意味解析は、その名前が何を指すか、型の使い方が合うかなどを確かめるよ。TypeScriptで「let n: number = "hello";」と書くと、文の形は読めても、数値型へ文字列を代入しているので型検査のエラーになる。
ひよこ ひよこ
文字列と数値を足したら、必ずエラー?
ペンギン先生 ペンギン先生
言語や演算のルールによるよ。JavaScriptなどでは文字列と数値の足し算が文字列の連結になる場合がある。見た目だけで間違いと決めず、その言語で許される型や変換を確認するのが大切だね。
ひよこ ひよこ
型以外にも調べるの?
ペンギン先生 ペンギン先生
変数や関数の名前がどの宣言を指すか、使える範囲か、引数が合うかなども確認する。名前と型などの情報を管理するシンボルテーブルは、そのための道具だよ。何をいつ検査するかは言語と実装によって違うんだ。
ひよこ ひよこ
ASTを作ってから、全部まとめて調べるの?
ペンギン先生 ペンギン先生
構文の木に型などの情報を付けていく構成があるけれど、必ず独立した一回の工程とは限らないよ。たとえばClangでは、構文解析中に意味解析のSemaが呼ばれ、正しいプログラムのASTを作る。図は役割の違いを簡略化した例なんだ。
ひよこ ひよこ
意味解析に通れば、正しく動く?
ペンギン先生 ペンギン先生
すべてのバグが消えるわけではないよ。縦5、横4の面積を求めたいのに「5 + 4」と足してしまっても、数値の型としては正しい。利用者が求める結果か、実行時の条件は満たすかは、テストや確認も必要だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「意味解析」って出てきたら「型や名前の使い方が、言語のルールに合うか確かめる処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Semantic Analysis」 = 意味の解析
💬 Semanticは意味の、Analysisは解析。コンパイラでは、書かれたプログラムを言語の規則に照らして解釈する処理を指すよ。

参考資料

← 用語集にもどる