Aula 9: Do Código-Fonte ao Executável — Compilação, Assembler, Linkagem e Carregamento
Na aula anterior vimos que o código de alto nível precisa, no fim das contas, virar linguagem de máquina. Mas quem faz a tradução, e como vários arquivos que escrevemos viram um único programa executável? A resposta é uma cadeia de ferramentas (Toolchain): um compilador (Compiler) que traduz o códig
Para que um código que você escreveu possa rodar, ele passa por algumas estações: primeiro um programa o traduz para linguagem de máquina, depois várias partes são unidas em um único arquivo, e por fim o arquivo é carregado na memória e roda. Cada estação é uma ferramenta separada com uma única tarefa.
- Compilador
- Um programa que traduz código-fonte escrito em uma linguagem de alto nível para código em uma linguagem de nível mais baixo, geralmente assembly ou código de máquina.
- Assembler
- Um programa que traduz código assembly para código de máquina e cria um arquivo objeto.
- Arquivo Objeto
- O produto do assembler para um único arquivo-fonte: código de máquina junto com uma tabela de símbolos, ainda antes da linkagem.
- Linker
- Um programa que une vários arquivos objeto e bibliotecas em um único executável e resolve referências entre arquivos.
- Carregador
- Uma parte do sistema operacional que copia um executável do disco para a memória e o inicia como um processo.
- Executável
- Um arquivo pronto para rodar que contém código de máquina já linkado, o produto final da cadeia de construção.
- Interpretador
- Um programa que executa código linha por linha em tempo de execução, em vez de traduzi-lo antecipadamente para um executável.
- Bytecode
- Uma forma intermediária que não é código-fonte nem código de máquina da CPU, executada por um interpretador ou uma máquina virtual.
- Linkagem Estática e Dinâmica
- A estática incorpora a biblioteca dentro do executável; a dinâmica a carrega separadamente em tempo de execução e a compartilha entre programas.
- Símbolo
- O nome de uma função ou variável na tabela de símbolos, usado pelo linker para conectar uma chamada à sua definição.