88 votes

Node.js ou Erlang

J'aime vraiment ces outils lorsqu'il s'agit du niveau de concurrence qu'ils peuvent gérer.

Erlang/OTP semble être une solution beaucoup plus stable mais nécessite un apprentissage beaucoup plus poussé et une plongée dans le paradigme du langage fonctionnel. Et il semble qu'Erlang/OTP soit bien meilleur lorsqu'il s'agit de CPU multi-cœurs (corrigez-moi si je me trompe).

Mais lequel dois-je choisir ? Laquelle est la meilleure à court et à long terme ?

Mon objectif est d'apprendre un outil qui permette de faire évoluer mes projets Web sous une charge élevée plus facilement que les langages traditionnels.

0 votes

Vous pouvez utiliser JavaScript comme un langage fonctionnel avec underscorejs.org

2 votes

@ToddMoses êtes-vous sûr d'avoir commenté la bonne question ?

2 votes

Pommes et Oranges. Node.JS (à sa base) est libevent (C) + interop Javascript. Erlang est une implémentation IO totalement personnalisée. Node.JS est fait pour les applications monofilaires. Votre dilemme est de savoir si vous voulez un emploi chez Facebook/Google, ou si vous voulez faire des logiciels qui déchirent.

87voto

Justin Ethier Points 57486

Je donnerais à Erlang un essai. Même si la courbe d'apprentissage est plus raide, vous en tirerez plus de bénéfices puisque vous apprendrez un langage de programmation fonctionnel. De plus, Erlang étant spécifiquement conçu pour créer des systèmes fiables et hautement concurrents, vous en apprendrez beaucoup sur la création de services hautement évolutifs.

10 votes

Je ne pense pas qu'Erlang soit un peu plus complexe que Javascript. Il n'y a aucun type d'héritage en Erlang, donc vous êtes toujours sûr de la fonction que vous appelez. Il n'y a pas de conversion implicite de type en Erlang, donc vous êtes toujours sûr des types de données que vous utilisez. Il n'y a pas d'affectation destructive, vous êtes donc toujours sûr de ne pas avoir un vieux morceau de code cassé parce qu'un nouveau code en callback a changé votre état interne.

51voto

Jarsen Points 1713

Je ne peux pas parler pour Erlang, mais il y a quelques choses qui n'ont pas été mentionnées à propos de node :

  • Node utilise le moteur V8 de Google pour compiler le javascript en code machine. Ainsi, Node est en fait assez rapide. Cela s'ajoute aux avantages en termes de vitesse offerts par la programmation événementielle et l'io non bloquante.
  • Node a une communauté assez active. Allez sur leur groupe IRC sur freenode et vous verrez ce que je veux dire.
  • J'ai remarqué que les commentaires ci-dessus poussent Erlang sur la base qu'il sera utile d'apprendre un langage de programmation fonctionnel. Si je suis d'accord pour dire qu'il est important d'étendre ses compétences et d'en acquérir un, il ne faut pas baser un projet sur le fait que l'on veut apprendre un nouveau style de programmation.
  • D'un autre côté, Javascript est déjà dans un paradigme dans lequel vous vous sentez à l'aise pour écrire ! De plus, c'est du javascript, donc quand vous écrirez du code côté client, il aura un aspect et un toucher cohérents.
  • La communauté du nœud a déjà pompé des tonnes de modules ! Il existe des modules pour redis, mongodb, couch, etc. Un autre bon module à consulter est Express (pensez à Sinatra pour les nœuds)

Consultez le vidéo sur le blog de Yahoo par Ryan Dahl, le gars qui a écrit le noeud. Je pense que cela vous aidera à avoir une meilleure idée d'où en est node, et où il va.

Gardez à l'esprit que le nœud est encore à un stade de développement avancé, et qu'il a donc subi un certain nombre de changements - des changements qui ont cassé le code précédent. Cependant, il est censé être à un point où vous pouvez vous attendre à ce que l'API ne change plus trop. Donc si vous cherchez quelque chose d'amusant, je dirais que node est un excellent choix.

26 votes

Je pense que le moteur V8 compile JavaScript en code machine et non en assembleur.

11 votes

Le fait que tant de travaux aient été réalisés autour de Javascript ne rend pas le langage un tant soit peu adapté à la résolution de problèmes complexes. Le langage lui-même est affreux avec tous ces cas spéciaux dans la conversion des types. Et le style callback où les variables sont modifiées à des centaines d'endroits différents et l'enfer avec la recherche de l'endroit où une affectation a eu lieu.

15voto

dsmith Points 1610

Je suis un programmeur Erlang de longue date, et cette question m'a incité à jeter un œil à node.js. Ça a l'air plutôt bien.

Il semble que vous deviez lancer plusieurs processus pour tirer parti de plusieurs cœurs. Je ne vois rien qui permette de définir l'affinité des processeurs. Vous pourriez utiliser taskset sous linux, mais cela devrait probablement être paramétré et défini dans le programme.

J'ai également remarqué que le support de la plate-forme pourrait être un peu plus faible. Plus précisément, il semble que vous deviez utiliser Cygwin pour le support de Windows.

Ça a l'air bien.


Editar

Node.js a maintenant un support natif pour Windows.

5 votes

Cette réponse est un peu ancienne. Actuellement, Node est multiplateforme, pas besoin d'avoir Cygwin pour Windows. Et Node a un support intégré pour le clustering dans une machine, partageant les sockets TCP.

9voto

Warren Young Points 16324

J'envisage les deux mêmes solutions que vous, gotts, pour plusieurs projets.

Jusqu'à présent, le meilleur outil que j'ai trouvé pour les départager dans le cadre d'un projet donné est de savoir si je dois utiliser Javascript. Un système existant que je cherche à migrer est déjà écrit en Javascript, donc sa prochaine version sera probablement réalisée en node.js. D'autres projets seront réalisés dans un framework web Erlang car il n'y a pas de base de code existante à migrer.

Il faut également tenir compte du fait qu'Erlang ne se limite pas à plusieurs cœurs, mais peut s'étendre à un centre de données entier. Je ne vois pas de mécanisme intégré dans node.js qui me permette d'envoyer un message à un autre processus JS sans me soucier de la machine sur laquelle il se trouve, mais cela est intégré dans Erlang aux niveaux les plus bas. Si votre problème n'est pas assez important pour nécessiter plusieurs machines ou s'il ne nécessite pas plusieurs processus coopératifs, cet avantage n'est pas susceptible d'avoir de l'importance et vous devriez donc l'ignorer.

Erlang est en effet une piscine profonde dans laquelle il faut plonger. Je vous suggère d'écrire d'abord un programme fonctionnel autonome avant de commencer à créer des applications Web. Une première étape encore plus facile, puisque vous semblez à l'aise avec Javascript, est d'essayer de programmer JS dans un style plus fonctionnel. Si vous utilisez jQuery ou Prototype, vous êtes déjà engagé dans cette voie. Essayez de rebondir entre la programmation fonctionnelle pure en Erlang ou l'un de ses proches (Haskell, F#, Scala...) et le JS fonctionnel.

Une fois que vous êtes à l'aise avec la programmation fonctionnelle, cherchez l'un des nombreux frameworks web Erlang ; vous ne devriez probablement pas écrire votre application directement dans quelque chose de bas niveau comme inets à ce stade avancé. Regardez quelque chose comme Azote par exemple.

1 votes

On oublie souvent de mentionner que le point de vue "Erlang s'adapte à un centre de données entier" comporte des aspects très importants à prendre en compte (la sécurité en est un). Consultez le chapitre consacré à ce sujet ici : learnyousomeerlang.com/distribunomicon

9voto

p_l Points 810

Bien que j'opterais personnellement pour Erlang, je dois admettre que je suis un peu partial à l'égard de JavaScript. Mon conseil est que vous évaluez quelques points :

  1. Réutilisez-vous du code existant dans l'un ou l'autre de ces langages (à la fois en termes de code source et d'expérience du programmeur !)
  2. Voulez-vous des mises à jour à la volée sans arrêter l'application (c'est là qu'Erlang gagne par défaut - son runtime a été conçu pour ce cas, et OTP contient tous les outils nécessaires).
  3. Quelle est l'ampleur du trafic prévu, en termes d'opérations distinctes et simultanées, et non de bande passante ?
  4. Dans quelle mesure les opérations que vous effectuez pour chaque demande sont-elles "parallèles" ?

Erlang dispose d'un système de concurrence et d'un système distribué parallèle transparent pour le réseau. En fonction de la nature exacte du projet, la disponibilité d'une mise en œuvre mature d'un tel système peut l'emporter sur les problèmes liés à l'apprentissage d'un nouveau langage. Il existe également deux autres langages fonctionnant sur Erlang VM que vous pouvez utiliser, le langage Ruby/Python-like Reia y Erlang à la sauce Lisp .

Une autre option encore est d'utiliser les deux, surtout avec Erlang utilisé comme une sorte de "hub". Je ne suis pas sûr que Node.js ait un système d'interface de fonction étrangère, mais si c'est le cas, Erlang a une bibliothèque C pour que les processus externes puissent s'interfacer avec le système comme n'importe quel autre processus Erlang.

0 votes

D'après la documentation, Node.js peut tirer parti de C et C++ pour les ajouts externes. nodejs.org/docs/v0.3.1/api/addons.html

0 votes

On dirait que Reia est mort, mais à sa place on trouve élixir ... cela me fait penser à Groovy et Java ; ici, ce serait Elixir et Erlang.

0 votes

@EvanPlaice - Ça ne m'impressionne pas beaucoup. Le truc, c'est que tu es en train de coder une chose problématique en C++ et de les ajouter en tant que built-ins. Ce n'est pas vraiment une FFI si ce que vous faites réellement est d'étendre l'émulateur. (Ok, préférence personnelle ;)) La bibliothèque externe mentionnée dans le cas d'erlang est pour faire des processus asynchrones dans d'autres langues qui apparaissent comme des noeuds OU qui parlent sur un port ouvert (pensez à un tuyau bidirectionnel, avec des données structurées). Tout cela s'intègre parfaitement au mode de fonctionnement asynchrone. Il y a aussi les NIFs, qui sont essentiellement ce que Node.js a, mais qui sont déconseillés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X