0

私は小さなコンパイラを構築しようとし、Lexer と Parser を完成させました。次に、アセンブリ コード ジェネレーターの一部を作成する必要があります。だから私はいくつかの問題を抱えています!

実際、私はCが得意で、このタスクのために NASM アセンブリを学びました。これで、NASM を使用していくつかのプログラムを作成できるようになりました。しかし、コンパイラのアセンブリを実装する方法がわかりません。つまり、アセンブリ生成部分です。

  • アセンブリ言語に習熟している必要がありますか?
  • または、そのためのチュートリアルはありますか? (コンパイラ開発 <-> 実装アセンブリ )

ありがとう^ - ^

4

1 に答える 1

2

次のステップは、設計目標、コンパイルされるプログラムの現在の形式、および元の言語によって異なります。

解析直後のコンパイルされるプログラムの形式は、おそらくある種の抽象的な構文ツリーであり、それ以外のものではありません。その場合は、さまざまな目的でテーブルを生成する必要があります。たとえば、ユーザー定義型 (および構造体とクラス) の名前と定義を追跡するための型テーブルなどです。名前、修飾子 ("const"、"final"、"volatile" など)、および関数/メソッドと変数の型を追跡するためのシンボル テーブル。

これは、いくつかの言語機能によって複雑になる可能性があることに注意してください-ネームスペース(シンボルテーブルで短い名前だけでなく「完全修飾名」が必要な場合)およびオーバーロード(たとえば、シンボルテーブルのエントリが必要な関数のオーバーロード)同じ名前の異なるエントリを区別するために必要な、入力および出力パラメーターの型などの情報で飾られている必要があります)。

関連するテーブルを取得したら; おそらく、「抽象構文ツリー+テーブル」から直接アセンブリ言語(またはより良い、生のマシンコード)を生成できます。多くの場合、抽象構文ツリーの内容を最適化して単純化し、次に抽象構文ツリーを別の中間形式 (静的単一代入など) に変換して、さらに最適化できるようにし、別の低レベルの中間形式に変換します。ターゲット マシンの命令に近づけてから、さらに最適化 (レジスタ割り当て、ピープ ホール、命令スケジューリング) を行い、それを最終的なアセンブリ言語 (または生のマシン コード) に変換します。

アセンブリ言語に習熟している必要がありますか?

アセンブリ言語の基本的な理解が必要です (コンパイラの出力が元のソース コードの正しい翻訳であることを視覚的に確認するだけでも)。最適化の程度と最適化の計画に応じて、アセンブリ言語に精通している必要がある場合とそうでない場合があります。

または、そのためのチュートリアルはありますか?

常にチュートリアルがあります (例: 無知な人や基本的な紹介情報によってまとめられた危険なナンセンス)。

良いチュートリアルがあるかどうかはわかりませんが、それが可能かどうかは疑問です。すべてをカバーするには情報が多すぎます (すべての異なるソース言語と言語機能、すべての異なる宛先言語、可能なすべての異なる手法など)。そのため、「優れたチュートリアル」は非常に大きくなり、本格的な本になります(チュートリアルではありません)。

于 2020-11-18T08:52:33.657 に答える