Java 和 Android 的代码解释器和运行器

Code interpreter and runner for Java and Android

问题:

我们正在寻找一种在运行时解释和执行源代码的方法。我想要建议。

我们正在开发一款游戏,用户必须编写源代码才能完成挑战,例如 CodinGame

游戏objective是为了帮助刚开始学习编程学科的学生。

要求:

于是我们开始寻找实现方式。

一开始我们想到了用"Aspect Oriented Programming",但是没有找到可以动态读取同学源码的东西

InstantJ 等编译器不是一个选项,因为它使用 JAVAC,因此无法在 Android.

中构建

所以我们想到了读取用户输入的源代码并"running in memory,"通过反射调用方法的东西。或者类似的东西。

也有人建议使用 LISP 或 LOGO 解释器,但这种情况下的问题是语法。我们希望学生们学习一门将来可以使用的语言。

我们现在正在寻找的解决方案是JavaParser。但是这个库字面意思是做代码解析器而不是解释指令。这里我们必须手动通过反射执行调用。并且很难解释IF、FOR等条件

问题:

我们的目标是用户可以编写 Java(或 Java脚本)代码来调用预定义的方法。这些方法已经在游戏中实现 类。我们不是专门寻找图书馆,我们希望得到研究建议。

对我们可以寻找的东西有什么建议吗?

经过多方搜索和与朋友交流,我相信我得到了一个非常好的解决方案!

在搜索过程中我找到了 Rhino 库,有了它我可以使用 JavaScript 制作脚本而不需要编译。

private void executeScript() {
    String source = "" +
            "game.walk();\n" +
            "game.walk();\n" +
            "var jumps = 10;\n" +
            "for (var i = 0; i < jumps; i++) {\n" +
            "   game.jump(i + 1);\n" +
            "}";


    org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter();
    cx.setOptimizationLevel(-1); // disable compilation
    Scriptable scope = cx.initStandardObjects();
    Object wrappedOut = cx.javaToJS(this, scope);
    ScriptableObject.putProperty(scope, "game", wrappedOut);
    Object result = cx.evaluateString(scope, source, "<cmd>", 1, null);

}

public void walk() {
    System.out.println("Walking!");
}

public void jump(int count) {
    System.out.println("Jumping! " + count);
}

输出:

System.out: Walking!
System.out: Walking!
System.out: Jumping! 1
System.out: Jumping! 2
System.out: Jumping! 3
System.out: Jumping! 4
System.out: Jumping! 5
System.out: Jumping! 6
System.out: Jumping! 7
System.out: Jumping! 8
System.out: Jumping! 9
System.out: Jumping! 10

完美!