En primer lugar, estoy de acuerdo con la respuesta de SÓLO MI OPINIÓN correcta sobre el aprendizaje de Erlang. Es un lenguaje principalmente funcional (aunque la simultaneidad juega un papel importante), y todas sus características se agregaron para ir hacia la tolerancia a fallas y la robustez, que no son exactamente los mismos objetivos de diseño que Javascript en primer lugar.
En segundo lugar, dejar Node.js para entrar en Erlang está un poco fuera de lugar. Node.js es un servidor / marco único que se encarga de hacer todo de una manera controlada por eventos con la ayuda de devoluciones de llamada. Erlang tiene su propio marco (OTP), pero no está en el mismo nivel en absoluto.
Si planeas aprender Erlang, te sugiero que ingreses a mi blog Una carta abierta para principiantes (o curiosos) de Erlang como lectura de introducción antes de sumergirte en los tutoriales.
Lo único en lo que puede comparar Erlang y Node.js, en términos de patrones y uso, es cómo están controlados por eventos. Sin embargo, hay dos grandes diferencias importantes aquí. El modelo de Node.js se basa en devoluciones de llamada vinculadas a eventos. Erlang se basa en colas de mensajes y recepciones selectivas. ¿Cuáles son las implicaciones allí?
En primer lugar, si hace las cosas de una manera basada en la devolución de llamada, la única forma de llevar el estado es tenerlo global o entrar en la programación de estilo de paso continuo. En segundo lugar, debe cuidar la matriz completa del evento usted mismo. Un ejemplo de esto es que si imaginamos una máquina de estados finitos muy simple: un semáforo mutex, controlado por eventos.
El semáforo mutex tiene dos estados: bloqueado y libre. Cada vez que una determinada unidad de cómputo (trabajador, proceso, función o subproceso) desea obtener acceso al mutex, tiene que activar un evento que le dice "Estoy interesado". Ahora debe preocuparse por los siguientes tipos de eventos:
- El mutex es gratis y usted solicita obtener la cerradura
- El mutex está bloqueado por otra persona y desea obtener el bloqueo
- El mutex está bloqueado por usted mismo y desea liberar el mutex
Luego, debe considerar eventos adicionales, como el tiempo de espera para evitar puntos muertos:
- El mutex ha sido bloqueado y esperó demasiado tiempo, un temporizador para abandonar los incendios
- El mutex se ha bloqueado y usted esperó demasiado tiempo, obtuvo el bloqueo y luego se activó el tiempo de espera
Entonces también tienes los eventos fuera de límite:
- acabas de bloquear el mutex mientras algún trabajador esperaba que fuera gratis. Ahora la consulta de ese trabajador tiene que estar en cola para que cuando esté libre se maneje
- Necesita hacer todo el trabajo asincrónico
La matriz de eventos se vuelve compleja muy rápido. Nuestro FSM aquí solo tiene 2 estados. En el caso de Erlang (o cualquier idioma con recepción selectiva y sincronización con eventos potencialmente sincrónicos), debe preocuparse por algunos casos:
- El mutex es gratis y usted solicita obtener la cerradura
- El mutex está bloqueado por otra persona y desea obtener el bloqueo
- El mutex está bloqueado por usted mismo y desea liberar el mutex
Y eso es. Los temporizadores se manejan en los mismos casos en que se reciben, y para todo lo que tenga que ver con 'esperar hasta que esté libre', los mensajes se ponen en cola automáticamente: el trabajador solo tiene que esperar una respuesta. El modelo es mucho, mucho más simple en estos casos.
Esto significa que, en casos generales, CPS y modelos basados en devolución de llamada como el de node.js le piden que sea muy inteligente en la forma en que maneja los eventos, o le piden que se ocupe de una matriz de eventos completa completa, porque debe volver a llamar en cada caso intrascendente que resulte de problemas de tiempo extraños y cambios de estado.
Las recepciones selectivas generalmente le permiten concentrarse solo en un subgrupo de todos los eventos potenciales y le permiten razonar con mucha más facilidad sobre los eventos en ese caso. Tenga en cuenta que Erlang tiene un comportamiento (patrón de diseño / implementación de marco) de algo llamado gen_event
. La implementación gen_event le permite tener un mecanismo muy similar al que se usa en node.js si eso es lo que desea.
Habrá otros puntos que los diferenciarán; Erlang tiene una programación preventiva, mientras que node.js lo hace cooperativo, Erlang es más apto para algunas aplicaciones a gran escala (distribución y todo), pero Node.js y su comunidad suelen ser más aptos y conocedores de la última tendencia web. Se trata de elegir la mejor herramienta, y esto dependerá de sus antecedentes, su tipo de problema y sus preferencias. En mi caso, el modelo de Erlang se ajusta muy bien a mi forma de pensar. Este no es necesariamente el caso para todos.
Espero que esto ayude.