sexta-feira, 11 de maio de 2007

Linguagens funcionais




Há alguns dias atrás coloquei a seguinte pergunta no GUJ:

Sei que muitas faculdades lá fora ensinam linguagens funcionais de programação e fiquei curioso de fazer uma pequena enquete no GUJ. Perguntei:

  1. Você já ouviu falar ou já usou alguma linguagem funcional?
  2. Você aprendeu alguma linguagem funcional? Qual? Foi na faculdade? Qual faculdade?
  3. Se aprendeu alguma linguagem funcional, você acredita que conhecer uma linguagem funcional pode lhe dar alguma vantagem no futuro?
  4. Se aprendeu alguma linguagem funcional, você admite que no futuro haverá espaço para programadores em linguagens como erlang, links, scala ou outra qualquer do gênero?

Vale a pena ler as respostas uma a uma. Colocarei aqui minha impressão sobre esta pesquisa. No fim revelarei parte dos motivos que me levaram a fazê-la. Em outro post, abordarei um tema que deixará claro porque acho que há motivos imediatos para que a gente procure saber mais sobre linguagens funcionais.

Mas antes de falar sobre as respostas listarei algumas definições encontradas com ajuda do google:

Java, C, Pascal, etc. são o que se chamam de linguagens imperativas no sentido em que consistem em uma seqüência de comandos. Mas o que caracteriza uma linguagem funcional?

Segundo a introdução ao Haskell, um programa funcional é uma expressão e é executado avaliando a expressão. O texto lembra que quem usou uma planilha já tem experiência com programação funcional. Nas planilhas se especifica o valor de uma célula em função dos valores de outras. O foco está no que é calculado e não no como é calculado. Outro exemplo citado é o da linguagem de consultas SQL onde se escreve a expressão sem se preocupar como ela será implementada pelo sistema gerenciador de base de dados.

Segundo http://www.nist.gov/dads/HTML/purelyfnctnl.html, linguagem funcional não permite nenhuma ação destrutiva do tipo sobrescrever dados. As linguagens puramente funcionais são livres de "side effects", isto é, a chamada de uma função não tem nenhum efeito além de avaliar o resultado da função.

Segundo http://cbbrowne.com/info/functional.html, programação funcional é um estilo de programar que enfatiza a avaliação de expressões ao invés da execução de comandos. As espressões nestas linguagens são formadas usando funções para combinar valores básicos. Uma linguagem funcional é uma linguagem que suporta e encoraja a programação no estilo funcional.

Acho que estas definições ainda não deixaram as coisas 100% claras mas o google está aí para resolver esta lacuna. Chega de definições e vamos aos finalmentes.

Não sei se o número de respostas permite tirar muitas conclusões porque apesar do tópico ter sido lido por quase 600 gujeiros, só 17 responderam.

O que consegui entender das respostas foi:

  • Algumas faculdades ensinam algum tipo de linguagem funcional;
  • Alguns desenvolvedores mais interessados já estudaram alguma linguagem funcional, mas não ficou claro com qual profundidade;
  • Foi citado que a exposição a uma linguagem funcional torna mais fácil entender algumas novidades pois elas muitas vezes são oriundas de alguma linguagem funcional;
  • A maioria não acredita que vá usar alguma linguagem funcional em sua vida profissional

O que eu posso dizer sem antecipar o assunto do meu próximo post?

Muitos esqueceram que já usam linguagens funcionais nas consultas SQL, nas planilhas, nas transformações XSLT e em muitas outras áreas. Ninguém se lembrou de que o conceito de generics do Java veio de uma extensão do Java chamada GJ. Esta é baseada em outra extensão do Java chamada pizza, que por sua vez incorpora princípios de linguagens funcionais e closures é um deles. Ah, acho que quase todo mundo no GUJ já ouviu falar em closures que é, mais um conceito do mundo das linguagens funcionais e que a gente vai usar com o Java 7.

E porque fiz esta pesquisa com nossos homens de Java?

  • Porque neste modelo de programação, há muita pesquisa acadêmica que repercurte também em grandes empresas como a Microsoft, por exemplo. Devido a isto, há alguns indícios que estamos em meio a uma revolução no modo de escrever programas, com as linguagens pouco a pouco incorporando as facilidades das linguagens funcionais.
  • Porque no Java serão incluídos alguns conceitos oriundos das linguagens funcionais já no Java 7 e possivelmente alguns outros nas versões subseqüentes. Apesar de que, no Java esta evolução será mais lenta do que nas linguagens dominadas pela Microsoft. O motivo do Java evoluir mais devagar é porque em casa que todo mundo manda ninguém tem razão. A vantagem da padronização feita em grupo do tipo JCP vira transtorno no momento de decidir rápido por mudanças mais radicais que o mercado pode exigir.
  • Para entender conceitos novos como closures e continuations.
  • Para estar apto a executar tarefas específicas programando em outras linguagens com mais facilidades de conviver com máquinas multiprocessadas como Scala ou erlang.
Há outros motivos. A motivação mais forte e imediata para aprender pelo menos um mínimo de linguagens funcionais, será assunto do meu próximo post quando falarei um pouco de .NET.




4 comentários:

Andre Barbosa disse...

Legal o post, fiquei curioso para ler o próximo, mas minha duvida mesmo é o porque do lambda como imagem ilustrativa.

Anônimo disse...

Já fiz umas fórmulas monstruosas no Excel (sem VBA). De fato, quando vi Lisp rolou um Déjà Vu.

Luca Bastos disse...

André

O lambda, além de enfeite, serve para lembrar que o chamado lambda calculus ou λ-calculus, é a base da maioria dos modelos de programação funcional.

Anônimo disse...

mbda, além de enfeite, serve para lembrar que o chamado lambda calculus ou λ-calculus, é a base da maioria dos modelos de programação funcional.

Quem sou eu

São Paulo/Paraty, SP/RJ, Brazil
Engenheiro estrutural COPPE/UFRJ por formação, desenvolvedor Java por experiência e poeta se sobrasse tempo