Cel mai bun răspuns
Gândește-te la un automobil. Putem (și de multe ori) conducem un automobil fără să înțelegem cum funcționează. Majoritatea oamenilor nu se uită niciodată la motorul mașinii, care trăiește sub capotă (o numim capotă în America, dar, de exemplu, oamenii din Marea Britanie o numesc capotă ).
Pe lângă motor, există o transmisie , care preia puterea generată de motor și o transmite la trenul de transmisie , care ia în cele din urmă acea putere și întoarce roțile. Majoritatea oamenilor nu înțeleg niciunul dintre aceste detalii și nici nu au nevoie pentru a opera un automobil.
În calitate de programator, este adesea util să știi ce se întâmplă sub capotă, deoarece îți oferă informații în lucruri pe care nu le puteți vedea.
Două exemple Python care se pot dovedi utile:
Variabilele în Python sunt deseori explicate către programatorii începători ca fiind casete numite în care puteți plasa date. Deci, atunci când scrieți
x = 1
, efectiv, creați o casetă, o denumiți x
și punerea unui 1 în casetă. Când inspectați ulterior caseta, veți găsi că există un 1 în ea.
Cu toate acestea, asta nu se întâmplă de fapt sub capotă . Variabila x este o referință sau o etichetă care vă arată unde este stocat efectiv 1 în memorie. Gândiți-vă la o notă lipicioasă cu un „x” pe ea, care este blocat pe cutia care conține 1. Dacă decideți să puneți altceva în cutie, poate un 2, Python va crea o cutie nouă și va muta lipiciosul nota de la prima casetă la a doua. Acest lucru este ușor de demonstrat folosind funcția id()
a lui Python, care îmi spune efectiv unde locuiește un obiect în memoria Python (asta nu este strict adevărat, dar necesită o digresiune care nu mai este utilă pentru a răspunde la întrebare).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Puteți vedea că x
se afla într-un anumit loc și când I-am schimbat conținutul, x
s-a mutat de fapt. De ce se întâmplă acest lucru este o altă divagare care, de asemenea, nu este importantă aici. Faptul este că x s-a mutat în sensul că datele la care se referă x se află acum într-un alt loc.
Programatorii începători Python nu știu acest lucru și, mai important, nu trebuie să știe acest lucru . Este perfect să folosiți analogia unei casete numite.
Al doilea exemplu este mai complex și va fi dificil de înțeles pentru noii veniți.
Modelul de date Python mapează o serie de așa-numitele funcții integrate la metodele de clasă sub capotă . Îmi place să-l explic folosind emisiunea TV Stranger Things ca punct de referință. În acea emisiune, există un invers jos , care este ca un univers alternativ în care lucrurile sunt recunoscute, dar încurcate. Luați în considerare funcția Python len()
. Aceasta este listată în manual ca Funcție încorporată care returnează numărul de elemente din ceva. Puteți calcula lungimea unui string
(care este un container ), un list
(de asemenea, un container) și așa mai departe.
Programatorii Python începători sunt de obicei învățați că len()
este pur și simplu o funcție încorporată și funcționează pe orice container. De fapt, ceea ce se întâmplă sub capotă este că Python traduce un apel către len()
într-o metodă din pe dos numit \_\_len\_\_()
. Dacă obiectul pe care îl treceți la len()
are o metodă \_\_len\_\_()
, acesta va funcționa. Dacă nu, nu va fi. Acesta este motivul pentru care, de exemplu, nu se poate apela len()
pe un întreg:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
Programatorul inițial Python înțelege că acest lucru înseamnă că un întreg nu este un container și, prin urmare, acest lucru nu trebuie contat.Dar este ușor să creăm un tip întreg pentru care putem apela funcția len()
:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Am creat un nou tip numit MyInt
, am definit o variabilă x
de tip MyInt
și a putut apela len()
. len()
este destul de inutil (), dar dovedește faptul că len()
poate fi apelat pentru orice obiect, nu doar pentru un „container”. ” În practică, ca programator, aș putea crea propriul meu obiect Organization
, care reprezintă o afacere sau altă organizație. și aș putea dori să pot apela len()
pe un obiect Organization
și să-i returnez numărul de ani în care organizația a existat .
Deci, înțelegând ce se întâmplă sub capotă, putem merge mai departe ca programatori.
Răspuns
Cred că alții au dat explicații bune despre ce „ sub capotă ”înseamnă în general.
Câteva note de clarificat: un computer, în forma sa cea mai simplă, este procesorul și memoria principală. Procesoarele citesc instrucțiuni foarte particulare și mută valorile din memorie. Memoria este împărțită în nenumărate celule, fiecare celulă are o adresă.
„Sub capotă” memoria computerului dvs. arată astfel:
(Sursa: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Când lucrați într-un limbaj de nivel înalt (presupun că lucrați cu Java sau Python sau ceva similar) este greu de înțeles de ce lucrurile sunt așa cum sunt. De exemplu, să luăm în considerare o listă legată. Este posibil să vi se fi afișat o imagine cu bule cu numere în ele, cu o săgeată care arăta spre o altă bulă alături.
Ceva asemănător:
Acest lucru este foarte bun pentru a înțelege modul în care funcționează listele legate în comparație cu, de exemplu, o matrice; cu toate acestea, „sub capotă” este mult diferit.
Așa cum am spus, totul în computer este celule de memorie cu valori. Un nod de listă conectat, deși este vizualizat lângă vecinul său, poate fi la sute sau mii de octeți distanță de vecinul său. Sub capotă, săgețile pe care le vedeți în imagine sunt de fapt indicatori, iar un indicator poate face referire la orice celulă din memorie. În special, indicatorul face referire la adresa următorului nod din listă.
Sper că acest exemplu vă va ajuta să clarificați despre ce vorbește.