Compiladores

Compiladores é um dos assuntos da computação que não sei absolutamente nada sobre ele mas gostaria muito de aprender um pouco.

Infelizmente não vou ver nada sobre isso na faculdade, pois o curso que estou fazendo é de tecnologia e não tem muito sobre softwares de sistema no currículo.

Vou ter que aprender sozinho.

De vez em quando, ao longo deste ano, eu faço uma pesquisa sobre os livros disponíveis. Qualquer aluno de computação sabe (ou deveria saber) que o livro do dragão é a referência sobre compiladores. Eu dei uma passada rápida em alguns capítulos e gostei do livro, o único problema é que eu gostaria de algo mais prático.

Eu achei o Crafting a Compiler with C. Este parece ter uma abordagem muito mais prática. Acho que vou começar com ele, quando quiser me aprofundar na teoria compro o livro do dragão.

O problema agora é tempo. Só vou ter tempo de mexer com isso quando terminar a faculdade. Se tudo ocorrer bem isso deve acontecer no final do primeiro semestre de 2009.

Para você ter uma idéia de como essa vontade me persegue: no começo do ano estava conversando sobre isso com o Paulo (aka pcpa, se você nunca ouviu falar nele basta dizer que ele é o autor do driver vesa do X, e já escreveu um interpretador LISP, é um dos hackers que conheço pessoalmente que mais admiro) ele disse que também tinha interesse no assunto e que estava escrevendo uma máquina virtual. A descrição da máquina dele me empolgou.

Nessa época eu estava lendo o Inside the Machine e bem no começo do livro o autor apresenta uma descrição de uma máquina extremamente simples que não tem nenhuma utilidade prática, a não ser ser discutida num livro de introdução a arquitetura de computadores.

Não teve jeito… Fiz o projetinho da máquina virtual e escrevi um assembler para ela ‘na loca’ (ie, sair escrevendo código sem pensar muito e sem ter embasamento teórico sobre o assunto). O código está aqui. Embora o assembler tenha funcionado eu nunca cheguei a implementar a maquininha virtual…

8 Responses to “Compiladores”

  1. Tabgal Says:

    Olha, vou falar uma coisa aqui que pode ou não ser certa,mas enfim.

    Para brincar com compiladores vá de linguagem de alto nível (tipo python, lua, javascript). Provavelmente em lisp é muito mais fácil também, mas aí entram outras questões…

    Daí você se foca na estrutura e no processo do negócio e não perde tempo com os detalhezinhos. Não vai ser um gcc da vida (em velocidade), mas vai dar pra entender o negócio

    Minha maior aventura no mundo dos compiladores foi fazer um interpretador de expressões matemáticas simples (1+2*3 essas coisas) E aí já me deu um nó na cabeça. Apesar de ter a base, só fui aprender com um maldito (ou bendito) livro grátis em PDF e que já esqueci o nome. Entendi do livro foi a técnica das “produções reversas” e daí fui avançando.

    Mas é uma área interessante realmente.

  2. Sulamita Garcia Says:

    Sabe que Compiladores foi uma das matérias que mais me orgulho de ter feito na universidade, junto com Arquitetura de Computadores. Entre tanta coisa velha e tanta aula chata, esta foi uma das poucas matérias que realmente desafiou. Pra você agora vai ser muito simples aprender, mas pra quem estava começando na área foi um tremendo desafio. Na materia anterior a esta, Automatos e alguma outra coisa, fizemos o analisador léxico, que analisa os caracteres permitidos. O analisador sintático veio pronto, mas quando foi o semestre de compiladores mesmo, fizemos o analisador semantico e o tradutor para linguagem intermediária. Foi muito punk, mas foi muito foda. Tenho vergonha da linguagem que usamos para fazer – era trabalho em dupla – por isto não vou dar nenhuma sugestão. Mas realmente, fazer em linguagem de alto nível ajuda a focar no compilador de verdade, não nos detalhezinhos.

  3. Elvis Says:

    C é na verdade uma das linguagens mais difíceis de se fazer um compilador, devido ao uso de parênteses para muitas utilidades desconexas (em particular o casting bagunça tudo). C++ então deve ser algo do outro mundo.

  4. Leonardo Boiko Says:

    Eu gostei do livro de compiladores que tem na conectiva, não lembro o nome agora. Mas recomendo não ter medo do dragão, ou de teoria em geral.

  5. Leonardo Boiko Says:

    ah e lisp++ — lisp é uma árvore de parsing, por isso é muito iluminadora sobre o assunto.

  6. Leandro Says:

    Recomendo ler o tutorial “Let’s build a compiler”, do Jack Crenshaw. O cara faz tudo na unha, usando Pascal, e tem uma didática fantástica (ele não é da área de computação, é apenas um curioso muito esforçado). Outro tutorial massa, se vc quiser brincar com coisas cortantes e tóxicas (e, portanto, muito legais), é o do Kalleidoscope, que tem na página do LLVM. O cara faz em C++ um compilador duma linguagem muito massa com menos de 700 linhas de código, e, claro, usa o excelente LLVM para geração de código/interpretação (com JIT e tudo!). Tem material de cursos de compiladores da gringolândia também (achei vários na Internet: da Stanford e Tufts são muito bons, na minha opinião), que você pode usar como leitura complementar.

    De qualquer maneira, o livro do dragão é referência absoluta. O Aho costuma ser muito teórico e formal, mas isso faz falta nessas coisas apenas “mão na massa”, principalmente se você quiser se aprofundar no assunto… afinal ferramentas aparecem e somem mas a teoria continua lá. Eu tenho a primeira edição e já pensei várias vezes em comprar a segunda edição, por ter bastante coisa sobre linguagens dinâmicas.

    Fazer um compilador é um rito de passagem, e talvez um dos mais divertidos deles. É uma das áreas que mais me interesso.

  7. Luiz Capitulino Says:

    Opas.

    Não pensei que esse post fosse trazer tanto feedback. Muito obrigado por todas as dicas, depois que começar a estudar o assunto eu faço um novo post.

  8. Andre O Moura Says:

    Obrigado pela dica, também quero conhecer muito sobre compiladores…. vou pesquisar o livro que mencionou!!!!!