Read in English · Leer en español · Lire en français
Abschnitt 0.1 von 0.8 · Einsteiger · 15 Min. Lesezeit
Programme, Code und wie ein Computer sie ausführt
Videolektion
4 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Willkommen bei Be Software Architecture Wise. In dieser ersten Lektion beginnen wir ganz am Anfang: was Software ist und was wirklich geschieht, wenn ein Computer ein Programm ausführt. Sie brauchen keinerlei technisches Vorwissen. Am Ende kennen Sie die Handvoll Ideen, auf denen jedes spätere Kapitel aufbaut.
Beginnen wir mit zwei Wörtern, die Sie ständig hören werden. Hardware ist die physische Maschine: der Prozessor, der Arbeitsspeicher, der Massenspeicher und die Netzwerkkarte. Software ist die Gesamtheit der Anweisungen und Daten, die dieser Hardware sagen, was sie tun soll. Ein nützliches Bild ist eine Restaurantküche. Der Koch ist der Prozessor, und die Software sind die Rezepte, denen der Koch folgt.
Ein Programm ist eine Liste präziser Anweisungen, und der Computer befolgt sie exakt, Wort für Wort. Er errät nie, was Sie gemeint haben. Deshalb werden Fehler in den Anweisungen zu Bugs. Der Computer ist nicht schwierig; er tut genau das, was ihm gesagt wurde. Programmierer schreiben diese Anweisungen als Quellcode, in Sprachen wie Python, Java oder Go, die Menschen lesen und ändern können.
Aber der Prozessor kann weder Python noch Java lesen. Seine eigene Sprache ist Maschinencode: sehr einfache Anweisungen, spezifisch für einen Prozessortyp. Also muss Quellcode übersetzt werden. Es gibt zwei Hauptwege. Auf dem ersten Weg übersetzt ein Compiler das gesamte Programm in Maschinencode, bevor es veröffentlicht wird. Sprachen wie C, Rust und Go funktionieren so. Auf dem zweiten Weg wird der Code in eine Zwischenform namens Bytecode kompiliert, und ein Programm namens virtuelle Maschine führt ihn aus und übersetzt dabei viel genutzte Teile in Maschinencode. Java, Python und C Sharp funktionieren so.
Zwischen Ihren Programmen und der Hardware sitzt das Betriebssystem, etwa Windows, macOS, Linux oder Android. Anwendungen wie ein Webbrowser oder eine Essensliefer-App greifen nicht direkt auf die Hardware zu. Sie fordern beim Betriebssystem an, was sie brauchen, und zwar über sogenannte Systemaufrufe. Das Betriebssystem teilt den Prozessor, den Arbeitsspeicher, die Dateien und das Netzwerk unter allen laufenden Programmen auf und verhindert, dass sie sich gegenseitig stören. In unserer Küche ist es die Küchenleitung, die entscheidet, welches Rezept die Aufmerksamkeit des Kochs bekommt.
Wenn ein Programm läuft, erzeugt das Betriebssystem dafür einen Prozess mit eigenem privatem Speicher. Innerhalb eines Prozesses kann es mehrere Threads geben, die jeweils gleichzeitig einen Teil der Arbeit erledigen. Threads teilen sich den Speicher des Prozesses. Das ist nützlich, aber wenn zwei Threads gleichzeitig dieselben Daten ändern, entstehen einige der am schwersten zu findenden Bugs. Und beachten Sie den Unterschied zwischen Arbeitsspeicher und Festplatte. Der Arbeitsspeicher, also der RAM, ist schnell, wird aber gelöscht, wenn das Programm endet oder der Rechner neu startet. Alles, was nicht verloren gehen darf, muss in einem dauerhaften Speicher abgelegt werden, meist einer Datenbank.
Fügen wir das mit einem winzigen Programm zusammen, das den Preis einer Bestellung berechnet. Wenn Sie es starten, erzeugt das Betriebssystem einen Prozess und startet darin den Python-Interpreter. Der Interpreter liest die Datei und wandelt sie in Bytecode um. Gibt es einen Tippfehler, etwa eine fehlende Klammer, wird er jetzt gemeldet, bevor irgendetwas läuft. Das Programm fragt Sie, wie viele Artikel Sie möchten, und wartet. Während es wartet, verbraucht es überhaupt keine Prozessorzeit. Dann die Berechnung: drei Artikel zu zwölf Pfund fünfzig ergeben siebenunddreißig Pfund fünfzig, und mit zwanzig Prozent Mehrwertsteuer ergibt das fünfundvierzig Pfund. Schließlich wird das Ergebnis ausgegeben, und der Prozess endet. Sein Speicher wird zurückgegeben, und weil nichts auf die Festplatte gespeichert wurde, ist die Antwort weg.
Warum ist das für Softwarearchitektur wichtig? Weil jedes System, das Sie entwerfen werden, wie groß es auch ist, aus Programmen besteht, die als Prozesse auf gemeinsam genutzter Hardware laufen. Entscheidungen darüber, was im Arbeitsspeicher liegt und was dauerhaft gespeichert werden muss, tauchen in jedem Kapitel immer wieder auf. Und weil vieles gleichzeitig läuft und Rechner neu starten, müssen Architekten von Anfang an Nebenläufigkeit und Ausfälle einplanen.
Das ist das Fundament. Der vollständige Abschnitt enthält das komplette Codebeispiel und mehr zum Betriebssystem und zu Bugs. Als Nächstes sehen wir uns in Abschnitt null Punkt zwei an, wie Programme Daten organisieren. Bis gleich.
Was Sie wissen müssen
- Hardware ist die physische Maschine (CPU, RAM, Massenspeicher, Netzwerkkarte); Software ist die Gesamtheit der Anweisungen und Daten, die ihr sagen, was sie tun soll.
- Ein Programm ist eine Liste präziser Anweisungen; der Computer tut genau, was dort steht, daher werden Fehler in den Anweisungen zu Bugs.
- Programmierer schreiben Quellcode in Hochsprachen, den Compiler, Interpreter oder Bytecode-VMs in Maschinencode übersetzen, den die CPU ausführen kann.
- Das Betriebssystem teilt CPU, Arbeitsspeicher, Dateien und Netzwerk unter den Programmen auf und setzt die Sicherheit durch; Programme fordern seine Dienste über Systemaufrufe an.
- Ein laufendes Programm ist ein Prozess mit eigenem Speicher; Threads innerhalb eines Prozesses teilen sich diesen Speicher, was nützlich ist, aber Nebenläufigkeitsfehler verursachen kann.
- RAM ist schnell, verliert seinen Inhalt aber beim Neustart; alles, was nicht verloren gehen darf, muss in einen dauerhaften Speicher geschrieben werden, meist eine Datenbank.
Hardware und Software
Ein Computer ist eine Maschine, die Anweisungen sehr schnell befolgt. Die physischen Teile, die man anfassen könnte, sind die Hardware; die Anweisungen, die diesen Teilen sagen, was sie tun sollen, sind die Software. Ein Laptop, ein Smartphone, der Server, auf dem die Website Ihrer Bank läuft, und der Chip in einem smarten Thermostat sind allesamt Computer, gebaut aus denselben vier Arten von Teilen.
Die CPU (Central Processing Unit, also der Prozessor) führt Anweisungen aus. Ein moderner Prozessor hat mehrere Kerne, von denen jeder seinen eigenen Strom von Anweisungen abarbeiten kann, und jeder Kern führt Milliarden einfacher Schritte pro Sekunde aus. Der RAM (Random Access Memory, meist einfach Arbeitsspeicher genannt) enthält die Anweisungen und Daten, an denen die CPU gerade arbeitet. Er ist schnell, aber flüchtig: Schaltet man den Strom ab, ist sein Inhalt verschwunden. Der Massenspeicher (ein Solid-State-Laufwerk oder eine sich drehende Festplatte) behält Dateien auch ohne Strom, ist aber viel langsamer erreichbar. Eine Netzwerkkarte (kabelgebunden oder WLAN) sendet Daten an andere Computer und empfängt Daten von ihnen.
Denken Sie an eine Restaurantküche. Der Koch ist die CPU: der Einzige, der tatsächlich kocht. Die Arbeitsfläche ist der RAM: Alles, was der Koch in diesem Moment benutzt, liegt dort griffbereit, wird aber am Ende des Abends abgeräumt. Vorratskammer und Gefriertruhe sind der Massenspeicher: groß, dauerhaft und ein paar Schritte entfernt. Die Durchreiche zum Gastraum ist die Netzwerkkarte, durch die Bestellungen hereinkommen und Gerichte hinausgehen. Die Rezepte sind die Software.
Die vier Teile, die jeder Computer hat
| Teil | Was er tut | Küchenanalogie | Was passiert, wenn er der Engpass ist |
|---|---|---|---|
| CPU (Prozessor) | Führt Anweisungen aus: Rechnen, Vergleichen, Daten verschieben | Der Koch | Arbeit staut sich; Seiten und Berichte werden langsam, obwohl Arbeitsspeicher frei ist |
| RAM (Arbeitsspeicher) | Enthält laufende Programme und die Daten, die sie nutzen | Die Arbeitsfläche | Das System beginnt, Daten auf die Festplatte auszulagern, und wird drastisch langsamer, oder Programme werden beendet |
| Massenspeicher (SSD oder Festplatte) | Bewahrt Dateien und Datenbanken dauerhaft auf | Vorratskammer und Gefriertruhe | Speichern und Laden von Daten wird langsam; eine volle Festplatte kann eine Datenbank stoppen |
| Netzwerkkarte | Sendet Daten an andere Rechner und empfängt Daten von ihnen | Die Durchreiche zum Gastraum | Anfragen warten darauf, gesendet oder empfangen zu werden; Nutzer bemerken Verzögerungen |
Was ein Programm ist
Ein Programm ist eine Liste präziser Anweisungen, denen ein Computer folgt, um eine Aufgabe zu erledigen: eine Rechnung berechnen, eine Webseite anzeigen, eine Zahlung senden. Das entscheidende Wort ist präzise. Ein menschlicher Koch kommt mit „nach Geschmack salzen“ zurecht; ein Computer nicht. Er tut genau das, was ihm gesagt wird, in genau der angegebenen Reihenfolge, und nichts darüber hinaus. Wenn eine Anweisung verlangt, durch eine Zahl zu teilen, die sich als null herausstellt, zuckt der Computer nicht mit den Schultern und macht weiter: Das Programm bricht mit einem Fehler ab, es sei denn, der Programmierer hat weitere Anweisungen geschrieben, was in diesem Fall zu tun ist.
Auf der untersten Ebene wiederholt die CPU einen einzigen Zyklus, solange sie eingeschaltet ist: die nächste Anweisung aus dem Speicher holen, entschlüsseln, was sie bedeutet, sie ausführen und zur nächsten übergehen. Jede Anweisung ist winzig: zwei Zahlen addieren, zwei Werte vergleichen, einen Wert von einer Stelle im Speicher an eine andere kopieren, zu einer anderen Anweisung springen, wenn ein Vergleich wahr war. Alles, was ein Computer tut, vom Abspielen eines Films bis zum Training eines KI-Modells, besteht aus Milliarden dieser kleinen Schritte.
Software ist der weitere Begriff: Programme zusammen mit den Daten, der Konfiguration und der Dokumentation, die sie brauchen. Eine Anwendung (oder App) ist Software, die für einen Menschen etwas Nützliches tut, etwa eine Banking-App. Systemsoftware, etwa das unten beschriebene Betriebssystem, existiert vor allem, um andere Software auszuführen.
Schichten: Anwendungen, das Betriebssystem und die Hardware
Quellcode und Programmiersprachen
CPUs verstehen nur Maschinencode: als Zahlen codierte Anweisungen, die für eine Prozessorfamilie spezifisch sind. Intel- und AMD-Chips in den meisten Laptops und Servern verwenden eine Familie (x86-64); die Chips in Smartphones, neueren Macs und vielen Cloud-Servern eine andere (Arm). Maschinencode, der auf der einen läuft, läuft nicht auf der anderen. Maschinencode von Hand zu schreiben ist langsam, fehleranfällig und kommt heute fast nie vor.
Stattdessen schreiben Menschen Quellcode in einer Programmiersprache: einer genau definierten Notation, die sich teils wie Englisch und teils wie Mathematik liest. Python, JavaScript, Java, C#, Go, Rust und C sind weit verbreitete Beispiele. Man nennt sie Hochsprachen, weil Programmierer damit „addiere die Preise in diesem Warenkorb“ in ein oder zwei Zeilen statt in Dutzenden Maschinenbefehlen ausdrücken können und weil sie Details der jeweiligen CPU verbergen. Quellcode ist reiner Text, in Dateien gespeichert, und er ist das, was Programmierer lesen, schreiben, prüfen und in der Versionskontrolle ablegen (einem System, das eine Historie jeder Änderung führt; mehr dazu im letzten Abschnitt dieses Kapitels).
Sprachen unterscheiden sich darin, was sie leicht machen. Python wird für seine Lesbarkeit geschätzt und dominiert in Data Science und KI-Arbeit; JavaScript ist die Sprache, die jeder Webbrowser ausführt; Java und C# sind in großen Geschäftssystemen verbreitet; Go ist für Netzwerkdienste beliebt; C und Rust kommen dort zum Einsatz, wo jede Mikrosekunde und jedes Byte zählt, etwa in Betriebssystemen und Datenbanken. Keine Sprache ist in allem die beste, und die Wahl ist teils eine technische Entscheidung, teils eine Frage, welche Fähigkeiten ein Team mitbringt.
Vom Quellcode zum laufenden Programm: Compiler, Interpreter und virtuelle Maschinen
Quellcode muss in etwas umgewandelt werden, das die CPU ausführen kann. Es gibt drei grundlegende Ansätze, und reale Sprachen kombinieren sie oft.
Ein Compiler ist ein Programm, das den gesamten Quellcode eines Programms vor der Ausführung in eine andere Form übersetzt. Sprachen wie C, C++, Rust und Go werden meist vorab (ahead of time) in Maschinencode für eine bestimmte CPU und ein bestimmtes Betriebssystem kompiliert. Das Ergebnis ist eine ausführbare Datei, die schnell startet und schnell läuft, aber Sie müssen für jede Art von Rechner, die Sie unterstützen wollen, eine eigene Version kompilieren, und der Compiler weist das Programm zurück, wenn er bestimmte Arten von Fehlern findet.
Ein Interpreter ist ein Programm, das Quellcode (oder etwas sehr Ähnliches) liest und dessen Anweisungen gleich beim Lesen ausführt, Schritt für Schritt. Interpretation macht es leicht, Dinge auszuprobieren und dasselbe Programm auf jedem Rechner auszuführen, auf dem der Interpreter vorhanden ist, auf Kosten der Geschwindigkeit.
Viele populäre Sprachen liegen dazwischen. Java-Quellcode wird von einem Werkzeug namens javac in Bytecode kompiliert: kompakte Anweisungen für einen gedachten, idealisierten Computer statt für eine reale CPU. Die Java Virtual Machine (JVM) führt diesen Bytecode dann auf dem realen Rechner aus, auf dem sie installiert ist; so läuft ein Java-Programm unverändert unter Windows, macOS und Linux. Die JVM beobachtet, welche Teile des Programms am häufigsten laufen, und kompiliert diese Teile während der Laufzeit in Maschinencode, eine Technik namens Just-in-time-Kompilierung (JIT). C# auf .NET funktioniert ähnlich. Auch die Standardimplementierung von Python, CPython, kompiliert Ihre .py-Dateien zu Bytecode (wobei der Bytecode importierter Module in .pyc-Dateien zwischengespeichert wird) und führt diesen Bytecode dann in ihrer eigenen Interpreterschleife aus.
Zwei Wege vom Quellcode zur CPU
Die Ansätze im Vergleich
| Ansatz | Typische Sprachen | Stärken | Kosten |
|---|---|---|---|
| Vorab-Kompilierung in Maschinencode | C, C++, Rust, Go | Schneller Start und schnelle Ausführung; eine eigenständige Datei zum Deployen | Eigene Version je CPU und Betriebssystem bauen; langsamerer Zyklus aus Ändern und Ausprobieren |
| Bytecode plus virtuelle Maschine mit JIT | Java, Kotlin, C# | Ein Build läuft auf vielen Plattformen; JIT kann lang laufende Services sehr schnell machen | Die Laufzeitumgebung muss installiert sein; langsamerer Start und zusätzlicher Speicher, während der JIT warmläuft |
| Bytecode plus Interpreter | Python (CPython), Ruby | Schnell geschrieben und ausprobiert; sehr portabel | Bei aufwendigen Berechnungen meist langsamer; geschwindigkeitskritische Teile werden oft in C geschrieben und aus Python aufgerufen |
| JIT-kompiliert im Browser oder auf dem Server | JavaScript (V8 in Chrome und Node.js) | Läuft überall, wo ein Browser läuft; schnell genug für die meisten Webaufgaben | Die Performance kann weniger vorhersehbar sein als bei kompiliertem Code |
Die Aufgabe des Betriebssystems
Wenn Sie einen Computer einschalten, ist das erste größere Programm, das startet, das Betriebssystem (Operating System, OS): Windows, macOS, Linux, Android oder iOS. Die meisten Server im Internet laufen unter Linux. Das Betriebssystem hat vier Hauptaufgaben.
Erstens teilt es die CPU auf. Auf einem Laptop laufen vielleicht ein paar Dutzend Programme, aber es gibt nur eine Handvoll Kerne, also schaltet das OS jeden Kern viele Male pro Sekunde zwischen Programmen um, so schnell, dass sie alle gleichzeitig zu laufen scheinen. Zweitens verwaltet es den Arbeitsspeicher: Es gibt jedem Programm einen eigenen Bereich und hindert ein Programm daran, den Bereich eines anderen zu lesen oder zu überschreiben. Drittens stellt es Dateien und Geräte bereit: Programme bitten das OS, eine Datei zu öffnen, etwas auf dem Bildschirm darzustellen oder Daten über das Netzwerk zu senden, und das OS kümmert sich über kleine Programme namens Treiber um die jeweilige Hardware. Viertens setzt es die Sicherheit durch: Benutzer, Berechtigungen und die Regel, dass eine App Ihre Fotos nicht lesen darf, solange Sie es nicht erlauben.
Programme stellen diese Anfragen über Systemaufrufe, eine feste Menge von Diensten, die das OS anbietet. Das ist das erste Beispiel in diesem Kurs für eine wichtige Architekturidee: eine Schicht, die unübersichtliche Details hinter einer stabilen Menge von Anfragen verbirgt. Wer eine Essensliefer-App schreibt, muss nicht wissen, welche Marke von Netzwerkchip das Smartphone hat.
Prozesse, Threads, Arbeitsspeicher und Festplatte
Eine Programmdatei auf der Festplatte ist nur eine Sammlung gespeicherter Anweisungen. Wenn Sie sie starten, erzeugt das OS einen Prozess: eine laufende Instanz des Programms mit eigenem privatem Speicher, eigener Identität und eigenem Anteil an CPU-Zeit. Öffnen Sie zwei Browserfenster, haben Sie möglicherweise mehrere Prozesse; starten Sie einen Webserver, läuft er vielleicht als ein Prozess oder als viele.
Innerhalb eines Prozesses kann es mehrere Threads geben. Ein Thread ist eine Abfolge von Anweisungen, die gerade ausgeführt wird. Ein Prozess mit mehreren Threads kann mehrere Dinge gleichzeitig tun, etwa die Anfragen zweier Kunden zur selben Zeit bearbeiten, und alle seine Threads teilen sich den Speicher des Prozesses. Diese gemeinsame Nutzung ist bequem, aber riskant: Wenn zwei Threads dasselbe Datenelement im selben Moment ohne Abstimmung ändern, kann das Ergebnis auf eine Weise falsch sein, die nur gelegentlich auftritt. Solche Nebenläufigkeitsfehler gehören zu den am schwersten zu findenden, und das ist ein Grund, warum viele Systeme getrennte Prozesse bevorzugen oder Entwürfe, in denen jede Anfrage unabhängig bearbeitet wird.
Der Unterschied zwischen Arbeitsspeicher und Festplatte erklärt einen großen Teil des Softwaredesigns. Daten im RAM sind schnell erreichbar, in etwa einer Zehntelmikrosekunde, verschwinden aber, wenn der Prozess endet oder abstürzt oder der Rechner neu startet. Daten auf der Festplatte bleiben erhalten, aber der Zugriff dauert viel länger: Dutzende Mikrosekunden oder mehr auf einem Solid-State-Laufwerk und mehrere Millisekunden auf einer sich drehenden Festplatte. Deshalb muss jede Information, die nicht verloren gehen darf, etwa eine Bestellung oder eine Zahlung, in einen dauerhaften Speicher geschrieben werden, meist über eine Datenbank, bevor das System dem Kunden „erledigt“ meldet.
Ein Prozess, seine Threads, sein Speicher und die Festplatte
PRICE_PER_ITEM = 12.50 # pounds
VAT_RATE = 0.20 # 20 per cent
def total_with_vat(quantity):
subtotal = quantity * PRICE_PER_ITEM
return subtotal * (1 + VAT_RATE)
quantity = int(input("How many items? "))
print("Total to pay:", round(total_with_vat(quantity), 2))Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: was geschieht, wenn das Programm läuft
Angenommen, der obige Code ist als order.py gespeichert, Sie tippen python order.py ein und geben dann 3 ein.
| 1. Start | Das Betriebssystem erzeugt einen neuen Prozess, gibt ihm Speicher und startet darin den Python-Interpreter (selbst ein kompiliertes Programm). |
|---|---|
| 2. Kompilieren | CPython liest order.py von der Festplatte, prüft, ob es gültiges Python ist, und kompiliert es zu Bytecode. Eine fehlende Klammer oder ein fehlender Doppelpunkt würde hier als Syntaxfehler gemeldet, bevor irgendetwas läuft. |
| 3. Definieren | Der Interpreter führt den Bytecode von oben aus. Er legt 12,5 und 0,2 unter den Namen PRICE_PER_ITEM und VAT_RATE im Speicher ab und registriert die Funktion total_with_vat, ohne sie schon auszuführen. |
| 4. Eingabe | input() bittet das OS, von der Tastatur zu lesen. Der Prozess wartet, ohne CPU zu verbrauchen, bis Sie 3 eintippen und die Eingabetaste drücken. int() wandelt den Text „3“ in die Zahl 3 um. |
| 5. Berechnen | Die Funktion läuft: 3 mal 12,5 ergibt 37,5, dann 37,5 mal 1,2 ergibt 45,0. Jeder Schritt besteht aus einer Handvoll Bytecode-Anweisungen, von denen jede auf der CPU zu vielen Maschinenbefehlen wird. |
| 6. Ausgabe | print() bittet das OS, Total to pay: 45.0 auf dem Bildschirm anzuzeigen. |
| 7. Ende | Das Programm erreicht seine letzte Zeile, der Prozess endet, und das OS fordert seinen Speicher zurück. Nichts wurde auf die Festplatte gespeichert, also ist das Ergebnis weg, sofern Sie es nicht abgeschrieben haben. |
Selbst dieses neunzeilige Programm ist für Speicher, Tastatur und Bildschirm auf das Betriebssystem angewiesen und auf eine Laufzeitumgebung der Sprache, die es für die CPU übersetzt.
Hätten Sie three statt 3 eingetippt, würde int() mit einem Laufzeitfehler scheitern und das Programm abbrechen: Der Code hat nie festgelegt, was mit ungültigen Eingaben geschehen soll.
Das Programm speichert Geld der Kürze halber als Gleitkommazahl. Reale Finanzsysteme speichern ganze Pence oder verwenden einen Dezimaltyp, aus Gründen, die der nächste Abschnitt erklärt.
Bugs: wenn die Anweisungen falsch sind
Ein Bug ist ein Fehler in Software, der dazu führt, dass sie sich anders verhält als beabsichtigt. Weil Computer Anweisungen exakt befolgen, ist fast jeder Bug eine Lücke zwischen dem, was der Programmierer gemeint, und dem, was er tatsächlich geschrieben hat, oder eine Situation, an die niemand gedacht hat.
Es hilft, drei Arten zu unterscheiden. Ein Syntaxfehler verletzt die Grammatik der Sprache (eine fehlende Klammer), sodass der Compiler oder Interpreter das Programm gar nicht erst ausführt; solche Fehler fallen sofort auf. Ein Laufzeitfehler tritt auf, während das Programm läuft, etwa bei einer Division durch null oder beim Versuch, eine nicht vorhandene Datei zu lesen; das Programm bricht dann meist mit einer Fehlermeldung ab. Ein Logikfehler ist der gefährlichste: Das Programm läuft fröhlich weiter und liefert die falsche Antwort, berechnet zum Beispiel die Mehrwertsteuer doppelt. Nichts stürzt ab, daher decken ihn nur Tests, sorgfältige Reviews oder ein unzufriedener Kunde auf.
Professionelle Teams rechnen mit Bugs und bauen Schutzmechanismen ein: automatisierte Tests, Code-Reviews, schrittweise Releases und ein Monitoring, das bemerkt, wenn die Fehlerraten steigen. Viele dieser Schutzmechanismen sind architektonischer Natur, und sie tauchen im gesamten Kurs auf.
Warum das für die Architektur wichtig ist
Bei Architektur geht es um die großen Entscheidungen, die teuer zu ändern sind, und mehrere davon beruhen auf den Ideen dieses Abschnitts. Die Wahl von Sprache und Laufzeitumgebung beeinflusst Startzeit, Speicherverbrauch, welche Bibliotheken Sie nutzen können und wen Sie einstellen können. Die Trennung zwischen Arbeitsspeicher und Festplatte entscheidet, was dauerhaft gespeichert werden muss und wie sich ein System nach einem Absturz erholt. Prozesse und Threads sind die Einheiten, die laufen, ausfallen und skalieren: Ein späteres Kapitel fragt, ob ein System ein einziger Prozess oder viele zusammenarbeitende sein sollte. Und der geschichtete Aufbau des Betriebssystems, der die Hardware hinter einer stabilen Menge von Anfragen verbirgt, ist das erste Beispiel für ein Prinzip, dem Sie als Information Hiding wiederbegegnen werden.
Der nächste Abschnitt betrachtet, womit Programme eigentlich arbeiten: Daten und die Strukturen und Algorithmen, die die Arbeit damit schnell oder langsam machen.
Prüfen Sie Ihr Verständnis
Warum verschwinden die Daten eines Programms, wenn es abstürzt, sofern sie nicht gespeichert wurden?
Während ein Programm läuft, liegen seine Daten im RAM, der zum Prozess gehört und geleert wird, wenn der Prozess endet oder der Rechner neu startet. Nur Daten, die in einen Speicher wie eine Festplatte oder Datenbank geschrieben wurden, bleiben erhalten.
Was ist der Unterschied zwischen einem Compiler und einem Interpreter?
Ein Compiler übersetzt das gesamte Programm vor der Ausführung in eine andere Form (Maschinencode oder Bytecode); ein Interpreter führt die Anweisungen aus, während er sie liest. Viele Sprachen, etwa Java und Python, kompilieren zuerst zu Bytecode und führen diesen Bytecode dann in einer virtuellen Maschine aus.
Warum kann ein auf einem Windows-Laptop gebautes Java-Programm meist unverändert auf einem Linux-Server laufen?
Java wird zu Bytecode kompiliert, nicht zu Maschinencode für eine bestimmte CPU. Jeder Rechner, auf dem eine Java Virtual Machine installiert ist, kann diesen Bytecode ausführen.
Warum bitten Programme das Betriebssystem, eine Datei zu lesen oder Daten zu senden, statt die Festplatte oder Netzwerkkarte selbst zu steuern?
Das Betriebssystem teilt die Hardware sicher unter den Programmen auf, setzt Berechtigungen durch und verbirgt die Details jedes Geräts hinter Systemaufrufen, sodass Anwendungen nicht wissen müssen, auf welcher Hardware sie laufen.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Wenn Python langsamer ist als C, warum bauen dann so viele Unternehmen ihre Backend-Systeme in Python?“