2009/7/5 le-silva <leand...@gmail.com>:
> 2- Por causa disso, meu exemplo de Scala foi por água abaixo. Porque o
> modelo de atores de Scala, apesar de ser semanticamente message
> passing, fundamentalmente, é shared memory com locks implicitos,
> implementados pela biblioteca de atores da linguagem. (Aliás, você já
> deu uma olhada nos fontes da biblioteca de atores de Scala? Eu fiz
> isso há um tempo atrás. Threads Java puras, como esperado... hehehe)
Eu não cheguei a olhar, mas um colega de trabalho meu está justamente
re-implementando um programa aqui em Scala e está gostando muito do
modelo de concorrência. Segundo ele, conseguiram esconder bastante
coisa de modo que, barrando alguns poucos casos onde a abstração vaza,
dá para fazer muita coisa legal sem perceber que são Java threads.
Aliás, acho muito bacana, de um ponto de vista de linguagem pura, que
Scala consiga implementar toda a abstração recorrendo somente à sua
própria sintaxe e semântica, sem necessidade de suporte nativo no
compilador. Eu estou estudando um pouco a linguagem, fazendo alguns
scripts aqui e ali, e gostei de várias das decisões que eles tomaram
para isso.
> Pela que a linguagem Java não tenha uma sintaxe tão flexivel. =( Mas
> deu pra fazer uma coisa interessante. Pena eu não ter um código aqui,
> agora, pra mostrar, porque implementei isso pra empresa que trabalho.
> Na segunda-feira prometo que posto um exemplinho -- claro, se você
> tiver interesse, não sei se você tem muito interesse em Java, sei lá.
Manda bala. Acabei demorando para responder, mas sempre estou interessado. ;)
> Principalmente se não for seguida a boa prática de deixar o código
> concorrente livre de efeito colateral. Afinal, concorrencia e efeito
> colateral na mesma frase não combinam nem a pau.
Sim. Gostei da diferença entre val e var no Scala justamente por dar
essa flexibilidade. Só não gostei das palavras-chave serem tão
parecidas. Por causa de uma consoante, nego pode perder horas
procurando um bug. :)
> Vou dar uma olha no seu projeto, me parece interessante.
Preciso só voltar a codar. :)
Abraços,
R.
Opa!
2009/7/5 le-silva <leand...@gmail.com>:
> 2- Por causa disso, meu exemplo de Scala foi por água abaixo. Porque oEu não cheguei a olhar, mas um colega de trabalho meu está justamente
> modelo de atores de Scala, apesar de ser semanticamente message
> passing, fundamentalmente, é shared memory com locks implicitos,
> implementados pela biblioteca de atores da linguagem. (Aliás, você já
> deu uma olhada nos fontes da biblioteca de atores de Scala? Eu fiz
> isso há um tempo atrás. Threads Java puras, como esperado... hehehe)
re-implementando um programa aqui em Scala e está gostando muito do
modelo de concorrência. Segundo ele, conseguiram esconder bastante
coisa de modo que, barrando alguns poucos casos onde a abstração vaza,
dá para fazer muita coisa legal sem perceber que são Java threads.
Aliás, acho muito bacana, de um ponto de vista de linguagem pura, que
Scala consiga implementar toda a abstração recorrendo somente à sua
própria sintaxe e semântica, sem necessidade de suporte nativo no
compilador. Eu estou estudando um pouco a linguagem, fazendo alguns
scripts aqui e ali, e gostei de várias das decisões que eles tomaram
para isso.
Eu confesso que não cheguei a entrar em todos detalhes possíveis mas
no que o meu colega precisou na implementação o resultado foi
satisfatório. De fato, o código que foi criado não usa nada de
especial e não tem nenhum requerimento muito complicada. E, por razões
várias, Scala faz mais sentido para nós agora do que Erlang e foi uma
substituição até bem tranqüila. Imagino que para necessidade bem mais
complexas possa haver alguma falha na implementação, mas não cheguei
ainda nesse ponto.
> No caso tentei adaptar um parser p/ um protocolo para funcionar com actors
> mas não deu muito certo já que para o treco todo funcionar você tem que
> bloquear
> to top-level receive.
Pelo que eu andei lendo na literatura, embora não seja considerado de
boa forma bloquear no top-level, há maneiras de contornar isso usando
helper actors. Não sei, é claro, se era aplicável no seu caso.
Abraços,
R.
Duas coisas que você comenta em seu post:
http://www.kumpera.net/blog/index.php/2007/03/01/java-e-concorrencia-via-actor
"O maior problema é que Java não é a plataforma ideal para se
implementar Actors da maneira ideal. Você é obrigado a assumir vários
trade-off para chegar em uma solução escalavel. Primeiro que utilizar
uma thread por actor não vinga, dificilmente um sistema suportaria
mais de 3mil deles. Um programa erlang pode ter milhares de micro-
processos sem nenhum problema."
Uma coisa que tive que fazer em minha implementação foi não manter as
threads vivas o tempo todo. Fiz alguns testes e não demorava muito pra
JVM explodir por falta de threads... hehehe... Então, mantenho-nas
vivas o mínimo possível.
"Finalmente tem o problema que apenar de usar um modelo de troca de
mensagens que não precisa de memória compartilhada, não podemos nos
dar o luxo de ter actors que simplesmente abortam na presença de
erro."
Esse foi o motivo de eu prover um onException, pra que o ator possa
fazer algo se alguma falha ocorrer.