diff --git a/ERFAHRUNGSBERICHT.md b/ERFAHRUNGSBERICHT.md new file mode 100644 index 0000000..0a237d6 --- /dev/null +++ b/ERFAHRUNGSBERICHT.md @@ -0,0 +1,56 @@ +# Erfahrungsbericht zu der Programmierung des RISC-V Emulators + +--- + +Für mich war direkt ab Beginn des Projektes klar, dass ich das in C++ schreiben möchte. Einmal, um das frisch Gelernte +aus der C+ Vorlesung mit Anwendung vertiefen zu können, als auch um Praxiserfahrung mit der reinen Theorie zu bekommen. + +Da C++ objektorientierte Programmierung erlaubt, habe ich mich dafür entschieden und habe begonnen, die ersten wichtigen +Komponenten eines Rechenwerks als Singleton zu implementieren. Nötig oder nicht konnte ich dabei das Konzept näher +vertiefen. +So hat sich dann mit der Zeit immer mehr herauskristallisiert, welche Komponenten ich in meinem Programm brauche. +Schlussendlich eben ein ProgramLoader und einen Manager, neben den Registern, dem Memory und der ALU. Und somit viel +weniger, als ich Anfangs dachte zu brauchen. + +Begonnen habe ich damit, die Assembly Datei zu lesen und zu interpretieren. Zeile für Zeile zu lesen, Kommentare zu +ignorieren, Befehl und Argumente zu trennen. Ich habe mich dafür, diese in einem Vektor zu speichern, den ich dann an +die ALU weitergeben kann. Diese kann dann simpel die benötigten Daten aus dem Vektor herauslesen. +Die Labels haben zu Beginn einer Herausforderung dargestellt, da ich ja keinen herkömmlichen program counter verwende, +kann ich also nicht einfach den aktuellen pc-value in einem register speichern. Dabei lernte ich den virtuellen Lesekopf +eines Dateistreams in C++ kennen. Dieser erlaubt mir, mit geeigneten Funktionen jederzeit die aktuelle Position des +Kopfes auszulesen als auch manuell zu setzen. +Dadurch habe ich mich entschieden, zu Beginn jeden Programmstartes die Assembly Datei zu indexieren und nach Labeln zu +suchen. Wird eins gefunden, wird dieses zusammen mit dem Stream offset in einer Map gespeichert. Somit konnte ich +jederzeit +an bestimmte Labels im Code springen. + +Der Rest war "nur noch" die Implementierung der ALU Befehle selbst. Da bereits (fast) alle Helfermethoden und Daten zur +Verfügung standen, ging dies je nach Befehl recht schnell. Die größte Herausforderung hierbei war das erkennen eines +Arguments als Register, Label oder immediate Value. + +Nachdem alles angeforderte Implementiert war, habe ich mithilfe der Beispielprogramme den Emulator angepasst und gefixt, +bis alles wie gewünscht funktioniert hat. + +--- + +Ich habe beim Programmieren auf einen sehr modularen Aufbau geachtet. Das ist mir Teils gelungen, Teils sind einige +Durchführungen von Befehlen sehr unschön im Code anzusehen. Begonnen von der riesigen if/else Abfrage in der Alu. Durch +noch mehr Modularität wäre das deutlich schöner. Bereits das Parsen der Argumente ist meiner Meinung nach nicht elegant +noch 100% sicher. +Außerdem ist der Emulator für die aktuellen Anforderungen sicherlich genügend, für nicht unterstütze Syntax oder Angaben +von immediate values anstatt von Labeln im Assembly Code aber keines Falls gewachsen. Das liegt unter anderem an der +fast nicht vorhandenen Fehlerbehebung im Code. Tritt irgendwo ein z.B. parsing Fehler auf, führt das direkt zu +undefiniertem +Verhalten, möglich sogar direkt zu einem Absturz. Bis auf ein paar Ausnahmen ist dieser dann undokumentiert, es kann +also +ohne genaues debuggen im Code nicht der Fehler direkt festgestellt werden. + +Auch wenn der Emulator feature complete ist, ist er nicht poliert und optimiert wie er das sein sollte, um einen +reibungslosen Verlauf bei z.B. möglichen Fehlern zu gewährleisten. + +--- + +Der Emulator wurde mit Git erstellt. Das Repository +ist [auf meinem Privaten Git Server](https://git.blck-hosting.de/BLACK/riscv-emulator) +zu finden. Durch die einzelnen Commits und den somit sichtbaren Fortschritt soll gezeigt werden, dass der Code von mir +selber geschrieben wurde und nicht von einer KI. diff --git a/README.md b/README.md index 78e7bce..1811ef7 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Es gibt folgende Anweisungen: | Befehl | Abkürzung für | Aktion | - |:------:|:-------------:|:-------------------------------------------:| + |:------:|:-------------:|:-------------------------------------------:| | s | sprint | Führt den Sourcecode bis zum Ende aus | | l | line | Führe die nächste Zeile des Sourcecodes aus | | e | end | Beende den Emulator direkt |