1

私は現在、独自の単純なおもちゃのプログラミング言語を実装しています。早く実装して欲しいのですが、今の段階からどこに行けばいいのかよくわかりません。 通訳者を作る方が簡単に思えるので、自分の言語を通訳者にしようと思っています。またはより速いですか?コンパイラを作るより。

とにかく、私はかなり困っています。パーサー/レクサーを Bison/Flex で作成しましたが、AST を作成していません。この理由は、AST を解釈することを計画していたためですが、ポリモーフィズム (実装言語として C++ を使用しています) の恩恵を受ける AST をどのように設計するかがよくわからないため、スイッチを使用する必要はありません。 /if-else ステートメント。私がこれにどのように取り組むべきかについて誰かが考えを持っていますか? または、AST を解釈せずに、IR にコンパイルして IR を解釈する必要があります。

その場合が後者の場合、私自身の IR を発明する代わりに、(IR を解釈するための) どのような IR と VM が私のソース コードに制限なく自由に使用できるでしょうか? LLVM については知っていますが、他に考慮すべきものはありますか?

編集:

私が作成しているプログラミング言語は単純な C に似た言語であり、いくつかの視覚的な基本特性が組み込まれています。数値 (浮動小数点) またはテキスト文字列の 2 つの使用可能なプリミティブを使用して、静的に型付けされます。

これは次のようになります。

begin // start of the program

   num x = 3;                // make a number
   str text = "Hello World"; // make a string

   print text + x; // prints out "Hello World3"

end // end of the program
4

1 に答える 1

2

最初の試行では、多相メンバー関数を使用して AST を解釈することは問題ありません。もちろん、いくつかの理由で非常に遅くなり、パフォーマンスを大幅に改善するにはまったく別のアプローチに切り替える必要がありますが、機能しているが遅いプログラムは、壊れているが潜在的に速いプログラムよりも優れています。いくつかの型を表す問題を無視すると、次のようになります。

struct Node { virtual int eval(); };
struct Const : Node {
    int n;
    virtual int eval() { return n; }
};
struct Add : Node {
    Node *lhs, *rhs;
    virtual int eval() { return lhs->eval() + rhs->eval(); }
};

独自の IR を作成するのは手間がかかります。ここでは、2 つの言語を指定し、さらに 1 つの言語を実装する必要があります。既存の IR を使用すると、これらの問題は発生せず、より簡単になりますが、それでもその IR にコンパイルする必要があります。IR があなたの言語に適していない場合、このステップは非常に難しく、IR が持つ可能性のあるすべての複雑さと特異性に対処する必要があります。あなたの言語を知らなければ、何かを推薦することは不可能です.

編集: あなたの言語は、LLVM に直接コンパイルできるほど単純に見えますが、翻訳を行うのに十分なほど LLVM IR を理解するには時間がかかる場合があります。また、C++ インタプリタが標準ライブラリ (例: std::string) に委譲できるいくつかの実装の詳細 (文字列の割り当てなど) を特定する必要があります。JVM や CLR などの他の主要な VM はより高いレベルで動作し、文字列を直接サポートしますが、IR を生成するためのツールは LLVM の C++ API よりも劣っており、いくつかの追加のボイラープレートが必要です (たとえば、すべてをクラスに入れる)。 . さらに、その VM に依存しています。

最初に AST 指向のインタープリターを実装することをお勧めしますが、それが私が始めた方法であるため、部分的かもしれません。

于 2013-05-27T17:21:04.913 に答える