La mejor respuesta
Piense en un automóvil. Podemos (y a menudo lo hacemos) conducir un automóvil sin entender cómo funciona. La mayoría de la gente nunca mira el motor del automóvil, que vive debajo del capó (lo llamamos capó en Estados Unidos, pero, por ejemplo, los británicos lo llaman el capó ).
Además del motor, hay una transmisión , que toma la energía generada por el motor y la transmite al transmisión , que en última instancia toma ese poder y hace girar las ruedas. La mayoría de las personas no comprenden ninguno de estos detalles, ni los necesitan para operar un automóvil.
Como programador, a menudo es útil saber qué está sucediendo bajo el capó, porque le brinda información en cosas que no puede ver.
Dos ejemplos de Python que pueden resultar útiles:
Variables en Python se explican a menudo a los programadores principiantes como cajas con nombre en las que puede colocar datos. Entonces, cuando escribes
x = 1
estás, en efecto, creando un cuadro, nombrándolo x
y poner un 1 en la casilla. Cuando más tarde inspeccione la caja, encontrará que hay un 1 en ella.
Sin embargo, eso no es realmente lo que está sucediendo debajo del capó . La variable x es una referencia o etiqueta que le dice dónde está realmente almacenado el 1 en la memoria. Piense en una nota adhesiva con una x, que está pegada en el cuadro que contiene el 1. Si decide poner algo más en el cuadro, tal vez un 2, Python creará un cuadro nuevo y moverá el cuadro adhesivo nota de la primera casilla a la segunda. Esto es fácil de demostrar usando la función id()
de Python, que efectivamente me dice dónde vive un objeto en la memoria de Python (eso no es estrictamente cierto, pero requiere una digresión que ya no es útil para responder la pregunta).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Puede ver que x
estaba en un lugar determinado y cuando Cambié su contenido, x
realmente se movió. Por qué sucede esto es otra digresión que tampoco es importante aquí. El hecho es que x se movió en el sentido de que los datos a los que x se refiere ahora están en un lugar diferente.
Los programadores principiantes de Python no saben esto y, lo que es más importante, no necesitan saber esto . Está perfectamente bien usar la analogía de una caja con nombre.
El segundo ejemplo es más complejo y será potencialmente difícil de entender para los recién llegados.
El modelo de datos de Python asigna una serie de las llamadas funciones integradas a métodos de clase bajo el capó . Me gusta explicarlo usando el programa de televisión Stranger Things como punto de referencia. En ese programa, hay un upside down , que es como un universo alternativo en el que las cosas son reconocibles, pero están desordenadas. Considere la función Python len()
. Esto se enumera en el manual como una función incorporada que devuelve el número de elementos en algo. Puede calcular la longitud de un string
(que es un contenedor ), un list
(también un contenedor), y así sucesivamente.
A los programadores principiantes de Python normalmente se les enseña que len()
es simplemente una función incorporada y funciona en cualquier contenedor. De hecho, lo que sucede bajo el capó es que Python traduce una llamada a len()
a un método en el boca abajo llamado \_\_len\_\_()
. Si el objeto que pasa a len()
tiene un método \_\_len\_\_()
, funcionará. Si no, no lo hará. Por eso, por ejemplo, no se puede llamar a len()
en un número entero:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
El programador principiante de Python entiende que esto significa que un entero no es un contenedor y, por lo tanto, no hay nada que contar.Pero es fácil crear un tipo entero para el que podemos llamar a la función len()
:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Creé un nuevo tipo llamado MyInt
, definí una variable x
de tipo MyInt
, y pudo llamar a len()
. Mi len()
es bastante inútil (), pero demuestra el punto de que len()
se puede llamar para cualquier objeto, no solo un “contenedor. » En la práctica, como programador, podría crear mi propio objeto Organization
, que representa una empresa u otra organización. y es posible que desee poder llamar a len()
en un objeto Organization
y que devuelva la cantidad de años que la organización ha existido .
Entonces, al comprender lo que está sucediendo bajo el capó, podemos ir más lejos como programadores.
Respuesta
Creo que otros han dado buenas explicaciones de lo que “ bajo el capó ”significa en general.
Algunas notas para aclarar: una computadora, en su forma más simple, es el procesador y la memoria principal. Los procesadores leen instrucciones muy particulares y mueven los valores en la memoria. La memoria se divide en innumerables celdas, cada celda tiene una dirección.
“Bajo el capó” la memoria de su computadora se ve así:
(Fuente: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Cuando se trabaja en un lenguaje de alto nivel (supongo que está trabajando con Java o Python o algo similar) es difícil entender por qué las cosas son como son. Por ejemplo, consideremos una lista vinculada. Es posible que se le haya mostrado una imagen de burbujas con números con una flecha apuntando a otra burbuja junto a ella.
Algo así:
Todo esto está muy bien para entender cómo funcionan las listas enlazadas en comparación con, digamos, una matriz; sin embargo, «bajo el capó» es muy diferente.
Como dijimos, todo en la computadora son celdas de memoria con valores. Un nodo de lista vinculado, aunque se visualiza cerca de su vecino, puede estar a cientos o miles de bytes de su vecino. Debajo del capó, las flechas que ve en la imagen son en realidad punteros, y un puntero puede hacer referencia a cualquier celda en la memoria. En particular, el puntero hace referencia a la dirección del siguiente nodo de la lista.
Espero que este ejemplo ayude a aclarar de qué está hablando.