4

私はJVMを対象とした言語を作成しており、現在コンパイラーをまとめています。論理的には、私の新しい言語には、バイトコードの作成に関してJavaと同じニーズがたくさんあることがわかります。いくつか例を挙げます。

  • ドットで区切られた識別子のシーケンスが何を指しているかを調べます。abcはローカル変数a、フィールドa、クラスa、またはクラスabを参照できます。
  • 算術演算用のプリミティブ型の変換:intVar * doubleVarの場合、intVarをdoubleにキャストする必要があります
  • パラメータのセットのマッチング方法を見つけます。適切な継承と上記と同じプリミティブキャストを使用します。
  • 関連するメモ、オートボクシング
  • ジェネリック型チェック、例えばList<X<? super Y>> l = new List<X<Z>>(); 互換性があるかどうか

おそらくもっとたくさんあります、そして私はどういうわけかこれらのホイールを再発明したくありません(新しい言語を作ります、もちろん私はすでにいくつかのホイールを再発明しています...)、それで私は再利用するための最良の方法は何であるか疑問に思いました(の一部)既存のJavaコンパイラーに、上記を理解するために必要なASTの一部を渡します。

私はすでにレクサーとパーサー(ANTLR)を配置しているので、コンパイラーを比較的簡単に操作できるようにするために、どのコンパイラーが存在するかについてのアドバイスを本当に探しています(たとえば、ECJを少し調べました)。 、しかし誰かが私が望むものができないと私に言った場合、または別のコンパイラがより使いやすいでしょうそれは素晴らしいでしょう)。

明確な質問で要約すると、Java以外のJVM言語のフロントエンドで使用するのに適した、簡単にアクセスできるバックエンドを備えているJavaコンパイラはどれですか。

4

2 に答える 2

3

学術論文を読んでいるときに聞いた2つの拡張可能なコンパイラバックエンドは次のとおりです。

ドメイン固有言語工学については、私は提案します

  • Xtext、たとえばJavaのバリエーションであるXtend

これらのプロジェクトは成熟しているようです。私は彼らをよく見たことがありませんでしたが、私は本当にしたいと思います;)

于 2012-09-19T06:48:11.163 に答える
2

少し鈍感になるリスクを冒して、私の答えはScalaです。

ScalaはJVMベースの言語であり、最新リリースの時点でマクロシステムを備えています。マクロ(Cに関連付けられているものよりも強力な場合)は、最初から始めることなく、既存の言語の上にドメイン固有言語を構築するための手法です。マクロシステムを使用すると、既存の言語でコードを記述し、新しい構成によって拡張され、新しい構成を基本言語にコンパイルできます。

Javaから直接構築したい場合は、Java Syntax Extenderを検討する価値があるかもしれませんが、JSEは広く使用されておらず、かなりラフな場合があります。(実際、私が聞いたことがない、より成熟したJavaマクロシステムがあるかもしれません。)

于 2012-09-19T00:06:52.427 に答える