Beste antwoord
Denk aan een auto. We kunnen (en doen dat vaak) in een auto rijden zonder te begrijpen hoe het werkt. De meeste mensen kijken nooit naar de motor van de auto, die onder de motorkap leeft (we noemen het de motorkap in Amerika, maar Britse mensen noemen het bijvoorbeeld de motorkap ).
Naast de motor is er een transmissie , dat het door de motor gegenereerde vermogen opneemt en verzendt naar de aandrijflijn , die uiteindelijk dat vermogen pakt en de wielen laat draaien. De meeste mensen begrijpen geen van deze details, en dat is ook niet nodig om een auto te besturen.
Als programmeur is het vaak handig om te weten wat er onder de motorkap gebeurt, omdat het je inzicht geeft in dingen die u niet kunt zien.
Twee Python-voorbeelden die nuttig kunnen zijn:
Variabelen in Python worden vaak uitgelegd voor beginnende programmeurs als benoemde vakken waarin u gegevens kunt plaatsen. Dus als je schrijft
x = 1
ben je in feite een box aan het maken met de naam x
, en een 1 in de doos plaatsen. Wanneer u de doos later inspecteert, ziet u dat er een 1 in zit.
Dat is echter niet wat er gebeurt onder de motorkap . De variabele x is een referentie of label die u vertelt waar de 1 feitelijk in het geheugen is opgeslagen. Denk aan een notitie met een x erop, die op de doos met de 1 wordt geplakt. Als je besluit iets anders in de doos te doen, misschien een 2, zal Python een geheel nieuwe doos maken en de sticky verplaatsen. opmerking van het eerste vak naar het tweede. Dit is gemakkelijk te demonstreren met de functie id()
van Python, die me effectief vertelt waar een object in het geheugen van Python leeft (dat is niet helemaal waar, maar het vereist een uitweiding die niet langer nuttig is voor het beantwoorden van de vraag).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Je kunt zien dat x
zich op een bepaalde plaats bevond en wanneer Ik heb de inhoud gewijzigd, x
daadwerkelijk verplaatst. Waarom dit gebeurt, is nog een uitweiding die hier ook niet belangrijk is. Het is een feit dat x verplaatst is in de zin dat de gegevens waarnaar x verwijst nu op een andere plaats staan.
Beginnende Python-programmeurs weten dit niet en wat nog belangrijker is, ze hoeven dit niet te weten . Het is prima om de analogie van een vak met naam te gebruiken.
Het tweede voorbeeld is complexer en zal mogelijk moeilijk te begrijpen zijn voor nieuwkomers.
Het Python Data Model wijst een aantal zogenaamde ingebouwde functies toe aan klassemethoden onder de motorkap . Ik leg het graag uit met het tv-programma Stranger Things als referentiepunt. In die show is er een upside down , die lijkt op een alternatief universum waarin dingen zijn herkenbaar, maar in de war. Beschouw de Python len()
-functie. Dit wordt in de handleiding vermeld als een ingebouwde functie die het aantal elementen in iets teruggeeft. U kunt de lengte berekenen van een string
(dit is een container ), een list
(ook een container), enzovoort.
Beginnende Python-programmeurs wordt doorgaans geleerd dat len()
gewoon een ingebouwde functie is en dat het werkt op elke container. Wat er in feite onder de motorkap gebeurt, is dat Python een aanroep naar len()
vertaalt naar een methode in de ondersteboven genaamd \_\_len\_\_()
. Als het object dat u doorgeeft aan len()
een \_\_len\_\_()
-methode heeft, zal deze werken. Zo niet, dan niet. Dit is de reden waarom men bijvoorbeeld len()
niet kan aanroepen op een geheel getal:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
De beginnende Python-programmeur begrijpt dat dit betekent dat een geheel getal geen container is, en daarom is dit niets om te tellen.Maar het is gemakkelijk om een integer-type te maken waarvoor we de len()
-functie kunnen aanroepen:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Ik heb een nieuw type gemaakt met de naam MyInt
, een variabele gedefinieerd x
van het type MyInt
, en kon len()
aanroepen. Mijn len()
is behoorlijk nutteloos (), maar het bewijst het punt dat len()
kan worden aangeroepen voor elk object, niet alleen voor een “container. ” In de praktijk zou ik als programmeur mijn eigen object Organization
kunnen maken, dat een bedrijf of een andere organisatie vertegenwoordigt. en misschien wil ik len()
op een Organization
-object kunnen bellen en het het aantal jaren dat de organisatie bestaat, terug laten geven .
Dus door te begrijpen wat er zich onder de motorkap afspeelt, kunnen we verder gaan als programmeurs.
Antwoord
Ik denk dat anderen een goede uitleg hebben gegeven van wat ” onder de motorkap ”betekent in het algemeen.
Enkele opmerkingen ter verduidelijking: een computer, in zijn eenvoudigste vorm, is de processor en het hoofdgeheugen. Processors lezen zeer specifieke instructies en verplaatsen de waarden in het geheugen. Het geheugen is opgesplitst in talloze cellen, elke cel heeft een adres.
“Onder de motorkap” ziet het geheugen van je computer er als volgt uit:
(Bron: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Wanneer u in een taal op hoog niveau werkt (ik neem aan dat u werkt met Java of Python of iets soortgelijks) is het moeilijk te begrijpen waarom de dingen zijn zoals ze zijn. Laten we bijvoorbeeld eens kijken naar een gelinkte lijst. Mogelijk hebt u een afbeelding gekregen van bellen met nummers erin met een pijl die naar een andere ballon wijst.
Zoiets:
Dit is allemaal goed en wel om te begrijpen hoe gekoppelde lijsten werken in vergelijking met bijvoorbeeld een array; “onder de motorkap” is het echter heel anders.
Zoals we al zeiden, alles in de computer bestaat uit geheugencellen met waarden. Een verbonden lijstknooppunt, hoewel gevisualiseerd in de buurt van zijn buur, kan honderden of duizenden bytes verwijderd zijn van zijn buurman. Onder de motorkap zijn de pijlen die u in de afbeelding ziet in feite aanwijzers, en een aanwijzer kan naar elke cel in het geheugen verwijzen. In het bijzonder verwijst de aanwijzer naar het adres van het volgende knooppunt in de lijst.
Ik hoop dat dit voorbeeld helpt te verduidelijken waar hij het over heeft.