Blog

Hardware meistern: Meine Nand2Tetris-Reise beginnt

Jeffrey Zaayman

Aktualisiert Oktober 15, 2025
11 Minuten

Im Jahr 2010 starb ein Mann namens Maurice Wilkes. Sein Tod war ein Verlust für die Computerbranche, denn er galt als einer der letzten Menschen, die Hardware und Software wirklich auf einer grundlegenden Ebene verstanden. Ich habe während meiner gesamten Karriere ausschließlich mit Software gearbeitet, aber ich habe immer versucht, meinen Wissenskreis über mein spezifisches Fachgebiet hinaus zu erweitern. So habe ich immer versucht, mehr über Hardware zu lernen, aber oft fehlte mir die Zeit, mich damit zu beschäftigen - und ich hatte keine Ahnung, wo ich anfangen sollte.

Das ist Nand2Tetris, ein Kurs auf coursera.org von Noam Nisan und Shimon Schocken. Ich habe von diesem Kurs zum ersten Mal vor ein paar Jahren erfahren, als ein guter Freund ihn mir vorstellte. Ich stürzte mich sofort hinein, gab aber nach ein paar Wochen auf. Im Laufe der Jahre habe ich ihn mehrmals begonnen und wieder aufgegeben. Im Januar 2023 beschloss ich schließlich, den Kurs zu beenden. Im März hatte ich den ersten Teil abgeschlossen, komplett mit Zertifikat und einem gesunden Gefühl der Erfüllung.

Ich möchte klarstellen, dass sich dieser Kurs für mich unglaublich gelohnt hat. Bis dahin hatte ich nur rudimentäre Kenntnisse über die Funktionsweise von Speicher und CPU, aber in diesem Kurs habe ich sie nicht nur erklärt, sondern auch selbst gebaut. Wenn Sie schon immer wissen wollten, was Ihr Computer auf der Hardware-Ebene tut, kann ich Ihnen diesen Kurs nur empfehlen. Er lüftet den Vorhang über das, was in so ziemlich jedem Gerät, das Sie heute benutzen, vor sich geht, und lässt Sie einen Blick in die magische 'Black Box' werfen.

Der Kurs

Der komplette Kurs (über zwei Teile) beginnt, wie der Name schon sagt, mit dem bescheidenen NAND-Gatter und nimmt Sie mit auf eine Reise durch Hardware und Software, bis Sie ein komplettes Tetris-Spiel auf der von Ihnen erstellten virtuellen Hardware schreiben können. Ich glaube, das ist es, was mich an dem Kurs gereizt hat. Es fühlte sich an, als würde ich Brot von Grund auf neu backen, aber anstatt die Zutaten zu kaufen, baute ich den Weizen an und zog die Hühner für die Eier und die Kühe für die Milch auf. Ein System von Grund auf aufzubauen, hat etwas ganz 'Fundamentales'.

Wir leben in einer Welt, die sich ständig zu beschleunigen scheint. Es bleibt nur wenig Zeit, um innezuhalten und etwas zu verstehen, bevor man es umsetzen und zum nächsten Schritt übergehen muss. Nachdem ich mich gerade auf eine CKAD-Prüfung vorbereitet (und sie bestanden) hatte, beschloss ich, etwas für mich zu lernen. Ich habe mich aktiv dafür entschieden, langsamer zu machen und mir die Zeit für diesen Kurs zu nehmen. Also setzte ich mich an einem verregneten Samstagnachmittag hin und begann den Kurs, der meine Wahrnehmung von Hardware für immer verändern sollte.

Bevor wir fortfahren, noch einige Vorbehalte. Sie müssen zwar keine Hardware-Kenntnisse haben, aber eine Vorstellung von Logikgattern und deren Funktionsweise wird das Verständnis des Materials erheblich erleichtern. Sie sollten auch wissen, wie man in einer Sprache programmiert, die es erlaubt, Dateipfade von der Kommandozeile zu lesen (z.B. Python, Ruby, Java). Was Sie von diesem Kurs erwarten können - in einem Wort: Wissen. Lesen Sie weiter, um zu entscheiden, ob Sie die gleiche Reise antreten wollen.

NAND

Das erste, was ich lernen musste, war, was ein NAND-Gatter ist:

Diagramm eines NAND-Gatters und seiner Wahrheitstabelle
Ein NAND-Gatter und seine Wahrheitstabelle

Oben sehen Sie das Diagramm eines NAND-Gatters und die dazugehörige Wahrheitstabelle - eine Tabelle, die alle möglichen Kombinationen von Eingangs- und Ausgangswerten enthält. Wir wissen, dass die Ausführung Und Logik, bei der einer der Operanden 0 ist, führt zu einer 0 am Ausgang. Nur wenn beide Eingänge 1 sind, ist der Ausgang auch eine 1. Ein NAND-Gatter funktioniert genau umgekehrt.

Für die Zwecke des Kurses würde NAND als unteilbarer Ausgangspunkt und Baustein für alle anderen Logikgatter und Komponenten dienen, die ich erstellen würde.

Boolesche Logik

Im ersten Teil des Kurses ging es um die Verwendung von NAND, um die gängigsten 'primitiven' Gatter zu erstellen.

NICHT

Ich habe zum Beispiel ein NICHT-Gatter erstellt, indem ich seinen einzigen Eingang (in) sowohl an die a als auch an die b Eingänge eines NAND-Gatters angeschlossen habe, und der Ausgang entsprach genau dem Verhalten eines NICHT-Gatters. Unten sehen Sie ein Diagramm, das zeigt, was ich meine:

Ein Diagramm eines NOT-Gatters und seine Wahrheitstabelle
Ein NOT-Gatter und seine Wahrheitstabelle

Ein NOT-Gatter funktioniert, indem es seinen Eingang in das Gegenteil 'umdreht'. Wenn Sie sich die Wahrheitstabelle des NAND-Gatters ansehen, sehen Sie, dass die Ausgabe 1 ist, wenn a und b beide 0 sind, und dass die Ausgabe 0 ist, wenn sie beide 1 sind.

Ein Diagramm eines NAND-Gatters, das ein NOT-Gatter implementiert, und seine Wahrheitstabelle
Ein NAND-Gatter, das ein NOT-Gatter implementiert, und seine Wahrheitstabelle

UND

Das war meine erste Offenbarung - dass jedes logische Gatter eine eigene kleine 'Black Box' ist, die aus anderen Gattern besteht. Das UND-Gatter, als weiteres Beispiel, besteht aus einem NAND-Gatter und einem NICHT-Gatter (das wiederum aus einem NAND-Gatter besteht). Das NAND-Gatter erledigt seine Aufgabe und fungiert dann als NICHT-Gatter, um das Ergebnis zu spiegeln und Sie erhalten UND. Was mir die Augen öffnete, war die Tatsache, dass jede CPU, die es gibt, auf ihrer untersten Ebene aus einem komplexen Tanz solcher Gatter besteht, die Signale verarbeiten.

Ein Diagramm eines NAND- und NOT-Gatters, das ein AND-Gatter implementiert, dessen Wahrheitstabelle
Ein NAND- und NOT-Gatter, das ein AND-Gatter implementiert, dessen Wahrheitstabelle

Die eigentliche Arbeit, die Gatter zu bauen, wurde in einer Hardware-Beschreibungssprache erledigt, wie sie in der Industrie verwendet wird, nur viel einfacher. Der Kurs wird mit den notwendigen Java-basierten Tools geliefert, um diese Gatter zu bauen und zu testen.

MUX

Am meisten fasziniert haben mich die MUX- und DMUX-Gatter. Hier ist eine Erklärung des MUX (Multiplexor) Chips, um Ihnen eine Vorstellung zu geben. Er hat drei Eingänge: a und b sowie einen selector. Sie geben zwei Werte ein (z.B. 0 und 1) und je nachdem, welchen Wert Sie für den Selektor gewählt haben (0 oder 1), wird entweder der a -Eingang (0) oder der b -Eingang (1) an out weitergeleitet. So sieht es von außen aus: Werte fließen hinein, Sie ziehen einen Hebel und einer dieser Werte fließt heraus. Aber das ist nicht das, was wirklich passiert. Wenn Sie in das Innere der Box schauen, sind es nur die akkumulierten Gatter, die in der richtigen Reihenfolge verdrahtet sind, die die Illusion eines Flusses erzeugen. Auf dieselbe Weise vermitteln 60 Standbilder pro Sekunde die Illusion von Bewegung.

Ein Diagramm eines MUX-Gatters und seine Wahrheitstabelle
Ein MUX-Gatter und seine Wahrheitstabelle

Ich erinnere mich an das Zitat des kanadischen Informatikers Alfred Aho: "DieInformatik ist eine Wissenschaft der Abstraktion - man erstellt das richtige Modell für ein Problem und entwickelt die geeigneten mechanisierbaren Techniken, um es zu lösen." Sie verwenden die Blackboxen, die Sie in der vorherigen Phase erstellt haben, um die Blackboxen zu bauen, die Sie in der nächsten Phase verwenden werden - Blackboxen innerhalb von Blackboxen.

Boolesche Arithmetik

In diesem Abschnitt habe ich die Gatter verwendet, die ich zuvor entworfen hatte, um einen Halbaddierer zu konstruieren, einen einfachen Chip mit zwei Eingängen (a und b) und zwei Ausgängen (sum und carry). Er 'addiert' die beiden Eingänge und wenn das Ergebnis größer als 1 ist, ist die Summe 0 und das Übertragsbit ist 1 (das Konzept ist das gleiche wie bei der Addition von Dezimalzahlen). Dieses Bit würde dann von der Spalte '1' in einem Binärwert in die Spalte '2' übertragen. Wenn Sie also 1 und 1 addieren, erhalten Sie 10 (zwei).

Eine Tabelle, die zeigt, wie Bits hinzugefügt werden können
Eine Tabelle, die zeigt, wie Bits hinzugefügt werden können

Auch hier war die Illusion am Werk. Bits schienen sich zu kombinieren und Werte und Überträge zu erzeugen, aber es handelt sich nur um die clevere Implementierung eines XOR-Gatters und eines UND-Gatters.

Es gibt 10 Arten von Menschen. Diejenigen, die das Binärsystem verstehen, und diejenigen, die es nicht verstehen.

Der Höhepunkt des Abschnitts war die ALU (Arithmetic Logic Unit), ein komplexer kleiner Chip, der eine Reihe von mathematischen und logischen Operationen an zwei Eingängen durchführt. Wie beim MUX-Chip geben Sie zwei Werte ein, drehen ein paar Steuerbits um, und das Ergebnis kommt heraus. Abstraktionen auf der Spitze von Abstraktionen, auf der Spitze von Abstraktionen.

Diagramm eines ALU (Arithmetic Logic Unit) Chips
Die ALU (Arithmetische Logikeinheit)
Die Wahrheitstabelle für die ALU
Befehlsreferenz für die ALU

Sequentielle Logik

Bislang haben diese Chips sofort funktioniert - ich habe etwas eingegeben und das Ergebnis kam sofort heraus. Aber das ist nicht repräsentativ für die Realität; in der realen Welt gibt es Zeit. Und in der Tat hätten wir ohne Zeit keinen Speicher. In diesem Abschnitt wurde das Daten-Flip-Flop (DFF) vorgestellt, das zweite (und letzte) primitive Gatter. Seine Ausgabe ist die Eingabe von einem "Tick" früher (Ticks sind die Anzahl der Operationen, die eine CPU pro Sekunde ausführen kann - eine 2 GHz CPU tickt 2 Milliarden Mal pro Sekunde).

Daraus habe ich Bit-Chips und aus diesen die eigentlichen Speicherchips entwickelt. Ein Bit ist eine Komponente, die aus einem MUX-Chip und einem DFF-Chip besteht, die, wenn sie kombiniert werden, einen Wert als Eingabe erhalten können (0 oder 1) und, abhängig vom Ladebit, entweder den von Ihnen gelieferten Wert laden oder ihre eigene Ausgabe in sich selbst zurückführen und sich so ihren Zustand "merken". Dies war die Grundlage für die Erstellung aller Speicherchips in diesem Abschnitt.

Diagramm eines 1-Bit-Registers
Ein 1-Bit-Register

Was mich an diesem Abschnitt verblüfft hat, war die Veranschaulichung, wie das Gedächtnis funktioniert, wie sich jedes Bit Milliarden Mal pro Sekunde an seinen Wert erinnert!

Han Solo unterbricht ständig C3P0 in Rückkehr der Jedi

Maschinensprache

Der nächste Abschnitt gab mir eine kleine Pause von der Hardware und führte mich in Assembler-Code ein. Ich wollte schon immer eine Assembler-Sprache lernen, aber ich habe mich nie dazu durchringen können. Hier konnte ich nicht nur eine (wenn auch einfache) Assemblersprache lernen, sondern sie auch verstehen.

Die Assemblersprache, die in diesem Kurs verwendet wird, heißt Hack und ist zwar einfach, aber sehr leistungsfähig. Mit ihrer Syntax ist es möglich, Schleifen zu erstellen, Werte zu vergleichen und zu anderen Teilen des Codes zu springen.

Um zum Beispiel den Wert 17 im ersten Speicherregister zu speichern, würden Sie schreiben:

@17
D=A
@M=D
Diagramm, das zeigt, wie Werte zwischen Registern verschoben werden

Was dieser Code tut, ist:

  1. Setzen Sie das Adressregister(A) auf 17. Dieses Register dient zwei Zwecken: dem Zugriff auf Speicheradressen und dem Setzen von unmittelbaren (literalen) Werten.
  2. Verschieben Sie diesen Wert in das Datenregister(D).
  3. Nachdem der Wert sicher gespeichert ist, konzentriere ich mich auf das erste (0.) Speicherregister. Dazu setze ich das Register A auf 0. Das Speicherregister(M) zeigt nun auf den Speicherplatz 0.
  4. Indem ich M=D einstelle, lege ich den Wert 17 im Speicherregister 0 ab.

Im Grunde habe ich einen Befehl wie den folgenden Pseudocode ausgeführt. Ich musste nur jeden einzelnen Schritt des Vorgangs codieren.

M[0] = 17

Genau das tut jede CPU Milliarden Mal pro Sekunde. Trotz mehr Registern und Cache mischen moderne CPUs im Wesentlichen Werte und führen grundlegende Elemente größerer Berechnungen aus.

Binär

Was ich in diesem Abschnitt gelernt habe, ist, wie die einzelnen Binärbefehle den Computer steuern. Die folgenden binären Zeichenfolgen setzen das A-Register auf 18 (den Speicherplatz der Zielanweisung). Sie weisen dann die CPU an, das D-Register mit dem Wert 0 zu vergleichen. Wenn D gleich 0 ist, springt er zu dieser Stelle im Speicher.

0000000000010010  // @18
1110001100000010  // D;JEQ

Verrücktes Zeug. Ich konnte jetzt Binärdateien lesen. Ich verstand, warum Assembler nicht zwischen CPUs portierbar ist. Dies ist ein buchstäblicher (und benutzerdefinierter) Befehlssatz für diese spezielle CPU.

Matrix Meme: Neo in einem Stuhl, der sagt: "Ich kann binär lesen".

Computer Architektur

Nach diesem kurzen Abstecher ging es wieder an die Hardware. Im vorletzten Abschnitt habe ich die gesamte Hardware, die ich erstellt hatte, zu einem funktionierenden Computer zusammengesetzt. Dazu musste ich eine Reihe von Chips und Registern sowie die ALU zur CPU zusammensetzen. Diese wurden dann mit dem Speicher kombiniert, um das Programm und seine laufenden Werte zu speichern. Darüber hinaus wurde ein Bildschirm hinzugefügt. Interessanterweise ist ein Bildschirm im Grunde auch ein Speicher. Dieser Bildschirm ist schwarz-weiß, wobei 0 für ein schwarzes Pixel und 1 für ein weißes Pixel steht. Die Tastatur ist ebenfalls ein Speichergerät, allerdings ein Nur-Lese-Gerät.

Schaltplan einer Nand2Tetris CPU
Viola! Eine funktionierende CPU

Damit hatte ich einen vollständig funktionierenden Computer mit einer CPU, deren Funktionsweise ich in meinem Kopf behalten konnte. Ich konnte nun binäre Anweisungen auf ein Blatt Papier schreiben und die CPU in meinem Kopf 'laufen lassen'.

Gedankenexplosives Meme mit dem Spruch "Ich kann eine CPU in meinem Kopf emulieren".

Assembler

Im letzten Abschnitt ging es um die Software. Hier kamen meine Programmierkenntnisse ins Spiel. Ich schrieb einen Assembler in Python, der die Hack-Assemblersprache in die von der CPU verwendete Binärsprache umwandelte.

Zu diesem Zeitpunkt konnte ich (fast) jedes Programm in der Assemblersprache schreiben. Außerdem konnte ich, wenn ich wollte, die Sprache erweitern und neue Kurzbefehle im Assemblercode erstellen. Alles, was ich tun musste, war, eine neue 'Abkürzungsanweisung' zu erfinden und die erforderliche Folge von Binärzeilen zu erzeugen.

Fazit

Und das war's: Ich hatte den Kurs abgeschlossen und konnte das Zertifikat vorzeigen. War es das wert? Unbedingt. Ich hatte die Einblicke und Perspektiven in die Computerhardware gewonnen, die ich mir seit Jahren gewünscht hatte.

Der Kurs ist gut strukturiert. Es werden jeweils ein paar Konzepte vorgestellt, und jeder Abschnitt wird im nächsten Abschnitt vertieft. Ich bin kein 'Hardware'-Anwender, aber ich fand, dass ich mir die Konzepte gut merken konnte.

Ich wollte diesen Kurs schon seit ein paar Jahren machen und bin jetzt so froh, dass ich es getan habe. Die Reise war wirklich fesselnd und kein trockener Kurs, der von leidenschaftslosen Dozenten gehalten wurde. Ich bin jetzt auf halbem Wege durch die zweite Hälfte des Kurses, in der es um die Software geht. Ich werde darüber schreiben, wenn ich ihn beendet habe.

Wenn ich Ihr Interesse geweckt habe, ermutige ich Sie, es zu versuchen. Vielleicht brauchen Sie, wie ich, ein paar Anläufe, aber es ist es wert.

Frohes Nanding!

Verfasst von

Jeffrey Zaayman

Contact

Let’s discuss how we can support your journey.