Beste Antwort
Denken Sie an ein Auto. Wir können (und tun es oft) ein Auto fahren, ohne zu verstehen, wie es funktioniert. Die meisten Leute schauen nie auf den Motor des Autos, der unter der Motorhaube lebt (wir nennen ihn die Motorhaube in Amerika, aber zum Beispiel nennen es die Briten die Motorhaube ).
Zusätzlich zum Motor gibt es ein Getriebe , der die vom Motor erzeugte Leistung aufnimmt und sie an den Antriebsstrang überträgt, was letztendlich diese Kraft nimmt und die Räder dreht. Die meisten Menschen verstehen keines dieser Details und müssen es auch nicht, um ein Auto zu bedienen.
Als Programmierer ist es oft hilfreich zu wissen, was unter der Haube passiert, weil es Ihnen Einblicke gibt
Zwei Python-Beispiele, die sich als hilfreich erweisen können:
Variablen in Python werden häufig erläutert Anfängern von Programmierern als benannte Felder , in die Sie Daten einfügen können. Wenn Sie also
x = 1
schreiben, erstellen Sie praktisch eine Box und nennen sie x
und eine 1 in die Box geben. Wenn Sie die Box später inspizieren, werden Sie feststellen, dass sich darin eine 1 befindet.
Dies ist jedoch nicht der Fall unter der Haube . Die Variable x ist eine Referenz oder eine Bezeichnung, die angibt, wo die 1 tatsächlich im Speicher gespeichert ist. Stellen Sie sich eine Haftnotiz mit einem x vor, die auf der Schachtel mit der 1 klebt. Wenn Sie sich entscheiden, etwas anderes in die Schachtel zu legen, vielleicht eine 2, erstellt Python eine brandneue Schachtel und verschiebt die Haftnotiz Notiz vom ersten bis zum zweiten Feld. Dies lässt sich leicht mit der Funktion id()
von Python demonstrieren, mit der ich effektiv feststellen kann, wo sich ein Objekt im Speicher von Python befindet (das ist nicht unbedingt der Fall, erfordert jedoch einen Exkurs, der nicht mehr hilfreich ist zur Beantwortung der Frage).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Sie können sehen, dass x
an einem bestimmten Ort war und wann Ich habe den Inhalt geändert, x
ist tatsächlich verschoben worden. Warum dies geschieht, ist ein weiterer Exkurs, der auch hier nicht wichtig ist. Tatsache ist, dass x in dem Sinne verschoben wurde, dass sich die Daten, auf die sich x bezieht, jetzt an einer anderen Stelle befinden.
Anfängliche Python-Programmierer wissen dies nicht und, was noch wichtiger ist, das müssen sie nicht wissen . Es ist vollkommen in Ordnung, die Analogie einer benannten Box zu verwenden.
Das zweite Beispiel ist komplexer und für Neulinge möglicherweise schwer zu verstehen.
Das Python-Datenmodell ordnet eine Reihe von sogenannten integrierten Funktionen Klassenmethoden unter der Haube zu. Ich erkläre es gerne anhand der TV-Show Stranger Things als Bezugspunkt. In dieser Show gibt es eine Oberseite unten , die wie ein alternatives Universum ist, in dem Dinge sind erkennbar, aber durcheinander. Betrachten Sie die Python-Funktion len()
. Dies wird im Handbuch als integrierte Funktion aufgeführt, die die Anzahl der Elemente in etwas zurückgibt. Sie können die Länge eines string
(der ein -Container ist), eines (auch ein Container) usw.
Anfängliche Python-Programmierer lernen normalerweise, dass len()
einfach eine integrierte Funktion ist und funktioniert jeder Behälter. Tatsächlich passiert unter der Haube , dass Python einen Aufruf von len()
in eine Methode im verkehrt herum genannt \_\_len\_\_()
. Wenn das Objekt, das Sie an len()
übergeben, eine \_\_len\_\_()
-Methode hat, funktioniert es. Wenn nicht, wird es nicht. Aus diesem Grund kann beispielsweise len()
nicht für eine Ganzzahl aufgerufen werden:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
Der beginnende Python-Programmierer versteht dies so, dass eine Ganzzahl kein Container ist und daher nichts zu zählen ist.Es ist jedoch einfach, einen Ganzzahltyp zu erstellen, für den wir die Funktion len()
aufrufen können:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Ich habe einen neuen Typ namens MyInt
erstellt und eine Variable x
vom Typ MyInt
und konnte len()
aufrufen. Mein len()
ist ziemlich nutzlos (), aber es beweist, dass len()
für jedes Objekt aufgerufen werden kann, nicht nur für einen „Container“. ” In der Praxis kann ich als Programmierer mein eigenes Objekt Organization
erstellen, das ein Unternehmen oder eine andere Organisation darstellt. und ich möchte möglicherweise in der Lage sein, len()
für ein Organization
-Objekt aufzurufen und die Anzahl der Jahre zurückzugeben, in denen die Organisation existiert
Wenn wir also verstehen, was unter der Haube vor sich geht, können wir als Programmierer weiter gehen.
Antwort
Ich denke, andere haben gute Erklärungen gegeben, was “ unter der Haube “bedeutet im Allgemeinen.
Einige Anmerkungen zur Verdeutlichung: Ein Computer ist in seiner einfachsten Form der Prozessor und der Hauptspeicher. Prozessoren lesen ganz bestimmte Anweisungen und verschieben die Werte im Speicher. Der Speicher ist in unzählige Zellen aufgeteilt, jede Zelle hat eine Adresse.
„Unter der Haube“ Der Speicher Ihres Computers sieht folgendermaßen aus:
(Quelle: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Wenn Sie in einer Hochsprache arbeiten (ich nehme an, Sie arbeiten mit Java oder Python oder etwas ähnliches) es ist schwer zu verstehen, warum die Dinge so sind, wie sie sind. Betrachten wir beispielsweise eine verknüpfte Liste. Möglicherweise wurde Ihnen ein Bild von Blasen mit Zahlen gezeigt, wobei ein Pfeil auf eine andere Blase daneben zeigt.
So ähnlich:
Dies ist alles gut und schön, um zu verstehen, wie verknüpfte Listen im Vergleich zu beispielsweise einem Array funktionieren. „Unter der Haube“ ist es jedoch ganz anders.
Wie gesagt, alles im Computer sind Speicherzellen mit Werten. Ein verknüpfter Listenknoten kann, während er in der Nähe seines Nachbarn angezeigt wird, Hunderte oder Tausende von Bytes von seinem Nachbarn entfernt sein. Unter der Haube sind die Pfeile, die Sie im Bild sehen, tatsächlich Zeiger, und ein Zeiger kann auf jede Zelle im Speicher verweisen. Insbesondere verweist der Zeiger auf die Adresse des nächsten Knotens in der Liste.
Ich hoffe, dieses Beispiel hilft zu klären, wovon er spricht.