Anführungszeichen normalisiert

master
Robert Jacob 3 months ago
parent 1dc18a660a
commit 45ddbc4c48
  1. 58
      content/projekt/HE32/index.md

@ -30,17 +30,17 @@ Weitere Infos & Unterlagen können auf der zugehörigen [Website](https://www.na
## 1. Der Kurs ##
Inhaltlich geht es in 12 Kapiteln vom NAND-Gatter bis zur einfachen 'Betriebssystem'-Erstellung
(die auf der [Website](https://www.nand2tetris.org/course) unter 'Projects' abgerufen werden).
Inhaltlich geht es in 12 Kapiteln vom NAND-Gatter bis zur einfachen "Betriebssystem"-Erstellung
(die auf der [Website](https://www.nand2tetris.org/course) unter "Projects" abgerufen werden).
- Die ersten fünf Kapitel befassen sich mit dem Aufbau einer 'eigenen' CPU, Speicherelementen
etc. aus einfachsten NAND-Gattern und deren Zusammenschaltung zum 'Hack'-Computer!
- Die ersten fünf Kapitel befassen sich mit dem Aufbau einer "eigenen" CPU, Speicherelementen
etc. aus einfachsten NAND-Gattern und deren Zusammenschaltung zum "Hack"-Computer!
- Kapitel 6 behandelt die Erstellung eines passenden Assemblers,
- Kapitel 7 & 8 befassen sich mit der Erstellung eines Übersetzers einer eigenen VM bzw. deren 'intermediate
Language' (VM/IL -> Assembler)
- Kapitel 7 & 8 befassen sich mit der Erstellung eines Übersetzers einer eigenen VM bzw. deren "intermediate
Language" (VM/IL -> Assembler)
- Kapitel 9 - 11 behandeln dann die Erstellung eines Compilers für eine prozedurale aber
schon objektorientierte Sprache (genannt 'Jack', übersetzt wird dann in VM-Code/IL).
- Kapitel 12 erklärt, wie man ein passendes 'Betriebssystem' (OS, 'Operating System') erstellt - wobei
schon objektorientierte Sprache (genannt "Jack", übersetzt wird dann in VM-Code/IL).
- Kapitel 12 erklärt, wie man ein passendes "Betriebssystem" (OS, "Operating System") erstellt - wobei
es hier eigentlich um eine Kombination von BIOS & Standard-Library geht.
Das Geniale: Der Schwierigkeitsgrad bleibt immer akzeptabel, gerade für das Selbststudium!
@ -52,7 +52,7 @@ jedoch ist man frei in der Wahl der Programmiersprache zur Realisierung (*ich ha
in Python erstellt - natürlich hier nicht veröffentlicht, schließlich soll sich jeder seine
Lösung selbst erarbeiten!*).
Mitgeliefert werden alle notwendigen Emulatoren und Hilfsmittel um die Ergebnisse mit den korrekten
Lösungen automatisiert zu vergleichen (auf der [Website](https://www.nand2tetris.org/software) unter 'Software').
Lösungen automatisiert zu vergleichen (auf der [Website](https://www.nand2tetris.org/software) unter "Software").
Ich habe zwei Monate für den ganzen Kurs gebraucht. Für die ersten 10 Kapitel einen Monat, für die
restlichen zwei noch einmal einen ganzen Monat (der Schwierigkeitsgrad steigt zwar kaum an, jedoch
@ -65,7 +65,7 @@ Meine Empfehlung: Pädagogisch wertvoll!
### 2.1 Hardware & Assembler ##
Zunächst wird im Hardware-Teil eine [ISA](https://de.wikipedia.org/wiki/Befehlssatzarchitektur) definiert,
d.h. man 'baut' analog zu einer echten CPU eine Theoretische, die 'Hack'-CPU mit dem 'Hack'-Befehlssatz
d.h. man "baut" analog zu einer echten CPU eine Theoretische, die "Hack"-CPU mit dem "Hack"-Befehlssatz
(in einer Kurs-spezifischen [HDL](https://de.wikipedia.org/wiki/Hardwarebeschreibungssprache)). Diese wird
im beigestellten Simulator mittels Testscript verifiziert.
Das sieht dann ungefähr so aus:
@ -79,7 +79,7 @@ Das IS sieht wie folgt aus:
{{< image alt="IS Overview" src="hack_is.png" >}}
Hierfür ist ein Assembler zu erstellen, der als Output 16-Bit Code (als 'Binär-Text') generiert, z.Bsp. wie folgt:
Hierfür ist ein Assembler zu erstellen, der als Output 16-Bit Code (als "Binär-Text") generiert, z.Bsp. wie folgt:
<div class="pure-g">
{{< image alt="Assembly Sample" src="asm_code.png" class="pure-u-1 pure-u-md-1-2" >}}
@ -97,12 +97,12 @@ vertraut. Hierzu kann der beigestellte VM-Emulator genutzt werden:
</div>
Als nächstes wird ein Übersetzer erstellt, von VM-Code zu Assembly Language. Wenn man diesen mit dem unter
2.1 erstellten Assembler kombiniert, kann man also schon von VM-Code direkt in 'Native Code' übersetzen ...
2.1 erstellten Assembler kombiniert, kann man also schon von VM-Code direkt in "Native Code" übersetzen ...
### 2.3 Hochsprache ###
Als Krönung soll jetzt noch ein 'echter' Hochsprachen-Compiler erstellt werden. Hierzu wird eine relativ
einfache Sprache - genannt 'Jack' - vorgegeben (es gibt schon ein VSC-Plugin!).
Als Krönung soll jetzt noch ein "echter" Hochsprachen-Compiler erstellt werden. Hierzu wird eine relativ
einfache Sprache - genannt "Jack" - vorgegeben (es gibt schon ein VSC-Plugin!).
Sogar Objekte können bereits angelegt werden!
Hier mal die formale Definition:
@ -127,10 +127,10 @@ um aus Jack den Hack-Maschinencode zu erzeugen.
### 2.4 OS ###
Final erstellt man im Kurs eine Mischung aus BIOS und 'Standard'-Lib (nach vorgegebenem API) - etwas großspurig
als 'Betriebssystem' bezeichnet.
Final erstellt man im Kurs eine Mischung aus BIOS und "Standard"-Lib (nach vorgegebenem API) - etwas großspurig
als "Betriebssystem" bezeichnet.
Interessant ist zum Beispiel das Modul 'Memory'. Hier schraubt man eine Speicherverwaltung selber zusammen, inkl.
Interessant ist zum Beispiel das Modul "Memory". Hier schraubt man eine Speicherverwaltung selber zusammen, inkl.
Garbage Collection Strategie - wirklich lehrreich!
Bei Screen- und Output-Modul befasst man sich mit Bildschirmspeicher und Character-Generierung, wie zu C64-Zeiten ...
@ -139,9 +139,9 @@ Bei Screen- und Output-Modul befasst man sich mit Bildschirmspeicher und Charact
### 3.1 Von 16-Bit zu 32-Bit Worten ###
Leider ist der Addressbereich des 'Instruction Set' auf 15-Bits limitiert, es lassen sich also nur 32768
Leider ist der Addressbereich des "Instruction Set" auf 15-Bits limitiert, es lassen sich also nur 32768
Speicherstellen adressieren. Für das RAM ist das zunächst egal, was wirklich kneift ist der eingeschränkte
ROM-Bereich. Wenn man also gemäß 2.4 (s.o.) ein 'OS' erstellt hat, kann man es nicht komplett laden, da es ca.
ROM-Bereich. Wenn man also gemäß 2.4 (s.o.) ein "OS" erstellt hat, kann man es nicht komplett laden, da es ca.
60K Wortcode erzeugt. Auch der mitgelieferte Emulator lehnt entsprechende Code-Mengen ab.
Könnte man da vielleicht Abhilfe schaffen? (Spoiler-Alert: Man kann!)
@ -150,7 +150,7 @@ Wenn man den Addressbereich nur um 3 Bit erweitert könnte man 256K Worte addres
und die zusätzliche eigentliche Applikation reichen?
Ich habe also alles der Einfachheit halber auf 32-Bit umgestellt, drei Bits einfach oben auf die unteren 15 Bits
'aufgepfropft' und das alte Bit 15 in das Bit 31 verschoben.
"aufgepfropft" und das alte Bit 15 in das Bit 31 verschoben.
Den bereits existierenden (selbstgeschriebenen) Assembler habe ich um eine Option für die Generierung von diesem
32-Bit Code erweitert.
@ -170,8 +170,8 @@ Was mir auch nicht gleich klar war: Rust ist eine funktionale Sprache (wie Schem
nur optisch wie eine Prozedurale aus.
Bis Kapitel 17 (inkl., von insgesamt 21) habe ich mich durch das [Rust-Manual](https://doc.rust-lang.org/stable/book/)
vorgearbeitet, dann habe ich die Arbeit am HE32-Projekt in Rust aufgenommen ('Hack'-Emulator 32-Bit) - und bin
gleich am indirekten Vector-Zugriff gescheitert (ein solideres Verständnis von 'RefCell' hätte geholfen -
vorgearbeitet, dann habe ich die Arbeit am HE32-Projekt in Rust aufgenommen ("Hack"-Emulator 32-Bit) - und bin
gleich am indirekten Vector-Zugriff gescheitert (ein solideres Verständnis von "RefCell" hätte geholfen -
Danke **Vespasian**)!
Auch hatte ich zunächst für parallele Threads geplant und vorsichtshalber eine Menge mit Arc & Mutex hantiert -
überflüssigerweise & eine echte Performance-Bremse.
@ -180,13 +180,13 @@ Weil eine neue Sprache lernen ja immer eine Unterforderung ist (💀!), habe ich
auch gleich für eine GUI-Lösung entschieden 🏋 (hier sieht man noch, das die GUI-Landschaft für Rust im Fluß
ist - nach einiger Web-Recherche habe ich mich für [Qt5 mit ritual](https://rust-qt.github.io/) entschieden).
Eigentlich soll Rust ja 'sicher' im Hinblick auf Speicherzugriffe sein, schade auch, das für Qt5 dann große Teile
wieder auf 'unsafe' gedreht werden (müssen) 🖕 ...
Eigentlich soll Rust ja "sicher" im Hinblick auf Speicherzugriffe sein, schade auch, das für Qt5 dann große Teile
wieder auf "unsafe" gedreht werden (müssen) 🖕 ...
Wenigstens lässt sich der Timer-Event von Qt gut nutzen!
Nicht so gut funktioniert das Einklinken in die Event-Schleife zwecks Abfangen der Tastatur und Weiterreichung
an die Emulation (das Symbol wird nicht richtig aufgelöst - ist zumindest nicht auffindbar?!).
Daher habe ich das Modul ('crate' in Rust-Terminologie) device_query dafür genutzt.
Da es so etwas wie globale Variablen nicht gibt 🤔(?) habe ich das Crate 'lazy_static' ebenfalls hinzugezogen.
Daher habe ich das Modul ("crate" in Rust-Terminologie) device_query dafür genutzt.
Da es so etwas wie globale Variablen nicht gibt 🤔(?) habe ich das Crate "lazy_static" ebenfalls hinzugezogen.
Nach einigen Performance-Optimierungen läuft der HE32 jetzt ganz passabel. Nur an zwei Stellen waren die
System-Bibliotheken anzupassen: In Math.multiply musste die Bitzahl erhöht werden und Sys.wait musste an
@ -199,8 +199,8 @@ Die [Quellen zu HE32](https://git.hacknology.de/projekte/HE32) finden sich wie g
## 4. Was kann man - ganz praktisch - an Erkenntnissen gewinnen? ##
- Der Kurs empfiehlt sich unbedingt für Ingenieure oder Naturwissenschaftler. Wer im Informatik-Studium nur die
'Fertigprodukte' Flex und Bison kennengelernt hat, jedoch interessiert ist am Eigenbau, ist hier ebenfalls richtig.
Ist schon ein tolles Gefühl, wenn man eine 'eigene' Compiler-Toolchain gebaut hat!
"Fertigprodukte" Flex und Bison kennengelernt hat, jedoch interessiert ist am Eigenbau, ist hier ebenfalls richtig.
Ist schon ein tolles Gefühl, wenn man eine "eigene" Compiler-Toolchain gebaut hat!
- Der Compilerbau hat seit den 80ern Fortschritte gemacht: Die Erfindung einer zwischengeschalteten VM/IL erlaubt
eine deutliche Komplexitätsreduzierung, man muß eben nicht mehr direkt aus der Hochsprache Assembly-Code für die
Zielplattform generieren.
@ -209,7 +209,7 @@ Außerdem erlaubt das Konzept die Aufteilung in Frontend/VM/Backend - und als Fr
können dann bei Bedarf verschiedene Hochsprachen Verwendung finden, als Backend sind unterschiedliche Targets
mit vertretbarem Aufwand machbar (siehe hierzu z.Bsp.: [LLVM](https://llvm.org/)).
- 💡Rust: Der Verzicht auf 'saubere' Mehrtaskfähigkeit beschleunigt die Abarbeitung ca. vierfach.
- 💡Rust: Der Verzicht auf "saubere" Mehrtaskfähigkeit beschleunigt die Abarbeitung ca. vierfach.
- 💡Eine CPU mit nur zwei Registern (ohne PC) muss extrem viel über den Stack abwickeln. Sowohl in der Emulation wie
auch in der Realität (externer Speicherzugriff!) ist das SEHR langsam. Hier gilt also: Viel(e Register) hilft viel!

Loading…
Cancel
Save