5

主に学習の練習として、外部ツールによらず、仮想マシン、アセンブラ、およびコンパイラをゼロから作成しています。構文木からアセンブリへの変換に関するリソースはありますか?

私は、仮想マシンとアセンブラがどのように動作するか、そしてコンパイラのいくつかの部分について、適切な概念的理解があると思います。

私が知りたいことは次のとおりです。 コンパイラでは、ソースコードを構文木に変えたとします。この構文木をアセンブリに変換するために、どのようなプロセスを経なければなりませんか?

(私はここでは、最小限の、簡単な説明を探しています。のような場合としながら、のは、いくつかの簡単な言語構造を仮定します。)

私は既存のツールに基づいて複雑なソリューション、またはソリューションには特に興味がありません。むしろ、私は構文木からアセンブリへの背後にあるアイデアについて、1ページ分の幅広い説明をしたいと思っています。

誰でもこのようなリソースを知っていますか? (:原則、テクニックとツールコンパイラ)

感謝:)

+0

コンパイラの本の第1章第2ページと第3ページしかし、私はあなたが望むのは、あなたが望むすべてであると思っていると思います。問題は、手順上のランゲージを*良い*マシンコード(仮想マシンであっても)に翻訳するには多くの機械が必要であり、その2ページでは何が必要なのか分かりませんが、構築することはできません他の200ページのコンパイラブックを読まなくても、あらゆる種類の分かりやすいコードジェネレータを使用できます。 –

答えて

6

コンパイラの質問に対する義務応答は、ドラゴンの本を読むことです。あなたがソースコードを構文木に変えたと言ったら、どういう意味ですか?通常、構文解析の第1段階は、抽象構文木(AST)を作成することです。次のステップは通常属性です。属性は、AST内のノードのプロパティであり、必ずしもソース言語とは関係なく、コード生成に不可欠です。通常、メモリサイズの要件を決定するために、ここで何らかの型チェックが行われ、オブジェクト指向言語では、どの関数が呼び出されるかが決定されます。たとえば、ソースがobj1 = obj2 + obj3である場合、obj2のタイプを判別するまで、プラス記号をどのようにするかは分かりません。

あなたの質問に答えてショットをつけること。 1)ソースコードをASTに解析する。 2)ASTの帰属を行う。 3)中間コードを生成する(あなたがアセンブリーと呼んでいると思われるもの)。

ドラゴンの本の第5章と第6章が詳しく説明しています。本当に難しい部分は、コード生成に必要な属性を把握することです。また、if文にはいくつか問題があります。たとえば、if条件が失敗した場合、コードを飛び越える必要があることはわかっていますが、少なくとも最初はどれくらいの距離があるか分かりません。バックパッチは、この問題の1つの解決策です。

関連する問題