2009-06-30 9 views
18

私は、条件付き構造によって決定される単純な割り当てを実行するルールエンジンを作成中です。プロジェクトの前提条件は、ルールがXML形式であることです。 XMLスキーマを単純なコードブロックに似せるようにモデル化しました。私はXMLを解析し、それをJavaコードに変換したいと考えています。私は、実行時にこのコードをコンパイル(および実行)したいと考えています。そうすることで、私のルール・エンジンはインタープリターとして機能しなくなり、ネイティブのJavaバイトコードを実行します。実行時にJavaクラスをコンパイルしてデプロイするにはどうすればよいですか?

私は解析段階と多かれ少なかれJavaコード生成段階を理解しました。私は最終段階、すなわち実行時のコンパイルを理解したいと思います。このスレッドに続き

Compile to java bytecode (without using Java)私は、次の可能な解決策に気付いています

私はだけでなく、これらの比較を大好きです実行時フェーズでJavaコンパイルを解決するための他の提案

+2

せずに、実行時にコードをコンパイルすることができますあなたのためのポインタのカップル: 1)Tomcatのソースをダウンロードします。JSP用のクラスを作成するときは、あなたが記述したものだけを行う必要があります。 2)Drools(http://www.jboss.org/drools/)をご覧ください。私はそれを過去に使ってきましたが、ルールエンジンに関してはかなり強力です。 –

+0

このアプリケーションは完了しましたか?私は、あなたがソースを共有することができれば、それがどのように機能するか見ることに興味があります。 –

+0

@ EricB。あなたが興味を示してくれてうれしいです。残念なことに、このアプリケーションは他の場所で順調に進んでいます。私はJava 6 Compiler APIを使用しましたが、はるかに単純なスコープでした。言い換えれば、XMLコードブロックはまだ翻訳されず、今日までコンパイルされていません...私は独自のコードを投稿しています。 – Yaneeve

答えて

4

これをClojureコードに変換すると、Clojureコンパイラによってバイトコードに変換されます。

+0

詳細を教えてください。 – Yaneeve

+1

@ Yaneeve、Clojure(http://clojure.org/)は、JVMのために書かれたリスプの方言です。あなたのタグのセマンティクスをlisp関数/マクロとして実装するのであれば、XML構造から対応するlisp構造に変換するのは簡単なことです。必要に応じてクラスにコンパイルできます。 XMLが必要条件でない場合は、まずはlispデータを使って始めるといいでしょう。理由のjava + xml中心の議論のために、参照してください:http://www.defmacro.org/ramblings/lisp.html – kwatford

+2

ちょうどあなたの提案が心であるようにちょうど数年早くあなたの答えに戻ってきました吹く。あまりにも私は、当時、平均的な開発者/管理者は、リスプと機能的なコーディングの観点から考えていないし、考えなかった。 Reimann:http://riemann.io/ – Yaneeve

1

BeanShellをここにお伝えください(Executing java code given in a text file)。

BeanShellとは何ですか?

のBeanShellはJavaで書かれた を対象 スクリプト言語機能、小さな、無料、組み込み可能 Javaソース・インタープリタです。 BeanShellは動的に 標準のJava構文を実行し、 は、一般的なスクリプト のルーズタイプ、 コマンド、およびメソッド終了のような便利さをPerlやJavaScriptの のように拡張しています。

対話的にJavaの実験とデバッグのために を使用したり、アプリケーションを に新しい方法で拡張することができます。スクリプティングJavaは、迅速なプロトタイピング 、ユーザースクリプトの拡張子、 ルール・エンジン、設定、テスト、 ダイナミックな展開、組み込みシステム、 、さらにはJavaの教育を含め 多種多様なアプリケーションに 向いています。

BeanShellのは、実行時に動的にJavaコード を実行するために、あなたのJava アプリケーションからBeanShellのを呼び出すことができたり、アプリケーションで 拡張性を提供するために、小型で組み込み可能なので、 。 また、スタンドアロンの BeanShellスクリプトを使用して、Java アプリケーションを操作することもできます。 Java のオブジェクトとAPIを動的に処理します。 BeanShellはJavaで書かれており、アプリケーションと同じVMに を実行すると、 「ライブ」オブジェクトへの参照をスクリプトに自由に渡して、結果として を返すことができます。要するに

、BeanShellのは、動的 のJavaを解釈し、プラスのすべて は1つのきれいなパッケージに巻かれたスクリプト言語 かつ柔軟な環境です。

+0

私が間違っていたら私を訂正してください。しかし、BeanShellはインタープリタであり、Javaバイトコードを作成することはできません。その実行の結果... – Yaneeve

+0

はい、私はBeanShellが解釈されると思います。私が言及した理由は、Javaを使用してより複雑な構文をルールエンジンで表現したいと考えているからです。その場合、Javaコードがコンパイルされているか解釈されていますか? –

+0

CPUとメモリは私が展開しなければならない環境の中で問題になっているので問題はありません... – Yaneeve

2

Groovy、BeanShell、またはJVMに基づいた他のスクリプト言語では、実行時にコードを挿入、変更、追加、実行する機能があります。実際にはすべてのスクリプト言語が解釈されるため、実際には実行時にコンパイルされません。

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 

のようなプロセスをフォークすることができますし、それをコンパイルして実行することができます。

2

Javassistは、Javaで書かれたほぼ完全なJavaコンパイラです。完全にJavaで作成されています。あなたは一度に完全な.javaファイルを与えることはできませんが、個々の関数のコード文字列を与えることができ、バイトコードとjava.lang.Classになる同じCt​​Classオブジェクトにそれらを追加することができます。

Javassist(コンパイラ)とBeanshell(インタープリタ)を一緒に使用して、最適化するタイミングを制御するGigaLineCompileのバージョン0.1をリリースしました。それ以降のバージョンではJavassistとBeanshellの間でより細かく変更されるので、部分文字列を共有するコードがたくさんあると、部分文字列はコンパイルされ、他の部分はbeanshellで実行されます。 Javaコードを生成する人工知能に最も役立ちますが、Clojureの代わりに、あるいはJavassist/Beanshellだけの極端なものでもあります。

Javassistの、BeanShellの、そしてGigaLineCompileはこちら(ソースで)ダウンロードすることができます:ここ http://sourceforge.net/projects/gigalinecompile

関連する問題