コンパイラのフェーズと例: コンパイルのプロセスと手順
コンパイラ設計のフェーズは何ですか?
コンパイラ さまざまなフェーズで動作し、各フェーズではソース プログラムをある表現から別の表現に変換します。各フェーズでは、前のステージから入力を受け取り、その出力をコンパイラの次のフェーズに渡します。
コンパイラには 6 つのフェーズがあります。 この各フェーズは、高レベル言語からマシンコードへの変換に役立ちます。 コンパイラのフェーズは次のとおりです。
- 字句解析
- 構文解析
- 意味解析
- 中間コードジェネレータ
- コードオプティマイザー
- コードジェネレーター

これらすべてのフェーズでは、トークンに分割し、解析ツリーを作成し、さまざまなフェーズでソース コードを最適化することで、ソース コードを変換します。
フェーズ 1: 字句解析
字句解析は、コンパイラがソース コードをスキャンするときの最初のフェーズです。 このプロセスは左から右に、文字ごとに実行し、これらの文字をトークンにグループ化できます。
ここでは、ソース プログラムからの文字ストリームが、トークンを識別することによって意味のあるシーケンスにグループ化されます。 対応するチケットをシンボル テーブルにエントリし、そのトークンを次のフェーズに渡します。
このフェーズの主な機能は次のとおりです。
- ソースコード内の字句単位を識別する
- 字句単位を定数や予約語などのクラスに分類し、別のテーブルに入力します。 ソースプログラム内のコメントは無視されます
- 言語の一部ではないトークンを特定する
例::
x = y + 10
トークン
| X | 識別子 |
| = | 代入演算子 |
| Y | 識別子 |
| + | 加算演算子 |
| 10 | 数 |
フェーズ 2: 構文分析
構文分析とは、コード内の構造を発見することです。 テキストが予期された形式に従っているかどうかを判断します。 このフェーズの主な目的は、プログラマによって書かれたソース コードが正しいかどうかを確認することです。
構文分析は、トークンを使用して解析ツリーを構築することにより、特定のプログラミング言語に基づくルールに基づいて行われます。 また、ソース言語の構造と言語の文法または構文も決定します。
このフェーズで実行されるタスクのリストを次に示します。
- 字句アナライザーからトークンを取得する
- 式が構文的に正しいかどうかを確認します
- すべての構文エラーを報告する
- 構文解析木と呼ばれる階層構造を構築する
例:
任意の識別子/番号は式です
x が識別子で y+10 が式の場合、x= y+10 はステートメントになります。
次の例の構文解析木を考えてみましょう
(a+b)*c
解析ツリー内
- 内部ノード: 演算子フィールドと子用の 2 つのファイルを持つレコード
- リーフ: 2 つ以上のフィールドを持つレコード。 XNUMX つはトークンとトークンに関するその他の情報用です
- プログラムのコンポーネントが意味のある形で組み合わされていることを確認する
- 型情報を収集し、型の互換性を確認します。
- オペランドがソース言語で許可されているかどうかをチェックする
フェーズ 3: セマンティック分析
セマンティック分析は、コードのセマンティック一貫性をチェックします。 前のフェーズの構文ツリーとシンボル テーブルを使用して、指定されたソース コードが意味的に一貫していることを検証します。 また、コードが適切な意味を伝えているかどうかもチェックします。
セマンティック アナライザーは、型の不一致、互換性のないオペランド、不適切な引数で呼び出された関数、宣言されていない変数などをチェックします。
セマンティック分析フェーズの機能は次のとおりです。
- 収集した型情報を保存し、シンボル テーブルまたは構文ツリーに保存するのに役立ちます。
- 型チェックを実行できるようにします
- 型が一致しない場合、つまり目的の操作を満たす正確な型修正ルールがない場合は、意味エラーが表示されます。
- 型情報を収集し、型の互換性を確認します。
- ソース言語がオペランドを許可するかどうかをチェックします
例:
float x = 20.2; float y = x*30;
上記のコードでは、セマンティック アナライザーは乗算の前に整数 30 を浮動小数点数 30.0 に型キャストします。
フェーズ 4: 中間コードの生成
セマンティック分析フェーズが終了すると、コンパイラはターゲット マシン用の中間コードを生成します。 これは、何らかの抽象的なマシンのプログラムを表します。
中間コードは、高級言語とマシンレベル言語の間にあります。 この中間コードは、ターゲットのマシンコードに変換しやすい方法で生成される必要があります。
中間コード生成に関する機能:
- ソースプログラムの意味表現から生成される必要があります。
- 翻訳プロセス中に計算された値を保持します。
- 中間コードをターゲット言語に翻訳するのに役立ちます
- ソース言語の優先順位を維持できます。
- 命令のオペランドの正しい数を保持する
例:
たとえば、
total = count + rate * 5
アドレス コード メソッドを使用した中間コードは次のとおりです。
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
フェーズ 5: コードの最適化
の次のフェーズは、コードの最適化または中間コードです。 このフェーズでは、不要なコード行を削除し、ステートメントのシーケンスを整理して、リソースを無駄にすることなくプログラムの実行を高速化します。 このフェーズの主な目標は、中間コードを改良して、より高速に実行され、占有スペースが少ないコードを生成することです。
このフェーズの主な機能は次のとおりです。
- 実行速度とコンパイル速度の間のトレードオフを確立するのに役立ちます。
- ターゲットプログラムの実行時間を改善します。
- 中間表現のまま合理化されたコードを生成します
- 到達不能なコードを削除し、未使用の変数を削除する
- 変更されていないステートメントをループから削除する
例:
次のコードを検討してください
a = intofloat(10) b = c * a d = e + b f = d
になることができる
b =c * 10.0 f = e+b
フェーズ 6: コード生成
コード生成は、コンパイラの最後のフェーズです。 コード最適化フェーズから入力を取得し、結果としてページ コードまたはオブジェクト コードを生成します。 このフェーズの目的は、ストレージを割り当て、再配置可能なマシン コードを生成することです。
また、変数のメモリ位置も割り当てられます。 中間コード内の命令は機械語命令に変換されます。 このフェーズでは、最適化コードまたは中間コードをターゲット言語に変換します。
ターゲット言語はマシンコードです。 したがって、すべてのメモリの場所とレジスタもこのフェーズ中に選択され、割り当てられます。 このフェーズで生成されたコードは、入力を受け取り、予期される出力を生成するために実行されます。
例:
a = b + 60.0
おそらくレジスタに変換されるでしょう。
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
シンボルテーブル管理
シンボル テーブルには、識別子の属性のフィールドを持つ各識別子のレコードが含まれています。 このコンポーネントにより、コンパイラは識別子レコードを検索して迅速に取得することが容易になります。 シンボル テーブルはスコープ管理にも役立ちます。 シンボル テーブルとエラー ハンドラはすべてのフェーズと対話し、それに応じてシンボル テーブルが更新されます。
エラー処理ルーチン
コンパイラの設計プロセスでは、以下のすべてのフェーズでエラーが発生する可能性があります。
- 字句アナライザー: スペルが間違っているトークン
- 構文アナライザー: 括弧がありません
- 中間コードジェネレータ: 演算子のオペランドが一致しません
- コード オプティマイザー: ステートメントに到達できない場合
- CPコード Generator: メモリがいっぱいであるか、適切なレジスタが割り当てられていない場合
- シンボルテーブル: 複数の宣言された識別子のエラー
最も一般的なエラーは、スキャンでの無効な文字シーケンス、タイプでの無効なトークン シーケンス、スコープ エラー、およびセマンティック分析での解析です。
エラーは、上記のいずれかのフェーズで発生する可能性があります。 エラーが見つかった後、フェーズはコンパイル プロセスを続行するためにエラーに対処する必要があります。 これらのエラーは、コンパイル プロセスを実行するためにエラーを処理するエラー ハンドラーに報告する必要があります。 通常、エラーはメッセージの形式で報告されます。
製品概要
- コンパイラはさまざまなフェーズで動作し、各フェーズではソースプログラムをある表現から別の表現に変換します。
- XNUMXつのフェーズ コンパイラ設計 1) 字句解析 2) 構文解析 3) 意味解析 4) 中間コード生成 5) コード最適化 6) コード Generator
- 字句解析は、コンパイラがソース コードをスキャンするときの最初のフェーズです
- 構文分析とは、テキスト内の構造を発見することです
- セマンティック分析はコードのセマンティック一貫性をチェックします。
- コンパイラによるセマンティック分析フェーズが終了したら、ターゲット マシン用の中間コードを生成します。
- コード最適化フェーズでは、不要なコード行を削除し、ステートメントのシーケンスを整理します。
- コード生成フェーズはコード最適化フェーズから入力を取得し、結果としてページ コードまたはオブジェクト コードを生成します。
- シンボル テーブルには、識別子の属性のフィールドを持つ各識別子のレコードが含まれます。
- エラー処理ルーチンは、多くのフェーズでエラーとレポートを処理します。

