1

私はjavascriptに似た最小限のおもちゃの言語を持っています。ASTを生成して、エスケープ分析や型推論などの最適化手法を試します。それぞれのクラス/関数の代わりに演算子トークンを一般化して、すべてのノードで型情報を保持するなど、いくつかのアプローチを試しました...しかし、それでもどこにも行かないような気がします。作業するのはすぐに扱いにくくなります...

私はlua5、neko、v8を勉強しましたが、..まあ...私は周りで最も明るいものの1つではないと確信しています。

ASTの設計と、作業が簡単なASTでの変換の実装の経験がある人はいますか?私はあなたの生活を楽にするためのヒントやコツをいただければ幸いです。

(ドラゴンの本を読みに行くように言わないでください。私はすでに持っています。)

4

4 に答える 4

3

アランが述べたように、アペルの本は素晴らしいです。私は、コンパイラーの学部課程でMLにModernCompilerImplementationを受講しました。

個人的には、ASTで多くの変換を行うことは避けたいと思います。これは、使用できるさまざまな構成の数と、同じことを表現できる方法の数が理由です。多数のケースとサブケースを処理するコードを頻繁に作成する必要があり、あなたが言ったように、それは非常に速く扱いにくくなります。

ASTを、制御フローグラフの基本ブロックなどのより最小限の表現に変換することをお勧めします。各操作は、基本ブロック内の単純なステートメントとして記述できます。可能な操作のセットは小さく保つ必要があります。必要なすべての変換を実行できるように、十分な情報を保持するようにしてください(特に、型を破棄しないでください)。各プログラム変数が1回だけ割り当てられる単一静的割り当てフォームを使用することもできます。これにより、多くの変換と分析を簡素化する不変条件が提供されます。

于 2009-01-13T19:12:49.587 に答える
0

私は非常に簡単だと思ったANLTR.orgを使用しています。

于 2009-01-06T15:05:22.250 に答える
0

AST はプログラムの構造を表します。複雑な言語の場合、AST は必然的に複雑になります。したがって、これが「簡単」であると想定しないでください。

多くの人は、ASTがあれば生活が楽になると思い込んでいます. しかし、解析はヒマラヤ山脈の麓に過ぎません。AST は、識別子の意味、次に実行されるステートメント、このデータが消費される場所など、一般的な推論を表していません。これらすべてを利用できない限り、実際の言語で多くのことを行うことはできません。ましてや、簡単に行うことはできません。

これらの推論結果をキャッシュまたは明示的にするのが最善です: シンボル テーブル、制御フロー、データ フローなど。

パターン マッチング言語を追加して、構文構造の認識を有効にしたり、変換ルールを記述したりすることもできます。

optimize_increment(x:exp):statement
= " \x=\x+1; " -->  " \x++ " if no_side_effects(x);

このようなルールは、キャッシュされた推論 ("side_effects" など) を利用する必要があります。

これをすべて構築しようとするのは非常に困難です。これを実用的にする 1 つの方法は、多くの言語と変換アプリケーションにわたってインフラストラクチャ コストを償却することです。当社のDMS Software Reengineering Toolkitには、C、C++、Java、C#、COBOL など、さまざまな言語に対応するさまざまな程度のこの機構がすべて備わっています。

于 2009-07-12T10:09:51.137 に答える
0

わかりました、あなたはすでに持っているので、ドラゴンの本はお勧めしません. Appelの本をお勧めできますか?概念を示すソース コードもいくつかあります。その中には、抽象構文ツリーを具象構文ツリーに変換するために Visitor パターンを使用するものもあります。頑張って、楽しんでください!

于 2009-01-07T03:26:06.140 に答える