Avez-vous réellement "essayé" (signifie programmé dans, pas seulement lu un article dessus) Erlang et décidé contre pour un projet? Si oui, pourquoi? De plus, si vous avez choisi de revenir à votre ancienne langue, ou d'utiliser un autre langage fonctionnel comme F #, Haskell, Clojure, Scala, ou autre chose, cela compte aussi et indiquez pourquoi.
Je suis retourné à Haskell pour mes projets personnels d'Erlang pour la simple vertu du système de type étonnant de Haskell. Erlang vous donne une tonne d'outils à gérer lorsque les choses tournent mal. Haskell vous donne des outils pour vous empêcher de vous tromper en premier lieu.
Lorsque vous travaillez dans un langage avec un système de type fort, vous prouvez efficacement des théorèmes libres sur votre code chaque fois que vous compilez.
Vous obtenez également un tas de sucre en surcharge des machines de classe de Haskell, mais cela est largement secondaire pour moi - même si cela me permet d'exprimer un certain nombre d'abstractions qui seraient terriblement verbeuses ou non idiomatiques et inutilisables à Erlang (par exemple Haskell's catégorie-extras).
J'adore Erlang, j'aime ses canaux et son évolutivité sans effort. Je m'y tourne quand ce sont les choses dont j'ai besoin. Haskell n'est pas une panacée. J'abandonne une meilleure compréhension opérationnelle de la consommation d'espace. J'abandonne le ramasse-miettes magique en un seul passage. J'abandonne les modèles OTP et toute cette évolutivité sans effort.
Mais c'est difficile pour moi de renoncer à la couverture de sécurité qui, comme on le dit souvent, à Haskell, si elle vérifie la frappe, c'est probablement correct.
Nous utilisons Haskell, OCaml et (maintenant) F # donc pour nous cela n'a rien à voir avec le manque de syntaxe de type C. Nous sautons plutôt Erlang parce que:
Il y a probablement d'autres raisons auxquelles je ne peux pas penser en ce moment, mais ce sont les principaux points.
La meilleure raison d'éviter Erlang est lorsque vous ne pouvez pas vous engager dans la manière fonctionnelle de programmer.
J'ai lu un discours anti-Erlang il y a quelques semaines et l'une des critiques de l'auteur à l'égard d'Erlang est qu'il ne pouvait pas comprendre comment faire pour qu'une fonction renvoie une valeur différente chaque fois qu'il l'appelait avec les mêmes arguments. Ce qu'il n'avait vraiment pas compris, c'est qu'Erlang est délibérément ainsi. C'est ainsi qu'Erlang parvient à fonctionner si bien sur plusieurs processeurs sans verrouillage explicite. La programmation purement fonctionnelle est une programmation sans effet secondaire. Vous pouvez inciter Erlang à travailler comme notre blogueur déchaîné le souhaitait, en ajoutant des effets secondaires, mais ce faisant, vous jetez la valeur qu'Erlang offre.
La programmation fonctionnelle pure n'est pas la seule bonne façon de programmer. Tout n'a pas besoin d'être rigoureusement mathématique. Si vous déterminez que votre application serait mieux rédigée dans une langue qui abuse du terme "fonction", mieux vaut rayer Erlang de votre liste.
J'ai déjà utilisé Erlang dans quelques projets. Je l'utilise souvent pour des services reposants. Cependant, je ne l'utilise pas pour les applications Web frontales complexes où des outils comme Ruby on Rails sont beaucoup mieux. Mais pour le powerbroker en coulisses) Je ne connais pas de meilleur outil qu'Erlang.
J'utilise également quelques applications écrites en Erlang. J'utilise un peu CouchDB et RabbitMQ et j'ai mis en place quelques serveurs EJabberd. Ces applications sont les outils les plus puissants, les plus simples et les plus flexibles de leur domaine.
Ne pas vouloir utiliser Erlang car il n'utilise pas JVM est dans mon esprit assez idiot. JVM n'est pas un outil magique qui est le meilleur pour tout faire dans le monde. Dans mon esprit, la possibilité de choisir parmi un arsenal d'outils différents et de ne pas être coincé dans un seul langage ou cadre est ce qui sépare les experts des singes de code.
PS: Après avoir relu mon commentaire dans son contexte, j'ai remarqué qu'il semblait que j'appelais oxbow_lakes un singe de code. Je ne l'étais vraiment pas et je m'excuse s'il l'a pris comme ça. Je généralisais sur les types de programmeurs et je n'appellerais jamais un individu un nom aussi négatif sur la base d'un commentaire de lui. Il est probablement un bon programmeur même si je l'encourage à ne pas faire de la JVM une sorte de rupture de contrat.
Alors que je ne l'ai pas fait, d'autres sur Internet l'ont, par exemple.
Nous avons étudié les avantages relatifs de C++ et d'Erlang dans la mise en œuvre d'un algorithme parallèle de traçage des rayons acoustiques pour la marine américaine. Nous avons trouvé une courbe d'apprentissage beaucoup plus petite et un meilleur environnement de débogage pour Erlang parallèle que pour la programmation C++ basée sur pthreads. Notre implémentation C++ a surpassé le programme Erlang d'au moins 12x. Les tentatives d'utilisation d'Erlang sur le microprocesseur IBM Cell BE ont été frustrées par l'empreinte mémoire d'Erlang. (Source)
Et quelque chose de plus proche de mon cœur, que je me souviens avoir relu au lendemain du concours ICFP:
Le codage était très simple, traduisant le pseudocode en C++. J'aurais pu utiliser Java ou C #, mais je suis au point où la programmation à un niveau élevé en C++ est tout aussi facile, et je voulais conserver la possibilité de descendre rapidement dans certains erlang est mon autre langue préférée pour le piratage, mais était inquiet de rencontrer un problème de performance dont je ne pouvais pas me dégager. (Source)
Pour moi, le fait que Erlang soit typé dynamiquement est quelque chose qui me rend méfiant. Bien que je fais utilise des langages typés dynamiquement parce que certains d'entre eux sont tellement très orientés vers les problèmes (prenez Python, je résous beaucoup de problèmes avec cela), je souhaite qu'ils soient plutôt typés statiquement.
Cela dit, j'avais l'intention d'essayer Erlang pendant un certain temps, et je viens de commencer à télécharger la source. Votre "question" a donc atteint quelque chose après tout. ;-)
Un certain nombre de raisons:
Parce qu'il semble étranger à toute personne habituée à la famille de langues C
Parce que je voulais pouvoir exécuter sur Java Virtual Machine pour profiter des outils que je connaissais et comprenais (comme JConsole) et des années d'efforts qui sont allés dans JIT et GC.
Parce que je ne voulais pas avoir à réécrire toutes les bibliothèques (Java) que j'ai construites au fil des ans.
Parce que je n'ai aucune idée de "l'écosystème" d'Erlang (accès à la base de données, configuration, build etc).
En gros, je connais Java, sa plate-forme et son écosystème et j'ai investi beaucoup d'efforts dans la construction de choses qui fonctionnent sur la JVM. Il était de loin plus facile de passer à scala
J'ai décidé de ne pas utiliser Erlang pour mon projet qui allait être exécuté avec beaucoup de données partagées sur un seul système multiprocesseur et je suis allé avec Clojure car Clojure obtient vraiment la mémoire partagée-concurrence. Lorsque j'ai travaillé sur des systèmes de stockage de données distribués, Erlang était un bon choix car Erlang brille vraiment sur les systèmes de transmission de messages distribués. Je compare le projet à la meilleure fonctionnalité de la langue et je choisis en conséquence
Je connais Erlang depuis l'université, mais je ne l'ai jamais utilisé jusqu'à présent dans mes propres projets. Principalement parce que je développe principalement des applications de bureau, et Erlang n'est pas un bon langage pour créer de belles interfaces graphiques. Mais je vais bientôt implémenter une application serveur, et je vais essayer Erlang, car c'est à ça que ça sert. Mais je m'inquiète d'avoir besoin de plus de bibliothèques, alors je vais peut-être essayer avec Java à la place.
Utilisé pour une passerelle de messages pour un protocole binaire propriétaire multicouche. Les modèles OTP pour les serveurs et les relations entre les services ainsi que la correspondance de modèles binaires ont rendu le processus de développement très facile. Pour un tel cas d'utilisation, je préférerais probablement Erlang à d'autres langues.
La JVM n'est pas un outil, c'est une plateforme. Bien que je sois tous en faveur du choix du meilleur outil pour le travail, la plate-forme est généralement déjà déterminée. À moins que je ne développe quelque chose de autonome, à partir de zéro et sans le désir de réutiliser tout code/bibliothèque existant (trois aspects qui sont déjà peu probables isolément déjà), je peux être libre de choisir la plate-forme.
J'utilise plusieurs outils et langages mais je cible principalement la plateforme JVM. Cela exclut Erlang pour la plupart sinon la totalité de mes projets, aussi intéressants que soient certains de ses concepts.
Silvio
Bien que j'aimais de nombreux aspects de la conception de l'exécution d'Erlang et de la plate-forme OTP, j'ai trouvé que c'était un langage de programme assez ennuyeux à développer. Les virgules et les périodes sont totalement boiteuses et nécessitent souvent de réécrire le dernier caractère de nombreuses lignes de code juste pour changer une ligne. De plus, certaines opérations simples dans Ruby ou Clojure sont fastidieuses dans Erlang, par exemple la gestion des chaînes.
Pour les systèmes distribués reposant sur une base de données partagée, le système Mnesia est vraiment puissant et probablement une bonne option, mais je programme dans une langue pour apprendre et s'amuser, et le facteur ennuyeux d'Erlang a commencé à l'emporter sur le facteur amusant une fois que j'ai dépassé la base des tutoriels sur les comptes bancaires et commencé à écrire des plugins pour un serveur XMPP.
J'adore Erlang du point de vue de la concurrence. Erlang a vraiment bien fait la concurrence. Je n'ai pas fini par utiliser erlang principalement à cause de la syntaxe.
Je ne suis pas un programmeur fonctionnel de métier. J'utilise généralement C++, donc je convoite ma capacité à basculer entre les styles (POO, impératif, méta, etc.). J'avais l'impression qu'Erlang me forçait à adorer la vache sacrée des données immuables.
J'adore son approche de la concurrence, simple, belle, évolutive, puissante. Mais pendant tout le temps que je programmais à Erlang, je continuais à penser, je préférerais de loin un sous-ensemble de Java qui interdisait le partage de données entre les threads et le modèle de concurrence Erlang utilisé. Je pensais Java aurait le meilleur pari de restreindre la langue de l'ensemble de fonctionnalités compatible avec les processus et les canaux d'Erlang.
Tout récemment, j'ai trouvé que le langage de programmation D offre concurrence de style Erlang avec une syntaxe de style c familière et un langage multi-paradigme. Je n'ai encore rien essayé massivement en parallèle avec D, donc je ne peux pas dire si c'est une traduction parfaite.
Donc, professionnellement, j'utilise C++ mais je fais de mon mieux pour modéliser des applications massivement simultanées comme je le ferais dans Erlang. À un moment donné, je voudrais donner aux outils de concurrence de D un véritable essai routier.
Je ne vais même pas regarder Erlang.
Deux articles de blog l'ont cloué pour moi:
Les machines Erlang parcourent toute la liste pour déterminer si elles ont un message à traiter, et la seule façon d'obtenir un message consiste à parcourir toute la liste (je soupçonne que le filtrage des messages par pid implique également de parcourir toute la liste des messages)
http://www.lshift.net/blog/2010/02/28/memory-matters-even-in-erlang
Il n'y a pas de miracle, en effet, Erlang ne fournit pas trop de services pour faire face aux surcharges inévitables - par exemple il est toujours laissé au programmeur d'application de s'occuper de la vérification de l'espace disponible dans la file d'attente des messages (soi-disant en parcourant la file d'attente pour déterminer la longueur actuelle et je suppose qu'il n'y a pas de mécanismes intégrés pour assurer une certaine équité entre les expéditeurs).
erlang - comment limiter la file d'attente de messages ou l'émuler?
Les deux (1) et (2) sont bien en dessous de la naïveté de mon livre, et je suis sûr qu'il y a plus de "joyaux" logiciels de même nature à l'intérieur des machines d'Erlang.
Donc, pas d'Erlang pour moi.
Il semble qu'une fois que vous devez faire face à un grand système qui nécessite de hautes performances sous surcharge, C++ + Boost est toujours le seul jeu en ville.
Je vais regarder D ensuite.
Je voulais utiliser Erlang pour un projet, en raison de son évolutivité incroyable avec le nombre de CPU. (Nous utilisons d'autres langues et nous heurtons parfois le mur, ce qui nous oblige à modifier l'application)
Le problème était que nous devons livrer notre application sur plusieurs plates-formes: Linux, Solaris et AIX, et malheureusement il n'y a pas d'installation Erlang pour AIX pour le moment.
Être une petite opération empêche les efforts de portage et de maintenance d'une version AIX d'Erlang, et demander à nos clients d'utiliser Linux pour une partie de notre application est un pas.
J'espère toujours qu'un AIX Erlang arrivera pour que nous puissions l'utiliser.