手続型言語のコンパイラが最後に行う処理|科目A-1(応用情報技術者) 令和6年 秋期午前試験 問20

出典:令和6年秋期 午前 問20 分野:ソフトウェア / 開発ツール
手続型言語のコンパイラがコード生成までに行う処理のうち,最後に行う処理はどれか。
  • ア:意味解析
  • イ:構文解析
  • ウ:最適化
  • エ:字句解析
応用情報技術者
解説

コンパイラは、人が読み書きしやすい高水準語のソースコードを、コンピュータが実行できる機械語などに変換するソフトウェアです。

コンパイル処理は、ソースコードをいきなり機械語にするのではなく、段階的に解析・変換していきます。基本の流れは「字句解析 → 構文解析 → 意味解析 → 最適化 → コード生成」です。

コンパイル
処理段階 内容 イメージ
字句解析 ソースコードの文字列を、意味のある最小単位であるトークンに分ける 単語や記号に分解する
構文解析 トークンの並びが、プログラミング言語の文法に合っているか確認する 文法として正しい形かを調べる
意味解析 変数の宣言やデータ型など、意味として正しいか確認する 型の不一致や未宣言変数を確認する
最適化 実行効率を上げるために、無駄な処理を減らしたり、より効率の良い形に変換したりする 同じ結果をより速く出せる形に直す
コード生成 機械語、アセンブリ言語、中間コードなど、実行できる形のコードを出力する コンピュータが動かせる形に変換する

字句解析では、たとえば「int a = 1 + 2;」というコードを、「int」「a」「=」「1」「+」「2」「;」のような部品に分けます。この部品をトークンといいます。

構文解析では、トークンの並びが文法に合っているかを確認します。たとえば、セミコロンが抜けている、かっこの対応が合っていない、といった誤りを見つけます。

意味解析では、文法としては正しくても、意味として問題がないかを確認します。たとえば、宣言していない変数を使っていないか、数値に文字列を足そうとしていないかなどを確認します。

最適化では、処理結果を変えずに、より効率よく実行できる形に変換します。たとえば「int a = 4 * 5;」を、あらかじめ計算して「int a = 20;」のようにすることがあります。

コード生成では、解析と変換が終わった内容をもとに、コンピュータが実行できる機械語やアセンブリ言語などを作ります。

つまり、コンパイラは「ソースコードを分解する」「文法を確認する」「意味を確認する」「効率よく直す」「実行できるコードを作る」という順番で処理します。

したがって、コード生成までに行う処理のうち最後なのは、の最適化です。

❌他選択肢が誤りの理由
ア:意味解析
⇒意味解析は、構文解析の後に行われますが、その後に最適化が行われます。
イ:構文解析
⇒構文解析は、字句解析の後に行われ、その後に意味解析や最適化が続きます。
エ:字句解析
⇒字句解析は、ソースコードを単語や記号などのトークンに分解する初期段階の処理です。選択肢の中では最も早く行われます。
TSUNAGARU-ADVICE

まず押さえたいこと

コンパイラの代表的な処理順序は、字句解析 → 構文解析 → 意味解析 → 最適化 → コード生成です。したがって、コード生成の直前に行われる処理は最適化です。

迷ったときの判断軸

字句解析では文字列をトークンに分け、構文解析では文法に従っているかを調べ、意味解析では型や変数の使い方などを確認します。その後、実行効率などを改善する最適化を行ってから、目的コードを生成すると整理すると覚えやすくなります。

科目Bにつなげるために

特にプロフェッショナルデジタルスキル(システム)試験合格を目指す方は、各工程の順序だけでなく、字句解析=トークン化、構文解析=文法確認、意味解析=意味・型の確認、最適化=効率改善という役割の違いも押さえておきましょう。