Как скомпилировать файлы rhino/javascript в байт-код .class для java во время выполнения

Я делаю игру с падающим песком на Java. Я хочу, чтобы пользователи могли написать для него свой собственный движок, используя более простой язык. Игры с падающим песком могут сильно нагружать ЦП, поэтому я хочу, чтобы движок работал как можно быстрее, и при этом не приходилось вручную компилировать.

Мне нужно знать, как компилировать файлы javascript rhino в файлы .class во время выполнения, которые будут использоваться.

Я искал способ, но не смог найти ничего, кроме ручной компиляции с помощью командной строки, которую я не хочу, чтобы пользователи делали.


person aexyl93    schedule 02.10.2010    source источник
comment
Так вы в принципе знаете, как это сделать? но вы хотите, чтобы это было сделано динамически, и пользователю не нужно было беспокоиться об изменении сценария rhino на .class? для этого вы можете предоставить им пакетный файл, который может служить вашей цели...   -  person Varun    schedule 15.12.2010


Ответы (4)


Здесь есть краткое руководство:

person ars    schedule 02.10.2010
comment
Пример кода в этой статье имеет небольшой недостаток. То есть вызов функции fib(num); должен быть позади определения it . благодаря. - person Joe.wang; 11.12.2013
comment
В этой статье четко сказано, что Rhino не может скомпилировать .js в .class, хотя может. - person peterh; 19.02.2017


Вы можете скомпилировать свои сценарии во время выполнения, используя Context.compileString(). Это создает объект Script, который вы можете использовать повторно.

Script s = someContext.compileString(myScript, "<cmd>", 1, null);

// Store s, cache it in a map or something, maybe even serialize and persist it.

// Later...

Object result = s.exec(anotherContext, someScope);

Разница в производительности между чем-то вроде этого и использованием Context.evaluateString() может легко быть на несколько порядков быстрее.

person Jeb    schedule 19.01.2012

Вы можете попробовать следующий образец:

void toClassFile( String script ) throws IOException {
    CompilerEnvirons compilerEnv = new CompilerEnvirons();
    ClassCompiler compiler = new ClassCompiler( compilerEnv );
    Object[] compiled = compiler.compileToClassFiles( script, null, 1, "javascript.Test" );
    for( int j = 0; j != compiled.length; j += 2 ) {
        String className = (String)compiled[j];
        byte[] bytes = (byte[])compiled[(j + 1)];
        File file = new File( className.replace( '.', '/' ) + ".class" );
        file.getParentFile().mkdirs();
        try (FileOutputStream fos = new FileOutputStream( file )) {
            fos.write( bytes );
        }
    }
}
person Horcrux7    schedule 19.04.2015