コンパイラの処理順序は各工程の入力から考える
基本情報技術者試験 平成30年度秋期 午前 問19 / ソフトウェア › 開発ツール
過去問にチャレンジ
手続型言語のコンパイラが行う処理のうち,最初に行う処理はどれか。
- ア
意味解析
- イ
構文解析
- ウ
最適化
- エ
字句解析
会話形式の解説
講師今回は、コンパイラが原始プログラムを翻訳するときの処理の順番がテーマです。どれが一番最初に来るかを答えます。順番を考えるときは、それぞれの工程が何を入力にしているかに注目してください。
受験者私は、まず文法が正しいかを確かめると思ったので、構文解析が最初かなと考えました。
講師そう考えたくなりますね。では、コンパイラが最初に受け取るものは何でしょうか。
受験者ソースプログラムなので、文字が並んでいるだけのものです。
講師そのとおりです。構文解析は、言語の文法規則に沿ってプログラムの構造を調べ、構文木という構造の図を作る工程です。ただし、入力は生の文字列ではなく、単語に区切られたトークンの列です。
受験者トークンの列は、どこで作られるのですか。
講師字句解析です。ソースの文字の並びを読み、予約語・識別子・演算子・定数などのトークンに区切ります。文字列だけを入力にして動けるのはこの工程だけで、後の解析はどれもトークン列を前提にしています。
受験者だから構文解析は2番目なのですね。意味解析はどこに入りますか。
講師意味解析は、変数の型が合っているか、名前が宣言されているかといった整合性を確かめる工程です。どこが変数でどこが式かという構造が分かっていないと確かめられないので、字句解析と構文解析の後になります。
受験者最適化は、実行を速くしたりコードを小さくしたりする処理だったと思います。改善する対象が分かっていないとできないので、解析が終わった後ということですか。
講師はい。プログラムの構造と意味が解析で明らかになってから、何を改善するかを決めます。全体の流れは、字句解析、構文解析、意味解析、最適化、コード生成の順です。
受験者まとめると、文字列を扱えるのは字句解析だけなので、最初に行う処理は字句解析ということですね。
講師そのとおりです。単語の字句、文の形の構文、中身の正しさの意味と、細かい単位から大きな単位へ進むと整理しやすくなります。文法のチェックが先に思えて構文解析を選びやすいので、各工程の入力に注目しましょう。そうすれば、丸暗記に頼らなくても順序を判断しやすくなります。
まとめ
コンパイラの処理は、字句解析、構文解析、意味解析、最適化、コード生成の順に進みます。コンパイラが最初に受け取るのは文字の並びだけで、それを直接扱えるのは文字列をトークンに区切る字句解析です。構文解析はトークン列を入力にして構文木を作ります。意味解析と最適化は、構造が分かった後に行います。したがって、最初に行う処理は字句解析です。
解答・解説
正解はエです
この問題のテーマ
コンパイラが原始プログラムを目的プログラムに翻訳するときの処理の順序を問う問題です。そのうち一番最初に来る工程を答えます。
解き方の考え方
各工程が何を入力にしているかを考えると、順序が決まります。コンパイラが最初に受け取るのは、ソースプログラムという文字の並びだけです。文字の並びを直接扱える工程が最初に来て、ほかの工程はその結果を使って後から動きます。おおまかな流れは、字句解析、構文解析、意味解析、最適化、コード生成の順です。
選択肢ごとの解説
- ×ア 意味解析意味解析は、変数の型が合っているか、名前が宣言されているかといった整合性を確かめる工程です。この確認をするには、どこが変数でどこが式かという構造がわかっている必要があります。そのため、字句解析と構文解析が済んだ後に行います。
- ×イ 構文解析構文解析は、言語の文法規則に沿ってプログラムの構造を調べ、構文木を作る工程です。入力は生の文字列ではなく、単語に区切られたトークンの列です。トークン列を作るのは字句解析なので、構文解析は2番目になります。
- ×ウ 最適化最適化は、実行速度を上げたりコードのサイズを小さくしたりするための改善処理です。何を改善するかは、プログラムの構造と意味が解析で明らかになってから決められます。そのため、解析の工程より後に行います。
- ○エ 字句解析字句解析は、ソースの文字の並びを読み、予約語・識別子・演算子・定数などのトークンに区切る工程です。文字列だけを入力にして動けるのはこの工程だけで、後に続く解析はどれもトークン列を前提にしています。したがって、最初に行う処理は字句解析です。
補足
順序を問う問題は、「その工程は何を入力にしているか」を考えると丸暗記に頼らずに解けます。単語(字句)、文の形(構文)、中身の正しさ(意味)の順に、細かい単位から大きな単位へ進むと覚えておくと整理しやすくなります。
POINT
- コンパイラの処理は、字句解析、構文解析、意味解析、最適化、コード生成の順に進みます。
- 字句解析は、文字列をトークンに分ける工程です。
- 構文解析は、トークン列を文法規則に照らして構文木を作る工程です。
- 意味解析は型や宣言の整合性を、最適化は実行効率を扱い、どちらも構造がわかった後に行います。
