quinta-feira, 2 de abril de 2009

Fases da Compilação




As fases de um compilador podem ser classificadas em dois grupos: análise e síntese.
Na fase de análise, encontram-se as fases de análise léxica, análise sintática e análise semântica. Já na fase de síntese encontram-se as fases de geração de código intermediário, otimização e geração de código. Adicionalmente as estas fases, existem ainda duas fases adicionais que interagem com todas as fases do compilador: o gerenciamento de tabelas e o tratamento de erros.

FASE DE ANALISE

  • Análise léxica - A fase de análise léxica (varredora) tem por objetivo ler o programa fonte e transformar seqüências de caracteres em uma representação interna, denominada itens léxicos. A saída é um fluxo do símbolo. As expressões regulares são usadas para definir o símbolo reconhecido por um varredor (ou pelo analisador lexical). Por exemplo, suponha a expressão abaixo, descrita em Pascal:
    Exp := (A + B) * 1.5;
    Os itens léxicos contidos nesta expressão, são:
    Exp, :=, (, A, +, B, ), *, 1.5 e ;.
    Os itens léxicos a serem reconhecidos pelo analisador léxico são determinados pela gramática da linguagem-fonte. Deste modo, caso um item léxico não seja definido por esta gramática, um erro léxico é gerado. Por exemplo, suponhamos que uma linguagem só suporte valores inteiros. Então o valor 1.5 iria ocasionar um erro, o qual deverá ser tratado.
  • Análise Sintática - responsabiliza-se por traduzir os Tokens, e descobrir a relação de uns com os outros. Se você escreve writeln, um espaço, e um identificador, seu programa passará pela análise léxica (writeln e identificador existem), mas não passará pela análise sintática, que informa a necessidade de um abre-parênteses logo após esta procedure.
  • A análise semântica - analisa a árvore sintática para a informação context-sensitive, gerada pelo analisador sintático em busca de inconsistências semânticas. Uma das tarefas mais importantes é a verificação de tipos, ou análise de contexto. É nesta fase que são detectadas, por exemplo, os conflitos entre tipos, a ausência de declarações de variáveis, funções e procedimentos.

FASE DE SINTESE

  • A fase de geração de código intermediário - permite a geração de instruções para uma máquina abstrata, normalmente em código de três endereços, mais adequadas a fase de otimização. Esta forma intermediária não é executada diretamente pela máquina alvo.
  • A fase de otimização - analisa o código no formato intermediário e tenta melhorá-lo de tal forma que venha a resultar um código de máquina mais rápido em tempo de execução, usando as réguas que denotam a semântica da linguagem-fonte. Uma das tarefas executadas pelo otimizador é a detecção e a eliminação de movimento de dados redundantes e a repetição de operações dentro de um mesmo bloco de programa.
  • A fase de geração de código - tem como objetivo analisar o código já otimizado é a gerar o um código objeto definitivo para uma máquina alvo. Normalmente este código objeto é um código de máquina relocável ou um código de montagem. Nesta etapa as localizações de memória são selecionadas para cada uma das variáveis usadas pelo programa. Então, as instruções intermediárias são, cada uma, traduzidas numa seqüência de instruções de máquina que realizam a mesma tarefa.

Fonte: http://www.geocities.com/SiliconValley/Bay/1058/compiler.html