Normalerweise treffe ich Gurus in SO und an anderen Orten (Ausbilder, Buchautoren usw.), die etwas Ähnliches "This will cause alignment issues"
oder andere Kleinigkeiten aussagen .
Ich möchte all diese Leckerbissen kennenlernen, die relevant
für die Programmierung von Bedeutung sind. Wenn ich jetzt Bücher auf niedriger Ebene sehe (z. B. Bücher zur Computerarchitektur), sind sie normalerweise zu niedrig und richten sich an Personen, deren Hauptinteresse die Computerarchitektur und nicht das Softwaredesign ist.
Haben Sie Empfehlungen für Bücher, die sich mit Themen befassen, die für Programmierer relevant sind?
low-level
computer-architecture
Samaursa
quelle
quelle
Antworten:
Eine schöne Sammlung von Büchern für genau diesen Zweck ist Randall Hydes "Write Great Code" -Serie ( Band 1, Band 2 ): Eine explizite Beschreibung der Maschinenarchitektur aus der Perspektive dessen, was Sie wissen müssen, um effizienten Code in Hochsprachen zu schreiben .
quelle
Leider kenne ich kein modernes Äquivalent zu Mikroprozessoren: A Programmer's View von R. Dewar. Das nächste, von dem ich weiß, ist Computer Organization and Design, vierte Ausgabe: Die Hardware- / Software-Schnittstelle von David A. Patterson und John L. Hennessy, aber ich bin mir nicht sicher, ob Sie es nicht für zu niedrig halten werden. Sie werden es auf jeden Fall für ihr anderes Werk tun, Computer Architecture, einen quantitativen Ansatz.
Online gibt Ihnen diese http://www-uxsup.csx.cam.ac.uk/courses/Architecture/course.pdf vielleicht das, was Sie wollen.
quelle
Besorgen Sie sich für x86-Plattformen eine Kopie der Intel IA-32- und Intel 64-Prozessorhandbücher . Das Optimierungsreferenzhandbuch behandelt viele dieser Probleme aus einer einfachen Perspektive für Intel x86-CPUs. AMD hat auch ähnliche Handbücher , die dieselben Themen behandeln.
Die meisten anderen CPU-Architekturen verfügen über ähnliche Handbücher, in denen Leistungsprobleme behandelt werden. ( ZB ARM und PowerPC .)
quelle
Ich finde, dass "Computerarchitektur: Ein quantitativer Ansatz" von Hennessy und Patterson ( Amazon Link ) eine sehr starke und solide Herangehensweise an die Computerarchitektur ist, mit etlichen Fallstudien, die direkt für die Programmierung relevant sind.
Es wird in verschiedenen CS-Architekturkursen für Studenten und Absolventen in den USA in unterschiedlichem Umfang eingesetzt.
Vor einiger Zeit gab es auch eine großartige Rezension zu Ars Technica .
quelle
Dies ist, was ich in meiner Klasse Computer Systems jetzt verwende. Computer Systems: A Programmer's Perspective (2nd Edition) und als die Klasse gerade angefangen hat, habe ich es mir angesehen und es gefällt mir wirklich.
Hier ist die Beschreibung des Buches:
quelle
Es ist eine Menge Arbeit, aber die Programmiersprache Pragmatik könnte genau das sein, wonach Sie suchen. Das Buch befasst sich theoretisch hauptsächlich mit dem Parsen und Kompilieren (was ein wesentliches Wissen für diejenigen ist, die das Programmieren wirklich lernen möchten). Dabei lernen Sie, wie sich Sprachkonzepte in etwas auf niedrigem Niveau umsetzen lassen. Besser noch, Sie lernen dies für viele Sprachen gleichzeitig und können auf intelligente Weise vergleichen und gegenüberstellen, wie verschiedene Sprachen tatsächlich funktionieren.
Ich kann es nicht empfehlen, es sei denn, Sie können mehrere Monate darauf verwenden, das Material tatsächlich zu lernen. Es ist nicht die Art von Sachen, die Sie nur überfliegen und plötzlich erleuchtet werden. Aber wenn Sie es ernst meinen, kann ich es nur empfehlen.
quelle
Es mag in der Biologie falsch sein, aber in der Informatik "rekapituliert die Ontogenese die Phylogenese" beinahe. Ein historischer Überblick über Computerarchitekturen seit den ersten Computern ist eine gute Möglichkeit, das Thema Computerarchitektur aus der Perspektive eines Programmierers zu verstehen. Computerentwürfe sind fast alle Verfeinerungen früherer Entwürfe.
Das heißt, ich empfehle, vollständig funktionierende ältere Systemdesigns zu studieren, die auf theoretischen "Computerarchitektur" -Büchern basieren, die Sie in der Informatik erhalten. Systemdesign wirklich zu verstehen und beim Schreiben von Software einen wirklich tollen Job zu machen. Das intuitive Erfassen der Architektur von Computersystemen erfordert die Beherrschung vieler Konzepte. Ich denke, wenn Sie anfangen, als Computerarchitekturen in Größe und Umfang überschaubarer waren, werden Sie vielleicht das Ziel erreichen, besseren Code zu schreiben.
(Diese Buchserie "Write Great Code", die ein anderer Mann erwähnt hat, sieht übrigens großartig aus, und ich habe meine Frage so bearbeitet, dass sie jegliche Anspielung auf das Lernen aus einem Buch beseitigt, weil sie großartig aussieht! )
Einige Dinge, die Computerarchitektur wirklich gut lehren:
Ich nehme gerne Maschinen aus den 1980er Jahren als Ausgangspunkt, um Menschen Dinge zu erklären und zu demonstrieren, denn zu diesem Zeitpunkt habe ich angefangen, Computer zu benutzen. Ich habe das Referenzhandbuch des Commodore 64-Programmierers verwendet, um Menschen einen Ausgangspunkt zu zeigen, an dem sich Programmierkenntnisse und Kenntnisse der Computerarchitektur begegnen. Mit einem solchen Buch und vielleicht einem Commodore 64-Emulator, der auf Ihrem PC ausgeführt wird, damit Sie etwas ausprobieren können, erfahren Sie, wie Computersysteme in der klassischen Inkarnation der Computerarchitektur der 1980er Jahre wirklich aufgebaut sind. Meiner Ansicht nach ist ein konkretes Beispiel ein besserer Ausgangspunkt als ein Dutzend theoretischer Modelle, denen die Details der realen Welt fehlen, die die Dinge zum Funktionieren bringen. Wenn Sie wissen, was ein Register ist, was eine ALU ist, was ein Bus ist und was eine Uhr ist, und welche Signalsysteme in einem alten Design aus den 1980er Jahren verwendet werden, gibt Ihnen die Grundlagen, die Sie benötigen, um etwas Neues zu verstehen, wie Intels "sandige Brückenarchitektur". Historisch gesehen, schauen Sie auf die Originale zurück, zum Beispiel nach "Von neumann" Architektur auf Wikipedia.
Ich gehe von meinem ersten Punkt ein paar Jahre weiter. Erfahren Sie mehr über die ursprüngliche IBM PC-Architektur, die Assemblersprache 8086 und den ISA-Bus. Aufgrund dieser und seiner Einschränkungen kann das Verständnis dessen, was eine "Intel COre i7" -CPU enthält, was die PCI- und PCI-e-Busse tun und warum Sie sie benötigen, natürlicher erfolgen. Die heutige PC-Architektur weist immer noch ein gewisses "Hangover" gegenüber dem ursprünglichen IBM PC-Design auf. Die Art und Weise, wie das anfängliche Laden (Booten) von Programmen (Betriebssystemen) auf einem 2011-PC erfolgt, hängt noch stark vom Erbe des ursprünglichen IBM-PCs und seines ROM-BIOS sowie dessen CMOS-Einstellungen auf einem ursprünglichen PC ab.
Verwenden und modifizieren Sie eine vorkonfigurierte Linux-Version, die auf einigen eingebetteten Nicht-PC-Geräten funktioniert, und Sie erfahren viel über die Architektur eingebetteter Computer, nicht nur über die technische Architektur, sondern auch darüber, warum einige der Funktionen vorhanden sind. Ein schönes Beispiel, das günstig erhältlich ist, ist der TS-7200, der einen schönen PC-104 hat (ISA-Bus, wie im Original-PC). PC-104-Computer (eingebetteter 16-Bit-ISA-Bus, der pin-kompatibel mit PCs der IBM PC / AT 80286-Ära ist) sind eine hervorragende Möglichkeit für Nicht-Board-Designer, ein eingebettetes System zu erstellen, da die Module stapelbar sind. Möchten Sie zusätzliche E / A oder Peripheriegeräte? Stapeln Sie einfach ein paar Module. Der TS-7200 verfügt über einen Nicht-x86-Kern (eine ARM9-CPU), auf dem entweder Big-Endian oder Little-Endian ausgeführt werden kann. Wenn Sie auf Ihrer Architektur-Lernreise noch nicht auf "Endianness" gestoßen sind, ist dies ein guter Ort, um diesem Phänomen zu begegnen.
quelle
In den meisten Büchern zur Assemblersprache werden relevante Architekturmerkmale erörtert, in der Regel jedoch nur für die Architektur, auf die sich das Buch bezieht. Sie erhalten also Informationen zu Cache-Überläufen und MMU-Seitenzuordnungstechniken, wahrscheinlich jedoch nichts über Endianness.
quelle