Compiladores

Um dos assuntos que tenho um grande interesse (mas nesse caso acho que é um dos que eu tenho pouco conhecimento também).

Na grade de Ciência da Computação da UFRJ temos (ou tínhamos, acho que não removeram na nova grade para o pessoal de 2009 para frente, mas não consigo me lembrar com certeza :P) uma disciplina obrigatória, no quarto período, que cobria o básico de Compiladores:

  • Entender o que um compilador faz, como faz, etapas da compilação, etc…
  • Depois aprendemos algumas técnicas (algoritmos) como o “Primeiro-Seguinte” (First-Follow).
  • No final, criamos um compilador simples utilizando um compiler-compiler como o Yacc. Quando eu fiz, nosso compilador gerava um código equivalente em C, que era em seguida passado ao gcc (acho assim o foco fica mais na criação do compilador, de como ele funciona, etc…)

(Depois de 2 anos, talvez eu tenha pulado alguma coisa importante nessa rápida descrição :P)

Mas a matéria costuma ser bem simples e com o fato de existir uma disciplina sobre L.F. (Linguagens Formais) no período anterior ao de Compiladores, normalmente quase todo mundo consegue passar com uma boa nota (agora se realmente aprendeu alguma coisa ou não… bem, não é problema meu :P).

O meu próprio projeto de compilador, o LEPSUC, esta no GitHub. E sim, ele tem alguns problemas… e alguns problemas bem idiotas (e que se tornam bem engraçados :P) que só fui descobrir 1 ano depois, quando testava algumas coisas enquanto minha namorada fazia o compilador dela (me deu curiosidade de mexer nele de novo). Então se alguém quiser usar, pode usar, mas tome cuidado :P

E tem 2 coisas que eu acho muito bacana, que envolvem compiladores:

1 – As linguagens que eles possibilitam

Toda a teoria desenvolvida e aplicada na construção de compiladores (e interpretadores) cada vez mais robustos/modernos, nos permite que hoje tenhamos linguagens como:

  • Perl: Uma linguagem DWIM (e talvez por isso tão fácil de aprender, mas tão difícil de virar um especialista :P). Coisas que podem parecer simples, como variáveis de contexto ($_), ajudam *muito* o programador e torna o Perl uma das linguagens mais prazerosas de programas que existe (emho :) ).
  • C++: Você já viu coisas incríveis que podem ser feitas com metaprogramação em C++? Se não, recomendo dar uma lida neste blog do professor Zimbrão (que por acaso é o professor de Compiladores e Computação 3 no DCC da UFRJ ;) ).
  • Linguagens funcionais/lógicas por exemplo!

Enfim, dezenas de linguagens com alguma coisa em especial, tudo proporcionado pelo compilador que consegue transformar todo aquele texto em algo que seu processador possa executar :)

OBS: Assembly continua sento h4x0rz l33t, não se preocupe :P

2 – Toda a ciência e matemática envolvida

Err… fazer um bom compilador não é apenas sentar e programar loucamente.

Tem toda uma teoria por trás… e como alguém que estuda grafos, acho que a que mais acho interessante é a parte de otimização do código. É mais complexo do que parece:

  • A otimização tem que manter a corretude de *todos* os programas. Não adianta otimizar, ficar Nx mais rápido se ele passa a fazer a coisa errada.
  • A otimização deve melhorar a performance da maioria dos programas. Não adianta melhorar um programa, em um determinado tipo de workload.
  • O tempo de otimização deve ser razoável. Ou seja, seu compilador não pode passar 1 mês otimizado seu programa que em outras ocasiões seria compilado em 5 minutos. Um exemplo disso é a modelagem do problema de alocação de registradores como o problema de Coloração, problema NP-Completo (para grafos arbitrários), logo não adianta colocar um algoritmo qualquer exponencial ai :)

Claro que os mecanismos de otimização da compilação, não vão tornar seu algoritmo n^5 em um linear ou n*log n ;) mas podem ajudar a melhorar todo o fluxo de dados dentro da CPU e memória, alocar os registradores de forma mais eficiente, permitir que trechos de códigos como loops sejam otimizados ou até paralelizados (creio que seja complicado tornar um loop paralelo automaticamente sem a ajuda do programador, dependência de dados e resultados e etc), …

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: