コンパイラのフェーズと例: コンパイルのプロセスと手順

コンパイラ設計のフェーズは何ですか?

コンパイラ さまざまなフェーズで動作し、各フェーズではソース プログラムをある表現から別の表現に変換します。各フェーズでは、前のステージから入力を受け取り、その出力をコンパイラの次のフェーズに渡します。
コンパイラには 6 つのフェーズがあります。 この各フェーズは、高レベル言語からマシンコードへの変換に役立ちます。 コンパイラのフェーズは次のとおりです。

  1. 字句解析
  2. 構文解析
  3. 意味解析
  4. 中間コードジェネレータ
  5. コードオプティマイザー
  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
  • 字句解析は、コンパイラがソース コードをスキャンするときの最初のフェーズです
  • 構文分析とは、テキスト内の構造を発見することです
  • セマンティック分析はコードのセマンティック一貫性をチェックします。
  • コンパイラによるセマンティック分析フェーズが終了したら、ターゲット マシン用の中間コードを生成します。
  • コード最適化フェーズでは、不要なコード行を削除し、ステートメントのシーケンスを整理します。
  • コード生成フェーズはコード最適化フェーズから入力を取得し、結果としてページ コードまたはオブジェクト コードを生成します。
  • シンボル テーブルには、識別子の属性のフィールドを持つ各識別子のレコードが含まれます。
  • エラー処理ルーチンは、多くのフェーズでエラーとレポートを処理します。