2016-03-31 2 views
1

Problem:-Code-Interpreter und Läufer für Java und Android

Wir sind für eine Art und Weise suchen Quellcode zur Laufzeit zu interpretieren und auszuführen. Ich hätte gerne Vorschläge.

Wir entwickeln ein Spiel, wo der Benutzer Quellcode schreiben muss, um die Herausforderungen, wie die CodinGame abzuschließen.

Das Ziel des Spiels ist es, Studenten zu helfen, die in Programmierdisziplinen beginnen.

Anforderungen:

  • Das Spiel wird entwickelt mit LibGDX (für Java Desktop und Android)
  • Der Schüler eine begrenzte Anzahl an Methoden haben wird, die aufgerufen werden können, wie turnLeft(), turnRight(), go() und Andere.
  • Es sollte möglich sein, Anweisungen wie IF/ELSE, FOR und WHILE zu verwenden.
  • Es wird sehr gut sein, wenn Sie Fehler im Code des Studenten zeigen können.

So begannen wir nach Wegen der Implementierung zu suchen.

Zuerst dachten wir uns, "Aspect Oriented Programming" zu verwenden, fanden aber nichts, was den Quellcode der Studenten dynamisch lesen könnte.

Compiler als InstantJ sind keine Option, da JAVAC verwendet wird, was es unmöglich macht, innerhalb des Android zu bauen.

Also dachten wir uns etwas aus, um den Quellcode zu lesen, der vom Benutzer eingegeben wurde und "im Speicher läuft", indem wir die Methoden über Reflektion aufrufen. Oder etwas ähnliches.

Es wurde auch etwas wie LISP oder LOGO-Interpreter vorgeschlagen, aber das Problem in diesem Fall ist die Syntax. Wir möchten, dass Schüler eine Sprache lernen, die in der Zukunft verwendet werden kann.

Die Lösung, die wir jetzt betrachten, ist JavaParser. Aber diese Bibliothek macht den Code-Parser buchstäblich und interpretiert die Anweisungen nicht. Hier müssen wir Aufrufe per Reflection manuell ausführen. Und es ist schwierig, Bedingungen zu interpretieren wie IF, FOR, usw.

Frage:

Unser Ziel ist es, dass der Benutzer schreiben kann Java (oder JavaScript-Code), die Anrufe zu vordefinierten Methoden machen sollte. Die Methoden sind bereits in den Spielklassen implementiert. Wir suchen nicht gezielt nach einer Bibliothek, wir möchten Vorschläge für die Forschung machen.

Irgendwelche Vorschläge für etwas, das wir suchen können?

Antwort

0

Nach viel suchen und mit Freunden reden, glaube ich, dass ich eine sehr schöne Lösung bekommen habe!

Während der Suche habe ich die Rhino-Bibliothek gefunden, und damit kann ich Skripts mit JavaScript erstellen, ohne dass eine Kompilierung erforderlich ist.

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

Ausgang:

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 

Perfect!

Verwandte Themen