Architektur nach von Neumann
Der Rechner besteht aus Funktionseinheiten
- ALU (Arithmetic Control Unit)
Rechenwerk - Control Unit
Steuer- / Leitwerk - Memory
Speicherwerk - I/O Unit
Ein- / Ausgabewerk

Die Struktur ist unabhängig vom zu bearbeitenden Problem. Der Computer ist speicherprogrammierbar, wobei Daten und Programmcode im selben Speicher liegen.
Die Befehle werden standardmäßig sequentiell ausgeführt, Änderungen im Kontrollfluss werden über (un-)bedingte Sprünge realisiert.
Befehle und Operanden sind durch Binärcodes repräsentiert, die einzelnen Bytes enthalten keine Angaben über den Typ ihres codierten Inhalts.
Sicherheit
Anweisungen, Daten und Zwischenergebnisse liegen im selben Speicher, Eingabedaten können nicht unbedingt vom Programmcode unterschieden werden
a')´ drop table --Versucht die Trennung zu umgehen
Der streng sequentielle Ablauf ist entscheidender Vorteil dieser Architektur, da deterministische Programmabläufe leichter zu programmieren sind. Race-Conditions sind durch Verwendung eines einzelnen Datenbus ausgeschlossen.
Harvard Architektur

Schaltungskonzept um besonders schnelle Prozessoren zu realisieren.
Daten und Steuerung werden strikt getrennt und auf separaten Leitungen übertragen.
Vorteile gegenüber von Neumann Architektur
- Gleichzeitiges Lesen und Schreiben von Daten
- Einfache Zugriffsrechtesteuerung und Speicherschutz
Durch die parallelisierte Natur des Systems entstehen die Probleme der Parallelisierung auf Rechnerebene. Es gibt keine Garantie für einen deterministischen Ablauf oder eine einfache Vermeidung von Race-Conditions.
Programmiermodelle
- Desktop -> Viel Integer / Floating Point
- Server -> Integer / Strings
- Embedded -> Codegröße & Stromverbrauch
Prinzipien des Entwurfs eines Rechners
Make The Common Case Fast
Die Performance eines Systems lässt sich am besten optimieren indem häufige Prozesse perfektioniert werden. Ihnen sollen priorisiert Ressourcen und Entwurfszeit zugeordnet werden.
Zusätzlich sind häufige Fälle meist simpler als Ausnahmen, was auch ihre Implementierung erleichtert
Amdahls Law beschreibt die Mathematik hinter Optimierung von Teilsystemen und deren Einfluss auf das Gesamte.
An diesem Beispiel wird gezeigt dass der etwas schnellere Common Case einen deutlich größeren Einfluss hat als die sehr starke Beschleunigung einer selteneren Operation.
- Simplicity favors Regularity
- Smaller is faster
- Make the common Case fast
- Good design demands compromises
Registerarchitekuren
Es werden verschieden Architekturen für Register und Datenfluss zur CPU verwendet. In jedem dieser Beispiele werden die notwendigen Assembler-Befehle gezeigt um die Berechnung durchzuführen.
Praktisch alle neu entwickelten RISC Prozessoren verwenden die Load-Store Variante.
Die dort verbauten Universalregister sind sehr schnell verfügbar (Zugriffe ).
Auch können Compiler diese Register sehr effizient ausnutzen. Beispielsweise können die Reihenfolgen einiger Operatoren getauscht werden, was bei der Stack-Architektur nicht möglich ist.
Stack-Architektur: Invers Polish Notation

Folge von Befehlen werden auf Stack gespeichert oder verrechnen die letzten Werte im Stack
In klassischer Infix-Notation wird zu
So entfällt der Bedarf für Klammern
Codesequenz
Die beiden zu verrechnenden Werte werden auf den Stack gespeichert, verrechnet und das Ergebnis wird wieder vom Stack entfernt.
Push A
Push B
Add
Pop C
Akkumulator Architektur

Ergebnisse werden immer in Register gelagert, so ist wie bei einem Taschenrechner eine weitere Berechnung mit dem vorherigen Ergebnis möglich.
Codesequenz
Load A
Add B
Store C
Registerarchitektur

Es werden mehrere Universalregister verwendet.
Beispielsweise x86 arbeitet nach diesem Prinzip.
Codesequenz
Wert wird im ersten Register gespeichert, dann wird der Inhalt des ersten Registers mit der Variable addiert und das Ergebnis in Register gespeichert. Schließlich wird der Variable C im Speicher der Wert aus dem dritten Register zugewiesen.
Load R1, A
Add R3, R1, B
Store R3, C
Registerarchitektur Load-Store

Ähnlich wie die Registerarchitektur, jedoch ohne Speicheroperanden. Jeder Zugriff auf den Speicher erfolgt über einen dedizierten load oder store Befehl.
Diese Architektur ist die typische RISC Architektur.
Codesequenz
Die beiden Variablen werden in unterschiedliche Register geladen. Diese beiden Register werden addiert und das Ergebnis in einem dritten Register gespeichert.
Abschließend wird der Wert aus dem Register in den Speicher geschrieben.
Load R1, A
Load R2, B
Add R3, R1, R2
Store R3, C