2011-07-28 17 views
3

プログラミング用のスクリプト言語を使用していますが、このスクリプトコードをJavaに翻訳するインタープリタを作成したいと考えています。このスクリプト言語は非常に深刻なものなので、小さなことではありません。Javaでカスタムインタープリタを作成する:どこから始めるのですか?

私はこの仕事について尋ねられましたが、それは簡単な問題ではありません。今私が何かばかげて、何十億もの構文解析を書き始める前に、私は何を知るべきですか?私はこれを適切に行うためにどこから始めるべきですか?

PS:スクリプトファイルをバイトコードに直接変換するのではなく、.javaソースに翻訳したいと考えています。

+1

Javaに直接変換し、Javaインタプリタ(つまり、スクリプト言語のJavaベースのスクリプトエンジン)経由で実行しない特別な理由は何ですか? –

+0

@Charlesはい、説明するのは難しい – Xorty

+0

それでは、答えるのは難しいです... –

答えて

5

スクリプトをJavaに翻訳する場合は、インタプリタではなくコンパイラです。 を読んでいるときにスクリプトを実行していると考えると、インタープリタです。

ただし、JavaCCまたはAntlrをご覧ください。コンパイルやインタプリタの作業にも適しています。言語の構文ルールを指定する必要があります。また、スクリプト言語のセマンティクスを実装して、Javaで追加のロジックを記述する必要があります。インタプリタを作成する場合は、Javaコードを記述すると、さらにJava(または任意の)コードが生成されます。コンパイラが必要な場合は、記述したJavaコードが直接スクリプトを実行します。

もう1つのコンセプトについては、Abstract Syntax Treeです。

ここには、lexer and parser generatorsの包括的なリストがあります。

+0

Groovy to Javaはコンパイラですか? Javaをバイトコードにコンパイルする必要はありますか? –

+0

はい、そうです。 Wikipedia: 'コンパイラは、プログラミング言語で書かれたソースコードを別のコンピュータ言語に変換するコンピュータプログラムです。 '...通訳者とは、通常、プログラミング言語で書かれた命令を実行、すなわち実行するコンピュータプログラムを意味する。 – pcjuzer

+0

@Charlesまあ、質問は少し学業です。 「高水準」の言語を他の言語に「変換する」場合は、「ソースからソースへの翻訳」と呼ばれることもあります。つまり、それは「コンパイラの種類」ですが、通常、実際のコンパイラほど複雑ではありません。例えば。 CからJavaに変換すると、CソースがCコンパイラでコンパイルされることを「想定」することができます。そのアサーションに基づいて、真のコンパイラが行う必要がある様々な意味チェック(例えば型チェック)を省略することができます。 –

3

これは面白い作業のようです:-)あなたは少しスクリプト言語を記述できますか?

私はパッケージjavax.scriptを見ています。同様のスクリプト言語があります(私はスクリプト言語として使用されているScalaについて知っています)。また、私はjavax.tools.JavaCompilerを見るだろう。私は現在、Javaソース・ジェネレータを構築しています(実行時にクラス・プロキシを作成してコンパイルするため)。 Javaソースコードを生成することは、バイトコードを生成するよりもはるかに簡単です。

構文解析に関しては、まず自分の言語に適したBNFを作成します。そこからtool to generate HTML railroadの図があります。あなたはBNFを書くときに間違いを犯すでしょうが、あなたは鉄道図を見ればそれらを見つけるでしょう。そして、それはあなたが解析できないものを作らないようにします。

ほとんどの人がANTLRまたはJavaCCを使用するように提案していることは知っていますが、私はそれがより簡単で柔軟性があると思うので、独自の再帰下降パーサーを作成します(私は数回、 。 1つの例はJackrabbit SQL-2 parserです。

+0

こんにちは、手続き型スクリプティング言語 - 多くの関数とプロシージャを呼び出す基本的な言語構造(ループ、構造、条件)。メソッドやクラスがない...手続き型ではなく、OOP – Xorty

+0

@Xortyで、その言語でのリフレクションがない場合、どのようなマクロも 'eval'のような機能はなく、あなたのタスクよりも些細なことではありません。インタプリタがすでに動作している場合は、何かを実行する代わりにJavaコードを出力するように簡単に変更することができます。あなたの最大の苦労は、言語そのものではなく、ランタイム(ライブラリ、FFIなど)をJavaに移行することです。 –

0

Javaのwrtingコンパイラ/インタプリタに関する本を入手することをお勧めします。 THREはかなりすなわち、次のとおりです。Writing Compilers and Interpreters

これは、字句解析/パーサなど

それとも、でジャンプしたい場合は、直接、私はあなたがすることをお勧めしますANTLR

0

を試してオフに開始する前に最初の大きな絵を見る方が良いでしょう言語認識に使用されるantlr Javaライブラリを使用してください。 これは、ほとんどのJVM言語で使用されているのと同じライブラリです。私はpersonnalyを使用していませんが、Groovyはこのライブラリを使用して構築されています。

関連する問題