コンパイラとアセンブラの違い
コンテンツ
コンパイラとアセンブラは、プログラムの実行において重要な役割を果たします。一部のコンパイラは、アセンブリコードではなく実行可能コードを直接生成します。コンパイラは前処理されたソースコードを取得し、アセンブリコードに変換します。アセンブラは、コンパイラからアセンブリコードを取得し、再配置可能なマシンコードに変換します。この記事では、コンパイラーとアセンブラーの違いを、以下に示す比較チャートを使用して説明しました。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | コンパイラ | アセンブラ |
---|---|---|
ベーシック | アセンブリ言語コードを生成するか、実行可能コードを直接生成します。 | 再配置可能なマシンコードを生成します。 |
入力 | 前処理されたソースコード。 | アセンブリ言語コード。 |
フェーズ/パス | コンパイル段階は、字句解析器、構文解析器、意味解析器、中間コード生成、コード最適化、コード生成です。 | アセンブラーは、指定された入力に対して2つのパスを作成します。 |
出力 | コンパイラによって生成されるアセンブリコードは、マシンコードのニーモニックバージョンです。 | アセンブラーによって生成される再配置可能なマシンコードは、バイナリコードで表されます。 |
コンパイラの定義
の コンパイラ ソース言語で書かれたプログラムを読み取り、同等のものに翻訳するコンピュータープログラム アセンブリ言語 アセンブリ言語コードを アセンブラ。ソースコードからアセンブリコードへの変換中に、コンパイラは エラー ユーザーへのソースコードで。
コンパイラも次のように分類されます シングルパス、マルチパス、ロードアンドゴー、デバッグおよび最適化。 分類は、コンパイラーが実行する機能とその構築方法に基づいて行われます。これらの複雑さにもかかわらず、コンパイラの基本的なタスクは同じままです。
コンパイルは2つの部分で実行されます。 分析部 そして 合成部。の 分析部 ソースコードを構成要素に分割し、ソースコードの中間表現を形成します。の 合成部 中間表現からターゲットコードを形成します。
コンパイルは、次のフェーズで実行されます。
字句解析器、構文解析器、意味解析器、中間コード生成器、コードオプティマイザー、コード生成器、シンボルテーブル、エラーハンドラー。
- の 字句解析器 ソースコードの文字を読み取り、それらをグループ化します トークンのストリーム。各トークンは、次のような文字の論理シーケンスを表します キーワード、識別子、演算子。トークンを形成する一連の文字は 語彙素.
- の 構文アナライザー 字句解析器から取得したトークンを解析し、トークンをグループ化します 階層構造.
- の セマンティックアナライザー ソースコードをチェックして セマンティックエラー.
- 中間コードジェネレーター を生成する 中間表現 ソースコードの
- の コードオプティマイザー 中間コードを高速化されたマシンコードに最適化します。
- の コードジェネレーター 最終的にターゲットコードを生成します 再配置可能なマシンコードまたはアセンブリコード.
- の シンボル表 ソースコード内の各識別子のレコードを含むデータ構造です。
- エラーハンドラー 各フェーズでエラーを検出し、それらのエラーを処理します。
アセンブラーの定義
一部のコンパイラーは、アセンブラーのタスクを実行し、アセンブリー・コードの代わりに再配置可能なマシン・コードを直接生成します。これはさらにリンカー/ローダーに直接渡されます。の アセンブラ コンパイラによって生成されたアセンブリコードを入力として受け取り、それを 再配置可能なマシンコード.
マシンコードとアセンブリコードの違いを見てみましょう。 アセンブリコード それは ニモニック マシンコードのバージョン。つまり、アセンブリコードは操作を表すために名前を使用し、さらにメモリアドレスに名前を付けます。一方、 マシンコード 使用する バイナリコード 操作およびメモリアドレスの表現用。
最も単純な形式のアセンブラーでも実行されます 2パス 入力の上。の 最初のパス すべてを検出する 識別子 格納場所を示すアセンブリコードで、 シンボル表 (コンパイラシンボルテーブルを除く)。の 保管場所が割り当てられます 最初のパスで遭遇する識別子に。
の中に セカンドパス、入力が再度スキャンされ、今回は オペコード は 翻訳済み に ビットのシーケンス マシンコードでその操作を表します。 2番目のパスも変換します 識別子 に 住所 シンボルテーブルで定義されます。したがって、2番目のパスは 再配置可能なマシンコード.
- コンパイラとアセンブラの主な違いは、 コンパイラ アセンブリコードを生成し、一部のコンパイラは実行可能コードを直接生成することもできますが、 アセンブラ 再配置可能なマシンコードを生成します。
- コンパイラは入力として 前処理されたコード プリプロセッサによって生成されます。一方、アセンブラーは アセンブリコード 入力として。
- コンパイルは次の2つの段階で行われます 分析フェーズ そして 合成段階。分析フェーズでは、入力が通過します 字句解析器、構文解析器、意味解析器 一方、合成分析は 中間コードジェネレーター、コードオプティマイザー、コードジェネレーター。一方、アセンブラーは入力を 二段階。最初のフェーズでは識別子を検出し、2番目のフェーズでアドレスを割り当てて、アセンブリコードをバイナリコードに変換します。
- コンパイラによって生成されたアセンブリコードは ニーモニック版 マシンコードの。ただし、アセンブラーによって生成される再配置可能なマシンコードは バイナリ再配置可能コード.
結論:
一部のコンパイラは実行可能コードを直接生成するため、アセンブラは必要ありません。アセンブラを使用する場合、リンカーはすべての組み込みライブラリをソースコードで使用されるライブラリ関数にリンクする必要があります。