2

私はすでに自分の言語の通訳者を持っています。以下で実装されます。

  • パーサー -> scala パーサー コンビネーター。
  • AST -> scala ケース クラス。
  • エバリュエーター -> scala パターン マッチング。

今、私は AST をネイティブ コードにコンパイルし、できれば Java バイトコードにコンパイルしたいと考えています。これら 2 つのタスクの少なくとも 1 つを達成するための 2 つの主なオプションを考えています。

  • LLVM IR コードを生成します。
  • C コードおよび/または Java コードを生成します。

obs .: GCJ とSLEMは使用できないようです (GCJ は、私がテストできたように、単純なコードで動作します)

4

2 に答える 2

1

簡潔な答え

私はJava Bytecodeを使います。

長い答え

問題は、コンパイルする言語が高レベルになるほど、

  1. コンパイルプロセスが遅く、面倒なほど
  2. 柔軟性が増すほど

たとえば、C にコンパイルすると、C コンパイラ用の多くの可能なバックエンドを取得できます。Java バイトコード、LLVM IR、多くのアーキテクチャ用の asm などを生成できますが、基本的には 2 回コンパイルします。LLVM IR を選択すると、asm へのコンパイルの途中までは進んでいますが (LLVM IR の解析は、C などの言語の解析よりもはるかに高速です)、そこから Java バイトコードを取得するのは非常に困難です。ただし、どちらの中間言語もネイティブにコンパイルできます。

汎用プログラミング言語にコンパイルするよりも、何らかの中間表現にコンパイルする方が望ましいと思います。LLVM IR と Java Bytecode の間では、Java Bytecode を使用します。個人的には LLVM IR の方が好きですが、基本的に両方が必要だと書いているため、Java Bytecode を LLVM IR に変換することはできますが、他の方向は非常に難しい。

残っている唯一の困難は、言語を Java バイトコードに変換することです。これを簡単にするツールに関するこの関連する質問が役立つ場合があります。

最後に、Java Bytecode のもう 1 つの利点は、インタプリタとの相性が良く、ホットスポットのような JITter (またはトレース コンパイラ) を効果的に簡単に生成できることです。

于 2013-03-20T09:48:43.443 に答える
0

最も単純なターゲットとして ByteCode を選択したことについては、@Oak に同意します。ByteCode を生成する可能な Scala ライブラリは、 @psuterによる CafeBabe です。

すべてを行うことはできませんが、小さなプロジェクトでは十分です。構文も非常に明確です。詳細については、プロジェクト Wiki を参照してください。

于 2013-03-20T14:00:22.303 に答える