Computerarchitektur als Programmierer lernen [geschlossen]

12

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 relevantfü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?

Samaursa
quelle
4
Sie wollen "Bücher, die durch Low-Level-Sachen gehen", aber Sie wollen keine Bücher, die zu "Low-Level" sind? Das Erlernen der Architektur kann für einige Programmierer äußerst vorteilhaft sein. Analog zu einem Webentwickler, der den TCP / IP-Stack versteht. Es ist nie so nützlich, bis Sie es WIRKLICH brauchen. \
Chris
1
@Chris: Was ich meinte, war "Low-Level für Programmierer" ... technisch können wir bis zu einer vollständigen CPU-Architektur gehen, und zweifellos wird es eines Tages nützlich sein, aber wenn man bedenkt, dass wir alle nur eine begrenzte Zeit haben, ein Buch das lehrt Low-Level-Sachen, die alle Programmierer kennen sollten, werden perfekt sein.
Samaursa
In diesem Fall bringt Sie jedes Einführungsbuch in die richtige Richtung, wohin Sie es dann je nach Bedarf oder Wunsch führen.
Chris
Jemand, der ein Auto mit einem Automatikgetriebe fährt, profitiert davon, während der Fahrt zu wissen, was eines ist und wie es funktioniert. Ich glaube, Sie werden ein besserer Programmierer, indem Sie lernen, zumindest ein wenig in Assemblersprache zu programmieren, so wie Sie, wie ich glaube, ein besserer Fahrer werden, wenn Sie lernen, "Stick zu fahren".
Warren P

Antworten:

16

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 .

Kilian Foth
quelle
Für welche Hochsprachen würde dies gelten? Wäre dies zum Beispiel Python, JavaScript, C #, Scala?
Job
@Job - Ich habe die Bücher nicht gelesen, aber ich würde sagen, dass sie für alle gelten würden / könnten, die Dinge wie Multithreading und 64-Bit-Verarbeitung nutzen. Das Ausführen der von Ihnen genannten Sprachen würde dieses Wissen wahrscheinlich nützlich machen (insbesondere, wenn Sie auch ein Serveradministrator sind oder diese Sprachen außerhalb einer Webumgebung ausführen).
Shauna
Hyde ist ein Assembler-Guru. Für ihn bedeutet "High-Level" meistens C. Aber sein Inhalt ist für Benutzer noch höherer Sprachen genauso wichtig. Strings, Prozeduraufrufe usw. unterscheiden sich auf Hardware-Ebene nicht sonderlich, egal ob sie in C oder in Python deklariert sind.
Kilian Foth
Ich denke, dass jede native kompilierte Sprache (C, C ++, Pascal, Objective-C), die auch ein bisschen Assemblersprache erlaubt, am meisten von diesem Buch profitieren würde. Wenn Sie jedoch Python verwenden und in C Erweiterungen dafür schreiben, oder wenn Sie Java verwenden und überhaupt keine systemeigenen Methoden verwenden, sollten Sie sich ein wenig mehr Gedanken über die Kosten ihrer Arbeit machen wie sie ihre Arbeit effizient auf der von ihnen genutzten Plattform erledigen können.
Warren P
Obwohl ich die Bücher noch nicht gelesen habe, wähle ich diese Antwort basierend auf den Rezensionen / der Zusammenfassung des Buches als richtig aus.
Samaursa
6

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.

Ein Programmierer
quelle
Der Link zum pdf ist tot.
22.
5

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 .)

greyfade
quelle
3

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 .

Bitgarden
quelle
1
Während ich dieses Buch mag - ich besitze die vier Ausgaben - richtet es sich an Computerarchitekten, nicht an Programmierer.
AProgrammer
3

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:

Nur wenige Studenten, die Informatik oder Computertechnik studieren, werden jemals die Möglichkeit haben, ein Computersystem aufzubauen. Andererseits müssen die meisten Schüler fast täglich Computer benutzen und programmieren. Computersysteme: Die Perspektive eines Programmierers führt in die wichtigen und dauerhaften Konzepte ein, die Computersystemen zugrunde liegen, indem aufgezeigt wird, wie sich diese Ideen auf die Richtigkeit, Leistung und Nützlichkeit von Anwendungsprogrammen auswirken. Die praktische Herangehensweise des Textes (einschließlich eines umfassenden Satzes von Übungen) hilft den Schülern, die Funktionsweise eines modernen Computersystems zu verstehen und bereitet sie auf zukünftige Kurse in Systemthemen wie Compiler, Computerarchitektur, Betriebssysteme vor. und Vernetzung.

Jetti
quelle
Das ist ein tolles Buch !!
Armando
2

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.

btilly
quelle
2

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:

  1. 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.

  2. 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.

  3. 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.

Warren P
quelle
0

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.

TMN
quelle