É uma pergunta quase embaraçosa ... Sou formado em Ciência da Computação (e um segundo em andamento). Trabalhei como desenvolvedor .NET em tempo integral por quase cinco anos. Eu geralmente pareço competente no que faço.
Mas eu não sei como os computadores funcionam!
Por favor, fique comigo por um segundo. Um rápido Google de 'How a Computer Works' produzirá muitos e muitos resultados, mas lutei para encontrar um que realmente respondesse ao que estou procurando. Sei que essa é uma pergunta enorme, realmente muito boa, se você puder me dar algumas palavras-chave ou alguma direção.
Eu sei que existem componentes .... a fonte de alimentação, a placa-mãe, ram, CPU, etc ... e eu recebo a 'idéia geral' do que eles fazem. Mas eu realmente não entendo como você parte de uma linha de código como Console.Readline()
no .NET (ou Java ou C ++) e faz com que ela realmente faça coisas.
Claro, estou vagamente ciente do MSIL (no caso do .NET) e que alguma mágica acontece com o compilador JIT e ele se transforma em código nativo (eu acho). Disseram-me que Java é semelhante e C ++ corta o passo do meio.
Eu fiz uma montagem de mainframe, já faz alguns anos. Lembro-me de que havia algumas instruções e alguns registradores da CPU, e escrevi o código .... e então alguma mágica aconteceu ... e meu programa funcionaria (ou travaria). Pelo que entendi, um 'Emulador' simularia o que acontece quando você chama uma instrução e atualiza os registros da CPU; mas o que faz essas instruções funcionarem da maneira que funcionam?
Isso se torna uma questão de eletrônica e não uma questão de 'computador'? Estou supondo que não há nenhuma razão prática para eu entender isso, mas sinto que deveria ser capaz.
(Sim, é isso que acontece quando você passa o dia com uma criança pequena. Demora cerca de 10 minutos e cinco iterações para perguntar 'Por quê?' Para você perceber o quanto não sabe).
Emulator
. É um monte de circuitos semicondutores reais com centenas (milhares) de fios de entrada e saída e bilhões de portas lógicas. OEmulator
foi usado apenas para fins instrucionais.Respostas:
Iniciarei do nível mais baixo que possa ser relevante (posso começar de um nível ainda mais baixo, mas provavelmente são irrelevantes), iniciando de Atom, Eletricidade, Transistores, Logic Gates, Circuitos Integrados (Chip / CPU) ) e termina na Assembléia (presumo que você esteja familiarizado com os níveis mais altos).
No início
Átomo
O átomo é uma estrutura composta de elétrons, prótons e nêutrons (que são compostos de partículas elementares ). A parte mais interessante do átomo para computadores e eletrônicos são os elétrons porque os elétrons são móveis (isto é, podem se mover com relativa facilidade, ao contrário de prótons e nêutrons que são mais difíceis de se mover) e podem flutuar livremente sem serem mantidos dentro um átomo.
Normalmente, cada átomo tem um número igual de prótons e elétrons, que chamamos de estado "neutro". Por acaso, é possível que um átomo perca ou obtenha elétrons extras. Dizem que átomos nesse estado desequilibrado são átomos de "carga positiva" (mais prótons do que elétrons) e átomos de "carga negativa" (mais elétrons que próton), respectivamente.
Os elétrons são inconstrutíveis e indestrutíveis (não na mecânica quântica, mas isso é irrelevante para o nosso propósito); Portanto, se um átomo perde um elétron, outro átomo próximo precisa receber os elétrons extras ou o elétron precisa liberar-se em um elétron flutuante livre, por outro lado, como o elétron é inconstrutível, para ganhar elétrons extras, um átomo precisa absorvê-lo de átomos próximos ou de um elétron flutuante livre. A mecânica dos elétrons é tal que, se houver um átomo carregado negativamente próximo a um átomo carregado positivamente, alguns elétrons migrarão até que ambos os átomos tenham a mesma carga.
Eletricidade
A eletricidade é apenas um fluxo de elétrons de uma área com número muito alto de átomos com carga negativa para uma área com número muito alto de átomos com carga positiva. Certas reações químicas podem criar uma situação em que temos um nó com muitos átomos com carga negativa (chamado "ânodo") e outro nó com muitos átomos com carga positiva (chamado "cátodo"). Se conectarmos dois nós com carga oposta a um fio, massas de elétrons fluirão do ânodo para o cátodo, e esse fluxo é o que chamamos de "corrente elétrica".
Nem todos os fios podem transmitir elétrons de maneira igualmente fácil, os elétrons fluem muito facilmente em materiais "condutores" do que em materiais "resistentes". Um material "condutor" possui baixa resistência elétrica (por exemplo, fios de cobre nos cabos) e um material "resistente" possui alta resistência elétrica (por exemplo, isolamento do cabo de borracha). Alguns materiais interessantes são chamados de semicondutores (por exemplo, silicons), porque podem alterar sua resistência facilmente, sob certas condições um semicondutor pode atuar como condutor e, em outras condições, pode se transformar em um resistor.
A eletricidade sempre prefere fluir através do material com menor resistência; portanto, se um cátodo e um ânodo estiverem conectados com dois fios, um com resistência muito alta e outro com resistência muito baixa, a maioria dos elétrons fluirá através do cabo de baixa resistência e quase nenhum flui através do material de alta resistência.
A Idade Média
Switches e transistores
Interruptores / flip-flops são como os interruptores de luz comuns; um interruptor pode ser colocado entre dois pedaços de fio para cortar e / ou restaurar o fluxo de eletricidade. Os transistores funcionam exatamente da mesma maneira que um interruptor de luz, exceto que, em vez de conectar e desconectar fisicamente os fios, um transistor conecta / desconecta o fluxo de eletricidade, alterando sua resistência, dependendo da existência de eletricidade no nó base e, como você já deve ter adivinhado Sei que transistores são feitos de semicondutores porque podemos alterar o semicondutor para se tornar um resistor ou um condutor para conectar ou desconectar correntes elétricas.
Um tipo comum de transistor, o transistor de junção bipolar NPN (BJT), possui três nós: "base", "coletor" e "emissor". Em um NPN BJT, a eletricidade pode fluir do nó "emissor" para o nó "coletor" somente quando o nó "base" é carregado. Quando o nó base não é carregado, praticamente nenhum elétron pode fluir através dele e, quando o nó base é carregado, os elétrons podem fluir entre o emissor e o coletor.
O comportamento de um transistor
(Eu sugiro que você leia isso antes de continuar, pois ele pode explicar melhor do que eu com gráficos interativos)
Digamos que temos um transistor conectado a uma fonte elétrica em sua base e coletor e, em seguida, conectamos um cabo de saída próximo ao coletor (veja a Figura 3 em http://www.spsu.edu/cs/faculty/bbrown/web_lectures / transistores / ).
Quando aplicamos eletricidade a nenhuma base ou coletor, nenhuma eletricidade pode fluir, uma vez que não há eletricidade para falar:
Quando aplicamos eletricidade ao coletor, mas não à base, a eletricidade não pode fluir para o emissor, pois a base se torna um material de alta resistência; portanto, a eletricidade escapa para o fio de saída:
Quando aplicamos eletricidade à base, mas não ao coletor, também não há eletricidade que possa fluir, pois não há diferença de carga entre o coletor e o emissor:
Quando aplicamos eletricidade à base e ao coletor, obtemos eletricidade fluindo através do transistor, mas como o transistor agora possui menor resistência que o fio de saída, quase nenhuma eletricidade flui através do fio de saída:
Portões lógicos
Quando conectamos o emissor de um transistor (E1) ao coletor de outro transistor (C2) e, em seguida, conectamos uma saída próxima à base do primeiro transistor (O) (veja a Figura 4 em http://www.spsu.edu / cs / faculdade / bbrown / web_lectures / transistors / ), então algo interessante acontece. Digamos também que sempre aplicamos eletricidade ao coletor do primeiro transistor (C1) e, portanto, brincamos apenas com os nós de base dos transistores (B1, B2):
Vamos resumir a tabela para ver apenas B1, B2 e O:
Eis que , se você estiver familiarizado com a Boolean Logic e / ou Logic Gates, observe que esse é precisamente o portão NAND. E se você estiver familiarizado com a lógica booleana e / ou portas lógicas, também deve saber que um NAND (assim como o NOR) está funcionalmente completo , ou seja, usando apenas o NAND, é possível construir todos os outros portões lógicos e o resto da verdade tabelas. Em outras palavras, você pode projetar um chip de computador inteiro usando apenas portas NAND.
De fato, a maioria das CPUs é (ou costumava ser?) Projetada usando NAND apenas uma vez que é mais barato fabricar do que usar uma combinação de NAND, NOR, AND, OR etc.
Derivando os outros operadores booleanos do NAND
Eu não descreveria como criar todos os operadores booleanos, apenas o NOT e o gate AND, você pode encontrar o resto em outro lugar.
Dado um operador NAND, podemos construir uma porta NOT:
Dado um operador NAND e NOT, podemos construir um portão AND:
Podemos construir outros portões lógicos de maneira semelhante. Como a porta NAND é funcionalmente completa , também é possível construir portas lógicas com mais de 2 entradas e mais de 1 saída, não discutirei como construir essas portas lógicas aqui.
Idade do Iluminismo
Construindo uma máquina de Turing a partir de portas booleanas
Uma CPU é apenas uma versão mais complicada de uma máquina de Turing. Os registradores da CPU são o estado interno da máquina de Turing e a RAM é uma fita da máquina de Turing.
Uma máquina de Turing (CPU) pode fazer três coisas:
Para nosso propósito, estamos construindo a Máquina de Turing de dois estados e três símbolos da Wolfram usando lógica combinatória (as CPUs modernas usariam microcódigo, mas são mais complexas do que o necessário para o nosso propósito).
A tabela de estados da Máquina de Turing da Wolfram (2,3) é a seguinte:
Queremos reencodificar a tabela de estados acima como uma tabela de verdade:
Eu realmente não vou construir uma porta lógica (não sei como desenhá-la no SE e provavelmente será enorme), mas como sabemos que a porta NAND está funcionalmente completa , temos uma maneira para encontrar uma série de portas NAND que implementarão essa tabela de verdade.
Uma propriedade importante da Turing Machine é que é possível emular um computador de programa armazenado usando uma máquina de Turing que possui apenas uma tabela de estados fixos. Portanto, qualquer Universal Turing Machine pode ler seu programa a partir da fita (RAM), em vez de ter que ter suas instruções codificadas na tabela de estado interna. Em outras palavras, nossa (2,3) Máquina de Turing pode ler suas instruções dos pinos I1, I2 (como software), em vez de ser codificada na implementação da porta lógica (como hardware).
Microcódigos
Devido à crescente complexidade das CPUs modernas, torna-se proibitivamente difícil usar a lógica combinatória sozinha para projetar uma CPU inteira. A CPU moderna é geralmente projetada como um intérprete de instruções de microcódigos; um microcódigo é um pequeno programa incorporado à CPU que é usado pela CPU para interpretar o código real da máquina. Esse próprio interpretador de microcódigo geralmente é projetado usando lógica combinatória.
Registro, cache e RAM
Esquecemos algo acima. Como nos lembramos de algo? Como implementamos a fita e a RAM? A resposta está em um componente eletrônico chamado Capacitor. Um capacitor é como uma bateria recarregável; se um capacitor estiver carregado, ele reterá elétrons extras e também poderá retornar elétrons ao circuito.
Para gravar em um capacitor, enchemos o capacitor com elétron (escreva 1) ou drenamos todos os elétrons no capacitor até que ele fique vazio (escreva 0). Para ler o valor de um capacitor, tentamos descarregá-lo. Se, quando tentamos descarregar, não há eletricidade fluindo, o capacitor está vazio (leia 0), mas se detectarmos eletricidade, o capacitor deve ser carregado (ler 1). Você pode notar que a leitura de um capacitor drena sua reserva de elétrons; as RAMs modernas têm o circuito para recarregar periodicamente o capacitor, para que possam reter sua memória enquanto houver eletricidade.
Existem vários tipos de capacitores usados em uma CPU, os registros da CPU e os caches de CPU de nível mais alto são feitos usando "capacitores" de alta velocidade, que são realmente construídos a partir de transistores (portanto, quase não há "atraso" para ler / gravar a partir de eles), eles são chamados de RAM estática (SRAM); enquanto a memória principal RAM é feita usando menos energia, mas capacitores mais lentos e muito mais baratos, eles são chamados de RAM dinâmica (DRAM).
Relógio
Um componente muito importante de uma CPU é o relógio. Um relógio é um componente que "marca" regularmente para sincronizar o processamento. Um relógio normalmente contém um quartzo ou outros materiais com um período de oscilação conhecido e relativamente constante, e o circuito do relógio mantém e mede essa oscilação para manter seu senso de tempo.
As operações da CPU são realizadas entre os ticks do relógio e a leitura / gravação é feita nos ticks para garantir que todos os componentes se movam de forma síncrona e não pisem entre si enquanto estiverem em estados intermediários. Em nossa (2,3) Máquina de Turing, entre os tiques do relógio, a eletricidade passa pelos portões lógicos para calcular a saída da entrada (I1, I2, R (t)); e, no relógio, o gravador grava O1, O2 na fita, o motor se move dependendo do valor de M e o registro interno é gravado a partir do valor de R (t + 1), depois o leitor de fita lerá a fita atual e carregará I1, I2 e o registro interno será relido novamente para R (t).
Conversando com Periféricos
Observe como a (2,3) Turing Machine faz interface com seu motor. Essa é uma visão muito simplificada de como uma CPU pode interagir com um hardware arbitrário. O hardware arbitrário pode ouvir ou gravar em um fio específico para entradas / saídas. No caso da Máquina de Turing (2,3), sua interface com o motor é apenas um único fio que instrui o motor a girar no sentido horário ou anti-horário.
O que não foi dito nesta máquina é que o Motor precisava de outro "relógio" que funcionasse em sincronia com o "relógio" interno da Máquina para saber quando iniciar e parar de funcionar, portanto, este é um exemplo de transmissão de dados síncrona . A outra alternativa comumente usada, a transmissão assíncrona usa outro fio, chamado linha de interrupção, para comunicar pontos de sincronização entre a CPU e o dispositivo assíncrono.
Idade digital
Código da máquina e montagem
A linguagem assembly é um mnemônico legível por humanos para códigos de máquina. No caso mais simples, há um mapeamento individual entre o código de montagem e a máquina; embora em linguagens assembly modernas, algumas instruções possam ser mapeadas para vários opcodes.
Linguagem de programação
Todos nós estamos familiarizados com isso, não estamos?
Ufa, finalmente terminei, digitei tudo isso em apenas 4 horas, por isso tenho certeza de que há um erro em algum lugar (sou principalmente um programador, não engenheiro elétrico nem físico, então pode haver várias coisas que são flagrantemente erradas). Por favor, se você encontrou um erro, não hesite em dar um @yell ou consertar você mesmo se tiver o representante ou criar uma resposta complementar.
fonte
De Nand para Tetris em 12 passos
Eu acho que isso será absolutamente perfeito para você:
De Nands a Tetris em 12 etapas
fonte
Se você fez a montagem, realmente existem apenas duas ou três camadas para entender:
O último (Microcódigo) foi o que o fez "clicar" para mim, porque preencheu a lacuna entre a eletrônica e o código.
fonte
Exemplo de um programa de graduação em CS que explica exatamente o que você perguntou pode ser encontrado aqui (IDC.AC.IL curso CS101) . É baseado neste livro da MIT Press: " Os elementos dos sistemas de computação: construindo um computador moderno a partir dos primeiros princípios ".
fonte
Para responder completamente a essa pergunta, seria necessário um livro inteiro. Felizmente, alguém já escreveu esse livro. É chamado Código: A Linguagem Oculta de Hardware e Software de Computador, por Charles Petzold. É uma leitura altamente informativa e muito divertida.
fonte
Eu recomendo o código de Charles Petzold. O livro é uma lição de história e uma visão geral técnica de como construir um computador. Começando com a explicação de simples comutadores telegráficos, o livro demonstra como os transistores funcionam, depois para portas lógicas, computadores programáveis e coisas mais complexas. Também é muito bem escrito e provavelmente poderia ser compreendido por qualquer pessoa com curiosidade suficiente.
fonte
Vai ser muito difícil (e longo!) Listar tudo o que você precisa saber para obter uma compreensão suficiente do que você precisa saber. Um livro famoso que realmente responde a todas essas perguntas é de Andrew Tanenbaum: Structured Computer Organization .
Na verdade, este livro leva você do computador físico de sua mesa até portas lógicas e álgebra booleana, e mostra um exemplo de arquitetura para guiá-lo através de como tudo realmente acontece nesse sistema.
(Uma observação: é muito caro, pois possui ~ 800 páginas. Provavelmente é bom apenas obter uma versão em segunda mão ou uma edição mais antiga. Os conceitos não mudaram.)
fonte
Bem, é preciso muitas bolas para dizer isso e perguntar, eu acho.
Praticamente o código é reduzido ainda mais e mais para um código de nível inferior mais complicado. Até o código de nível de montagem com registros push e move ... etc ...
Em seguida, o hardware pega esse código e age sobre ele. Na maioria das vezes, o hardware realmente tem suas próprias instruções sobre como fazer as coisas. Portanto, pode haver uma instrução simples, como um PUSH, em que um registro (local da memória) obtém um valor como 1 ou 2 ou o que for.
Definitivamente é uma questão de computador. E também uma programação. Alguns programadores programam o hardware que pega seu código e faz com que ele faça algo, embora em um nível muito baixo. Também é uma questão de eletrônica.
fonte
Existem dispositivos.
Depois, há drivers de dispositivo que interagem com esses dispositivos. Peça escrita em C, peça em montagem normalmente.
O sistema operacional interage com o software de aplicativo em uma extremidade e os drivers de dispositivo na outra para se comunicar com o hardware real.
Se você está realmente interessado, por que não fazer um hack do kernel Linux para saber mais?
fonte
No centro das coisas, esta é uma questão de eletrônica, embora o básico disso deva ter sido coberto no curso de pesquisa para qualquer diploma de CS. Todo o hardware atua com base nas portas programadas no nível do componente. Estas são as operações lógicas mais básicas: NOT, AND, OR, XOR, NAND, NOR. Cada porta tem uma função específica:
A porta NOT pega um valor de entrada e produz um valor de saída, obtém 0 ou 1 e gera o oposto.
O portão AND recebe dois valores de entrada e produz um valor de saída, obtém qualquer combinação de 0 e 1 e gera 0 para qualquer combinação, exceto dois, para os quais gera 1.
O portão OR funciona como o portão AND, mas produz 1 para cada combinação de 0 e 1, exceto dois zeros, para os quais gera um 0.
A porta XOR é novamente semelhante às portas AND e OR, mas produzirá um 0 quando as duas entradas forem iguais e um 1 quando as duas entradas forem diferentes.
A porta NAND é o oposto lógico da porta AND e a porta NOR é o oposto lógico da porta OR.
Em outras palavras, no nível do hardware, tudo se resume às expressões lógicas binárias mais básicas. Tudo o resto é apenas uma transição de um nível mais alto de programação para um nível mais baixo até atingir essa última camada.
fonte
Para a parte de transformar um programa em um idioma de alto nível nas instruções da máquina, qualquer livro do compilador deve preencher a conta. Por exemplo, o livro do dragão .
Para a parte "como as instruções são executadas?" Organização e Design do Computador: A Interface Hardware / Software deve preencher a conta.
fonte
Embora eu ache surpreendente que alguém possa concluir um curso em CS sem entender o hardware, suponho que seja inteiramente possível que um curso possa se concentrar apenas na teoria como um ramo da matemática, e não nos detalhes de engenharia e implementação. As veneráveis palestras do SICP (apresentadas na década de 1980) pareciam ser assim.
No meu curso de CS, há duas décadas, uma edição anterior de Computers: from Logic to Architecture era leitura obrigatória no primeiro ano.
Algo assim deve preencher as lacunas.
Como alternativa, o Open Courseware do MIT deve ter algo que ajude.
fonte