O que são compiladores?

Um compilador é um programa que lê um programa escrito em uma linguagem, que é a linguagem fonte, e o traduz em um programa equivalente em outra linguagem, que é a linguagem alvo. Uma parte importante do processo é a que o compilador relata ao usuário a presença de erros no programa fonte.

Existem milhares de linguagens fonte, desde as linguagens tradicionais como Fortran e Pascal, até as linguagens especializadas. As linguagens alvo são igualmente variadas, pois uma linguagem alvo pode ser uma outra linguagem de programação, ou a linguagem de máquina de qualquer coisa entre um microprocessador e um supercomputador.
Os compiladores são algumas vezes classificados como: de uma passagem, de passagem múltipla, de carregar e executar, depuradores ou otimizantes, dependendo de como tenham sido construídos ou que função se suponha que devam realizar.
A despeito dessa aparente complexidade, as tarefas básicas que qualquer compilador precisa realizar são essencialmente as mesmas.

O Contexto de um Compilador
O nome compilador, criado nos anos 50, faz referência ao processo de composição de um programa pela reunião de várias rotinas de biblioteca; o processo de tradução (de uma linguagem fonte para uma linguagem objeto), considerado hoje a função central de um compilador, era então conhecido como programação automática.
Nesse processo de tradução, há duas tarefas básicas a serem executadas por um compilador:
• Análise, em que o texto de entrada (na linguagem fonte) é examinado, verificado e compreendido
• Síntese, ou geração de código, em que o texto de saída (na linguagem objeto) é gerado, de forma a corresponder ao texto de entrada.
Normalmente, pensamos nessas tarefas como fases do processo de compilação, mas não é absolutamente necessário que a análise de todo o programa seja completada antes que o primeiro trecho de código objeto seja gerado: essas duas fases podem ser intercaladas.
Na compilação a análise consiste em três fases:
• Análise linear: É a qual um fluxo de caracteres constituindo um programa é lido da esquerda para a direita e agrupado em tokens.
• Análise hierárquica: Os caracteres ou tokens são agrupados hierarquicamente em coleções aninhadas.
• Análise semântica: São realizadas algumas verificações a fim de assegurar que os componentes de um programa se combinam de forma significativa.

A estrutura básica de um compilador
Um compilador é composto basicamente de cinco unidades, que são o analisador léxico, o analisador sintático, o analisador semântico, o gerador de código e, por último, o otimizador. Estas unidades geram algumas estruturas especiais de dados, que são os tokens(palavras), a árvore sintática abstrata, a tabela de strings e a tabela de símbolos. A seguir temos uma breve descrição de cada uma destas unidades.

Analisador léxico: é o responsável pela identificação dos vários símbolos (tokens) existentes no código fonte de um programa. Ele também é conhecido pelo nome de scanner, uma vez que sua função é ‘varrer’ o código fonte a procura de erros de grafia no programa. Como é o analisador léxico quem opera sobre a tabela de strings, será ele também o responsável pela sua manutenção.

Analisador sintático: após a atuação do scanner o analisador sintático, ou parser, entra em ação para verificar se a ordem em que aparecem os tokens é gramaticalmente correta. O produto lógico de um parser é uma árvore sintática abstrata, que é algo da forma a seguir, em que os tokens assumem os nós terminais da árvore. As duas abordagens diferentes para a realização da análise sintática se baseiam no caminho usado para percorrer a árvore sintática.
A primeira abordagem é a “top-down”, que parte do topo da árvore em direção às suas folhas, fazendo a leitura partindo do nó mais a esquerda em direção a direita e a análise também é feita a partir deste nó. Por isso a estratégia top-down também é conhecida como “LL”, ou “Left-to-right scan, Leftmost derivation”. Uma segunda estratégia é a de “bottom-up”, que vai das folhas em direção ao topo da árvore, também lendo tokens da esquerda para a direita, porém fazendo a análise a partir do nó mais a direita da árvore, sendo por isso conhecida também como “LR”, ou “Left-toright- scan, Rightmost derivation”.

Analisador semântico: é o componente do compilador encarregado de fazer a análise semântica, ou correção de contexto, do que estiver escrito no código fonte do programa. Ele atua, entre outras coisas, para verificar se as variáveis foram declaradas antes de serem usadas, compatibilidade de tipos em chamadas de funções, compatibilidade de tipos em atribuições de valor, etc. Durante sua atuação ele utiliza de forma intensa a chamada tabela de símbolos, que serve como um dicionário para se realizar a análise semântica do programa.

Gerador de código: é o primeiro componente de um compilador que depende da máquina em que a execução vai ser realizada. Esta dependência é natural visto que o código gerado vai ser o código executável no processador em questão, logo dependente do conjunto de instruções do mesmo. A atuação do gerador de código é relativamente simples, consistindo em gerar seqüências de instruções de máquina sempre que certas estruturas forem definidas após a análise semântica. Esta geração pode ser feita imediatamente ou gerando-se primeiro um código intermediário, que seria transformado em linguagem de máquina num segundo passo de compilação.

Otimizador: é o responsável pela modificação no código gerado na tentativa de obter um melhor desempenho ou quanto a espaço ou quanto a velocidade de execução. A otimização pode ser feita em dois momentos, um antes de se realizar a geração do código (portanto mais complexa e eficiente) e outro após a geração do código (logo mais simples porém menos eficiente).

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>