Java作为Java的脚本语言?

时间:2012-12-06 16:03:28

标签: java performance scripting jvm

是否可以将Java用作java的脚本语言?或者也许以某种方式在运行时将java脚本编译成java二进制文件?我确实试过搜索但除了一些黑客之外找不到任何全面的东西......

我有使用其他语言的经验,例如对于C#我使用lua非常方便,但现在我需要达到最佳性能,因为对脚本的调用大约是每帧1.000.000。

所以我认为将java本身作为java程序的脚本语言,应该为我提供最佳的性能和兼容性。

有什么建议吗?

8 个答案:

答案 0 :(得分:8)

BeanShell是Java常用的脚本解决方案。它是一种类似Java的脚本语言。

存在使用Java基础结构和JVM但使用不同语言的其他解决方案。例如Scala,Groovy和Jython(兼容Java的Python)。所有这些重要的事情是它们将与使用标准Java创建的Java库互操作,因此您可以轻松地使用(比如说)Scala来驱动您的Java语言创建的解决方案。

以上都提供了REPL(read-eval-print-loop),因此您可以在动态命令行环境中导入,实例化对象并与对象进行交互。这对于测试和原型设计交互以及测试脚本非常有用。

答案 1 :(得分:7)

您可以使用BeanShell,但Groovy,XTend和Scala可能会做出更好的选择。

答案 2 :(得分:5)

答案是'是',您可以在Java程序本身中使用Java作为脚本语言。此外,还有其他几种语言也可用于此目的 - Javascript,LUA,Groovy,Ruby,列表很长。通过引入javax.scripting API,集成变得更加容易,javax.scripting API标准化并大大简化了将第三方脚本语言集成到Java程序中的过程。我强烈建议您阅读有关Oracles页面的API和一些教程。

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

答案 3 :(得分:4)

从7.0版开始,Java对运行时编译有“官方”支持(如果SDK中的tools.jar在classpath上)。可能,执行速度可以与编译的java一样高,高于解释器。

阅读的起点(互联网上的许多样本):

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


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

答案 4 :(得分:3)

您可以使用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 :(得分:1)

对于简单的东西,当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'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

答案 6 :(得分:0)

RelProxy是一个Java编译器(在内存中),它使Java感觉像一种脚本语言,但没有限制。当在Java环境中使用Groovy时,它还支持Groovy类的热类重载。

答案 7 :(得分:0)

Java 11支持运行源代码而不进行编译。

对于包含{p>的文件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二进制文件的路径。