Java как язык сценариев для Java?

Можно ли использовать Java в качестве языка сценариев для java? Или, возможно, каким-то образом скомпилируйте java-скрипты в java-бинарники во время выполнения? Я попытался выполнить поиск, но не смог найти ничего всеобъемлющего, кроме некоторых хаков...

У меня есть опыт работы с другими языками, и, например, для С# я использовал lua, что было довольно удобно, но теперь мне нужно добиться максимальной производительности, так как вызовы скриптов будут составлять около 1.000.000 за кадр.

Итак, я понял, что адаптация java как скриптового языка для Java-программы должна обеспечить мне лучшую производительность и совместимость.

Любые предложения?

Ответ 1

BeanShell - это широко используемое решение для сценариев для Java. Это язык сценариев, который очень похож на Java.

Существуют и другие решения, которые используют инфраструктуру Java и JVM, но с другим языком. например Scala, Groovy и Jython (Java-совместимый Python). Важно все это понять, что они будут взаимодействовать с Java-библиотеками, созданными с использованием стандартного Java, поэтому вы можете тривиально использовать (скажем) Scala для создания вашего решения на Java-языке.

Все вышеперечисленное предоставляет REPL (read-eval-print-loop), чтобы вы могли импортировать, создавать экземпляры и взаимодействовать с вашими объектами в динамическая среда командной строки. Это очень полезно для взаимодействия с тестированием и прототипированием, а также для тестирования ваших скриптов.

Ответ 2

Вы можете использовать BeanShell для этого, но Groovy, XTend и Scala могут сделать лучший выбор.

Ответ 3

Ответ: "Да", вы можете использовать Java как язык сценариев в самой программе Java. Кроме того, есть несколько других языков, которые также могут быть использованы для этой цели - Javascript, LUA, Groovy, Ruby, список длинный. Интеграция была значительно упрощена благодаря внедрению API javax.scripting, который стандартизирует и значительно упрощает обработку интеграции сторонних скриптовых языков в Java-программы. Я бы очень рекомендовал прочитать API и некоторые уроки на странице "Оракулы".

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

Ответ 4

Вы можете использовать JANINO http://docs.codehaus.org/display/JANINO/Home ... легкий, "встроенный" JavaTM-компилятор, который компилирует простые программы в память в байт-код JavaTM, который выполняется в JVM запущенной программы... Примеры http://docs.codehaus.org/display/JANINO/Basic

Или Вы можете использовать MVEL http://mvel.codehaus.org/ Он похож на BeanShell, но намного быстрее.

Ответ 5

Начиная с версии 7.0, Java имеет "официальную" поддержку для компиляции во время выполнения (если tools.jar из SDK находится в classpath). Вероятно, скорость выполнения может быть выше, чем скомпилированная java, выше интерпретаторов.

Исходная точка для чтения (много примеров в Интернете):

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


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if(compiler!=null) {
    .... 
}

Ответ 6

Для простых вещей, когда groovy и т.д. недоступен, я вставляю java в скрипты bash, как описано в проекте java-script-template. Код выглядит следующим образом:

#!/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 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

Ответ 7

RelProxy является компилятором Java "на лету" (в памяти), что делает Java похожим на язык сценариев, но без ограничений. Он также поддерживает перезагрузку горячих классов классов Groovy, когда Groovy используется в среде Java.