terça-feira, 26 de agosto de 2008

Outros aspéctos da estrutura de um compilador

Opções e interfaces de um compilador


Um aspecto importante da construção de compiladores é a inclusão de mecanismos para a interface com o sistema operacional e para oferecer opções ao usuário. Exemplos de mecanismos de interace são recursos de entrada e saída e acesso ao sistema de arquivos da máquina-alvo.
exemplos de opções para o usuário são a especificação de características de listagens(comprimento, mensagens de erro, tabelas de referências cruzadas) e opções de otimização de código(desempenho de certas otimizações. Interface e opções são denominadas coletivamente como a pragmática do compilador. Por vezes, uma definição de linguagem especifica a necessidade de fornecer certa pragmática. Por exemplo, Pascal e C especificam certos procedimentos de entrada/saída(em Pascal, eles fazem parte da linguagem, e em C eles fazem parte de uma especificação de uma biblioteca padrão).Em Ada, diversas diretivas do compilador, são denominadas pragmas, fazem parte da definição da linguagem. Por exemplo, as declarações Ada

pragma list(ON);
...
pragma list(OFF);


geram uma listagem do compilador para a parte do programacontida entre os pragmas. Neste texto, não veremos as diretivas de compilador apenas no contexto de gerar informação para fins de depuração no compilador. Não trataremos dos aspectos de entrada/saída e de interface com o sistema operacional, pois isso envolve detalhes consideráveis e varia muito de um sistema operaconal para outro.


Tratamento de erros


Uma das funções mais importantes de um compilador é sua resposta a erros no programa-fonte.Erros podem ser detectados durante quase todas as fases de compilação. Esses erros estáticos(ou em tempo de compilação) devem ser reportados por um compilador, e é importante que ele possa gerar mensagens de erros inteligíveis e concluir a compilação após cada erro. Cada fase de um compilador requer um tratamentode erros ligeiramente dferente, e assim um sistema para tratamento de erros necessita de diferentes operações, cada uma apropriada para uma fase e situação específicas. Técnicas de tratamento de erros para cada fase serão, portanto, estudadas separadamente no capítulo apropriado.
uma definição de linguagem requer usualmente não apenas que erros estáticos sejam capiturados por um compilador, mas também que certos erros de execução sejam capturados. Isso exige que um compilador gere código adicional para efetuar testes apropriados de execução, a fim de garantir que todos esses erros causem um evento apropriado durante a execuçaõ. Um evento dos mais simples interromperá a execução do programa. Frequentemente, entretanto, isso é inadequado, e uma definição de linguagem pode requerer a presença de mecanismos para tratamento de erros. Isso pode complicar substancialmente o gerenciamento de um sistema de execução do ponto no qual ocorreu o erro. Não consideraremos a implementação desses mecanismos, mas mostraremos como um compilador pode gerar código de teste para garantir que erros específicos de execução interrompam a execução.


Para saber mais vá direto ao livro:

LOUDEN, Kenneth C. Compiladores : princípios e práticas. São Paulo: Pioneira Thomson Learning, 2004. 569 p. ISBN 852210422-0 (broch.)

Boa leitura!

Nenhum comentário: