Das ist fast peinlich zu fragen ... Ich habe einen Abschluss in Informatik (und einen zweiten in Arbeit). Ich habe fast fünf Jahre als Vollzeit-.NET-Entwickler gearbeitet. Ich scheine im Allgemeinen kompetent in dem, was ich tue.
Aber ich weiß nicht, wie Computer funktionieren!
Bitte, bleib für eine Sekunde bei mir. Eine schnelle Google-Suche nach "Wie ein Computer funktioniert" wird viele, viele Ergebnisse liefern, aber ich hatte Mühe, eine zu finden, die wirklich die gewünschten Antworten lieferte. Mir ist klar, dass dies eine sehr große Frage ist, also wirklich, wenn Sie mir nur einige Schlüsselwörter oder eine Richtung geben können.
Ich weiß, dass es Komponenten gibt ... das Netzteil, das Motherboard, den Arbeitsspeicher, die CPU usw. ... und ich bekomme eine allgemeine Vorstellung davon, was sie tun. Aber ich verstehe wirklich nicht , wie Sie aus einer Codezeile gehen wie Console.Readline()
in .NET (oder Java oder C ++) und haben es tatsächlich tut Sachen.
Klar, mir ist MSIL (im Fall von .NET) vage bewusst und es passiert etwas Magie mit dem JIT-Compiler und es verwandelt sich in nativen Code (glaube ich). Mir wurde gesagt, Java ist ähnlich und C ++ schneidet den mittleren Schritt aus.
Ich habe einige Großrechner zusammengebaut, das war vor ein paar Jahren. Ich erinnere mich, dass es einige Anweisungen und einige CPU-Register gab und ich Code schrieb ... und dann passierte etwas Magie ... und mein Programm würde funktionieren (oder abstürzen). Soweit ich weiß, würde ein 'Emulator' simulieren, was passiert, wenn Sie eine Anweisung aufrufen, und die CPU-Register aktualisieren. Aber warum funktionieren diese Anweisungen so?
Wird dies zu einer Elektronikfrage und nicht zu einer Computerfrage? Ich schätze, es gibt keinen praktischen Grund für mich, dies zu verstehen, aber ich habe das Gefühl, dass ich es tun sollte.
(Ja, dies passiert, wenn Sie einen Tag mit einem kleinen Kind verbringen. Es dauert ungefähr 10 Minuten und fünf Iterationen, bis Sie wissen, wie viel Sie nicht wissen, warum?)
Emulator
. Es ist ein Haufen realer Halbleiterschaltungen mit Hunderten (Tausenden) von Eingangs- und Ausgangsleitungen und Milliarden von Logikgattern. DieEmulator
wurde nur zu Unterrichtszwecken verwendet.Antworten:
Ich werde von der untersten Ebene beginnen, die relevant sein könnte (ich kann von einer noch niedrigeren Ebene aus beginnen, aber sie sind wahrscheinlich viel zu irrelevant), angefangen von Atom über Elektrizität zu Transistoren zu Logikgattern zu integrierten Schaltkreisen (Chip / CPU) ) und endet bei der Vollversammlung (ich nehme an, dass Sie mit den höheren Ebenen vertraut sind).
Am Anfang
Atom
Atom ist eine Struktur aus Elektronen, Protonen und Neutronen (die selbst aus Elementarteilchen bestehen ). Der interessanteste Teil des Atoms für Computer und Elektronik sind die Elektronen, da Elektronen beweglich sind (dh sie können sich im Gegensatz zu schwer zu bewegenden Protonen und Neutronen relativ leicht bewegen) und sich von selbst frei bewegen können, ohne im Inneren festgehalten zu werden ein Atom.
Normalerweise hat jedes Atom die gleiche Anzahl von Protonen und Elektronen, wir nennen diesen "neutralen" Zustand. Es ist möglich, dass ein Atom zusätzliche Elektronen verliert oder gewinnt. Atome in diesem unausgeglichenen Zustand sollen "positiv geladene" Atome (mehr Protonen als Elektronen) bzw. "negativ geladene" Atome (mehr Elektronen als Protonen) sein.
Elektronen sind unkonstruierbar und unzerstörbar (nicht so in der Quantenmechanik, aber das ist für unseren Zweck irrelevant); Wenn also ein Atom ein Elektron verliert, muss ein anderes Atom in der Nähe die zusätzlichen Elektronen aufnehmen oder das Elektron muss in ein frei schwebendes Elektron freigesetzt werden. Da das Elektron unkonstruierbar ist, muss es von einem Atom abgesaugt werden, um zusätzliche Elektronen zu gewinnen oder von einem frei schwebenden Elektron. Die Mechanik der Elektronen ist so, dass, wenn sich ein negativ geladenes Atom in der Nähe eines positiv geladenen Atoms befindet, einige Elektronen wandern, bis beide Atome die gleiche Ladung haben.
Elektrizität
Elektrizität ist nur ein Elektronenfluss von einem Gebiet mit sehr vielen negativ geladenen Atomen zu einem Gebiet mit sehr vielen positiv geladenen Atomen. Bestimmte chemische Reaktionen können dazu führen, dass wir einen Knoten mit vielen negativ geladenen Atomen (als "Anode" bezeichnet) und einen anderen Knoten mit vielen positiv geladenen Atomen (als "Kathode" bezeichnet) haben. Wenn wir zwei entgegengesetzt geladene Knoten mit einem Draht verbinden, fließen Elektronenmassen von der Anode zur Kathode, und dieser Fluss wird als "elektrischer Strom" bezeichnet.
Nicht alle Drähte können Elektronen gleich leicht übertragen, Elektronen fließen viel leichter in "leitenden" Materialien als in "resistenten" Materialien. Ein "leitendes" Material hat einen geringen elektrischen Widerstand (z. B. Kupferdrähte in Kabeln) und ein "widerstandsfähiges" Material einen hohen elektrischen Widerstand (z. B. Gummikabelisolierung). Einige interessante Materialien werden als Halbleiter (z. B. Silikone) bezeichnet, da sie ihren Widerstand leicht ändern können. Unter bestimmten Bedingungen kann ein Halbleiter als Leiter fungieren und unter anderen Bedingungen kann er sich in einen Widerstand verwandeln.
Elektrizität zieht es immer vor, das Material mit dem geringsten Widerstand zu durchfließen. Wenn also eine Kathode und eine Anode mit zwei Drähten verbunden sind, von denen einer einen sehr hohen Widerstand und der andere einen sehr geringen Widerstand aufweist, fließt der größte Teil der Elektronen durch das Kabel mit geringem Widerstand und nahezu Keiner fließt durch das hochohmige Material.
Das Mittelalter
Schalter und Transistoren
Schalter / Flip-Flops sind wie normale Lichtschalter, ein Schalter kann zwischen zwei Drahtstücken platziert werden, um den Stromfluss zu unterbrechen und / oder wiederherzustellen. Transistoren funktionieren genauso wie Lichtschalter, mit dem Unterschied, dass ein Transistor anstelle des physischen Verbindens und Trennens von Drähten den Stromfluss verbindet / trennt, indem er seinen Widerstand ändert, abhängig davon, ob sich im Basisknoten Strom befindet, und wie Sie vielleicht bereits vermutet haben Ich weiß, Transistoren bestehen aus Halbleitern, weil wir den Halbleiter entweder in einen Widerstand oder in einen Leiter umwandeln können, um elektrische Ströme zu verbinden oder zu trennen.
Ein üblicher Transistortyp, der NPN Bipolar Junction Transistor (BJT), hat drei Knoten: "Basis", "Kollektor" und "Emitter". In einem NPN-BJT kann Elektrizität nur dann vom "Emitter" -Knoten zum "Kollektor" -Knoten fließen, wenn der "Basis" -Knoten aufgeladen ist. Wenn der Basisknoten nicht geladen ist, kann praktisch kein Elektron durchfließen, und wenn der Basisknoten geladen ist, können Elektronen zwischen dem Emitter und dem Kollektor fließen.
Das Verhalten eines Transistors
(Ich schlage vor , Sie sehr durch lesen diese , bevor Sie fortfahren, da es besser ist als ich mit interaktiven Grafiken erklären kann)
Nehmen wir an, wir haben einen Transistor an der Basis und am Kollektor an eine Stromquelle angeschlossen und verdrahten dann ein Ausgangskabel in der Nähe des Kollektors (siehe Abbildung 3 in http://www.spsu.edu/cs/faculty/bbrown/web_lectures) / transistoren / ).
Wenn wir weder Basis noch Kollektor mit Elektrizität versorgen, kann überhaupt keine Elektrizität fließen, da es keine Elektrizität gibt, über die man sprechen kann:
Wenn wir den Kollektor mit Strom versorgen, aber nicht die Basis, kann der Strom nicht zum Emitter fließen, da die Basis zu einem Material mit hohem Widerstand wird, sodass der Strom zum Ausgangsdraht entweicht:
Wenn wir den Sockel mit Strom versorgen, aber nicht den Kollektor, kann auch kein Strom fließen, da kein Ladungsunterschied zwischen Kollektor und Emitter besteht:
Wenn wir sowohl die Basis als auch den Kollektor mit Elektrizität versorgen, fließt Elektrizität durch den Transistor. Da der Transistor jetzt einen niedrigeren Widerstand als das Ausgangskabel hat, fließt nahezu keine Elektrizität durch das Ausgangskabel:
Logikgatter
Wenn wir den Emitter eines Transistors (E1) mit dem Kollektor eines anderen Transistors (C2) verbinden und dann einen Ausgang in der Nähe der Basis des ersten Transistors (O) anschließen (siehe Abbildung 4 in http://www.spsu.edu) / cs / faculty / bbrown / web_lectures / transistoren / ), dann passiert etwas Interessantes. Nehmen wir auch an, wir legen immer Strom an den Kollektor des ersten Transistors (C1) und spielen nur mit den Basisknoten der Transistoren (B1, B2) herum:
Fassen wir die Tabelle so zusammen, dass nur B1, B2 und O angezeigt werden:
Und siehe da , wenn du mit Boolesche Logik und / oder Logikgatter vertraut sind, sollten Sie feststellen , dass dies genau das NAND - Gatter ist. Und wenn Sie mit Boolescher Logik und / oder Logikgattern vertraut sind, wissen Sie möglicherweise auch, dass ein NAND (und auch ein NOR) funktional vollständig ist , dh wenn Sie nur NAND verwenden, können Sie alle anderen Logikgatter und den Rest der Wahrheit konstruieren Tabellen. Mit anderen Worten, Sie können einen ganzen Computerchip nur mit NAND-Gattern entwerfen.
Tatsächlich werden die meisten CPUs (oder wurde es früher verwendet?) Nur mit NAND entwickelt, da die Herstellung billiger ist als die Verwendung einer Kombination aus NAND, NOR, AND, OR usw.
Ableiten der anderen Booleschen Operatoren von NAND
Ich würde nicht beschreiben, wie man alle booleschen Operatoren, nur das NOT- und das AND-Gatter macht, den Rest findet man woanders.
Wenn ein NAND-Operator gegeben ist, können wir ein NOT-Gatter konstruieren:
Wenn ein NAND- und ein NOT-Operator gegeben sind, können wir ein AND-Gatter konstruieren:
Wir können andere Logikgatter auf ähnliche Weise konstruieren. Da das NAND-Gatter funktional vollständig ist , ist es auch möglich, Logikgatter mit mehr als 2 Eingängen und mehr als 1 Ausgang zu konstruieren. Ich werde hier nicht diskutieren, wie solche Logikgatter konstruiert werden.
Aufklärungszeitalter
Aufbau einer Turingmaschine aus Booleschen Toren
Eine CPU ist nur eine kompliziertere Version einer Turing-Maschine. Die CPU-Register sind der interne Zustand der Turing-Maschine, und der RAM ist ein Band der Turing-Maschine.
Eine Turing-Maschine (CPU) kann drei Dinge tun:
Für unseren Zweck bauen wir Wolframs 2-Zustands-3-Symbol-Turing-Maschine mit kombinatorischer Logik (moderne CPUs würden Mikrocode verwenden, aber sie sind komplexer als für unseren Zweck erforderlich).
Die Zustandstabelle der Wolfram (2,3) Turingmaschine lautet wie folgt:
Wir wollen die obige Zustandstabelle als Wahrheitstabelle umcodieren:
Ich werde ein solches Logikgatter nicht wirklich konstruieren (ich bin mir nicht sicher, wie ich es in SE zeichnen soll, und es wird wahrscheinlich ziemlich umfangreich sein), aber da wir wissen, dass das NAND-Gatter funktionsfähig ist , haben wir einen Weg um eine Reihe von NAND-Gattern zu finden, die diese Wahrheitstabelle implementieren.
Eine wichtige Eigenschaft von Turing Machine ist, dass es möglich ist, einen Computer mit gespeicherten Programmen unter Verwendung einer Turing-Maschine zu emulieren , die nur eine Tabelle mit festen Zuständen aufweist. Daher kann jede Universal Turing-Maschine ihr Programm vom Band (RAM) lesen, anstatt ihre Anweisung in die interne Statustabelle fest einprogrammieren zu müssen. Mit anderen Worten, unsere (2,3) Turing-Maschine kann ihre Anweisungen von den I1-, I2-Pins (als Software) lesen, anstatt in der Logikgatter-Implementierung (als Hardware) fest codiert zu sein.
Mikrocodes
Aufgrund der zunehmenden Komplexität moderner CPUs wird es unerschwinglich schwierig, die kombinatorische Logik allein zum Entwerfen einer gesamten CPU zu verwenden. Moderne CPUs sind in der Regel als Interpreter für Mikrocodebefehle konzipiert. Ein Mikrocode ist ein kleines Programm, das in die CPU eingebettet ist und von der CPU zur Interpretation des tatsächlichen Maschinencodes verwendet wird. Diese Mikrocode-Interpreter selbst werden im Allgemeinen mit kombinatorischer Logik entworfen.
Registrieren, Cache und RAM
Wir haben oben etwas vergessen. Wie erinnern wir uns an etwas? Wie implementieren wir das Band und den RAM? Die Antwort liegt in einer elektronischen Komponente namens Kondensator. Ein Kondensator ist wie eine wiederaufladbare Batterie. Wenn ein Kondensator aufgeladen wird, werden zusätzliche Elektronen gespeichert und es können auch Elektronen an die Schaltung zurückgegeben werden.
Um in einen Kondensator zu schreiben, füllen wir den Kondensator mit Elektronen (schreibe 1) oder entleeren alle Elektronen im Kondensator, bis er leer ist (schreibe 0). Um den Wert eines Kondensators abzulesen, versuchen wir ihn zu entladen. Wenn beim Entladen kein Strom fließt, ist der Kondensator leer (Anzeige 0). Wenn jedoch Strom erkannt wird, muss der Kondensator aufgeladen werden (Anzeige 1). Sie werden vielleicht bemerken, dass das Lesen eines Kondensators seinen Elektronenspeicher entleert. Moderne RAMs verfügen über die Schaltung, um den Kondensator regelmäßig aufzuladen, so dass sie ihren Speicher behalten können, solange Strom vorhanden ist.
In einer CPU werden mehrere Kondensatortypen verwendet, die CPU-Register und die übergeordneten CPU-Caches werden mit sehr schnellen "Kondensatoren" erstellt, die eigentlich aus Transistoren bestehen (daher gibt es fast keine "Verzögerung" zum Lesen / Schreiben diese werden statisches RAM (SRAM) genannt; Während der Hauptspeicher RAM mit geringerer Leistung, aber langsameren und viel billigeren Kondensatoren hergestellt wird, werden diese als dynamischer RAM (DRAM) bezeichnet.
Uhr
Ein sehr wichtiger Bestandteil einer CPU ist die Uhr. Eine Uhr ist eine Komponente, die regelmäßig "tickt", um die Verarbeitung zu synchronisieren. Eine Uhr enthält typischerweise einen Quarz oder andere Materialien mit bekannter und relativ konstanter Schwingungsperiode, und die Uhrschaltung hält diese Schwingung aufrecht und mißt sie, um ihren Zeitsinn aufrechtzuerhalten.
CPU-Operationen werden zwischen Takt-Ticks ausgeführt und Lese- / Schreibvorgänge werden in den Ticks ausgeführt, um sicherzustellen, dass sich alle Komponenten synchron bewegen und nicht ineinander treten, während sie sich in Zwischenzuständen befinden. In unserer (2,3) Turing-Maschine fließt zwischen den Takten Elektrizität durch die Logikgatter, um die Ausgabe von der Eingabe (I1, I2, R (t)) zu berechnen. und in den Takt-Ticks schreibt der Bandschreiber O1, O2 auf das Band, der Motor bewegt sich abhängig vom Wert von M und das interne Register wird vom Wert von R (t + 1) und dann vom Bandleser geschrieben liest das aktuelle Band und lädt es in I1, I2 und das interne Register wird auf R (t) zurückgelesen.
Mit Peripheriegeräten sprechen
Beachten Sie, wie die (2,3) Turing-Maschine mit ihrem Motor verbunden ist. Dies ist eine sehr vereinfachte Ansicht, wie eine CPU mit einer beliebigen Hardware verbunden werden kann. Beliebige Hardware kann eine bestimmte Leitung für Ein- / Ausgänge abhören oder beschreiben. Bei der (2,3) Turing-Maschine besteht die Schnittstelle zum Motor nur aus einem einzigen Draht, der den Motor anweist, sich im oder gegen den Uhrzeigersinn zu drehen.
Was bei dieser Maschine nicht gesagt wird, ist, dass der Motor eine andere "Uhr" haben muss, die synchron mit der internen "Uhr" der Maschine läuft, um zu wissen, wann der Betrieb gestartet und gestoppt werden muss. Dies ist also ein Beispiel für eine synchrone Datenübertragung . Die andere häufig verwendete alternative asynchrone Übertragung verwendet eine andere Leitung, die als Interrupt-Leitung bezeichnet wird, um Synchronisationspunkte zwischen der CPU und dem asynchronen Gerät zu kommunizieren.
Digitales Zeitalter
Maschinencode und Montage
Assemblersprache ist eine vom Menschen lesbare Mnemonik für Maschinencodes. Im einfachsten Fall gibt es eine Eins-zu-Eins-Zuordnung zwischen Assembly und Maschinencode. Obwohl in modernen Assemblersprachen einige Anweisungen möglicherweise mehreren Opcodes zugeordnet sind.
Programmiersprache
Das ist uns allen bekannt, nicht wahr?
Puh, endlich fertig, ich habe das alles in nur 4 Stunden getippt, also bin ich sicher, dass es irgendwo einen Fehler gibt (ich bin in erster Linie ein Programmierer, kein Elektrotechniker oder Physiker, also gibt es möglicherweise einige Dinge, die offensichtlich falsch sind). Wenn Sie einen Fehler gefunden haben, zögern Sie bitte nicht, ein @yell zu geben oder es selbst zu beheben, wenn Sie den Repräsentanten haben oder eine ergänzende Antwort erstellen.
quelle
In 12 Schritten von Nand zu Tetris
Ich denke, das wird absolut perfekt für Sie sein:
Von Nands zu Tetris in 12 Schritten
quelle
Wenn Sie die Montage durchgeführt haben, müssen Sie nur noch zwei oder drei Ebenen verstehen:
Der letzte (Microcode) hat es für mich zum "Klicken" gebracht, weil er die Lücke zwischen Elektronik und Code füllte.
quelle
Ein Beispiel für einen Lehrplan für ein CS-Grundstudium, der genau erklärt, was Sie gefragt haben, finden Sie hier (IDC.AC.IL-Kurs CS101) . Es basiert auf dem MIT-Pressebuch: " Die Elemente von Computersystemen: Aufbau eines modernen Computers aus ersten Prinzipien ".
quelle
Die vollständige Beantwortung dieser Frage würde ein ganzes Buch kosten. Zum Glück hat jemand dieses Buch schon geschrieben. Es heißt Code: Die verborgene Sprache von Computerhardware und -software von Charles Petzold. Es ist eine sehr informative und sehr unterhaltsame Lektüre.
quelle
Ich kann Code von Charles Petzold nur empfehlen . Das Buch ist sowohl eine Geschichtsstunde als auch ein technischer Überblick über den Bau eines Computers. Beginnend mit der Erläuterung einfacher Telegraphenschalter zeigt das Buch, wie Transistoren funktionieren, und anschließend mit Logikgattern, programmierbaren Computern und komplexeren Dingen. Es ist auch sehr gut geschrieben und könnte wahrscheinlich von jedem mit genügend Neugier erfasst werden.
quelle
Es wird viel zu schwierig (und zu lang!) Sein, alles aufzulisten, was Sie wissen müssen, um ein ausreichendes Verständnis für das zu erlangen, was Sie wissen müssen. Ein berühmtes Buch, das all diese Fragen beantwortet, stammt von Andrew Tanenbaum: Structured Computer Organization .
Dieses Buch führt Sie vom physischen Computer auf Ihrem Schreibtisch bis hinunter zu logischen Gattern und zur Booleschen Algebra und zeigt Ihnen anhand einer Beispielarchitektur, wie alles in einem solchen System tatsächlich abläuft.
(Eine Anmerkung: Es ist sehr teuer, da es ~ 800 Seiten umfasst. Es ist wahrscheinlich gut, nur eine gebrauchte Version oder eine ältere Ausgabe zu erhalten. Die Konzepte haben sich nicht geändert.)
quelle
Nun, es braucht eine Menge Eier, um das zu sagen und zu fragen, denke ich.
Der Code wird so ziemlich immer weiter auf einen komplizierteren Code niedrigerer Ebene reduziert. Code auf Baugruppenebene mit Schieberegistern .. etc ...
Dann nimmt die Hardware diesen Code und reagiert darauf. In den meisten Fällen verfügt die Hardware über eigene Anweisungen zur Vorgehensweise. Es kann also eine einfache Anweisung wie PUSH geben, bei der ein Register (Speicherort) einen Wert wie 1 oder 2 oder was auch immer erhält.
Es ist definitiv eine Computerfrage. Und auch eine Programmierung. Einige Programmierer programmieren die Hardware, die Ihren Code aufnimmt und dazu bringt, etwas zu tun, wenn auch auf einem sehr niedrigen Niveau. Es ist auch eine Elektronikfrage.
quelle
Es gibt Geräte.
Dann gibt es Gerätetreiber, die mit diesen Geräten interagieren. Teil in C geschrieben, Teil in der Regel in der Baugruppe.
Das Betriebssystem interagiert auf der einen Seite mit der Anwendungssoftware und auf der anderen Seite mit den Gerätetreibern, um mit der eigentlichen Hardware zu kommunizieren.
Wenn Sie wirklich interessiert sind, warum nicht einen Linux-Kernel hacken, um mehr zu erfahren?
quelle
Im Kern handelt es sich hierbei um eine Elektronikfrage, deren Grundlagen jedoch für jeden CS-Abschluss im Studiengang behandelt werden sollten. Alle Hardware-Aktionen basieren auf Gattern, die auf Komponentenebene darin programmiert sind. Dies sind die grundlegendsten logischen Operationen: NOT, AND, OR, XOR, NAND, NOR. Jedes Tor hat eine bestimmte Funktion:
Das NICHT- Gatter nimmt einen Eingangswert und erzeugt einen Ausgangswert, es erhält eine 0 oder 1 und gibt das Gegenteil aus.
Das UND- Gatter nimmt zwei Eingangswerte an und erzeugt einen Ausgangswert. Es erhält eine beliebige Kombination von 0 und 1 und gibt 0 für eine beliebige Kombination mit Ausnahme von zwei aus, für die es eine 1 ausgibt.
Das ODER- Gatter funktioniert ähnlich wie das UND-Gatter, erzeugt jedoch eine 1 für jede Kombination von 0 und 1, die es erhält, mit Ausnahme von zwei Nullen, für die es eine 0 ausgibt.
Das XOR- Gatter ähnelt wieder sowohl dem AND- als auch dem OR-Gatter, erzeugt jedoch eine 0, wenn beide Eingänge identisch sind, und eine 1, wenn beide Eingänge unterschiedlich sind.
Das NAND- Gatter ist das logische Gegenteil des UND-Gatters und das NOR- Gatter ist das logische Gegenteil des ODER-Gatters.
Mit anderen Worten, auf der Hardwareebene kommt es auf die grundlegendsten binären logischen Ausdrücke an. Alles andere ist nur ein Übergang von einer höheren Programmierebene zu einer niedrigeren, bis diese letzte Ebene erreicht ist.
quelle
Für den Teil über die Umwandlung eines Programms in eine Hochsprache in Maschinenanweisungen sollte jedes Compiler-Buch die Rechnung füllen. Zum Beispiel das Drachenbuch .
Für den Teil "Wie werden Anweisungen ausgeführt?" Computer Organisation und Design: Die Hardware / Software-Schnittstelle sollte die Rechnung füllen.
quelle
Obwohl es für mich erstaunlich ist, dass jemand einen Kurs in CS absolvieren kann, ohne die Hardware zu verstehen, ist es durchaus möglich, dass sich ein Kurs nur auf die Theorie als Teilgebiet der Mathematik und nicht auf die Details der Technik und Implementierung konzentriert. Die ehrwürdigen SICP- Vorlesungen (wie sie in den 1980er Jahren gehalten wurden) schienen so zu sein.
Auf meinem CS-Kurs musste vor zwei Jahrzehnten eine frühere Ausgabe von Computers: from Logic to Architecture im ersten Jahr gelesen werden.
So etwas sollte die Lücken füllen.
Alternativ sollte die Open Courseware des MIT etwas enthalten, das hilft.
quelle