読み方 : いみかいせき

意味解析【semantic analysis】

概要

意味解析とは、コンパイラソースコードを処理する工程の一つであり、構文的に正しいプログラムが「意味的にも正しいか」を検証する段階。型の整合性や変数宣言の有無など、文法だけでは検出できない誤りをここで発見する。
意味解析のイメージ画像

コンパイラソースコード機械語へ変換する際、複数の処理段階を経る。まず、「字句解析」(lexical analysis)でコードを最小単位のトークンの列に分割し、「構文解析」(parsing)でその並びが文法規則に沿っているかを確認する。

しかし、構文解析パスしても、プログラムとして不適切なコードは依然として存在する。例えば、「整数型の変数に文字列を代入する」「宣言していない変数を使用する」といったケースは、構文上は形式的に問題なく見えても、実行時に誤動作を引き起こす可能性がある。意味解析はこうした問題をコンパイル時点で検出するための工程である。

意味解析における中心的な処理の一つが「型検査」である。型検査では、演算や関数呼び出しにおいてデータ型が適切に一致しているかを確認する。整数同士の加算は問題ないが、整数と真偽値を直接加算しようとした場合、型の不一致としてエラーが報告される。型検査の厳密さはプログラミング言語の設計方針によって異なり、コンパイル時に厳しく検査する「静的型付け言語」(C言語やJavaなど)と、実行時に型を決定する「動的型付け言語」(PythonJavaScriptなど)とでは、意味解析の役割の比重も変わってくる。

もう一つの重要な処理が「スコープ解析」と「名前解決」である。変数や関数が使用されている箇所で、それが適切なスコープ(有効範囲)内で宣言されているかを確認し、同じ名前が複数ある場合にどの宣言を参照すべきかを決定する。この処理には「シンボルテーブル」と呼ばれるデータ構造が用いられ、識別子の名前・型・スコープといった情報が登録・参照される。

意味解析を経たコードは、中間表現への変換や最適化といった後続の処理へと渡される。意味解析によってプログラムの論理的な整合性が保証されるため、実行時エラーの削減やデバッグコストの低減、攻撃者に悪用されかねない脆弱性の削減に寄与する。コンパイラの設計において重要な位置を占め、何をどこまでチェックできるかによってコンパイラごとの機能や性能の差がつきやすい工程でもある。

資格試験などの「意味解析」の出題履歴

▼ 基本情報技術者試験
平29修12 問19】 コンパイラにおける処理を字句解析,構文解析,意味解析,最適化の四つのフェーズに分けたとき,意味解析のフェーズで行う処理はどれか。
この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。