第1種情報処理技術者試験 |
1998年度 = 平成10年度 |
午前 |
問29 |
図は原始プログラムを目的プログラムに変換するコンパイラの処理過程を表している。a~cに入れるべき語句の組合せとして、正しいものはどれか。
a → b → c → コード最適化 → コード生成
| a | b | c
|
ア | 意味解析 | 字句解析 | 構文解析
|
イ | 構文解析 | 字句解析 | 意味解析
|
ウ | 字句解析 | 意味解析 | 構文解析
|
エ | 字句解析 | 構文解析 | 意味解析
|
エ
手続き型言語のコンパイラにおける処理手順は、以下のようになります。
① 字句解析
② 構文解析
③ 意味解析
④ 最適化
⑤ コード生成
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という式もエラーとなります。《意味》が正しいかどうかが調べられるわけです。
さらに、必要に応じて、プログラム高速化のための最適化が行われます。
最後にコード生成が行われます。すなわち、アセンブリ言語や機械語レベルへの変換が行われます。