Java 和 Android 的代码解释器和运行器
Code interpreter and runner for Java and Android
问题:
我们正在寻找一种在运行时解释和执行源代码的方法。我想要建议。
我们正在开发一款游戏,用户必须编写源代码才能完成挑战,例如 CodinGame。
游戏objective是为了帮助刚开始学习编程学科的学生。
要求:
- 游戏使用 LibGDX 开发(适用于 Java 桌面和 Android)
- 学生可以调用的方法有限,例如
turnLeft()
、turnRight()
、go()
等。
- 应该可以使用
IF/ELSE
、FOR
和 WHILE
等语句。
- 同学写的代码如果能指出错误就很好了
于是我们开始寻找实现方式。
一开始我们想到了用"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
完美!
问题:
我们正在寻找一种在运行时解释和执行源代码的方法。我想要建议。
我们正在开发一款游戏,用户必须编写源代码才能完成挑战,例如 CodinGame。
游戏objective是为了帮助刚开始学习编程学科的学生。
要求:
- 游戏使用 LibGDX 开发(适用于 Java 桌面和 Android)
- 学生可以调用的方法有限,例如
turnLeft()
、turnRight()
、go()
等。 - 应该可以使用
IF/ELSE
、FOR
和WHILE
等语句。 - 同学写的代码如果能指出错误就很好了
于是我们开始寻找实现方式。
一开始我们想到了用"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
完美!