Wie rechnet eine Maschine?
Man braucht nur einen Erstklässler zu betrachten: sofort wird klar, wie der Mensch zum Rechnen kam: zwei Finger, drei dazu, rasch abgezählt und schon ist klar: 2+3=5! Auch beweist das Beispiel, dass rechnen Mühe bereitet.
Ein alter Menschheitstraum war es, sich von dieser Mühe zu befreien: man baue eine rechnende Maschine. Viele Generationen lang war dies nicht möglich. Wir haben das Glück in einer Zeit zu leben, in der Rechenmaschinen - Computer - allgegenwärtig sind. Oft sogar versteckt in Waschmaschinen und Heizungsventilen und allerlei anderem Gerät.
Wir haben uns so an Computer gewöhnt, dass wir sie schon für selbstverständlich halten. Ein Leben ohne sie können wir uns kaum noch vorstellen. Die Wenigsten überlegen heute, wie ein Computer rechnet.
Er kann es halt. Ich möchte heute diese liebgewonnene Sicht verlassen
und mich auf einen etwas beschwerlichen Weg begeben. Ich möchte Ihnen
zeigen, wie eine Maschine rechnet. Dabei wird sich der eine oder andere
Ausflug in die Theorie nicht ganz vermeiden lassen. Auch werde ich
Einiges als gegeben voraussetzen müssen, weil der Ausflug sonst gar zu
lange dauern würde. Und letztlich kann ich die Funktion nur an einem
simplen Beispiel aufzeigen. Als Motivation möchte ich Ihnen aber
folgendes mitgeben: wer einmal verstanden hat, wie ein Rechner rechnet,
versteht auch viele der aktuellen Diskussionen rund um die
Computertechnik viel besser. In der Tat hatte ich mich sogar bemüht,
diesen Artikel zu vermeiden. Es stellte sich aber als schlichtweg
unmöglich heraus. Das Wissen um die Grundlagen ist essentiell für
korrektes Verständnis der "großen Probleme". In diesem Sinne hoffe ich
auf Ihre Ausdauer und ihre Geduld. Es lohnt sich. Versprochen.
Wie also rechnet ein Computer? Ignorieren wir
einmal für einen Moment die moderne Computertechnik, die Millionen und
Abermillionen von Bauteilen auf die Größe eines Fingernagels packt.
Denken wir uns zurück in die Welt der ersten, gebäudefüllenden,
Rechner. Dort konnte man die einzelnen Bauteile noch
anpacken. Basis jeden Rechners sind Bauteile, die Ströme schalten
können - früher Röhren, heute Transistoren (in Miniatur-Form auf den
Chips). Diese Bauelemente ordnen den Strömen einen Wert "0" oder "1" zu.
Uns soll hier nicht interessieren, wo die konkreten Schwellwerte sind.
Zwei Dinge sind aber wichtig: um die Werte Null und Eins darzustellen,
muss ein bestimmter Strom fließen. Und für die eigentliche Verarbeitung
im Rechner werden lediglich diese zwei verschiedenen Werte betrachtet,
nicht mehr der Strom. Sie werden auch als "ein Bit" bezeichnet.
Die Bauelemente werden zu logischen Schaltungen kombiniert. Damit wird es möglich, Logik technisch abzubilden. Man kann zwei Werte beispielsweise mit "und"
verküpfen. Umgangssprachlich sagt man zum Beispiel "wenn es Wochenende
ist und die Sonne scheint, gehe ich zum Badesee". Um zum Badegenuss zu
gelangen, muss also offensichtlich sowohl Wochenende sein, als auch die
Sonne scheinen. An einem sonnigen Wochentag werde ich genau so wenig
zum See fahren, wie an einem bewölkten Wochenende. Und an einem
wolkenverhangenen Wochenendtag werde ich wohl erst recht daheim bleiben.
Wie drückt man das nun in der Sprache der Bauelemente aus?
Zunächst einmal wird jeder der Eingangsbedingungen (Wochenende und
Sonnenschein) ein Bit zugewiesen: Das Wochenend-Bit ist am Wochendende
"1", unter der Woche "0". Entsprechend wird das Sonnenschein-Bit auf
"1" gesetzt, wenn wir einen strahlenden Himmel haben und andernfalls
auf "0". Nun kann man technisch beides miteinander verknüpfen. Dazu
kann man eine Tabelle aufstellen:
| Wochenende? | Sonne? | Baden gehen? |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Wenn unter "Baden gehen" eine "1" steht (man sagt: "das Bit ist gesetzt"), dann machen wir uns auf den Weg zum See.
Eine solche Tabelle wird als Wahrheitswertetafel bezeichnet.
In ihr werden zwei Eingangswerte (Wochende und Sonne) zu einem
Ausgangswert ("Baden gehen?") verknüpft. Die Obige gibt an, wie die
logische Funktion "und" gebildet wird. In der Logik gibt es noch
weitere Funktionen. Eine für uns wichtige ist das sogenannten "exklusive oder"
(auch XOR genannt). Sie entspricht in etwa dem umgangssprachlichen
"entweder ... oder". Dabei ist der Ausgangswert "1", wenn einer der
beiden Eingangswerte "1" ist, nicht aber beide. Die Wahrheitswertetafel
von XOR sieht wie folgt aus:
| Eingang 1 | Eingang 2 | Ausgang |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Genug der Theorie. Ganz praktisch lassen sich elektronische Schaltungen bauen, die solche logischen Funktionen realisieren.
So kann man z.B. eine XOR-Schaltung bauen, die zwei Eingangssignale hat
und ein Ausgangssignal. Das Ausgangssignal richtet sich dabei nach den
Eingangswerten und wird gemäß obiger Wahrheitswertetafel geschaltet.
Ich habe Ihre Geduld sicher schon arg strapaziert. Jetzt aber kommen wir endlich zum Rechnen.
Um es nicht noch komplizierter zu machen, möchte ich eine einfache
Maschine bauen, die lediglich zwei einstellige Zahlen miteinander
addieren kann. Und um es "computer-einfach" zu machen, dürfen diese
beiden Zahlen auch jeweils nur die Werte 0 oder 1 haben. Kurz gesagt: unsere Maschine wird lediglich 0+0=0, 0+1=1, 1+0=1 und 1+1=2 rechnen können.
Das ist wenig. Geschickt kombiniert (und mit geeigneter
Zahlendarstellung) reicht es aber, um später mit sämtlichen Zahlen zu
rechnen.
Aber bleiben wir bei unserem simplen Rechner. Wer genau hinschaut, entdeckt bereits ein Problem: wir haben kein Bauteil, um den Wert "2" auszudrücken. Daher müssen wir uns behelfen. Wir werden die Zwei einfach durch ein weiteres Bit darstellen. Für die Ausgabe benötigen wir also zwei Bit:
einmal unser "Zweier" Bit, und dann noch das Bit für die Einerstelle.
Diese zwei Bits bedeuten folgendes: "00" ist null, "01" eins, "10" zwei
und, der Vollständigkeit halber, "11" für drei.
Wir benötigen folglich eine Schaltung für diese Wertetabelle:
| Zahl 1 | Zahl 2 | Ergebnis-Bit 2 | Ergebnis-Bit 1 |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 |
Dem aufmerksamen Leser fällt auf, dass die Wertetabelle für den Ausgang Bit "2" genau der "und" Verküpfung entspricht. Und Ausgang "Bit 1" entspricht
gerade der "XOR" Verknüpfung. Wir müssen also Bauelemente für die
entsprechenden Verknüpfungen lediglich in geeigneter Weise miteinander
verknüpfen. Die folgenden simple Grafik zeigt, wie das geht:
Oben sind die beiden zu addierenden Zahlen (Eingänge) aufgeführt, unten die Ausgänge für beide Bits. Die Kästchen dazwischen stellen die Bausteine für die entsprechenden logischen Verknüpfungen (Schaltungen) dar. Die Linien sind Leitungswege, farblich nur zwecks leichterer Lesbarkeit unterschieden. Wie man sieht, werden also die beiden Eingänge gleichzeitig in die beiden logischen Schaltungen geführt. Unabhängig voneinander "errechnen" diese dann ihren Ausgabewert. Jede Schaltung ist für genau ein Ausgabebit zuständig.
Die "und"-Schaltung ist also für Bit 2 zuständig, die "XOR"-Schaltung für Bit 1. Jede dieser Schaltungen realisiert also einen Teil der obigen Wertetabelle. Das eigentliche Rechnen geschieht nun so: an den Eingänge wird ein Strom, entsprechend des Wertes 1 oder 0, angelegt. Dieser Strom fließt über die entsprechenden Leitungen in die logischen Schaltungen. Dort wiederum bewirkt er ein Schalten der entsprechenden Transistoren, so dass auf der Ausgangsleitung wiederum ein Strom, gemäß des (der Verknüpfung entsprechenden) Wertes 0 oder 1, anliegt. Probieren Sie es in Gedanken einmal mit allen möglichen Eingaben durch. Sie werden feststellen: die Schaltung "errechnet" immer das korrekte Ergebnis. Wir haben also eine simplen Rechner für unsere Aufgabenstellung konstruiert.
Beim "Rechnen" sind zwei Beobachtungen wichtig: Erstens benötigt der Strom eine gewisse (minimale) Zeit zum Durchlaufen der Schaltung und zweitens verbrauchen die Schaltvorgänge (und nur die) in den heutigen logischen Bausteinen Strom. Der wird dabei Großteils in Wärme umgesetzt. Aus Beidem lässt sich übrigens folgern, dass mit heutiger Technologie weder kostenloses noch unendlich schnelles Rechnen möglich ist.
Natürlich sind die Möglichkeiten meines "Minimal-Rechners" arg begrenzt - wer will schließlich nur die Werte 0 und 1 addieren... Wenn man den gezeigten "Rechner" aber als Bauteil begreift, ist er durchaus nützlich. Geschickt kombiniert, kann man aus ihm Bausteine zur Addition beliebiger Ganzzahlen bauen. Ein realer Rechner nun ist nichts anderes als ein großes Puzzle solcher Komponenten. Einfachste Bauelemente werden zu immer komplexeren Baugruppen zusammen gestellt, bis sie letztlich einen komplexen Rechner realisieren. Man sollte sich aber stets daran erinnern, dass auch die komplexesten Komponenten letztlich aus den Grundbausteinen bestehen, und damit auch deren Restriktionen unterliegen. Dinge wie Stromverbrauch und Schaltzeiten betreffen natürlich auch ein Rechenwerk als Ganzes - und lassen sich auf oberer Ebene nicht ignorieren.
Meiner Meinung nach lassen sich viele Problemstellung nur dann wirklich verstehen, wenn man sich an die Vorgänge auf unterster Ebene erinnert. Und das, lieber Leser, war der Sinn dieses Artikel. Ich hoffe, es ist gelungen Ihnen ein grobes Verständnis davon zu vermitteln, wie eine Maschine rechnen kann. Ich habe viele Details auslassen und manches vereinfachen müssen. Dennoch hoffe ich, die Essenz der Basistechnologie getroffen zu haben. Aus diesem Verständnis heraus können wir uns nun aufmachen, künftig praktische Anwendungsfälle zu betrachten.
Foto Abakus: Copyright (C) Claudia Hautumm / Pixelio
Schemagrafik: Copyright (C) 2008 Rainer Gerhards



Ich finde es immer wieder erstaunlich, dass jedes scheinbar noch so komplizierte System letztlich auf relativ einfachen Grundbedingungen basiert.
Danke!
P.S.: Ich kann seit meiner Schulzeit mit den Fingern diese 0 und 1 - Technik simulieren und so mit der einen Hand bis 32 zählen... Aber ich habe nie gewusst, wofür das eigentlich gut ist.
Jetzt weiß ich es :-)
Video eines 4 Bit Addierwerkes auf der Basis von Glasmurmeln:
http://www.youtube.com/watch?v=wIKah9aVlm4
Die Breite der Kugelbahnen beträgt 2 cm.
Was ich auch sehr schön finde, ist diese Form der UND-Funktion:
AND = NOT( NOT(A) OR NOT(B) OR NOT(C) )
Nur wenn alle Eingänge auf 1 sind, kann der innere Zustand auf 0 sein.
Dieser innere Zustand wird dann noch einmal umgekehrt, also von 0 auf 1.
0 0 0 ... 1 1 1 ... 1 ... 0
0 0 1 ... 1 1 0 ... 1 ... 0
0 1 0 ... 1 0 1 ... 1 ... 0
0 1 1 ... 1 0 0 ... 1 ... 0
1 0 0 ... 0 1 1 ... 1 ... 0
1 0 1 ... 0 1 0 ... 1 ... 0
1 1 0 ... 0 0 1 ... 1 ... 0
1 1 1 ... 0 0 0 ... 0 ... 1