私は、条件付き構成によって決定される単純な割り当てを実行するルールエンジンを作成中です。ルールがXML形式であることがプロジェクトの前提条件です。 XMLスキーマをモデル化して単純なコードブロックに似せました。 XMLを解析し、それをJavaコードに変換したい。次に、実行時にこのコードをコンパイル(および実行)したい。そうすると、ルールエンジンが次のように機能しなくなる。インタプリタですが、ネイティブJavaバイトコードを実行します。
解析段階と多かれ少なかれJavaコード生成フェーズを理解しました。最後のフェーズ、つまり実行時のコンパイルフェーズを理解したいと思います。
このスレッドに従う: コンパイルしてJavaバイトコード(Javaを使用しない) 私は次の可能な解決策に気づきました:
これらの比較と、実行時フェーズでのJavaコンパイル)を解決するための他の提案が欲しいです。
Java 6コンパイラAPI を使用します。
それをClojureコードに変換すると、Clojureコンパイラーがそれをバイトコードに変換します。
ここにJavaコンパイルユーティリティがあります。バイトコードツールなしで、実行時にコードをコンパイルできます。
Javassistはほぼ完全なJava Javaで記述されたコンパイラであり、完全にJavaで構成されています。一度に.Javaファイル全体を指定することはできませんが、次のコード文字列を指定することはできます。個々の関数を同じCtClassオブジェクトに追加します。これがバイトコードになり、次にJava.lang.Classになります。
Javassist(コンパイラー)とBeanshell(インタープリター)を一緒に使用し、最適化するコードとタイミングを制御できるGigaLineCompileのバージョン0.1をリリースしました。それ以降のバージョンでは、JavassistとBeanshellの間でより小さな粒度で変更されるため、一部の部分文字列を共有するコードの文字列が多数ある場合、部分文字列はコンパイルされ、他の部分はBeanshellで実行されます。 Javaコードを生成する人工知能に主に役立ちますが、Clojureまたは極端なJavassist/Beanshellのみの代替手段でもあります。
Javassist、Beanshell、およびGigaLineCompileは、ここから(ソースとともに)ダウンロードできます: http://sourceforge.net/projects/gigalinecompile
Groovy、BeanShell、またはJVMに基づくその他のスクリプト言語には、実行時にコードを挿入、変更、追加、および実行する機能があります。実際には、すべてのスクリプト言語が解釈されるため、実際には実行時にコンパイルされません。
手間を省いて、ここでほのめかされているように BeanShell を使用してください テキストファイルで指定されたコードを実行Java 。
BeanShellとは何ですか?
BeanShellは、小さくて無料の埋め込み可能なJava Javaで記述されたオブジェクトスクリプト言語機能を備えたソースインタープリターです。BeanShellは標準のJava構文を動的に実行し、それを共通で拡張しますルーズタイプ、コマンド、PerlやJavaScriptのようなメソッドクロージャなどのスクリプトの便利さ。
BeanShellをインタラクティブに使用して、Javaの実験とデバッグを行ったり、アプリケーションを新しい方法で拡張したりできます。スクリプトJavaは、次のようなさまざまなアプリケーションに適しています。迅速なプロトタイピング、ユーザースクリプト拡張、ルールエンジン、構成、テスト、動的展開、組み込みシステム、さらにはJava教育。
BeanShellは小さくて埋め込み可能であるため、JavaアプリケーションからBeanShellを呼び出して、実行時にJavaコードを動的に実行したり、アプリケーションに拡張性を提供したりできます。または、スタンドアロンのBeanShellスクリプトを使用して、Javaアプリケーションを操作します。JavaオブジェクトとAPIを動的に操作します。BeanShellはJavaそしてアプリケーションと同じVM)で実行され、「ライブ」オブジェクトへの参照をスクリプトに自由に渡し、結果として返すことができます。
つまり、BeanShellは動的に解釈されるJavaに加えて、スクリプト言語と柔軟な環境がすべて1つのクリーンなパッケージにまとめられています。
あなたはこのようなプロセスをフォークすることができます
Process p = Runtime.getRuntime().exec("Java -classpath "..." SomeClassContainingMain ...other arguments);
//you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here).
log.debug("PROCESS outputstream : " + p.getInputStream() );
log.debug("PROCESS errorstream : " + p.getErrorStream());
p.waitFor(); // Wait till the process is finished
コンパイルして実行できます。