01101000 01100101 01101100 01101100 01101111 00100001 → Olá.
Muitos de nós já ouvimos ou lemos que um computador só entende binário, se for verdade, então como é quando escrevemos um código como este, que não é binário:
O computador nos mostra algo assim:
Bem, isso é graças à magia da compilação, pense nisso como “traduzir” para outro idioma, dessa forma, nós e o computador podemos nos comunicar e nos entender. Quando executamos o processo de compilação, estamos traduzindo o código que acabamos de escrever para a única linguagem que o computador entende: binária, são uns e zeros, nada mais.
Existem quatro etapas principais durante a compilação: pré-processamento, compilação, montagem, vinculação.
Vamos compilar o arquivo main.c para descobrir o que está acontecendo em cada uma dessas etapas, isso é feito digitando o comando gcc main.c no prompt do shell.
#include <stdio.h>int principal(void)
O arquivo de código-fonte recebe a extensão “.c”.
O pré-processamento é a primeira etapa, nesta etapa:
- Os comentários são removidos.
- Todos os arquivos e macros incluídos são expandidos.
- procure o que está incluído no cabeçalho, <stdio.h> por exemplo e copie o arquivo de cabeçalho no código-fonte.
- Um arquivo “.i” é criado com todas essas informações.
Depois vem a Compilação, neste ponto o processo pega o que foi gerado no pré-processamento e traduz um passo mais próximo da linguagem de computador: linguagem assembly, que é um meio termo entre a linguagem legível por humanos e a linguagem de máquina e leva para o assembler.
Um arquivo “.s” é criado
O arquivo de linguagem de máquina é finalmente gerado pelo Assembler na etapa Assembly (arquivo de extensão .obj) e todo o programa é traduzido em código binário, também conhecido como “código objeto” e é completamente compreensível pela máquina.
E por último, Vinculação, é quando todo o código objeto de todos os módulos necessários, é mesclado em um único e vinculado às bibliotecas das quais usamos funções, copiando-as se estivermos usando vinculação estática (se vinculação dinâmica for usada , as bibliotecas são apenas nomeadas no arquivo binário)
Um arquivo excepcional “a.out” é criado. podemos especificar um nome de arquivo de saída diferente digitando a opção -o ao compilar o programa (gcc $ current_file_name -o new_file_name) o programa agora pode ser executado digitando ./a.out.
Lembre-se de que toda vez que fizermos uma alteração no código, precisaremos compilar para executar o arquivo.
Pode haver variações neste processo, como linguagens compiladas dinamicamente e linguagens compiladas estaticamente, mas o processo principal é bastante semelhante.