Antes de mais nada, concordo com a resposta de APENAS MINHA OPINIÃO correta sobre o aprendizado de Erlang. É uma linguagem principalmente funcional (embora a simultaneidade tenha um grande papel), e todos os seus recursos foram adicionados para oferecer tolerância a falhas e robustez, que não são exatamente os mesmos objetivos de design do Javascript.
Segundo, deixar o Node.js para entrar no Erlang é um pouco equivocado. O Node.js é um único servidor / estrutura que faz o possível para fazer tudo de maneira orientada a eventos com a ajuda de retornos de chamada. Erlang tem sua própria estrutura (OTP), mas não está no mesmo nível.
Se você planeja aprender Erlang, sugiro minha entrada no blog Uma carta aberta ao Erlang Beginner (ou espectador) como introdução à leitura antes de mergulhar nos tutoriais.
A única coisa em que você pode comparar o Erlang e o Node.js, em termos de padrões e uso, é como eles são controlados por eventos. No entanto, existem duas grandes diferenças aqui. O modelo do Node.js é baseado em retornos de chamada vinculados a eventos. Erlang é baseado em filas de mensagens e recebimentos seletivos. Quais são as implicações aí?
Primeiro de tudo, se você faz as coisas de uma maneira baseada em retorno de chamada, a única maneira de transmitir o estado é tê-lo global ou entrar na programação de estilo de passagem contínua. Em segundo lugar, você deve cuidar de toda a matriz de eventos. Um exemplo disso é que, se imaginarmos uma máquina de estados finitos muito simples: um semáforo mutex, orientado a eventos.
O semáforo mutex possui dois estados: bloqueado e livre. Sempre que uma determinada unidade de computação (trabalhador, processo, função ou thread) deseja obter acesso ao mutex, ela deve disparar um evento que diz "Estou interessado". Agora você precisa cuidar dos seguintes tipos de eventos:
- O mutex é gratuito e você solicita a obtenção do bloqueio
- O mutex está bloqueado por outra pessoa e você deseja obter o bloqueio
- O mutex está bloqueado por si mesmo e você deseja liberar o mutex
Então você tem outros eventos a considerar, como tempo limite para evitar conflitos:
- O mutex foi bloqueado e você esperou por muito tempo, um cronômetro para desistir de disparar
- O mutex foi bloqueado e você esperou por muito tempo, obteve o bloqueio e o tempo limite disparou
Então você também tem os eventos fora dos limites:
- você acabou de bloquear o mutex enquanto algum trabalhador esperava que fosse gratuito. Agora a consulta do trabalhador precisa ser enfileirada para que, quando estiver livre, seja devolvida
- Você precisa tornar todo o trabalho assíncrono
A matriz de eventos fica complexa muito rapidamente. Nosso FSM aqui possui apenas 2 estados. No caso do Erlang (ou qualquer idioma com recebimento seletivo e assíncrono com eventos potencialmente síncronos), você precisa se preocupar com alguns casos:
- O mutex é gratuito e você solicita a obtenção do bloqueio
- O mutex está bloqueado por outra pessoa e você deseja obter o bloqueio
- O mutex está bloqueado por si mesmo e você deseja liberar o mutex
E é isso. Os cronômetros são manipulados nos mesmos casos em que os recebimentos são feitos e, para qualquer coisa que tenha a ver com 'aguardar até que esteja livre', as mensagens são automaticamente enfileiradas: o trabalhador precisa aguardar uma resposta. O modelo é muito, muito mais simples nesses casos.
Isso significa que, em casos gerais, o CPS e os modelos baseados em retorno de chamada, como o do node.js, pedem que você seja muito inteligente na maneira como lida com eventos ou solicitam que você cuide de toda uma matriz de eventos complexa por completo, porque você precisa ser chamado de volta em cada caso inconseqüente resultante de problemas estranhos de tempo e alterações de estado.
Os recebimentos seletivos geralmente permitem que você se concentre apenas em um subgrupo de todos os eventos em potencial e que você raciocine com muito mais facilidade sobre os eventos nesse caso. Observe que Erlang tem um comportamento (padrão de design / implementação de estrutura) de algo chamado gen_event
. A implementação gen_event permite que você tenha um mecanismo muito semelhante ao que está sendo usado no node.js, se é isso que você deseja.
Haverá outros pontos que os diferenciam; O Erlang possui agendamento preventivo, enquanto o node.js o torna cooperativo, o Erlang é mais apto para alguns aplicativos de larga escala (distribuição e tudo), mas o Node.js e sua comunidade geralmente são mais aptos para a web e conhecem as últimas tendências da web. É uma questão de escolher a melhor ferramenta, e isso dependerá do seu histórico, do seu tipo de problema e de suas preferências. No meu caso, o modelo de Erlang se encaixa muito bem na minha maneira de pensar. Este não é necessariamente o caso para todos.
Espero que isto ajude.