quinta-feira, 1 de maio de 2014

Compiladores : Estruturação

Compiladores como bem sabemos (ou não) são softwares básicos que transformam nosso código fonte, escrito em uma linguagem que conseguimos entender de forma mais clara em código de máquina (ou outra linguagem alvo, veja a fig. 1.1 ), que particularmente não consigo entender (se você consegue, meus parabéns),  e nos dá como resultado o nosso programa alvo que pode ser executado. 

Uma das importantes tarefas do compilador é nos indicar erros no código fonte apresentado durante a tradução, já que ele está produzindo um código semanticamente equivalente ao nosso em outra  linguagem, contanto não falaremos aqui da linguagem, mas como um compilador é estruturado, ou seja, vou falar aqui sobre as fases de compilação, sendo ainda mais específico, da fase analítica da compilação.

                              
 Figura 1.1

Fonte: Elaborada pelo Autor

Compilador
                                              
O compilador funciona da seguinte maneira, o compilador transforma nosso código não somente (tampouco diretamente) para o código alvo, as etapas de trabalho são divididas em duas fases: análise (analysis) e síntese (synthesis) (veja a Fig 1.2), a parte analítica “quebra” o programa em pedaços e impõem uma estrutura gramatical nesses pedaços para formar uma estrutura intermediária do programa. A fase analítica da construção ainda checará se a estrutura léxica, sintática  e a semântica foram utilizadas corretamente e notifica o usuário caso encontre erros. Além disso coleta informações sobre o código fonte do programa e as guarda numa estrutura de dados específica chamada de tabela de símbolos .


  Figura 1.2
Fonte: Elaborada pelo Autor
A Tabela de Símbolos é uma estrutura projetada para guardar registros com nome e atributo (tokens), e ter a capacidade de pesquisá-los e acessá-los de forma eficiente. A tabela de símbolos é usada em todo o processo de compilação.

O analisador léxico lê todos os caracteres programa fonte e os agrupados formando lexemas (lexemes), para cada lexema o analisador produzirá um token que possui a seguinte forma <nome do token, atributo do token>, o nome do token é um símbolo abstrato utilizado para referência e seu atributo aponta para a entrada desse token na tabela de símbolos, essa informação salva na tabela é necessária para a análise sintática, semântica e para a geração de código.  Caracteres em branco, comentários e elementos não utilizados são descartados pelo analisador léxico.

O analisador sintático, também chamado de parser utiliza os tokens criados pelo analisador léxico para produzir uma representação em forma de árvore, com a finalidade de representar a estrutura gramatical do fluxo dos tokens, em outras palavras ele checa se a sequência de entrada é válida, enquanto o léxico examina se você escreveu corretamente o sintático examinará se você as dispôs corretamente.

O analisador semântico utilizará a árvore sintática e a tabela de símbolos para verificar a consistência do programa em relação à linguagem, como por exemplo a verificação de tipos, quando o compilador checa se foi passado o operador de tipo necessário para aquela operação. Ex: em C é necessário que o índice de um vetor seja um número inteiro (>=0), na análise semântica o compilador checará se por exemplo foi utilizado um número real para designar o índice.
                              ...
                              int a[10]; 
                              ....
                              a[1.3] = 1; //Erro

Depois de feitas essas verificações é gerado o código intermediário, quando inicia-se a fase de síntese da compilação que explicarei no próximo post  (geração de código intermediário, otimização de código e geração do código final).

Referências:

Compilador, Wikipédia, a Enciclopédia Livre. Disponível na Internet via <http://pt.wikipedia.org/wiki/Compilador> 

 Aho, Alfred. V. et. al, Compilers: Principles, Techniques, and Tools, Second Edition. Addison-Wesley, 2007. ISBN 978-0-321-48681-3. Capítulos 1 e 2.

SANTOS, Ricardo. Compiladores I - Capítulo 1, 20-?. PDF. Disponível na Internet via <http://www.facom.ufms.br/~ricardo/Courses/CompilerI/Lectures/Lec01.pdf>


Nenhum comentário:

Postar um comentário