Highlighting der gerade ausgeführten Codezeilen

Schrello

Mitglied
Hey,

ich soll ein Programm erstellen, mit dessen Hilfe Algorithmen wie z.B. BubbleSort erlernt werden können. Die GUI und so weiter habe ich soweit.

Eine Herausforderung ist das anzeigen des Codes zur Implementierung des Algorithmus und genauer die Darstellung der gerade ausgeführten Code-Zeile.

Habe mich jetzt mit asm auseinander gesetzt... damit ist es aber nicht möglich die gerade ausgeführte Code-Zeile auszugeben.

Kennt ihr eine Bibliothek, die dieses Problem aufgreift? Ansonsten muss ich mir halt etwas einfallen lassen. Bin für jeden Anstoß dankbar.
Ideal wäre es, den Algorithmus in Java zu implementieren und ausgehen von dieser Implementierung und Ausführung alles weitere durchführen zu können.

PS: Interessant ist, dass es viele Arbeiten, auch Dissertationen gibt, die sich mit Lernprogrammen für Algorithmen auseinandersetzen, aber keine die oben genannte Funktion anbietet.
 
K

kneitzel

Gast
Wie sieht es denn mit den IDEs aus? Die haben alle einen Debugger mit drin. Also sollte man da doch ggf. eingreifen können. (Somit kann ich nicht verstehen, dass sowas bei "Lernprogrammen für Algorithmen" generell nicht unterstützt ist. Eine IDE kann man ja ggf. auch als solches ansehen...

Oder recherchiert einmal, was für Möglichkeiten Java Interpreter diesbezüglich eventuell haben.

Und wenn es um Algorithmen an sich geht und alles etwas eingeschränkter sein darf: Zur Not kann man sich sowas auch selbst bauen. Dann wird halt ggf. nur ein Subset von Java unterstützt.
 

mihe7

Top Contributor
Da die Algorithmen ja fix sind (wenn ich es richtig verstanden habe), wäre es natürlich auch möglich, den Spaß zu "faken".

Java:
String[] code = {
    "int i = 0;",
    "while (i < 10) {",
    "    i++;",
    "}",
    "System.out.println(\"Fertig\");"
};

public void countToTen() {
    publish(0);
    int i = 0; 
    while (i < 10) { 
        publish(1);
        publish(2);
        i++; 
    }
    publish(4);
    System.out.println("Fertig");
}

private void publish(int step) {
    for (int i = 0; i < code.length; i++) {
        String prefix = i == step ? "--> " : "    ";
        System.out.println(prefix + code[i]);
    }
}

Code:
jshell> countToTen()
--> int i = 0;
    while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
--> while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
-->     i++;
    }
    System.out.println("Fertig");
    int i = 0;
    while (i < 10) {
        i++;
    }
--> System.out.println("Fertig");
Fertig
 

Schrello

Mitglied
Vielen Dank,

ihr habt mich beide weitergebracht.
@mihe7, ich nehme deine Idee auf und versuche Folgendes:

Mit Hilfe von asm, soll der implementierte Code (hier bei deinem Beispiel bleibend):

Java:
 public void doSth () {  
    int i = 0;
    while (i < 10) {
        i++;
    }
    System.out.println("Fertig");
}

in der compilierten Klasse abgeändert werden zu etwas wie:
Java:
public void doSth () {  

    int i = 0;
    System.out.println("int i = 0;");
    Thread.sleep(2000);

    while (i < 10) {
    System.out.println("while (i < 10)");
    Thread.sleep(2000);

        i++;
        System.out.println("i++");
        Thread.sleep(2000);
    }

    System.out.println("Fertig");
    System.out.println("System.out.println("Fertig");");
    Thread.sleep(2000);
}


Der Code wird in einem eigenen Thread ausgeführt. Nach jeder Zeile, soll die gerade ausgeführte Zeile ausgegeben werden und der Thread 2s schlafen.

(Das ist jetzt nur ein erster Wurf, um meine Idee zu verdeutlichen) Hoffentlich komme ich damit an mein Ziel...


@JustNobody... Die Idee mit dem Interpreter finde ich auch gut... habe bisher noch keinen Ansatz gefunden... Such aber jetzt sehr breit nach Lösungen und bleibe deiner Idee auf der Spur.
 

Schrello

Mitglied
Der Quelltext ist mir bekannt.

Die Idee mit dem Debugger finde ich auch nicht schlecht, habe aber noch keinen Ansatz bzw. eine Idee, wie ich da anfangen soll...

Recherchiere noch...
 

Schrello

Mitglied
Ich bin noch dabei... Ich recherchiere sowohl in die Richtung JPDA, als auch in Richtung asm.

Bei beiden habe in Ansätze... Bei asm habe ich es geschafft den ByteCode auszulesen und auszugeben. Nächster Schritt wäre die Manipulation des ByteCode.

Bei JPDA habe ich die Funktionsweise verstanden. Mit Hilfe des Java Debugger Utility kann eine neue Java Virtual Machine (VM) gestartet werden, in der der zu debuggende Code ausgeführt wird. Hier recherchiere ich jetzt, wie ich in meinem Projekt eine neue VM starten kann, um ausschließlich die eine gewünschte Methode "kontrolliert" ausführen zu lassen.

Ich werde hier noch eine Weile brauchen, bis ich den Durchbruch habe befürchte ich.
 

Schrello

Mitglied
Da die Algorithmen ja fix sind (wenn ich es richtig verstanden habe), wäre es natürlich auch möglich, den Spaß zu "faken".

Ich könnte die "kontrollierte" Ausführung auch direkt im Code implementieren, wie du es vorgeschlagen hast. Doch ich verfolge einen Framework-Ansatz. der es mir erlauben soll die 5 Algorithmen "einfach" implementieren zu können. Idealerweise wird der eigentliche Suchalgorithmus gewöhnlich implementiert (auch durch Dritte) und das Framework übernimmt die "kontrollierte" Ausführung, ohne dass bei der Implementierung des eigentlichen Algorithmuses auf besondere Dinge geachtet werden muss.

(Ist keine Vorgabe vom Prof... finde aber die Idee ganz cool)
 

Ähnliche Java Themen

Neue Themen


Oben