14

Javaのスクリプト言語としてJavaを使用することは可能ですか?それとも、実行時にJavaスクリプトをJavaバイナリにコンパイルするのでしょうか。私は検索しようとしましたが、いくつかのハックを除いて包括的なものを見つけることができませんでした...

私は他の言語の経験があり、たとえばC#では非常に便利なluaを使用しましたが、スクリプトの呼び出しはフレームあたり約1.000.000になるため、最高のパフォーマンスを達成する必要があります。

そのため、Java自体をJavaプログラムのスクリプト言語として適応させることで、最高のパフォーマンスと互換性が得られるはずだと考えました。

助言がありますか?

4

8 に答える 8

8

BeanShellは、Javaで一般的に使用されるスクリプトソリューションです。これは非常にJavaに似たスクリプト言語です。

JavaインフラストラクチャとJVMを使用するが、言語が異なる他のソリューションが存在します。例:Scala、Groovy、Jython(Java互換のPython)。これらすべてで理解する重要なことは、標準のJavaを使用して作成されたJavaライブラリと相互運用できるため、(たとえば)Scalaを使用してJava言語で作成されたソリューションを簡単に実行できることです。

上記はすべてREPL(read-eval-print-loop)を提供するため、動的なコマンドライン環境でオブジェクトをインポート、インスタンス化、および操作できます。これは、相互作用のテストとプロトタイピング、およびスクリプトのテストに非常に役立ちます。

于 2012-12-06T16:06:05.520 に答える
7

これにはBeanShellを使用できますが、Groovy、XTend、およびScalaがより適切な選択を行う可能性があります。

于 2012-12-06T16:05:53.510 に答える
5

答えは「はい」です。Javaプログラム自体の中でスクリプト言語としてJavaを使用できます。さらに、この目的に使用できる他のいくつかの言語があります-Javascript、LUA、Groovy、Ruby、リストは長いです。統合は、サードパーティのスクリプト言語をJavaプログラムに統合する処理を標準化および大幅に簡素化するjavax.scriptingAPIの導入によりはるかに簡単になりました。APIとOracleのページにあるいくつかのチュートリアルを読むことを強くお勧めします。

http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html

于 2012-12-06T16:09:21.807 に答える
4

JANINOhttp://docs.codehaus.org/display/JANINO/Homeを使用できます ...メモリ内の単純なプログラムを実行中のプログラムのJVM内で実行されるJavaTMバイトコードにコンパイルする軽量の「埋め込み」JavaTMコンパイラ...例を参照してくださいhttp://docs.codehaus.org/display/JANINO/Basic

または、MVEL http://mvel.codehaus.org/を使用できます。 これはBeanShellに似ていますが、はるかに高速です。

于 2013-01-20T19:41:51.223 に答える
4

バージョン7.0以降、Javaは実行時のコンパイルを「公式」にサポートしています(SDKのtools.jarがクラスパス上にある場合)。おそらく、実行速度はコンパイルされたJavaと同じくらい速く、インタプリタよりも速くなる可能性があります。

読むための出発点(インターネットの多くのサンプル):

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
    .... 
}
于 2015-08-13T15:21:40.310 に答える
4

Java 11は、コンパイルせずにソースコードを実行することをサポートしています。

HelloWorld.javaを含むファイルの場合

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!!!");
  }
}

あなたが実行することができます

java HelloWorld.java

コードを実行します。制限があります。すべてのクラスを同じファイルで定義する必要があります。

ファイルに拡張子がない場合は、オプション.javaを含める必要があり--sourceます。

たとえば、HelloWorld実行する必要のあるソースコードを含むファイルの場合

java --source 11 HelloWorld

シェルで直接java「スクリプト」を実行するには、次を使用できます

#!/usr/bin/java --source 11

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println("Hello World")
  }
}

ここで、はバイナリ/usr/bin/javaへのパスです。java

于 2018-08-15T19:38:37.067 に答える
1

groovyなどが利用できない単純なものについては、プロジェクトjava-script-templateで詳しく説明されているように、javaをbashスクリプトに埋め込みます。コードは次のようになります。

#!/bin/bash
set -e
TEMP_DIRECTORY=/tmp
TEMPFILE=`mktemp $TEMP_DIRECTORY/ScriptXXXXX|sed -e 's/\.//g'`
CLASS_NAME=`basename "$TEMPFILE"`
JAVA_SOURCE=$TEMPFILE.java
cat <<EOF >$JAVA_SOURCE.tmp

//Write your java class here with a main method
//Be sure to leave the name of the class as Script 

//import some commonly used imports
import java.io.*;
import java.text.*;
import java.util.*;

public class Script {

    public static void main(String[] args) throws Exception {
       System.out.println("Here's a test run for you");
    }

}

EOF

## change the name of the class to match the file
sed "s/public class Script /public class $CLASS_NAME /g" $JAVA_SOURCE.tmp >$JAVA_SOURCE

## compile the java
javac $JAVA_SOURCE 

## run the class using all passed in parameters from the command line
java -classpath $TEMP_DIRECTORY $CLASS_NAME
于 2014-05-07T05:40:53.010 に答える
0

RelProxyはオンザフライ(メモリ内)のJavaコンパイラであり、Javaをスクリプト言語のように感じさせますが、制限はありません。また、GroovyがJava環境で使用されている場合、Groovyクラスのホットクラスリロードもサポートします。

于 2014-02-15T11:42:50.880 に答える