Quer criar um compilador? Basta ler estes dois artigos (2008)
(prog21.dadgum.com)- A maioria dos livros didáticos sobre compiladores é extensa e focada em teoria, o que levanta o problema de que iniciantes têm dificuldade para implementar um compilador realmente funcional
- Como material prático para superar isso, é apresentada a série Jack Crenshaw, “Let’s Build a Compiler!”, que aborda um compilador Pascal conciso com estrutura de passagem única
- Este tutorial apoia o aprendizado experimental por meio da combinação de análise sintática e geração de código, de otimização mínima e de versões em C e Forth
- O segundo material, o artigo “A Nanopass Framework for Compiler Education”, apresenta uma arquitetura modular de compilador composta por inúmeras transformações simples (passes)
- Só depois de adquirir experiência prática de implementação com esses dois materiais é que, se necessário, pode-se recorrer a livros tradicionais (Dragon Book) para um estudo mais aprofundado
A realidade do aprendizado de compiladores e dois artigos essenciais
- Aponta-se que os livros sobre compiladores existentes são excessivamente extensos e difíceis, o que torna complicado para iniciantes escrever um compilador que realmente funcione
- A maioria dos livros trata de temas vastos como conversão de expressões regulares, teoria de gramáticas etc., sem oferecer um ponto de partida prático
- Isso acaba criando equívocos e mitos de que “compiladores são difíceis”
- Como material representativo que quebra essa percepção, é apresentada a série Jack Crenshaw, “Let’s Build a Compiler!”
- Iniciado em 1988, este tutorial trata de um compilador de passagem única no nível do Turbo Pascal
- Sua estrutura combina análise sintática e geração de código, realizando apenas o mínimo de otimização
- Foi escrito originalmente em Pascal, e depois passou a ter também uma versão em C e uma tradução para Forth
- A versão em Forth facilita a experimentação e a compreensão graças às características interativas da linguagem
- A limitação da série de Crenshaw é que ela não tem representação interna do programa (árvore sintática abstrata, AST)
- Em Pascal, a manipulação de árvores é complexa e por isso foi omitida, mas em linguagens de alto nível como Python, Ruby, Erlang, Haskell e Lisp isso pode ser implementado com facilidade
- Essas linguagens foram originalmente projetadas para manipular dados em estrutura de árvore
- O segundo material recomendado é o artigo de Sarkar, Waddell e Dybvig
“A Nanopass Framework for Compiler Education”
- A ideia central é que “um compilador é uma série de processos que transformam gradualmente a representação interna de um programa”
- Ele propõe uma estrutura composta por dezenas a centenas de transformações simples (passes)
- Cada transformação é mantida o mais simples possível, evitando acoplamento entre as transformações
- O framework define explicitamente a entrada e a saída de cada passe
- A linguagem de implementação é Scheme, realizando verificação em tempo de execução com base em tipagem dinâmica
- Depois de escrever um compilador de verdade com esses dois materiais, se necessário, pode-se continuar o estudo com livros tradicionais como o Dragon Book
- Ainda assim, só esses dois materiais já bastam para obter uma experiência prática de criação de compiladores
Ainda não há comentários.