Conceitos Gerais


Função de um compilador

Traduz códigos escritos em uma linguagem (fonte) para códigos em uma outra linguagem (alvo), normalmente de ``nível mais baixo'' que a primeira (Ver Fig. 1)
 
Figura 1: Visão Externa Figura 2: Visão Interna

As fases de um compilador (Fig. 2)

Análise Léxica

Agrupa caracteres que aparecem no código fonte em ``palavras'' ou Tokens (Equivalem ao Símbolos Terminais de uma Grámatica). Um Token é uma sequência ``mínima'' de caracteres que possui significado na linguagem em que o código fonte é escrito.

Espaços, saltos de linha e comentários são ignorados (normalmente).

void Mede(int y)
{
   int   Altura ; 
   Altura = x + y * 60; /* Um comentário */
}
Produto da Análise Léxica: ( PalRes void, PalRes Mede, Simbolo AP, PalRes int, Ident y, Simbolo FP, Simbolo AC, PalRes int, Ident Altura, Simbolo PV, Ident Altura, Simbolo AT, Ident X, Simbolo +, Ident y, Simbolo *, Inteiro 60, Ident PV, Simbolo FP )

Análise Sintática

Agrupa tokens em unidades ``maiores'', que por sua vez, podem ser agrupadas em unidades ainda maiores. Estas unidades equivalem as formas sentenciais e sentencas de uma gramática. Sentenças são representadas, normalmente, através de uma árvore de derivação (parse tree). O análisador sintática é também chamado de parser.

A figura abaixo é um exemplo de parse tree.

Análise Semântica

Geração de Código Intermediário

Otimização de Código

temp1 := id3 * 60.0
id1 := id2 + temp1

x = 50;        
x = 80;
if(x>100)
{            ==>    x = 80;
   ...              return(x);
   ...
}
return(x);

Geração de Código

Tabela de Símbolos

Programas ``Parceiros'' de Compiladores

Preprocessadores

Processamento de Macros
#define MAXITEM 1000
#define ImpNum($1)  printf("%i",$1);
Inclusão de Arquivos
#include <stdio.h>
Extensão de Linguagens
Macros Predefinidas Eg. Comandos de Banco de Dados (Equel)

Assemblers

  • Definir endereco (relocavel) de identificadores.
  • Traduzir mnemonicos para codigo de maquina.
  • Processar Macros
  •  
    MOV a, R1
    ADD #2, R1    ; b = a + 2;
    MOV R1, b
    0001 01 00 00000000 *
    0011 01 10 00000010
    0010 01 00 00000100 *
    Formato da Instrucao
    
    . 4 bits - Codigo da Instrucao
      0001 = Load
      0010 = Store
      0011 = Add
    . 2 bits - Indentifica Registrador
    . 2 bits - Tag (Modo de Enderecamento, ...)
      00 - Memoria Para Registrador
           Ultimos Bits: Endereco de memoria.
      10 - Modo Imediato
           Ultimos Bits: Valor Constante.

    Link-Editores

  • Agrupa varios 'codigos objeto' em um unico 'executavel'
  • Verifica Referencias Externas.
  • Carregador

    Modulo do Sistema Operacional que carrega o programa, fazendo o relocamento de enderecos.