Um pouco mais sobre compiladores
Breve Histórico dos compiladores
Os primeiros computadores não usavam compiladores, porque eles tinham apenas alguns poucos opcodes (pseudocódigos) e pouca memória e os usuários entravam com código binário de máquina diretamente. No final dos anos 40, os programadores descobriram que o código de máquina tedioso poderia ser representado usando alguns mnemônicos – abreviações de palavras, o que deu origem à linguagem assembly. Adicionalmente, os próprios computadores poderiam traduzir estes mnemônicos em linguagem de máquina.
Durante os anos 50, as linguagens de assembly dependentes da máquina para a qual eram projetadas ainda não eram ideais para os programadores, e por essa razão evoluíram as linguagens de alto-nível e independentes da máquina subjacente. Vários compiladores experimentais foram desenvolvidos desde então, começando com o trabalho de Grace Hopper na linguagem A-0.
O crédito do primeiro compilador completo, em 1957, é atribuído à equipe de desenvolvimento do FORTRAN, liderada por John Backus da IBM. O COBOL foi a primeira linguagem a ser compilada em múltiplas arquiteturas, em 1960.
O primeiro compilador autocontido – ou seja, capaz de compilar o seu próprio código-fonte em uma linguagem de alto-nível – foi criado para o LISP por Hart e Levin no MIT em 1962.
Compiladores vs Interpretadores
Após definir-se a sintaxe e a semântica da linguagem, precisa-se de uma forma eficiente para a implementação de cada um dos elementos da linguagem. Essa implementação é feita por programas processadores: compiladores e interpretadores, ou ainda um misto entre estas formas de processadores.
- Compiladores: os programas são transformados, por inteiro, em um conjunto correspondente de instruções que podem ser fisicamente efetuadas pelo computador. A execução do programa é feita diretamente através dessas instruções de computador; o programa inteiro constitui uma unidade a ser transferida “em um único lote” para o computador.
- Interpretadores: cada expressão do programa é executada diretamente, ou seja, transformada nas instruções correspondentes e acionada no computador sem ter-se a necessidade de transformar o programa inteiro em uma unidade de execução. As expressões do programa são executadas sob demanda.
Um compilador é um programa de computador – ou um conjunto de programas – que traduzem texto(s) escrito(s) em uma determinada linguagem de computador (a linguagem-fonte) em outra linguagem de computador (a linguagem-alvo).
Compiladores
1. Assembly e Compiladores
A razão mais comum para se querer traduzir código fonte é a de criar um programa executável. O nome “compilador” é reservado para programas que traduzem código- fonte de uma linguagem de alto-nível para uma de baixo-nível (por exemplo, em linguagem de máquina ou linguagem assembly).
Linguagem Assembly é uma versão mnemônica do código de máquina, na qual, nomes são usados ao invés de códigos binários. O assembler (montador) converte as instruções em linguagem assembly para a linguagem objeto relocável.

2. Linker
- Tem por função receber o código relocável, produzido pelo assembler, combinar com outros arquivos e gerar um arquivo executável.
- Lembrando que saída do linker é um único arquivo, sendo ainda um código objeto relocável.
3. Loader
O loader possui as funções de:
- Ler o código objeto relocável do disco que foi produzido pelo linker;
- Determinar o endereço de memória que o programa será carregado;
- Alterar os endereços relocáveis das instruções que fazem acesso à memória, obtendo assim o código objeto absoluto;
- Carregar as instruções alteradas e os dados na memória, no endereço apropriado.
