É do conhecimento comum que o código é escrito por um desenvolvedor e como os humanos se comunicam com os computadores. No entanto, você já pensou em como um software, como o código, interage com o hardware do computador, como uma CPU (Unidade Central de Processamento)? Se a resposta for sim, então você veio ao lugar certo.

Para entender como o código é executado em um computador, você deve entender o que faz um computador funcionar e como ele pode ser manipulado. Primeiro, vamos primeiro falar sobre as idéias fundamentais de hardware de computador antes de avançar para o lado do software.

O que é binário?

Binário é um sistema numérico de base 2 que os processadores e a memória usam para executar o código. Os números binários podem ser apenas 1 ou 0, daí seu nome. Se você agrupar oito números binários (00000000), obterá o que é conhecido como byte, enquanto um único número binário (0) é chamado de bit.

Como um switch simples produz sinais binários

Tudo o que é lógico sobre a computação com máquinas começa com a troca simples. Uma chave simples possui dois condutores e um mecanismo de conexão e desconexão. Conectar os dois condutores permite que a corrente flua, o que produz um sinal para a outra extremidade do condutor. Por outro lado, se os condutores forem desconectados, a corrente não fluirá, o que significa que nenhum sinal será produzido.

Crédito de imagem: 991joseph /Wikimedia Commons

Uma vez que uma chave só pode ser ligada ou desligada em uma instância, eles fornecem o mecanismo ideal para fazer os sinais altos e baixos usados ​​para produzir sinais de onda quadrada.

Quando você aperta um botão, ele produz um sinal ou um bit de dados. Uma foto normal tirada de um smartphone teria cerca de cinco megabytes de dados, o que equivale a 40 milhões de bits. Isso significa que você precisará apertar o botão dezenas de milhões de vezes apenas para produzir dados suficientes para uma foto tirada de seu smartphone.

Com as limitações mecânicas de um switch, os engenheiros precisavam de algo que não tivesse partes móveis e fornecesse velocidades de chaveamento mais rápidas.

Transistores usados ​​como interruptor

Crédito da imagem do transistor: Evan-Amos /Wikimedia e Square Wave Crédito de imagem: Sponk /Wikimedia

Graças à descoberta do doping (manipulação da condutividade elétrica de semicondutores como o silício), os engenheiros foram capazes de fazer interruptores controlados eletricamente, conhecidos como transistores. Esta nova invenção permitiu velocidades de processamento mais rápidas que precisavam de pouca voltagem para alimentar, tornando possível empilhar mais de um bilhão desses transistores em uma única CPU moderna.

O que é arquitetura de CPU?

Os transistores são habilmente organizados para fazer portas lógicas, meio-somadores, somadores, flip-flops, multiplexadores, registradores e vários componentes que tornam a CPU funcional. A maneira como esses componentes foram empilhados define o que é conhecido como arquitetura de CPU.

A arquitetura da CPU também determina o ISA (Instruction Set Architecture) do processador. Um ISA contém uma lista interna de instruções que uma CPU pode executar nativamente. Essas instruções são misturadas sequencialmente por meio de uma linguagem de programação para formar o que é conhecido como um programa. Normalmente, centenas de instruções estão prontamente disponíveis em uma CPU, incluindo adição, subtração, mover, salvar e carregar.

Aqui está um exemplo de um conjunto de instruções:

Instruction-set-sample

Cada instrução em um conjunto de instruções tem seu próprio endereço binário, conhecido como opcode. O opcode será os primeiros bits binários que informam qual operação do conjunto de instruções usar.

Sintaxe de instrução de montagem

Seguindo o opcode está o operando. O operando contém valores e endereços onde o opcode será usado.

O diagrama mostra uma instrução de 8 bits. Se uma CPU tiver uma arquitetura de 64 bits, as instruções podem se estender por até 64 bits na largura da instrução, tornando-a um processador mais capaz.

Relacionado: Como as CPUs RISC e CISC são diferentes?

O montador

Agora que você entende os sinais binários, pode aprender como o seu computador interpreta esses sinais. Como o código de máquina deve ser interpretado depende do tipo de lógica usada em um montador (um programa de baixo nível usado para decodificar e montar o código no binário apropriado).

Por exemplo, se nosso montador usa o padrão ASCII (American Standard Code for Information Interchange), nosso montador pegaria o código de máquina fornecido e o interpretaria da mesma forma que o ASCII na tabela abaixo.

00101001 UMA 00101111 G 00110101 M 00111011 S 01000001 Y
00101010 B 00110000 H 00110110 N 00111100 T 01000010 Z
00101011 C 00110001 eu 00110111 0 00111101 você
00101100 D 00110010 J 00111000 P 00111110 V
00101101 E 00110011 K 00111001 Q 00111111 C
00101110 F 00110100 eu 00111010 R 0100000 X

Como nosso montador usa ASCII (versão de 8 bits), cada oito números binários no binário são interpretados como um caractere. O montador pegaria esse byte e o interpretaria de acordo com os padrões fornecidos. Por exemplo, 01000001 01101001 01010100 seria traduzido na palavra "bit".

Compreendendo a linguagem Assembly

A linguagem Assembly é uma linguagem de programação de baixo nível legível por humanos que manipula diretamente os opcodes e operandos de uma arquitetura de CPU.

Aqui está um exemplo de um código de montagem simples usando o conjunto de instruções mostrado anteriormente:

1. LODA # 5 
2. LODB # 7
3. ADD R3
4. STRE M12

Este bloco de código é armazenado na RAM até que a CPU busque cada linha de código uma por uma.

O ciclo de busca, decodificação e execução da CPU

A CPU executa o código por meio de um ciclo conhecido como Buscar, Decodificar e Executar. Esta sequência mostra como uma CPU processa cada linha de código.

Buscar: O contador de instruções dentro da CPU leva uma linha de instrução da RAM para permitir que a CPU saiba qual instrução executar a seguir.

Decodificar: O Assembler decodificará o bloco de código legível por humanos e o montará como binários formatados apropriadamente para o computador entender.

1. 00010101 
2. 00100111
3. 00110011
4. 01011100

Executar: A CPU então executa os binários aplicando as instruções indicadas pelo opcode aos operandos fornecidos.

O computador vai executar da seguinte maneira:

  1. Carregue o primeiro registro com 5
  2. Carregue o segundo registro com 7
  3. 5 + 7 = 12, salve 12 no terceiro registro
  4. Armazene o valor do terceiro registro no endereço RAM M12

O computador adicionou dois números com sucesso e armazenou o valor no endereço de RAM especificado.

Excelente! Agora você sabe como um computador executa código. No entanto, não para por aí.

Indo além

Com o hardware adequado, um montador e uma linguagem assembly, as pessoas podiam executar o código com razoável facilidade. No entanto, como os programas e o hardware do computador se tornaram ainda mais complexos, os engenheiros e programadores tiveram que pense em uma maneira de tornar a programação menos tediosa e garantir a compatibilidade com diferentes tipos de CPU arquitetura. Daí a criação de compiladores e intérpretes.

O que é um compilador e um intérprete?

O compilador e o interpretador são programas de tradução que pegam código-fonte (programas feitos de linguagens de programação de alto nível) e traduzi-los para a linguagem assembly, que o montador então decodificará para binário.

Um intérprete pegará uma linha de código e executará imediatamente. Isso geralmente é usado em terminais como o terminal Linux Bash Shell e o terminal Windows PowerShell. Ótimo para realizar tarefas simples e pontuais.

Crédito de imagem: Rlistmedia /Wikimedia Common

Em contraste, um compilador pegará várias linhas de código e as compilará para fazer um programa. Exemplos desses programas seriam Microsoft Word, Photoshop, Google Chrome, Safari e Steam.

Com a criação de compiladores e interpretadores, foram criadas linguagens de programação de alto nível.

Linguagens de programação de alto nível

Linguagens de programação de alto nível são qualquer linguagem após o código assembly. Algumas dessas linguagens com as quais você pode estar familiarizado são C, Python, Java e Swift. Essas linguagens de programação tornaram a programação mais legível e simples do que a linguagem assembly.

Aqui está uma comparação lado a lado para ilustrar como é mais difícil programar em conjunto do que com uma linguagem de programação de alto nível como Python:

Ambos os códigos imprimirão "Hello World".

Com essas linguagens de programação, os desenvolvedores podem programar jogos, sites, aplicativos e drivers em um período de tempo razoável.

Relacionado: Python vs. Java: a melhor linguagem para 2022

Os computadores podem executar todas as formas de código

Um computador é um dispositivo que só pode ler binários. Esses binários são produzidos por mais de um bilhão de transistores microscópicos embalados dentro de uma CPU. O arranjo do transistor determina o ISA (Instruction Set Architecture) da CPU, que fornece centenas de instruções que uma CPU pode executar prontamente quando seu opcode é chamado por meio do código. Os desenvolvedores misturam e combinam essas instruções sequencialmente, o que cria um programa inteiro, como motores de jogos, navegadores da web, aplicativos e drivers.

Uma CPU executa o código por meio de uma sequência conhecida como ciclo de busca, decodificação e execução. Depois que um trecho de código é carregado na RAM, a CPU busca seu conteúdo um por um, decodifica o conteúdo em binário por meio do montador e, em seguida, executa o código.

Uma vez que o montador só pode traduzir o código feito explicitamente para a arquitetura da CPU, compiladores e intérpretes foram construídos em cima do montador (bem como um adaptador) para trabalhar em diferentes tipos de CPU arquitetura. Um intérprete pegará um comando e o executará imediatamente. Em contraste, um compilador pegará todos os seus comandos e os compilará em um programa reutilizável.

Linguagens de programação de alto nível como Python, C e Java foram criadas para tornar a programação mais fácil, rápida e conveniente. A grande maioria dos programadores não precisa mais codificar em linguagem assembly, pois suas linguagens de programação de alto nível e fáceis de usar podem ser traduzidas para o assembly por meio de um compilador.

Felizmente, agora você tem um melhor entendimento dos fundamentos dos computadores e como eles executam o código.

Como funciona um computador e o que ele contém?

É uma pergunta simples, mas que todos ponderam de vez em quando: como o computador à sua frente realmente funciona?

Leia a seguir

CompartilhadoTweetE-mail
Tópicos relacionados
  • Tecnologia Explicada
  • Programação
  • Processador de Computador
  • Em processamento
Sobre o autor
Jayric Maning (5 artigos publicados)

Desejoso de aprender como as coisas funcionavam, Jayric Maning começou a mexer em todos os tipos de dispositivos eletrônicos e analógicos durante a adolescência. Ele estudou ciência forense na Universidade de Baguio, onde se familiarizou com computação forense e segurança cibernética. No momento, ele está fazendo um monte de auto-estudo e mexendo com tecnologia para descobrir como eles funcionam e como podemos usá-los para tornar a vida mais fácil (ou pelo menos mais legal!).

Mais de Jayric Maning

Assine a nossa newsletter

Junte-se ao nosso boletim informativo para dicas de tecnologia, análises, e-books grátis e ofertas exclusivas!

Clique aqui para se inscrever