A jornada de instruções legíveis por humanos (como um programa C ++ ou um script python) ao código binário executado por um computador é um processo de várias etapas:
1.
Código fonte: Este é o código escrito por um programador em uma linguagem de programação de alto nível (como Python, Java, C ++, etc.). Este código é baseado em texto e usa comandos e sintaxe legíveis por humanos.
2.
Compilação (ou interpretação): Esta é a etapa crucial em que o código legível pelo ser humano é traduzido em código entendido da máquina. Existem duas abordagens principais:
*
Compilação: Um compilador pega o código -fonte inteiro e o traduz em um conjunto completo de instruções da máquina (código do objeto) de uma só vez. Esse código de objeto é frequentemente vinculado a outro código de objeto (como bibliotecas) para criar um arquivo executável. Este executável é essencialmente uma sequência de instruções binárias. Idiomas como C ++ e Java (antes da etapa da JVM) normalmente usam compiladores.
*
Interpretação: Um intérprete traduz e executa a linha de código -fonte por linha, sem criar um arquivo executável separado. Idiomas como Python e Javascript usam intérpretes. Embora eles não produzam diretamente o código binário da mesma maneira que um compilador, o próprio intérprete é um programa escrito em um idioma compilado e, finalmente, depende de instruções binárias para executar. O código interpretado ainda é executado usando instruções binárias, mas a tradução é feita dinamicamente, uma linha por vez.
3.
linguagem de montagem (às vezes): Em alguns casos, um compilador pode gerar linguagem de montagem como uma etapa intermediária. A linguagem de montagem é uma linguagem de programação de baixo nível que usa mnemônicos (abreviações curtas) para representar as instruções da máquina. Um assembler traduz esse código de montagem em código da máquina (binário). Esta etapa é frequentemente oculta do programador.
4.
Código da máquina (binário): Este é o estágio final. O código da máquina consiste em uma sequência de dígitos binários (0s e 1s). Cada instrução é representada por um padrão binário exclusivo que a CPU pode entender e executar diretamente. Este código binário representa coisas como:
*
OPCODES: Instruções que dizem à CPU qual operação executar (por exemplo, adição, subtração, acesso à memória).
*
operando: Dados ou endereços de memória em que a instrução opera.
Exemplo (simplificado): Digamos que uma instrução simples em uma linguagem de alto nível seja `x =y + 5;`. Após a compilação, isso pode se traduzir (de maneira aproximada e dependendo da arquitetura) para algo assim em binário (esta é uma ilustração altamente simplificada e instruções binárias reais são muito mais complexas):
*
Carregue o valor de `y` em um registro: `0001 1010 0000 0010` (instrução binária hipotética)
*
Adicione 5 ao registro: `0010 0101 0000 0101` (instrução binária hipotética)
*
Armazene o resultado no local da memória de `x`: `0011 1100 0000 0011` (instrução binária hipotética)
A representação binária específica depende inteiramente da arquitetura da CPU (x86, braço etc.) e do compilador/intérprete usado. O processo é complexo, mas a idéia principal é que as instruções de alto nível são divididas em uma sequência de instruções binárias simples que a CPU pode entender e executar diretamente.