next up previous contents
Next: Um Compilador Simplificado Up: CompiladoresNotas de Aula Previous: Lista de Figuras

Seção

Conceitos Básicos

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 e Fig. 2).


  
Figura 1: Esquema Simplificado
\begin{figure}\centerline{\psfig{figure=compilador.eps,height=5cm}}
\end{figure}


  
Figura 2: Fases de um Compilador
\begin{figure}\centerline{\psfig{figure=fases.eps,height=7cm}}
\end{figure}

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: ( PalRes1 void, PalRes Mede, Simbolo AP2, PalRes int, Ident y, Simbolo FP, Simbolo AC3, PalRes int, Ident Altura, Simbolo PV, Ident Altura, Simbolo AT4, Ident X, Simbolo +, Ident y, Simbolo *, Inteiro 60, Ident PV, Simbolo FP )

Análise Sintática

Agrupa token 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 3 e um exemplo de parse tree.


  
Figura 3: Exemplo de uma Parse Tree
\begin{figure}\centerline{\psfig{figure=arvore.eps,height=5cm}}
\end{figure}

Análise Semântica

          :=  
    id1         +   
          id2        * 
          
               id3      inttoreal 
                           60

Geração de Código Intermediário

  temp1 := inttoreal(60)
  temp2 := id3 * temp1
  temp3 := id2 + temp2
  id1 := temp3

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

MOVF id3, R2      ; Move conteudo da memoria na posicao id3 para registrador R2
MULF #60.0, R2    ; Multiplica R2 pela constante 60 e coloca resultado em R2
MOVF id2, R1      ; Carrega conteudo de id2 em R1
ADDF R2 , R1      ; Adiciona R2 e R1 e colocar resultado em R1
MOVF R1 , id1     ; Salva R1 em id1

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

Fonte:

MOV a, R1
ADD #2, R1    ; b = a + 2;
MOV R1, b

Alvo:

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

Carregador

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


next up previous contents
Next: Um Compilador Simplificado Up: CompiladoresNotas de Aula Previous: Lista de Figuras

1999-03-10