2010-10-02 10 views
6

Estoy haciendo un falling sand game en Java. Quiero que los usuarios puedan escribir su propio motor usando un lenguaje más simple. Los juegos de arena descendente pueden consumir mucha CPU, por lo que quiero que el motor funcione lo más rápido posible sin tener que compilar manualmente.Cómo compilar archivos rhino/javascript en .class bytecode para java en tiempo de ejecución

Necesito saber cómo compilar los archivos rhino javascript en archivos .class por en tiempo de ejecución para ser utilizado.

He buscado una forma pero no he podido encontrar otra que compilarla manualmente utilizando la línea de comando que no quiero que los usuarios tengan que hacer.

+0

Así que, básicamente, saben cómo hacerlo? pero quieres que esto se haga de forma dinámica y el usuario no necesita molestarse en cambiar la secuencia de comandos de rhino a .class? para esto, puede proporcionarles un archivo de proceso por lotes que pueda servir a su propósito ... – Varun

Respuesta

4

Hay un breve tutorial aquí:

+0

El ejemplo del código en este artículo tiene un pequeño defecto, que es el llamado de la función 'fib (num);' debe estar detrás de la definición de la cosa . Gracias. –

+0

Este artículo afirma claramente que el rinoceronte no puede compilar .js a .class, aunque podría hacerlo. – peterh

1

Puede compilar las secuencias de comandos en tiempo de ejecución utilizando Context.compileString(). Esto produce un objeto Script que puedes reutilizar.

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); 

La diferencia de rendimiento entre algo como esto y utilizando Context.evaluateString() podría fácilmente haber varios órdenes de magnitud más rápido.

0

Usted puede probar la muestra de la siguiente manera:

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); 
     } 
    } 
} 
Cuestiones relacionadas