logotipo

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).

Voltar para todos os artigos