Skip to content

robertkbl/MooseMachine

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#MooseMachine Build Status

##Motivation Der Informatikunterricht der gymnasialen Oberstufe beinhaltet einige Unterrichtseinheiten über die von-Neumann-Architektur und die Programmierung einer dieser Architektur ähnlichen Maschine mit der Java-Applikation Minmaschine. Diese Software visualisiert mit Hilfe einer vereinfachten Assembler-Sprache die Vorgänge innerhalb einer CPU, von der Befehlsholphase aus dem RAM bis hin zur Berechnung in der ALU. Trotz einiger Updates kann diese Applikation durch bestimmte Code-Konstellationen zum Absturz gebracht werden. Um dieses Problem zu beheben wurde die MooseMachine entwickelt.

##Funktionsumfang

  • Die MooseMachine basiert auf JavaFX 8, was auf Code-Basis eine höhere Flexibilität durch FXML und CSS im Design ermöglicht
  • Das Problem eines "zufälligen" Absturzes bzw. einer blockierten Oberfläche wurde durch das Ausführen des Maschinencodes in einem separaten Thread umgangen
  • Die MooseMachine ermöglicht das Debuggen des Codes in Einzelschritten, sowohl vorwärts als auch rückwärts. Die aktuelle Code-Position im Speicher wird im Code neben dem Speicher visualisiert
  • Der Editor basiert auf dem CodeMirror Browser-Editor. Durch diesen bietet die MooseMachine wichtiges Syntax-Highlighting
  • Die Applikation ist vollständig lokalisierbar, standardmäßig wird eine deutsche und englische Lokalisierung mitgeliefert. Sollte die aktuelle Systemsprache nicht mitgeliefert werden, so wird die englische Lokalisierung verwendet
  • Die Syntax der Minimaschine wurde um das DWORD-Keyword gekürzt, dafür um die drei Befehle PUT, PUTS, PUTA erweitert. Diese Befehle ermöglichen die Ausgabe von Speicherzellen, Strings und dem Akkumulator zur Visualisierung von Daten
  • Die MooseMachine wurde auf Geschwindigkeit optimiert. Ein Programm, das bis zu 2^15 - 1 zählt (der größten erreichbaren Zahl bei 16 Bit Integern) benötigt in der Minimaschine ~1.5 Sekunden. Die MooseMachine benötigt hierfür nur wenige Millisekunden, ohne Anzeige in der GUI benötigt das Programm für seine Abarbeitung und dem "Zurückspulen" auf den Anfangszustand nur ~70ms, ca. 200x so schnell wie die Minimaschine.

##Schreiben von Programmen in der MooseMachine Die Syntax der MooseMachine entspricht der Syntax der Minimaschine, sie wurde lediglich um das DWORD-Keyword gekürzt. Beispielprogramme befinden sich im Unterordner examples. Ein solches Programm kann bspw. so aussehen:

LOADI 	100 		// Zahl 100 in den Akkumulator laden
STORE 	100			// in Zelle 100 abspeichern

PUTS	"Zahl 1: "	// Ausgabe des Strings
PUT		100			// Zelle 100 ausgeben
PUTS	"\n"		// Zeilenumbruch ausgeben
LOADI 	200			// Zahl 200 in den Akkumulator laden
PUTS	"Zahl 2: "	
PUTA				// Akkumulator ausgeben
PUTS	"\n"

ADD		100			// Zelle 100 zu Akkumulator addieren
PUTS	"Summe:  "		
PUTA

HOLD				// Maschine anhalten

Die dazugehörige Konsolenausgabe sieht in diesem Fall so aus:

Zahl 1: 100
Zahl 2: 200
Summe:  300

##Verwendung in Java Die MooseMachine kann auch aus Java verwendet werden. Hierfür muss die .jar in den Klassenpfad eingebunden werden und das Package com.cs.moose.machine importiert werden, beispielsweise so:

import java.io.IOException;
import com.cs.moose.exceptions.*;
import com.cs.moose.io.File;
import com.cs.moose.machine.Lexer;
import com.cs.moose.machine.Compiler;
import com.cs.moose.machine.Machine;

public class Main {
    public static void main(String[] args) {
        // sanity check
        if (args.length != 2) {
            System.out.println("Bitte Dateinamen als 2. Parameter angeben");
            return;
        }

        try {
	        String code = File.readAllText(args[1]);        // Datei aus Aufrufparameter
	        Lexer lexer = new Lexer(code);                  // Code testen
	        Machine machine = Compiler.getMachine(lexer);   // Code kompilieren
	
	        for (int i = 0; i < 1000; i++) {
	            machine.goForward(); // Code ausführen
	        }
	        
	        System.out.println(machine.toString(20));                                    // die ersten 200 Speicherzellen ausgeben
	        System.out.println("\n\nSTDOUT: \n" + machine.toMachineState().getStdout()); // den Standard-Output ausgeben
        } catch (IOException ex) {
            System.out.println("Kann Datei nicht lesen");
        } catch (SyntaxException ex) {
            System.out.println("Inkorrekte Syntax in Zeile " + ex.getLine());
        } catch (CompilerException ex) {
            System.out.println("Compiler-Fehler: " + ex.getMessage());
        } catch (JumpPointException ex) {
            System.out.println("Punkt \"" + ex.getPoint() + "\" nicht definiert");
        } catch (MachineException ex) {
            System.out.println("Fehler beim Ausführen des Maschinencodes: " + ex.getMessage());
        }
    }
}

##Lizenz Die MooseMachine wird unter der MIT-Lizenz veröffentlicht.

About

An Application that runs simple software on an emulated CPU

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 93.2%
  • HTML 4.4%
  • CSS 2.4%