応用情報技術者 2013年 秋期 午前2 問20
問題文
コンパイラにおける処理を字句解析、構文解析、意味解析、最適化の四つのフェーズに分けたとき、意味解析のフェーズで行う処理はどれか。
選択肢
ア:言語の文法に基づいてプログラムを解析し、文法誤りがないかチェックする。
イ:プログラムを表現する文字の列を、意味のある最小の構成要素の列に変換する。
ウ:変数の宣言と使用とを対応付けたり、演算におけるデータ型の整合性をチェックする。(正解)
エ:レジスタの有効利用を目的としたレジスタ割付けや、不要な演算を省略するためのプログラム変換を行う。
コンパイラの意味解析フェーズとは【午前2 解説】
要点まとめ
- 結論:意味解析は変数の宣言と使用の対応付けやデータ型の整合性チェックを行うフェーズです。
- 根拠:字句解析や構文解析で文法的な誤りを検出した後、意味的な正しさを検証するために必要な処理だからです。
- 差がつくポイント:構文が正しくても意味的に誤ったプログラムを見抜く能力が問われ、型チェックやスコープ管理の理解が重要です。
正解の理由
選択肢ウは「変数の宣言と使用の対応付け」や「演算におけるデータ型の整合性チェック」を意味解析の典型的な処理として正確に示しています。意味解析は構文解析で得られた構文木を基に、変数のスコープや型の整合性を検証し、意味的に正しいプログラムかどうかを判断します。
よくある誤解
意味解析を構文解析と混同し、文法誤りの検出も意味解析の役割と誤解しがちです。最適化と意味解析の処理内容も混同されやすい点に注意が必要です。
解法ステップ
- コンパイラの処理フェーズを理解する(字句解析→構文解析→意味解析→最適化)。
- 各フェーズの役割を整理し、意味解析は「意味的な正しさの検証」であることを確認。
- 選択肢の説明とフェーズの役割を照合し、意味解析に該当する処理を選ぶ。
- 変数の宣言・使用の対応付けや型チェックが意味解析の代表的処理であることを再確認。
- 選択肢ウを正解と判断する。
選択肢別の誤答解説
- ア: これは構文解析の役割であり、文法誤りの検出を行います。意味解析ではありません。
- イ: 字句解析の処理で、プログラムをトークンに分解する段階です。意味解析とは異なります。
- ウ: 変数の宣言と使用の対応付けや型の整合性チェックは意味解析の典型的な処理です。
- エ: レジスタ割付けや不要な演算の省略は最適化フェーズの処理であり、意味解析ではありません。
補足コラム
意味解析はコンパイラの中間段階で、構文的に正しいプログラムが意味的にも正しいかを検証します。例えば、未宣言変数の使用や型の不一致を検出し、プログラムの正確性を保証します。これにより、実行時エラーの発生を未然に防ぐ役割を担っています。
FAQ
Q: 意味解析と構文解析の違いは何ですか?
A: 構文解析は文法規則に基づきプログラムの構造を解析し文法誤りを検出します。意味解析は構文解析後に意味的な正しさ(型や変数の整合性)を検証します。
A: 構文解析は文法規則に基づきプログラムの構造を解析し文法誤りを検出します。意味解析は構文解析後に意味的な正しさ(型や変数の整合性)を検証します。
Q: 最適化フェーズはどのような処理を行いますか?
A: 最適化はプログラムの実行効率を上げるために、不要な命令の削除やレジスタ割付けなどを行います。意味解析とは異なる段階です。
A: 最適化はプログラムの実行効率を上げるために、不要な命令の削除やレジスタ割付けなどを行います。意味解析とは異なる段階です。
関連キーワード: コンパイラ、意味解析、型チェック、スコープ管理、最適化、字句解析、構文解析

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

