Muss man verstehen, was auf Hardwareebene passiert, um ein guter Programmierer zu sein?


24

Ich bin ein Autodidakt, nur für den Fall, dass diese Frage in CS 101 beantwortet wird. Ich habe viele Sprachen gelernt und verwendet, hauptsächlich für meinen persönlichen Gebrauch, aber gelegentlich für berufliche Zwecke.

Es scheint, dass ich immer auf die gleiche Wand stoße, wenn ich Probleme beim Programmieren habe. Zum Beispiel habe ich gerade in einem anderen Forum eine Frage dazu gestellt, wie ein von einer Funktion zurückgegebener Zeiger auf ein Array zu behandeln ist. Anfangs denke ich, dass ich einfach nicht die richtige Technik kenne, die die Designer von C ++ eingerichtet haben, um mit der Situation umzugehen. Aber aus den Antworten und Diskussionen, die folgen, sehe ich, dass ich nicht wirklich verstehe, was passiert, wenn etwas "zurückgegeben" wird.

Wie tief muss ein guter Programmierer sein, um den Programmierprozess zu verstehen?


3
Mein Rat: Lernen Sie einige x86-Assemblys (DOS oder anders). Dann lernen Sie, einige der Assembler-Ausgaben einiger kleiner Teile von C-Code zu lesen. Stellen Sie Fragen, wenn Sie die Ausgabe nicht verstehen. Wiederholen. Dies zwingt Sie zu verstehen, was auf CPU-Ebene geschieht
Earlz


Earlz - Meinen Sie, ich sollte lernen, mit dem x86-Befehlssatz zu programmieren? Ist das der "CPU-Level"?
18.

Hiob, das hat Spaß gemacht. Er hat tatsächlich ein paar Fehler gemacht, aber nur zu Ihrer Information.
Vor 18.10.11

Antworten:


33

Nein, niemand versteht, was auf Hardwareebene vor sich geht.

Computersysteme sind wie Zwiebeln - es gibt viele Schichten, von denen jede zur Unterstützung von der Schicht abhängt, die darunter liegt. Wenn Sie der Typ sind, der an einer der äußeren Schichten arbeitet, ist es Ihnen egal, was mitten in der Zwiebel passiert. Und das ist auch gut so, denn die Zwiebelmitte ändert sich ständig. Solange die Ebene oder Ebenen, die Ihre bestimmte Ebene unterstützen, weiterhin gleich aussehen und Ihre Ebene unterstützen, sind Sie gut.

Aber dann wieder...

Ja. Ich meine, Sie müssen nicht verstehen, was wirklich in der Zwiebel vor sich geht, aber es ist sehr hilfreich, ein mentales Modell davon zu haben, wie das Innere einer typischen Zwiebel aussieht. Vielleicht nicht der tiefste Teil, in dem Sie Gates aus Transistoren und dergleichen haben, oder die nächste oder die nächste Schicht, in der Sie Mikrocode, eine Uhr, Befehlsdecodiereinheiten usw. haben. In den nächsten Schichten befinden Sie sich jedoch Ich habe Register, den Stapel und den Haufen. Dies sind die tiefsten Ebenen, auf die Sie viel Einfluss haben - der Compiler übersetzt Ihren Code in Anweisungen, die auf dieser Ebene ausgeführt werden. Wenn Sie möchten, können Sie diese Anweisungen in der Regel durchgehen und herausfinden, was "wirklich" passiert.

Die meisten erfahrenen Programmierer haben eine märchenhafte Version dieser Ebenen im Kopf. Sie helfen Ihnen zu verstehen, wovon der Compiler spricht, wenn er Ihnen mitteilt, dass eine "ungültige Adressausnahme" oder ein "Stapelüberlauffehler" oder ähnliches aufgetreten ist.

Wenn Sie interessiert sind, lesen Sie ein Buch über Computerarchitektur. Es muss nicht einmal ein besonders neues Buch sein - digitale Computer funktionieren seit langer Zeit in etwa gleich. Je mehr Sie über das Innere der Zwiebel erfahren, desto erstaunlicher wird es, dass all diese Dinge überhaupt funktionieren! Das (ungefähre) Lernen, was in den unteren Ebenen vor sich geht, macht das Programmieren weniger mysteriös und irgendwie magischer. Und wirklich mehr Spaß.

Eine andere Sache, die Sie untersuchen könnten, ist Zwiebeln eingebettet. Äh, ich meine eingebettete Systeme. Es gibt eine Reihe von Embedded-Plattformen, die sehr einfach zu bedienen sind: Arduino und BASIC Stamp sind zwei Beispiele. Hierbei handelt es sich im Grunde genommen um kleine Mikroprozessoren mit vielen integrierten Funktionen. Sie können sich Zwiebeln mit weniger Schichten als einen typischen Desktop-PC vorstellen, so dass Sie sich ein umfassendes Bild davon machen können, was im gesamten System vor sich geht, von der Hardware bis zur Software.


2
Vielen Dank. Dies beantwortet im Grunde meine Frage. Ich bin ein EE, der das Design von Registern, Addierern, Multiplexern usw. auf Chipebene (dh auf Transistorebene) durchgeführt hat, sodass ich die niedrigste Ebene erhalte (es sei denn, wir sprechen von Quantenmechanik). Ich kann auch die Sprachen verwenden, die ich ziemlich gut kenne. Ich habe nur eine große Lücke in der mittleren Ebene (Stapel, Haufen), wo Sie sagen, der Compiler erledigt seine Arbeit. Weil ich, wie Sie sagen, meine Programmiererfahrung "weniger mysteriös und ... magischer" haben möchte. Es scheint, als sollte ich die Level studieren, die mir noch unbekannt sind.
Bis zum

@bev: In diesem Fall sollten Sie wirklich eine Plattform wie Arduino ausprobieren.
Caleb

Es tut mir leid, dass ich langweilig bin, aber ich habe Arduino ausprobiert und kann nicht wirklich erkennen, wie die Verwendung es mir hilft, zu verstehen, wie ein Compiler Zeiger und Arrays unterschiedlich behandelt. Was sehe ich nicht?
18.

@bev: Wenn Sie nur herausfinden möchten, wie Funktionen aufgerufen werden, können Sie wahrscheinlich 30 Minuten damit verbringen, darüber zu lesen und fertig zu sein. Wenn Sie ein besseres Gefühl dafür bekommen möchten, wie alles zusammenarbeitet, ist es mit einem kleinen System am einfachsten. Es ist der beste Weg, um die ganze Zwiebel auf einmal in den Kopf zu bekommen. AVR, die Familie von Chips, auf denen Arduino basiert, ist ein schönes, benutzerfreundliches Allzweck-System mit einem Befehlssatz, der klein genug ist, um ohne allzu große Probleme gelernt zu werden.
Caleb

Ah, ok. Die Homepage ist in Bezug auf diesen Aspekt ihrer Produkte ein wenig düster. Ich schau nochmal nach.
18.

10

Sie sprechen nicht über die Hardwareebene, sondern darüber, was der Compiler wirklich mit dem macht, was Sie ihm sagen.

Dieses Verständnis ist auf jeden Fall erforderlich, um herauszufinden, was schief gelaufen ist, wenn es nicht offensichtlich ist, insbesondere, wenn es sich um eine Memory-Stomp-Situation handelt.


Loren - Ja! Danke für die einfache Wahrheit. Jetzt muss ich herausfinden, wie ich am besten lernen kann, wie C ++ - Compiler mit ihren Datentypen umgehen. Übrigens, als EE weiß ich, dass es nicht buchstäblich die Hardware-Ebene ist. Ich wusste nur nicht, wie Ihr CS-Freaks es nennt. (Immer noch nicht für diese Angelegenheit. Compiler-Level?)
bis

Übrigens - Memory Stomp?
18.

@Bev: Du hast gerade meinen Standpunkt hier bewiesen - wenn du nicht einmal weißt, was ein Gedächtnisstampf ist, wirst du eine schreckliche Zeit haben, einen Fehler aufgrund eines Fehlers zu finden. Ein Gedächtnisstampf ist, wenn etwas an eine Stelle schreibt, an der es nicht sein soll, und löscht (stampft auf), was auch immer dort war. Wenn du Glück hast, war alles, was du triffst, sofort von entscheidender Bedeutung und es explodiert zumindest. Wenn Sie Pech haben, macht das Programm einfach weiter mit einigen Lücken in den Daten.
Loren Pechtel

Danke für die Klarstellung. Es zeigt mir auch, wie viel ich nicht weiß, da ich meines Wissens nur auf den Heap oder den Stack schreibe, ohne eine genauere Kontrolle zu haben.
18.

@Bev: Das Problem tritt auf, wenn Sie an einen Ort schreiben, von dem Sie nicht glauben, dass Sie schreiben. Sie haben etwas auf dem Stapel und Sie machen einen Zeiger darauf. Sie verlassen die Routine - der Gegenstand verschwindet, der Zeiger nicht. Was passiert nun, wenn Sie an diesen Zeiger schreiben? Oder Sie haben ein Array von 100 Artikeln - was passiert, wenn Sie Artikel Nr. 200 schreiben?
Loren Pechtel

6

Grundlegendes zum Programmspeicher! = Grundlegendes zur Hardware

Grundlegendes zur Speicherhierarchie == Grundlegendes zur Hardware


Um Ihre allgemeine Frage zu beantworten: Es kommt darauf an. Es kann nicht schaden, Hardware zu verstehen, aber zu verstehen, wird nicht in allen Fällen helfen.

Anhand Ihres Beispiels müssen Sie lediglich verstehen, wie der Speicher aufgeteilt und wie er organisiert ist, wenn Sie ein Programm ausführen. Das Verständnis der Hardware hilft Ihnen in dieser Hinsicht nicht weiter, da der für ein Programm sichtbare Speicher dank der Magie des virtuellen Speichers die Hardware nicht einmal wirklich darstellt.

Wenn Sie sich für Leistungsprobleme interessieren, die auf der Reihenfolge basieren, in der Sie auf den Speicher zugreifen, profitieren Sie JETZT vom Verständnis der Hardware, der Speicherhierarchie, der Cache-Auslassungen, der Seitenfehler und all der wunderbaren Vorzüge der Hardware.


Stargazer - Ich bin noch nicht an dem Punkt angelangt, an dem ich mir über Leistungsprobleme Gedanken machen kann. Hoffentlich bald. Vielen Dank für Ihre Kommentare.
18.

5

Wenn Sie sich dazu entschließen, ein bisschen Assembler zu lernen, sollten Sie wahrscheinlich 6502 Assembler auf einem Commodore 64 (natürlich emuliert) oder 68000 auf einem Amiga lernen.

Hier können Sie sich einen Eindruck vom Commodore 64 verschaffen ...

http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main

Das klassische Alles-was-Sie-wissen-müssen-Buch ist das hier beschriebene ...

http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/

Sie können wahrscheinlich einen PDF-Scan finden, wenn Sie sich umschauen.

IMO, 6502 ist einfacher als Z80 und 68000 ist einfacher als 8086 - regelmäßigere Befehlssätze usw.

Die CPU ist jedoch nur ein Aspekt der Hardware. Auch eine moderne CPU ist ein ganz anderes Biest und erledigt Dinge, die auch aus der Sicht von Compilern transparent sind - wie das Präsentieren eines virtuellen Adressraums.

Ein besonderer Vorteil des 6502 auf dem C64 ist, dass nicht nur die CPU einfach ist, sondern es auch einige sehr einfach gibt, mit Hardware umzugehen. Früher hatte ich großen Spaß daran, mit dem SID-Musikchip herumzuspielen.

Also - es ist wahrscheinlich eine lohnende Übung, wenn Sie nicht zu viel Zeit damit verbringen. Ich habe 6502 Assembler als meine zweite Sprache gelernt, als ich ungefähr 14 Jahre alt war, direkt nach Commodore Basic. Meist geht es jedoch um ein sehr einfaches Arbeitsmodell, mit dem Sie mit einem Minimum an Missverständnissen komplexere Ideen hinzufügen können.

Einige nützliche Dinge, die Sie in Assembler lernen können ...

  • Wie CPU-Register funktionieren.
  • Funktionsweise der Speicheradressierung, einschließlich Indirektion
  • So funktioniert der CPU-Stack
  • Wie bitweise Logik funktioniert.
  • Wie die CPU E / A-Geräte steuert.
  • Wie funktionieren Interrupts?

Ein besonderer Grund, warum ich es empfehlen würde, ist, eine bessere Vorstellung davon zu bekommen, wie einfache Schritte völlig deterministisch und mechanisch und völlig ohne Intelligenz oder gesunden Menschenverstand funktionieren. Grundsätzlich gewöhnt man sich an das imperative Ausführungsmodell in seiner reinsten und eigensinnigsten Form.

Genau wie nützlich es die meisten dieser Dinge jetzt zu wissen , ist, obwohl, ist eine schwierige Frage.

Eine Sache, die Sie nicht lernen werden, ist, wie Sie gut mit einer Erinnerungserbschaft umgehen können. Diese alten Maschinen hatten meist ein einfaches Speichermodell ohne Cache-Schichten und ohne virtuellen Speicher. Sie werden auch nicht viel über Parallelität lernen - sie waren sicherlich Möglichkeiten, damit umzugehen, aber es bedeutete meistens Unterbrechungen. Sie mussten sich nicht um Mutexe usw. kümmern.

Manchmal kann ein mentales Modell, wie diese Dinge einst funktionierten oder wie der Assembler funktioniert, sogar irreführen. Wenn Sie sich beispielsweise einen C-Zeiger als Adresse vorstellen, kann dies zu undefinierten Verhaltensproblemen führen. Ein Wechselstromzeiger wird normalerweise als Ganzzahl implementiert, die eine Adresse enthält, es gibt jedoch keine Garantie dafür, dass dies strikt zutrifft. Beispielsweise können auf einigen bizarren Plattformen unterschiedliche Zeiger auf unterschiedliche Adressräume verweisen. Dies ist wichtig, wenn Sie mit zwei Zeigern arithmetisch oder bitweise logisch arbeiten möchten.

Wenn Sie nicht über eine dieser bizarren Plattformen verfügen, denken Sie vielleicht nicht, dass Ihnen das etwas ausmacht - aber Compiler nutzen heutzutage immer häufiger undefiniertes Verhalten von Standards zur Optimierung aus.

Ein mentales Modell der Systemarchitektur kann also nützlich sein, aber es ist immer noch wichtig, auf die Sprachspezifikation zu codieren, nicht auf ein hypothetisches Modell, das Ihre Sprache und Plattform möglicherweise nicht berücksichtigt.

Eine Menge nützlicher Gedankenmodelle entstehen schließlich, wenn man sich ein Bild davon macht, wie Compiler Code generieren - und die Codegenerierung für moderne Sprachen unterscheidet sich stark von den damals erhältlichen, recht trivialen Compilern.

Dies ist ein Lieblingsbuch von mir dafür ...

http://dickgrune.com/Books/MCD_1st_Edition/

Neben den Themen Parsing und ASTs usw. wird die Codegenerierung für eine Reihe von Sprachparadigmen behandelt - Imperativ, OOP, Funktional, Logik, Parallel und Verteilt - sowie für die Speicherverwaltung. Wenn Sie wissen möchten, wie polymorphe Methodenaufrufe funktionieren, ohne sich in den Details des CPU-Befehlssatzes zu verlieren, ist ein Buch wie dieses Ihr Freund - und in Kürze ist eine neue Ausgabe erhältlich.


Steve - wow. Ich bin mit der Vollständigkeit und dem Fokus Ihrer Antwort auf meine Frage fast sprachlos. Vielen Dank, dass Sie sich die Zeit genommen haben, diese ganze Sache zu schreiben. Ich werde auf jeden Fall Ihre Vorschläge nehmen.
18.

1
Ich würde vorschlagen, dass PDP-11 Assembler ein bisschen besser zu lernen ist als alle anderen erwähnten. Was alle anderen lehren, sind die Einschränkungen, die durch begrenzte Hardwareressourcen und / oder durch ein begrenzteres Hardwaredesign und vorausschauendes Denken erzwungen werden. So etwas wie eine aus der allzu üblichen 8051-Familie lehrt, wie wirklich bizarr das Programmiermodell auf solch begrenzter Hardware werden kann (wo zum Beispiel Steves Erwähnung verschiedener Adressräume ins Spiel kommt).
Greg A. Woods

@ Greg - Ich habe leider nie mit einem PDP-11 gespielt. Noch ein 8051 - Ich habe eine Zeit lang eingebettete Arbeit geleistet, aber dafür wurde ein Chip der 8096-Familie verwendet. Ich habe es mir hier nur angesehen - interessant. Ich habe schon vor einiger Zeit von der Harvard-Architektur gehört, aber ich hatte keine Ahnung, dass es so etwas gibt, das sehr beliebt ist und immer noch verwendet wird.
Steve314

4

Vor zwanzig Jahren war es wichtig, aber jetzt nicht mehr so ​​sehr - es gibt viel mehr Abstraktionsebenen zwischen Software und moderner Hardware.

Es ist nützlich zu wissen, wie man mehrere Threads benötigt, um mehrere Kerne auszunutzen, oder dass es eine schlechte Sache ist, mehr Speicher zu verwenden, als auf dem System vorhanden ist, aber darüber hinaus brauchen Sie es nicht wirklich, es sei denn, es ist Ihre Aufgabe, diese Abstraktion zu schreiben Lagen.

Der Rest Ihrer Frage lässt vermuten, dass Sie sich mehr mit dem Compiler als mit der Hardware beschäftigen, was ein bisschen anders ist. Es kann vorkommen, dass Sie auf Fälle stoßen, in denen es wichtig ist, aber diese sind entweder trivial (unendliche Rekursion funktioniert nicht sehr gut) oder die Art von Randfällen, in denen Sie sich bei der Lösung wohl fühlen können, aber wahrscheinlich nie dasselbe Problem haben nochmal.


Ja, du hast recht, ich bin mehr mit dem Compiler beschäftigt. Vielen Dank für Ihren Vorschlag zu mehreren Threads, mehreren Kernen usw. Es ist nur in meine toLearn-Notizen-Datei eingegangen.
Bis

@bev Multithreading ist einfach zu erlernen. Tun Sie es einfach nicht, es sei denn, Sie müssen es wirklich und tun es auch dann nicht. mehr Ärger als es meiner Erfahrung nach wert ist.
Skeith

@Skeith - danke für den Tipp. Ich merke es mir.
18.

4

Es hilft viel zu wissen und zu verstehen , die Abstraktion von der Hardware vorgestellt, und ein wenig von der allgemeinen Vorstellung davon , wie diese Illusion erzeugt wird - aber wie moderne Hardware , um wirklich zu verstehen versuchen , wirklich funktioniert , ist eine enorme Menge an Arbeit , von dem Sie‘ Es ist wahrscheinlich, dass nur eine minimale Rendite erzielt wird.

Wenn Sie eine kleine Ablenkung verzeihen: Das erinnert mich an etwas, das ich vor ein paar Jahren bemerkt habe. Vor Jahrzehnten (bis in die späten 1970er Jahre) dachten die meisten Menschen, Computer seien ein Stück weit von der Magie entfernt - kaum beeinflusst von den Gesetzen der Physik, fähig zu allen möglichen Dingen, die wenig Sinn machten, und so weiter. Zu der Zeit habe ich ziemlich viel Zeit damit verbracht (meistens erfolglos), die Leute davon zu überzeugen, dass sie keine Magie sind. Es waren wirklich ziemlich gewöhnliche Maschinen, die eine begrenzte Anzahl von Dingen sehr schnell und zuverlässig erledigten, aber ansonsten extrem banal waren.

Heutzutage hat sich die Sichtweise der meisten Menschen auf Computer geändert. Sie sind jetzt ziemlich gewöhnlich - bis zu dem Punkt, dass einige sehr gewöhnliche Leute ein praktisches Verständnis von ihnen haben. Nur zum Beispiel, vor einiger Zeit, als ich zu Abend aß, sah / hörte ich einen Kellner und eine Kellnerin in ihrer Pause darüber diskutieren, was sie in ihren neuen Computer stecken sollte. Der Rat, den er gab, war völlig vernünftig und realistisch.

Aber auch meine Sicht auf Computer hat sich geändert. Ich bin zu Hot Chips gegangen, und davor ging das Mikroprozessor-Forum etwa auf die Mitte der 90er Jahre zurück. Ich weiß wahrscheinlich mehr über Mikroprozessorhardware als mindestens 99% der Programmierer - und wenn ich weiß, was ich tue, sage ich Folgendes: Sie sind nicht mehr gewöhnlich. Sie haben brechen fast die Gesetze der Physik. Ich habe viele Tests auf niedriger Ebene durchgeführt und kann dies mit Sicherheit sagen: Es ist oft unglaublich schwierig, die Illusion zu überwinden, die die CPU erzeugt, und zu zeigen, wie die Hardware wirklich funktioniert. Ich wünschte , ich ein Bild von einem unseren Setups mit einem Computer posten könnte knapp Kabel von nicht begraben weniger als 4 Logikanalysatoren richtig zu messen , eine Aspekt, wie Caching auf einer modernen CPU funktioniert (ganz zu schweigen von einer wirklich anspruchsvollen Programmierung, um sicherzustellen, dass das, was wir gemessen haben, genau das war, was die CPU tat, und sonst nichts).


Jerry - danke für deine Kommentare. Als EE fühle ich mich mit der Transistorebene wohler als mit einigen der höheren Abstraktionsstufen. Ich frage mich nur, was ich wissen muss, um ein guter C ++ - Programmierer zu sein.
Bis

Das Bild klingt interessant. Warum kannst du es nicht posten?
Mason Wheeler

@Bev: Man muss eigentlich nichts auf Transistorebene wissen , um ein guter Programmierer zu sein. Diese Abstraktionen sind aus einem bestimmten Grund vorhanden, und Sie können fast immer davon ausgehen, dass etwas auf einer Abstraktionsebene, die unter der von Maschinencode / Assembly liegt, völlig irrelevant ist, und davon ausgehen, dass es funktioniert.
Mason Wheeler

@MasonWheeler: Ich habe es dort mitgenommen, wo ich früher gearbeitet habe, aber da ich dort nicht mehr arbeite, wäre es wahrscheinlich etwas schwieriger, Zugang dazu zu bekommen (wahrscheinlich nicht unmöglich - ich kündige zu guten Konditionen, aber trotzdem. ..)
Jerry Coffin

1

Verschiedene Sprachen arbeiten auf verschiedenen Abstraktionsebenen von der Hardware. C und C ++ sind sehr niedrig. Bei Skriptsprachen hingegen müssen Sie weniger über die zugrunde liegenden Details wissen.

Ich würde jedoch immer noch sagen, je mehr Sie wissen, desto besser sind Sie als Programmierer. Ein Teil der Programmierung besteht darin, mehrere Abstraktionsebenen gleichzeitig unter einen Hut zu bringen.

Wenn Sie in C ++ programmieren, müssen Sie ziemlich genau wissen, wie eine moderne CPU funktioniert, zumindest auf der Abstraktionsebene, auf der der Compiler arbeitet. (Es gibt Dinge in der CPU, die auch für den Compiler transparent sind).


Scott - mit "einem ziemlich guten Verständnis der Funktionsweise einer modernen CPU" meinen Sie, wie digitale Logik funktioniert (z. B. wie Karnaugh-Maps, Wahrheitstabellen und / ODER / NOR / XOR-Gatter funktionieren)? oder meinst du welche ressourcen der compiler direkt nutzt (also registriert)?
Vor 18.10.11

Mehr wissen ist gut. Der eigentliche Trick ist jedoch zu wissen, welche Art von "mehr" den größten Knall für Ihr Geld bringt. Das Wissen um das Timing von Befehlen wird zum Beispiel keinen großen Nutzen haben, wenn es nahezu unmöglich ist, vorherzusagen, welche Befehle Ihr Compiler verwenden wird. Wenn Sie lernen, wie man einen Profiler verwendet, ergibt sich wahrscheinlich ein viel besseres Kosten-Nutzen-Verhältnis.
Steve314

1
@bev - Nein, ich glaube nicht, dass Sie bis zum Gate-Level runter müssen. Wenn Sie nur die grundlegende Architektur (Speicher, Bus, CPU) kennen, wissen, wie ein Befehl geladen, ausgeführt, das Ergebnis gespeichert usw. wird, sind Sie wahrscheinlich in Ordnung. Sie müssen auch verstehen, wie der Compiler den Speicherplatz eines Programms anordnet, einschließlich der Verwendung des Stacks und des Heapspeichers.
Scott Whitlock

@ScottWhitlock - Danke - das ist genau die Art von Empfehlungen, nach denen ich gesucht habe.
18.

0

Ich möchte einen Punkt über das allgemeine Design übergeordneter Sprachen wie C hinzufügen.

Allgemein kann man sagen, dass solche Sprachen als Implementierung einer abstrakten Maschine angesehen werden können, und Dennis Ritchie selbst hat auf diese Weise beschrieben, wie C funktioniert und wie das spezielle Design der abstrakten Maschine von C es zu einer portableren Sprache gemacht hat. Insofern kann ein gewisses Verständnis der Computerarchitektur und der Funktionsweise auf Maschinenebene äußerst hilfreich sein, um auch die abstrakte Maschine einer Sprache zu verstehen.

DMRs Arbeit Portability of C Programs and the UNIX System ist das erste, an das ich mich erinnere, das (abstrakte) Maschinenmodell für C. zu diskutieren.

Ich denke, DMRs Artikel über die Geschichte und Entwicklung von C ist auch äußerst nützlich, um zu zeigen, wie echte Hardware das Sprachdesign beeinflusst, und ist vielleicht auch ein Beispiel für frühes Programmiersprachendesign: Die Entwicklung der C-Sprache


Da Sie neu hier sind, glauben Sie anscheinend, dies sei ein Forum, das ist es mit Sicherheit nicht. Ihre Antworten auf eine Frage sollten kein Punkt sein, den Sie hinzufügen, der auf Kommentare verwiesen werden sollte, und Sie sollten versuchen, eine umfassende Antwort direkt auf die Frage zu geben. Das heißt, Sie machen einen guten Punkt und dies ist wertvoll für die Themeninformationen. Wenn Sie vielleicht ein paar Zeilen in diese Antwort einfügen könnten, wäre die Frage zusammen mit dieser Erklärung großartig. Coole Infos, die Sie hier teilen. Willkommen bei Programmierern!
Jimmy Hoffa

Kommentare sind nicht versioniert und nicht permanent und können daher nicht zu einer Reihe von Antworten hinzugefügt werden. Die meisten Poster ignorieren häufig die Verwendung von Kommentaren, um ihre Antworten zu aktualisieren, und die meisten Antworten sind nicht als "Community-Wiki" -Antworten gekennzeichnet und können daher nicht von anderen so bearbeitet werden, dass die Zuordnung zu den nachfolgenden Mitwirkenden beibehalten wird. . Außerdem hat diese spezielle Frage eine echte Diskussion ausgelöst, und ob sie Ihnen gefällt oder nicht, so laufen einige dieser Dinge ab. Der Versuch, jeden Beitrag in eine Form zu zwingen, ist ein schwerwiegender Misserfolg des Stack-Exchange-Konzepts.
Greg A. Woods

Übrigens habe ich die einzig wahre Frage aus dem OP implizit beantwortet: Man sollte genug Verständnis für Hardware haben, um die abstrakte Maschine im Kern des Sprachentwurfs modellieren zu können.
Greg A. Woods
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.