Se você planeja aprender Erlang, sugiro que meu blog An Carta Aberta para o Erlang Beginner (ou espectador) como introdução antes de mergulhar em tutoriais.
A única coisa que você pode comparar Erlang e Node.js, em termos de padrões e uso, é como eles são orientados a eventos. No entanto, existem duas grandes diferenças principais aqui. O modelo do Node.js é baseado em retornos de chamada associados a eventos. Erlang é baseado em filas de mensagens e recebimentos seletivos. Quais são as implicações aí?
Primeiro de tudo, se você fizer as coisas de uma maneira baseada em retorno de chamada, a única maneira de levar o estado em volta é torná-lo global ou entrar em programação de estilo de continuação. Em segundo lugar, você tem que cuidar da matriz completa do evento. Um exemplo disso é que, se imaginarmos uma máquina de estados finita muito simples: um semáforo mutex, orientado a eventos.O semáforo mutex tem dois estados: bloqueado e livre. Sempre que uma determinada unidade de cálculo (trabalhador, processo, função ou thread) deseja obter acesso ao mutex, ele precisa disparar um evento que diz "Estou interessado". Agora você precisa cuidar dos seguintes tipos de eventos:
- O mutex é gratuito e você pede para obter o bloqueio
- O mutex é bloqueado por outra pessoa e você deseja obter o bloqueio
- O mutex está bloqueado por você e você quer liberar o mutex
Depois, você tem outros eventos a serem considerados, como tempo limite para evitar conflitos:
- O mutex foi bloqueado e você esperou por muito tempo, um timer para desistir de incêndios
- O mutex foi bloqueado e você esperou por muito tempo, obteve o bloqueio e, em seguida, o tempo limite foi desativado
Então você também tem os eventos fora do limite:
- você acabou de bloquear o mutex enquanto algum trabalhador esperava que ele fosse gratuito. Agora, a consulta desse trabalhador precisa ser enfileirada para que, quando estiver livre, ele seja tratado
- Você precisa tornar todo o trabalho assíncrono
A matriz de eventos se torna complexa muito rapidamente. Nosso FSM aqui tem apenas 2 estados. No caso de Erlang (ou qualquer idioma com recebimento seletivo e assíncrono com eventos potencialmente sincronizados), você precisa se preocupar com alguns casos:
- O mutex é gratuito e você pede para obter o bloqueio
- O mutex é bloqueado por outra pessoa e você deseja obter o bloqueio
- O mutex está bloqueado por você e você quer 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 'espera até que esteja livre', as mensagens são automaticamente enfileiradas: o trabalhador só precisa esperar por 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, solicitam que você seja muito inteligente em como lidar com eventos ou peça a você que cuide de toda uma matriz complexa de eventos. cheio, porque você tem que ser chamado de volta em cada caso inconseqüente que resulta de problemas de tempo estranhos e mudanças de estado.
Recebimentos seletivos geralmente permitem que você se concentre apenas em um subgrupo de todos os possíveis eventos e permita que você raciocine com muito mais facilidade sobre os eventos nesse caso. Note que o Erlang tem um comportamento (design pattern / framework implementation) de algo chamado gen_event
. A implementação gen_event permite que você tenha um mecanismo muito semelhante ao que está sendo usado em node.js, se é isso que você quer.
Haverá outros pontos que os diferenciam; Erlang tem agendamento preventivo, enquanto node.js torna cooperativo, Erlang é mais apto a alguns aplicativos de grande escala (distribuição e todos), mas o Node.js e sua comunidade geralmente são mais aptos à web e conhecedores da última tendência da web. É uma questão de escolher a melhor ferramenta, e isso dependerá do seu histórico, do tipo de problema e das suas preferências. No meu caso, o modelo de Erlang se encaixa muito bem na minha maneira de pensar. Isso não é necessariamente o caso de todos.
Espero que isso ajude.