Melhor resposta
Pense em um automóvel. Podemos (e frequentemente fazemos) dirigir um automóvel sem entender como ele funciona. A maioria das pessoas nunca olha para o motor do carro, que vive sob o capô (nós o chamamos de capô na América, mas, por exemplo, os britânicos o chamam de capô ).
Além do motor, há uma transmissão , que pega a potência gerada pelo motor e a transmite ao trem de força , que no final das contas pega esse poder e gira as rodas. A maioria das pessoas não entende nenhum desses detalhes, nem precisa para operar um automóvel.
Como um programador, muitas vezes é útil saber o que está acontecendo por baixo do capô, porque dá uma ideia em coisas que você não pode ver.
Dois exemplos de Python que podem ser úteis:
Variáveis em Python são frequentemente explicadas para programadores iniciantes como sendo caixas nomeadas nas quais você pode colocar dados. Então, quando você escreve
x = 1
você está, na verdade, criando uma caixa, nomeando-a x
, e colocando um 1 na caixa. Quando você inspecionar a caixa posteriormente, verá que há um 1 nela.
No entanto, não é exatamente isso que está acontecendo sob o capô . A variável x é uma referência ou rótulo que informa onde o 1 está realmente armazenado na memória. Pense em uma nota adesiva com um x nela, que está presa na caixa contendo o 1. Se você decidir colocar outra coisa na caixa, talvez um 2, o Python criará uma caixa totalmente nova e moverá o adesivo observe da primeira caixa para a segunda. Isso é fácil de demonstrar usando a função id()
do Python, que me diz efetivamente onde um objeto vive na memória do Python (isso não é estritamente verdadeiro, mas requer uma digressão que não é mais útil para responder à pergunta).
>>> x = 1
>>> id(x)
4501308752
>>> x = 2
>>> id(x)
4501308784
Você pode ver que x
estava em um determinado lugar e quando Mudei seu conteúdo, x
realmente movido. Por que isso acontece é outra digressão que também não é importante aqui. O fato é que x mudou no sentido de que os dados aos quais x se refere agora estão em um lugar diferente.
Os programadores iniciantes em Python não sabem disso e, mais importante, eles não precisam saber disso . É perfeitamente normal usar a analogia de uma caixa com nome.
O segundo exemplo é mais complexo e potencialmente difícil para os iniciantes entenderem.
O Modelo de Dados Python mapeia uma série das chamadas funções embutidas para métodos de classe nos bastidores . Gosto de explicar usando o programa de TV Stranger Things como ponto de referência. Nesse programa, há uma upside down , que é como um universo alternativo no qual as coisas são reconhecíveis, mas bagunçadas. Considere a função Python len()
. Isso está listado no manual como uma Função interna que retorna o número de elementos em algo. Você pode calcular o comprimento de um string
(que é um contêiner ), um list
(também um contêiner) e assim por diante.
Os programadores iniciantes em Python geralmente aprendem que len()
é simplesmente uma função embutida e funciona em qualquer recipiente. Na verdade, o que acontece sob o capô é que Python traduz uma chamada para len()
para um método no de cabeça para baixo chamado \_\_len\_\_()
. Se o objeto que você passar para len()
tiver um método \_\_len\_\_()
, ele funcionará. Se não, não vai. É por isso que, por exemplo, não se pode chamar len()
em um número inteiro:
>>> len(5)
Traceback (most recent call last):
File "
TypeError: object of type "int" has no len()
O programador iniciante em Python entende que isso significa que um inteiro não é um contêiner e, portanto, não há nada para contar.Mas é fácil criar um tipo inteiro para o qual podemos chamar a função len()
:
>>> class MyInt(int):
... # create an "upside down" method for len()
... def \_\_len\_\_(self):
... return 1
...
>>> x = MyInt(13)
>>> x
13
>>> len(x)
1
Eu criei um novo tipo chamado MyInt
, defini uma variável x
do tipo MyInt
, e foi capaz de chamar len()
. Meu len()
é bastante inútil (), mas prova que len()
pode ser chamado para qualquer objeto, não apenas um “contêiner. ” Na prática, como programador, posso criar meu próprio objeto Organization
, que representa uma empresa ou outra organização. e talvez eu queira chamar len()
em um objeto Organization
e fazer com que ele retorne o número de anos que a organização existe .
Então, ao entender o que está acontecendo nos bastidores, podemos ir mais longe como programadores.
Resposta
Acho que outros deram boas explicações sobre o que “ debaixo do capô ”significa em geral.
Algumas notas para esclarecer: um computador, em sua forma mais simples, é o processador e a memória principal. Os processadores lêem instruções muito específicas e movem os valores na memória. A memória é dividida em inúmeras células, cada célula tem um endereço.
“Sob o capô”, a memória do seu computador tem esta aparência:
(Fonte: https://chortle.ccsu.edu/AssemblyTutorial/Chapter-10/memory01.gif)
Ao trabalhar em uma linguagem de alto nível (presumo que você esteja trabalhando com Java ou Python ou algo semelhante) é difícil entender por que as coisas são como são. Por exemplo, vamos considerar uma lista vinculada. Você pode ter visto uma imagem de bolhas com números nelas com uma seta apontando para outra bolha ao lado dela.
Algo assim:
Isso é muito bom para entender como as listas vinculadas funcionam em comparação com, digamos, uma matriz; no entanto, “por baixo do capô” é muito diferente.
Como dissemos, tudo no computador são células de memória com valores. Um nó de lista encadeada, enquanto visualizado perto de seu vizinho, pode estar a centenas ou milhares de bytes de seu vizinho. Por baixo do capô, as setas que você vê na imagem são na verdade ponteiros, e um ponteiro pode fazer referência a qualquer célula na memória. Em particular, o ponteiro faz referência ao endereço do próximo nó na lista.
Espero que este exemplo ajude a esclarecer sobre o que ele está falando.