Construir aplicações multi-threaded é cada vez mais comum, porém continua incrivelmente dificil. Parece que a era das máquinas multi-core chegou, eu trabalho com uma estação assim, e em breve vão ser a maioria entre os novos computadores.
O problema que construir uma aplicação multi-threaded, que explore esse novo poder chegando, é muito dificil. Existem algumas técnicas que quebram um galho enorme nesse ponto, um padrão que curiosamente é muito pouco explorado é o Ator. Atores pode ser descritos por um conjunto de processos paralelos que se comunicam por troca assíncrona de mensagens.
Programação concorrente baseada em atores é modelada de forma que cada ator do sistema realiza uma tarefa e interage com os demais enviando mensagens. Esse modelo é um sucesso em linguagens na qual a passagem de mensagens é parte da sintaxe, o recebimento e demultiplexação dessas mensagem é bem simples (usando pattern matching) e, mais importante, possui um modelo de threads bem leve. Para quem não sabe, acabei de descrever as características mais marcantes de Erlang, uma linguagem criada pela Ericson e usada muito em telecomunicações.
Erlang foi desde o começo projetada pensando nisso, então programar usando Atores é tão natural quando criar uma interface ou usar herança em Java. Para quem nunca brincou com Erlang, já aviso, é puramente funcional então para nós, marrentos com OO, doi o cérebro bastante até reaprender como se programa.Mas voltando para Atores, sua enorme vantagem é o fato que toda comunicação ocorre via troca de mensagens, então não existe problemas relacionados a concorrência, já que o processamento da sua caixa postal de mensagens ocorre em uma thread própria. Em Erlang é comum termos uma quantidade enorme de Atores em um único processo pois suas threads consomem muito pouco recurso. Para implementarmos isso em Java de forma performática precisariamos suporte de threading cooperativo, ou mais claramente, continuações.
Agora vem a parte interessante, pesquisadores de uma universidade francesa tem desenvolvido uma linguagem que vem me parecendo mais e mais interessante e promissora – Scala (leia mais no site do projeto). Scala executa em uma JVM ou .NET, e possui recursos muito muito interessantes para torná-la extensivel para seus usuários. Os resultados que eles vem obtendo são tão promissores que arrisco dizer que Scala é Ruby bem feito. Um deles, este artigo, mostra como implementar Actors em Scala de forma extremamente performática. Vale a pena conferir.
4 responses so far ↓
1 Diego Pires Plentz // Jul 28, 2006 at 7:46 pm
E cada vez mais rumamos para as VM’s encubadoras.
2 Adriano Santos // Mar 26, 2010 at 8:14 am
Acompanho os seus post, e especificamente este achei muito interessante porém, gostaria de saber por que você considera ruby “mal feita”, na verdade ela não foi desenvolvida visando programação concorrente, mas sim visando maior abstração e elegância, e nisso ela foi muito feliz.
Entenda, não estou tentando causar nenhum flame war aqui, adoro Earlang, Scala, entre outras mas cada linguagem nasce com um propósito e até pouco tempo atrás nossos maiores problemas não eram a concorrência de processos, nem tínhamos computadores com multiplos núcleos.Acredito que linguagens como Ruby, Java vão ficar inertes diante do problema da programação concorrente.Vejo uma batalha acirrada entre todas estas linguagens e que só vai beneficiar a nós, programadores….
Abs e parabéns pelo teu blog.
3 Adriano Santos // Mar 26, 2010 at 8:16 am
Errata: “Acredito que linguagens como Ruby, Java NÃO vão ficar inertes diante do problema da programação concorrente.”
4 kumpera // Mar 26, 2010 at 4:08 pm
Ruby é uma linguagem mal projetada. Ela possui uma série de inconsistências gritantes. As bibliotecas foram construídas de forma
muito ad-hoc dado a quantidade de surpreendente de tranqueiras que existem em classes base como Object e Kernel.
Isso não diminui as qualidades da linguagem, vale lembrar.
Leave a Comment