ソフトウェア開発技術者試験 |
2001年度 = 平成13年度 |
午前 |
問44 |
図はコンパイラにおける処理の流れを表している。a~dに入る用語の組合せとして、適切なものはどれか。
[ a ] → [ b ] → [ c ] → [ d ] → 目的コード生成
| a | b | c | d
|
ア
| 構文解析 | 字句解析 | 意味解析 | 最適化
|
イ
| 構文解析 | 字句解析 | 最適化 | 意味解析
|
ウ
| 字句解析 | 構文解析 | 意味解析 | 最適化
|
エ
| 字句解析 | 構文解析 | 最適化 | 意味解析
|
ウ
手続き型言語のコンパイラにおける処理手順は、以下のようになります。
① 字句解析
② 構文解析
③ 意味解析
④ 最適化
⑤ コード生成
C言語を例にして、大まかな流れを考えてみましょう。
if (a > b) c = a; else c =b;
このような文字の並びを、トークン(単語)に区切っていきます。これが字句解析の段階です。この段階で綴り間違いや、キーワードや定数などの単語とみなせない語句があればエラーとなります。
if ( a > b ) c = a ; else c = b ;
単語に分割した後は、構文解析を行います。C言語のif文は、
if (式) 文
if (式) 文 else 文
のいずれかの形式ですから、これにのっとっているかどうか、すなわち《形》として正しいかどうかが調べられます。この場合はOKですね。
それが終了すると、次は意味解析です。たとえば、C言語では、構造体のオブジェクト(変数)の大小関係を比較することができませんので、通常の算術型であれば正しいa > bという式もエラーとなります。《意味》が正しいかどうかが調べられるわけです。
さらに、必要に応じて、プログラム高速化のための最適化が行われます。
最後にコード生成が行われます。すなわち、アセンブリ言語や機械語レベルへの変換が行われます。