14 de dezembro de 2023
O que acontece quando um programa em C é compilado
C
Hello world!
Um simples programa que apresenta o famoso “hello, world” na tela:
1#include <stdio.h>
2int main() {
3 printf("hello, world\n");
4 return 0;
5}
Ele começa sendo um aquivo fonte (source program), o qual um programador qualquer pode criar em um editor de texto.
O arquivo é armazenado como uma sequência de bytes, cada um representando um número inteiro correspondente a cada caractere na ASCII
Quando é rodado um comando para compilá-lo, como: gcc -o hello hello.c
, as seguintes operações acontecem:
Fase de pré-processamento
Aqui a biblioteca importada no começo (#include <stdio.h>) é copiada para o começo do arquivo. O arquivo agora tem um sufixo ".i" (hello.i).
Fase de compilação
O compilador traduz o arquivo hello.i em linguagem de montagem (ou assembly) e seu novo prefixo fica hello.s:
1main: subq $8, %rsp
2movl $.LC0, %edi call puts
3movl $0, %eax addq $8, %rsp
4ret
Fase de Assembly
O código é traduzido para linguagem de máquina. Vamos ter um novo arquivo, binário, chamado hello.o
.
Fase “Linking”
O programa chama a função printf da biblioteca da linguagem C, essa função está armazenada em um arquivo pré-compilado chamado printf.o. O que de alguma forma deve ser mesclado ao nosso programa. É nessa fase que esse processo de juntar as partes acontece e tudo fica pronto para executar.
Resumindo as fases
hello.c → (Pre-processor) → hello.i → (Compiler) → hello.s → (Assembler) → hello.o → (Linker) → hello.exe (Executable).