コンパイラの設計-コンパイラのフェーズ

コンパイルプロセスは、さまざまなフェーズのシーケンスです。各フェーズは、前のステージから入力を受け取り、ソースプログラムの独自の表現を持ち、その出力をコンパイラの次のフェーズにフィードします。コンパイラのフェーズを理解しましょう。

字句解析

スキャナーの最初のフェーズは、テキストスキャナーとして機能します。このフェーズでは、ソースコードを文字のストリームとしてスキャンし、意味のある語彙素に変換します。字句アナライザーは、これらの語彙素をトークンの形式で次のように表します。

<token-name, attribute-value>

構文解析

次のフェーズは構文解析または parsing。字句解析によって生成されたトークンを入力として受け取り、解析ツリー(または構文ツリー)を生成します。このフェーズでは、トークンの配置がソースコードの文法に対してチェックされます。つまり、パーサーは、トークンによって作成された式が構文的に正しいかどうかをチェックします。

セマンティック分析

セマンティック分析は、構築された解析ツリーが言語の規則に従っているかどうかをチェックします。たとえば、値の割り当ては互換性のあるデータ型間で行われ、整数に文字列が追加されます。また、セマンティックアナライザーは、識別子、そのタイプ、および式を追跡します。識別子が使用前に宣言されているかどうかなど。セマンティックアナライザは、注釈付きの構文ツリーを出力として生成します。

中間コード生成

セマンティック分析の後、コンパイラはターゲットマシンのソースコードの中間コードを生成します。これは、いくつかの抽象マシンのプログラムを表します。それは高級言語と機械語の中間にあります。この中間コードは、ターゲットマシンコードへの変換が容易になるように生成する必要があります。

コードの最適化

次のフェーズでは、中間コードのコード最適化を行います。最適化は、不要なコード行を削除し、リソース(CPU、メモリ)を無駄にすることなくプログラムの実行を高速化するために、ステートメントのシーケンスを配置するものと見なすことができます。

コード生成

このフェーズでは、コードジェネレーターは中間コードの最適化された表現を取得し、それをターゲットの機械語にマップします。コードジェネレーターは、中間コードを(一般的に)再配置可能なマシンコードのシーケンスに変換します。マシンコードの一連の命令は、中間コードと同じようにタスクを実行します。

シンボルテーブル

これは、コンパイラーのすべてのフェーズを通じて維持されるデータ構造です。すべての識別子の名前とそのタイプがここに保存されます。シンボルテーブルを使用すると、コンパイラは識別子レコードをすばやく検索して取得することが容易になります。シンボルテーブルは、スコープ管理にも使用されます。