你真的“尝试过”(意味着编程,而不只是阅读一篇文章)Erlang并决定反对它的项目?如果是这样,为什么?此外,如果您选择使用旧语言,或者使用其他功能语言,如F#,Haskell,Clojure,Scala或其他类似语言,那么这也很重要,并说明原因。
答案 0 :(得分:49)
我从Erlang返回Haskell的个人项目,因为Haskell的惊人类型系统的简单优点。 Erlang为您提供了大量工具来处理出错的时间。 Haskell为您提供了一些工具,可以帮助您避免出错。
使用强类型系统的语言工作时,每次编译时都可以有效地证明代码的自由定理。
你也从Haskell的类型类机器中得到了一堆重载糖,但这在很大程度上是次要的 - 即使它确实允许我表达一些在Erlang中非常冗长或非惯用且无法使用的抽象(例如Haskell的类别附加)。
我喜欢Erlang,我喜欢它的频道和轻松的可扩展性。当这些是我需要的东西时,我转向它。哈斯克尔不是灵丹妙药。我放弃了对空间消耗的更好的操作理解。我放弃了神奇的一通垃圾收集器。我放弃了OTP模式和所有轻松的可扩展性。
但是我很难放弃安全毯,就像通常所说的那样,在Haskell中,如果它有类似的话,它可能是正确的。
答案 1 :(得分:26)
我们使用Haskell,OCaml和(现在)F#所以对我们来说它与缺少类C语法无关。相反,我们跳过Erlang是因为:
我可能还有其他原因,但这些是主要观点。
答案 2 :(得分:25)
避免Erlang的最佳理由是当你无法承诺编程的功能时。
几周前我读了一篇反Erlang的博客咆哮,作者对Erlang的一个批评是他无法弄清楚每次用相同的参数调用函数时如何使函数返回不同的值。他真正没想到的是,Erlang是故意的。这就是Erlang如何在没有显式锁定的情况下在多个处理器上运行良好的方式。纯功能编程是无副作用的编程。你可以像我们的咆哮博客一样武装扭曲Erlang,添加副作用,但这样做会丢掉Erlang提供的价值。纯函数式编程不是唯一正确的编程方式。并非一切都需要在数学上严谨。如果您确定您的应用程序最好用滥用术语“功能”的语言编写,最好将Erlang从您的列表中删除。
答案 3 :(得分:16)
我已经在一些项目中使用过Erlang。我经常用它来提供宁静的服务。我不使用它的地方适用于复杂的前端Web应用程序,其中Ruby on Rails等工具要好得多。但对于幕后的权力经纪人,我知道没有比Erlang更好的工具。
我还使用了一些用Erlang编写的应用程序。我稍微使用了CouchDB和RabbitMQ,并且我已经设置了一些EJabberd服务器。这些应用程序是其领域中最强大,最简单和最灵活的工具。
不想使用Erlang,因为它不使用JVM在我看来非常愚蠢。 JVM不是一个在世界上做所有事情最好的神奇工具。在我看来,能够从不同工具中选择而不是陷入单一语言或框架中的能力将专家与代码猴分开。
PS:在上下文中阅读我的评论后,我注意到它看起来像是在叫oxbow_lakes一个代码猴子。如果他这样做,我真的不是并且道歉。我正在概括程序员的类型,我绝不会根据他的一条评论称个人为负面名称。他可能是一个优秀的程序员,尽管我鼓励他不要让JVM成为某种交易破坏者。
答案 4 :(得分:9)
虽然我没有,但互联网上的其他人也有,例如</ p>
我们调查了相对优点 C ++和Erlang的实现 平行声线追踪 美国海军的算法。我们找到 一个小得多的学习曲线和 更好的调试环境 并行Erlang比 基于pthreads的C ++编程。我们的 C ++实现优于 Erlang程序至少12倍。 尝试在IBM Cell上使用Erlang BE微处理器感到沮丧 Erlang的内存占用。 (Source)
更接近我的心,我记得在ICFP比赛结束后回顾:
编码非常简单, 将伪代码转换为C ++。一世 本来可以使用Java或C#,但我在 编程高的地方 C ++中的级别同样简单,我 想要保留快速的选择 跌入一些低级别 如果归结为它,就会喋喋不休。 Erlang是我最喜欢的语言 黑客入侵,但很担心 关于遇到一些表现 我无法解脱的问题 我来自。 (Source)
答案 5 :(得分:7)
对我来说,Erlang动态输入的事实让我很谨慎。虽然我做使用动态类型语言,因为其中一些非常注重问题(使用Python,我解决了很多问题),我希望它们是静态类型的。
那就是说,我实际上打算在一段时间内尝试Erlang,我刚刚开始下载源代码。所以你的“问题”毕竟取得了成就。 ; - )
答案 6 :(得分:6)
有很多原因:
因为它看起来与任何习惯使用C语言家族的人不相同
因为我希望能够在 Java虚拟机上运行,以利用我所了解和理解的工具(如JConsole)以及多年来努力进入JIT和GC
因为我不想重写我多年来建立的所有(Java)库。
因为我不知道Erlang“生态系统”(数据库访问,配置,构建等)。
基本上我熟悉Java,它的平台和生态系统,我已经投入了大量精力来构建在JVM上运行的东西。到目前为止更容易移动到scala
答案 7 :(得分:6)
我从大学开始就认识Erlang,但到目前为止我从未在自己的项目中使用它。主要是因为我主要开发桌面应用程序,而Erlang并不是制作漂亮GUI的好语言。但是我很快就会实现一个服务器应用程序,我会尝试一下Erlang,因为这是它的好处。但我担心我需要更多的图书馆,所以也许我会尝试使用Java。
答案 8 :(得分:6)
我决定不使用Erlang来处理我的项目,该项目将在单个多处理器系统上运行大量共享数据,然后使用Clojure,因为Clojure真正获得了共享内存并发性。当我处理分布式数据存储系统时,Erlang非常适合,因为Erlang真的很喜欢分布式消息传递系统。 我将项目与语言中的最佳功能进行比较,并相应地选择
答案 9 :(得分:5)
用于专有的多层二进制协议的消息网关。服务器的OTP模式和服务之间的关系以及二进制模式匹配使开发过程变得非常容易。对于这样一个用例,我可能会再次使用Erlang而不是其他语言。
答案 10 :(得分:4)
JVM不是一个工具,它是一个平台。虽然我都赞成选择最适合这项工作的工具,但平台大多已经确定了。除非我从头开始独立开发一些东西,而不想重用任何现有的代码/库(三个方面已经不太可能孤立),我可以自由选择平台。
我使用多种工具和语言但我主要针对JVM平台。如果不是我的所有项目,大多数情况都会排除Erlang,就像其中一些概念一样有趣。
西尔维奥
答案 11 :(得分:4)
虽然我喜欢Erlang运行时和OTP平台的许多设计方面,但我发现它是一种非常讨厌的程序语言。逗号和句号完全是蹩脚的,并且经常需要重写最后一个字符许多行代码只是为了改变一行。另外,一些在Ruby或Clojure中很简单的操作在Erlang中很繁琐,例如字符串处理。
对于依赖于共享数据库的分布式系统,Mnesia系统非常强大,可能是一个不错的选择,但是我用一种语言编程来学习和玩乐,而且一旦我得到它,Erlang的讨厌因素开始超过有趣的因素通过基本的银行帐户教程,并开始为XMPP服务器编写插件。
答案 12 :(得分:3)
我从并发的角度来看Erlang。 Erlang确实做到了并发。我最终没有使用erlang主要是因为语法。
我不是一个职业程序员。我通常使用C ++,所以我贪图我在样式之间切换的能力(OOP,命令式,元等)。感觉就像Erlang强迫我崇拜不可变数据的神圣牛。
我喜欢它的并发方法,简单,美观,可扩展,功能强大。但是我一直在Erlang编程的时候我一直在想,我更喜欢Java的一个子集,它不允许线程和使用过的Erlangs并发模型之间的数据共享。我认为Java最好用限制语言功能集与Erlang的进程和通道兼容。
就在最近,我发现D Programing language提供Erlang style concurrency熟悉的c风格语法和多范式语言。我还没有尝试过任何与D大量同时发生的事情,所以我不能说它是否是一个完美的翻译。
所以我专业地使用C ++,但我会像在Erlang中那样尽力模拟大规模并发应用程序。在某些时候,我想给D的并发工具一个真正的试驾。
答案 13 :(得分:2)
我甚至不会看Erlang。
两篇博客文章为我钉了它:
Erlang机器遍历整个列表以确定它们是否有要处理的消息,获取消息的唯一方法就是遍历整个列表(我怀疑通过pid过滤消息还涉及遍历整个消息列表)
http://www.lshift.net/blog/2010/02/28/memory-matters-even-in-erlang
没有奇迹,事实上,Erlang没有提供太多服务来处理不可避免的重载 - 例如仍然由应用程序员来处理检查消息队列中的可用空间(假设通过走队列来计算当前长度,并且我认为没有内置机制来确保发送者之间的公平性)。
我的书中的(1)和(2)都是天真的,我相信在Erlang机器内有更多类似性质的软件“宝石”。
所以,对我来说没有Erlang。
似乎一旦你必须处理一个需要在超载情况下具有高性能的大型系统,C ++ + Boost仍然是城里唯一的游戏。
接下来我会看看D.
答案 14 :(得分:2)
我想将Erlang用于一个项目,因为它具有令人惊讶的可扩展性和CPU数量。 (我们使用其他语言,偶尔会碰壁,让我们不得不调整应用程序)
问题在于我们必须在多个平台上提供我们的应用程序:Linux,Solaris和AIX,不幸的是,目前还没有针对AIX的Erlang安装。
作为一个小型操作会阻止移植和维护AIX版本的Erlang,并要求我们的客户使用Linux作为我们应用程序的一部分是不行的。
我仍然希望AIX Erlang能够到达,以便我们可以使用它。