Cosa significa ' sotto il cofano ' vuoi dire nella programmazione?

La migliore risposta

Pensa a unautomobile. Possiamo (e spesso lo facciamo) guidare unautomobile senza capire come funziona. La maggior parte delle persone non guarda mai il motore dellauto, che vive sotto il cofano (in America lo chiamiamo cofano , ma ad esempio gli inglesi lo chiamano bonnet ).

Oltre al motore, cè una trasmissione , che prende la potenza generata dal motore e la trasmette alla trasmissione , che alla fine prende quel potere e fa girare le ruote. La maggior parte delle persone non comprende nessuno di questi dettagli, né ne ha bisogno per far funzionare unautomobile.

In qualità di programmatore, è spesso utile sapere cosa sta succedendo sotto il cofano, perché ti dà unidea in cose che non puoi vedere.

Due esempi di Python che possono rivelarsi utili:

Le variabili in Python sono spesso spiegate ai programmatori principianti come caselle denominate in cui è possibile inserire i dati. Quindi, quando scrivi

x = 1

stai, in effetti, creando una scatola, denominandola x e inserendo un 1 nella casella. Quando successivamente ispezionerai la scatola, scoprirai che contiene un 1.

Tuttavia, non è proprio quello che sta succedendo sotto il cofano . La variabile x è un riferimento o unetichetta che ti dice dove l1 è effettivamente archiviato in memoria. Pensa a una nota adesiva con una “x” incollata sulla scatola che contiene 1. Se decidi di mettere qualcosaltro nella scatola, forse un 2, Python creerà una nuova scatola e sposterà nota dalla prima casella alla seconda. Questo è facile da dimostrare usando la funzione id() di Python, che mi dice efficacemente dove vive un oggetto nella memoria di Python (questo non è strettamente vero, ma richiede una digressione che non è più utile per rispondere alla domanda).

>>> x = 1

>>> id(x)

4501308752

>>> x = 2

>>> id(x)

4501308784

Puoi vedere che x si trovava in un determinato posto e quando Ho cambiato il suo contenuto, x effettivamente spostato. Perché questo accade è unaltra digressione che anche qui non è importante. Il fatto è che x si è spostato nel senso che i dati a cui si riferisce x sono ora in un posto diverso.

I programmatori Python alle prime armi non lo sanno e, cosa più importante, non hanno bisogno di saperlo . Va benissimo usare lanalogia di una scatola con nome.

Il secondo esempio è più complesso e sarà potenzialmente difficile da capire per i nuovi arrivati.

Il modello di dati Python mappa un numero di cosiddette funzioni incorporate ai metodi di classe sotto il cofano . Mi piace spiegarlo usando il programma televisivo Stranger Things come punto di riferimento. In quello spettacolo, cè un rialzo giù , che è come un universo alternativo in cui le cose sono riconoscibili, ma incasinate. Considera la funzione Python len() . Questo è elencato nel manuale come una Funzione incorporata che restituisce il numero di elementi in qualcosa. Puoi calcolare la lunghezza di un string (che è un contenitore ), un list (anche un contenitore) e così via.

Ai programmatori Python alle prime armi viene solitamente insegnato che len() è semplicemente una funzione incorporata e funziona su qualsiasi contenitore. In effetti, ciò che accade sotto il cofano è che Python traduce una chiamata a len() in un metodo nel capovolto chiamato \_\_len\_\_(). Se loggetto che passi a len() ha un metodo \_\_len\_\_(), funzionerà. In caso contrario, non lo farà. Questo è il motivo per cui, ad esempio, non è possibile chiamare len() su un numero intero:

>>> len(5)

Traceback (most recent call last):

File "", line 1, in

TypeError: object of type "int" has no len()

Il programmatore Python principiante capisce che questo significa che un intero non è un contenitore, e quindi questo non ha nulla da contare.Ma è facile creare un tipo intero per il quale possiamo chiamare la funzione len():

>>> class MyInt(int):

... # create an "upside down" method for len()

... def \_\_len\_\_(self):

... return 1

...

>>> x = MyInt(13)

>>> x

13

>>> len(x)

1

Ho creato un nuovo tipo chiamato MyInt, definito una variabile x di tipo MyInt ed è stato in grado di chiamare len(). Il mio len() è piuttosto inutile (), ma dimostra il punto che len() può essere chiamato per qualsiasi oggetto, non solo per un “contenitore. ” In pratica, come programmatore, potrei creare il mio oggetto Organization, che rappresenta unazienda o unaltra organizzazione. e potrei voler chiamare len() su un oggetto Organization e fare in modo che restituisca il numero di anni in cui lorganizzazione è esistita .

Quindi, comprendendo cosa sta succedendo sotto il cofano, possiamo andare oltre come programmatori.

Risposta

Penso che altri abbiano dato buone spiegazioni di cosa ” sotto il cofano “significa in generale.

Alcune note per chiarire: un computer, nella sua forma più semplice, è il processore e la memoria principale. I processori leggono istruzioni molto particolari e spostano i valori in memoria. La memoria è suddivisa in innumerevoli celle, ogni cella ha un indirizzo.

“Sotto il cofano” la memoria del tuo computer ha questo aspetto:

(Fonte: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)

Quando lavori in un linguaggio di alto livello (presumo tu stia lavorando con Java o Python o qualcosa di simile) è difficile capire perché le cose stanno come sono. Ad esempio, consideriamo un elenco collegato. È possibile che ti sia stata mostrata unimmagine di bolle con dei numeri e una freccia che punta a unaltra bolla accanto.

Qualcosa del genere:

Tutto questo va bene per capire come funzionano le liste concatenate rispetto, diciamo, a un array; tuttavia, “sotto il cofano” è molto diverso.

Come abbiamo detto, tutto nel computer sono celle di memoria con valori. Un nodo della lista collegata, sebbene visualizzato vicino al suo vicino, può trovarsi a centinaia o migliaia di byte di distanza dal suo vicino. Dietro le quinte, le frecce che vedi nellimmagine sono in realtà dei puntatori e un puntatore può fare riferimento a qualsiasi cella in memoria. In particolare, il puntatore fa riferimento allindirizzo del nodo successivo nellelenco.

Spero che questo esempio aiuti a chiarire di cosa sta parlando.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *