TEORIA SIM, ... MAS QUE TEORIA? Teoria é fundamental no currículo de um bom curso de Computação, sem dúvida. É a teoria que distingue um engenheiro de um técnico, um curso superior de uma escola profissional. Ensinar conhecimento prático na graduação pode atender as necessidades imediatas do mercado, mas deixa o formando depsreparado para mudanças futuras. Afinal, o aluno poderá aprender o conhecimento prático que precisar, quando precisar, no próprio trabalho. Portanto, é melhor reservar a maior parte possível de seu tempo na escola ao ensino daquilo que só a escola pode fazer direito: ensinar a teoria, e treiná-lo a aplicá-la. Isto posto, vem a pergunta: qual teoria? Dado que o tempo de escola é limitado, somos obrigados a escolher. Trinta anos atrás, a resposta consensual a esta pergunta era aquilo que podemos chamar de Teoria Clássica da Computação: estruturas de dados, análise de algoritmos, grafos, autômatos, linguagens formais, semântica formal, computabilidade e complexidade. Na época, as outras áreas desprezavam a Teoria da Computação, dizendo que era extremamente pobre e superficial. E, de fato toda a teria que um computeiro "precisava" saber, na opinião dos peritos, para merecer esse nome cabia em um livro de 300 páginas. A má notícia é que esse diagnóstico não mudou, só ficou pior. Hoje, toda a Teoria Clássica que um computeiro precisa conhecer cabe em 100 páginas, se tanto. Algumas das disciplinas clássicas não cresceram, ou cresceram apenas em direções muito distantes de aplicações. Outras tornaram-se inúteis porque suas aplicações originais desapareceram. Outras, finalmente, já eram inúteis desde o início, mas esse fato levou décadas para ser reconhecido. Linguagens Formais Vejam por exemplo o caso da Teoria de Linguagens Formais --- ou, numa tradução mais correta, Teoria Formal das Linguagens (TFL). Nas décadas de 70 e 80, o "sex appeal" dessa disciplina era decorrente de suas aplicacões na análise sintática de linguagens de programação e de línguas naturais. Naquela época, acreditava-se que o projeto de linguagens de programação e a construção de compiladores seria uma atividade importante para computeiros; e que a compreensão de línguas naturais era principalmente uma questão de sintaxe. Mas as coisas não saíram bem assim. Pelos anos 90 ficou evidente que a a linguagem de programaçãoem si era um fator de peso muito pequeno no desenvolvimento de software, e portanto a escolha da linguagem deveria levar em conta fatores externos, como disponibilidade de bibliotecas e ferramentas, interfaceamento, portabilidade, etc.. Além disso, a análise sintática passou a ser a parte mais trivial de qualquer compilador, ficando todo o custo e complexidade deslocado para a geração de código (incluindo otimização, sistema de tipos, alocação de memória, etc..). Por outro lado, percebeu-se que a análise da sintaxe de linguagens naturais não podia ser feita com gramáticas livres de contexto, e que a dificuldade da compreensão estava toda na semântica, e não na sintaxe. Alguns conceitos básicos de linguagens formais ainda são úteis hoje em dia, como notações tipo BNF para descrever linguagens de programação, e as expressões regulares para processamento de texto. Porém, esses conceitos podem ser compreendidos (e plenamente utilizados) mesmo por alunos iniciantes, sem necessidade de toda a parafernália da TFL (hierarquia de Chomski, fechamento sob várias operações, relação com autômatos, etc.) --- mesmo porque a implementação desses conceitos na prática frequentemente viola as definições da teoria. Assim, privada de suas principais aplicações, a Teoria Formal de Linguagens passou a ser largamente irrelevante para a computação. Ou seja, um computeiro que conhece TLF a fundo não tem nenhuma vantagem significativa sobre um computeiro que nunca ouviu falar da hiearquia de Chomski ou de autômatos a pilha --- nem mesmo quando a tarefa é a construção de um bom compilador, ou a análise de uma língua natural. Autômatos finitos Uma versão mais branda dessa história se repetiu no caso da Teoria de Autômatos Finitos (TAF). Ela havia sido incluída na Teoria Clássica da Computação principalmente pelas suas aplicações óbvias no projeto de circuitos digitais e em processamento de texto, por exemplo na análise léxica de linguagens de programação, e pela sua relação com a Teoria Formal de Linguagens. Essas aplicações ainda justificam o ensino do conceito de autômato finito, e da correspondência entre autômatos finitos e expressões regulares. Entretanto, mesmo nessas áreas, a importância do conceito tem diminuido em vez de aumentar. Transistores são muito mais baratos hoje do que eram 30 anos atrás, de modo que mesmo