Tout d’abord, je suis d’accord avec la réponse de JUST MY OPINION concernant l’apprentissage d’Erlang. C'est un langage essentiellement fonctionnel (bien que la simultanéité joue un grand rôle), et toutes ses fonctionnalités ont été ajoutées pour aller vers la tolérance aux pannes et la robustesse, ce qui n'est pas exactement le même objectif de conception que Javascript.
Deuxièmement, laisser Node.js entrer dans Erlang est un peu mal placé. Node.js est un serveur / framework unique qui permet de tout faire de manière événementielle à l'aide de callbacks. Erlang a son propre cadre (OTP), mais ce n’est pas du tout au même niveau.
Si vous envisagez d'apprendre Erlang, je suggère dans mon billet une lettre ouverte au débutant d'Erlang (ou spectateur) comme lecture d'introduction avant de plonger dans des didacticiels.
La seule chose dans laquelle vous pouvez comparer Erlang et Node.js, en termes de modèles et d'utilisation, est la manière dont ils sont gérés par les événements. Cependant, il y a deux grandes différences majeures ici. Le modèle de Node.js est basé sur des rappels liés à des événements. Erlang est basé sur les files de messages et les réceptions sélectives. Quelles sont les implications ici?
Tout d'abord, si vous faites les choses à la manière d'un rappel, la seule façon de véhiculer un état est de le généraliser ou de l'introduire dans une programmation de type poursuite. Deuxièmement, vous devez vous occuper de la matrice complète de l'événement. Un exemple de ceci est que si nous imaginons une machine à états finis très simple: un sémaphore mutex, piloté par les événements.
Le sémaphore mutex a deux états: verrouillé et libre. Chaque fois qu'une unité de calcul donnée (ouvrier, processus, fonction ou thread) veut accéder au mutex, elle doit déclencher un événement qui lui dit "je suis intéressé". Maintenant, vous devez prendre en charge les types d'événements suivants:
- Le mutex est gratuit et vous demandez d'obtenir le verrou
- Le mutex est verrouillé par quelqu'un d'autre et vous voulez obtenir le verrou
- Le mutex est verrouillé par vous-même et vous voulez le libérer.
Ensuite, vous avez d'autres événements à prendre en compte, tels que le dépassement de temps pour éviter les blocages:
- Le mutex a été verrouillé et vous avez attendu trop longtemps, une minuterie pour arrêter les feux
- Le mutex a été verrouillé et vous avez attendu trop longtemps, vous avez obtenu le verrou puis le délai d’attente s'est déclenché.
Ensuite, vous avez également les événements hors limites:
- vous venez de verrouiller le mutex alors qu'un travailleur s'attendait à ce qu'il soit libre. Maintenant, la requête de ce travailleur doit être mise en file d'attente de sorte que, lorsqu'elle est libre, elle soit traitée en retour
- Vous devez rendre tout le travail asynchrone
La matrice d'événements devient très rapide. Notre FSM ici n'a que 2 états. Dans le cas de Erlang (ou de toute langue avec réception sélective et asynchrone avec des événements potentiellement synchrones), vous devez vous soucier de quelques cas:
- Le mutex est gratuit et vous demandez d'obtenir le verrou
- Le mutex est verrouillé par quelqu'un d'autre et vous voulez obtenir le verrou
- Le mutex est verrouillé par vous-même et vous voulez le libérer.
Et c'est tout. Les minuteries sont traitées dans les mêmes cas que la réception, et pour tout ce qui concerne l'attente de la gratuité, les messages sont automatiquement mis en file d'attente: le travailleur doit seulement attendre une réponse. Le modèle est beaucoup, beaucoup plus simple dans ces cas.
Cela signifie qu'en général, les modèles CPS et basés sur le rappel, tels que celui de node.js, vous demandent soit d'être très intelligent dans la gestion des événements, soit de prendre en charge l'intégralité d'une matrice d'événements complexe, car vous devez être rappelé pour chaque cas sans conséquence résultant de problèmes de synchronisation et de changements d'état étranges.
Les réceptions sélectives vous permettent généralement de vous concentrer uniquement sur un sous-groupe de tous les événements potentiels et vous permettent de raisonner beaucoup plus facilement à propos des événements dans ce cas. Notez que Erlang a un comportement (implémentation de modèle de conception / framework) appelé quelque chose gen_event
. L'implémentation de gen_event vous permet d'avoir un mécanisme très similaire à ce qui est utilisé dans node.js si c'est ce que vous voulez.
Il y aura d'autres points qui les différencient; Erlang a une planification préemptive tandis que node.js le rend coopératif, Erlang est plus apte à certaines applications à très grande échelle (distribution et autres), mais Node.js et sa communauté sont généralement plus aptes au Web et mieux informés des dernières tendances du Web. C'est une question de choix du meilleur outil, et cela dépendra de vos antécédents, de votre type de problème et de vos préférences. Dans mon cas, le modèle d'Erlang correspond très bien à ma façon de penser. Ce n'est pas nécessairement le cas pour tout le monde.
J'espère que cela t'aides.