您为什么决定使用Erlang来“反对”?


72

您是否真的尝试过Erlang(编程的方式,而不仅仅是阅读其中的文章),并决定反对该项目?如果是这样,为什么?另外,如果您选择返回原来的语言,或者使用其他功能语言,例如F#,Haskell,Clojure,Scala或其他某种语言,那么这也很重要,并说明原因。

Answers:


49

我出于Haskell惊人的类型系统的简单优点,从Erlang回到Haskell进行个人项目。当出现问题时,Erlang为您提供了大量的工具来处理。Haskell首先为您提供了防止出错的工具。

当使用具有强大类型系统的语言工作时,每次编译时,您都会有效地证明有关代码的免费定理。

您还可以从Haskell的类型类机器中获得一堆重载糖,但这对我来说是次要的-即使它确实允许我表达许多在Erlang中非常冗长或非惯用且不可使用的抽象(例如,Haskell的类别附加)。

我喜欢Erlang,也喜欢它的渠道和轻松的可扩展性。当我需要这些东西时,我会转向它。Haskell不是万能药。我放弃了对空间消耗的更好的操作理解。我放弃了神奇的一站式垃圾收集器。我放弃了OTP模式和所有那些毫不费力的可扩展性。

但是,我很难放弃通常所说的在Haskell中进行的安全保护,如果它进行类型检查,那可能是正确的。


2
请注意,Haskell甚至支持REPL(例如,通过ghci),甚至不需要写-编译-执行周期。对我而言,这将静态(〜打字)和动态语言领域的精华融为一体。
康拉德·鲁道夫

2
@Konrad Haskell的REPL有限制。一方面,您无法data在其中编写定义。您需要将其写入文件,并进行REPL处理。ghci和拥抱。
Daniel C. Sobral

6
好点子!我听说将类型系统添加到Erlang是很棘手的,这主要是由于Hot Code Swap。阿姆斯特朗(Armstrong)和佩顿·琼斯(Peyton Jones)在本采访中谈到了Haskell和Erlang的类型:infoq.com/interviews/armstrong-peyton-jones-erlang-haskell
乔纳斯(Jonas)2010年

2
@Sanoj:非常感谢您与我们的访谈,这真是令人震惊。目前,我正在阅读Seibel的“工作中的编码员”,但是他们两个都有发言权,但是让他们彼此毗邻是令人难以置信的。引号/。limerick
Konrad

1
对于在Erlang中使用类型系统,您对Dialyzer和TypEr有何看法?当然,这是不一样的(成功键入而不是Hindley-Milner类型推断),但以我的经验,它在防止软件缺陷方面做得很好。
我给大家带来了糟糕的建议

26

我们使用Haskell,OCaml和(现在)F#,所以对我们而言,它与缺乏C语言语法无关。相反,我们跳过Erlang是因为:

  • 它是动态打字的(我们是Haskell打字系统的粉丝)
  • 没有提供“真实的”字符串类型(我知道为什么,但是很烦人的是尚未在语言级别对此进行更正)
  • 倾向于使用不良的(不完整或未维护的)数据库驱动程序
  • 它不包含电池,似乎没有一个社区致力于纠正此问题。如果是这样,它就不会高度可见。Haskell至少具有Hackage,我想这就是我们选择该语言的原因。在Windows环境中,F#在这里将具有最终的优势。

我可能现在还无法想到其他原因,但这是要点。


1
哦,是的,很多-尽管从未用于生产应用程序。在评估一项新技术时,它有助于首先使用它构建一些内部工具。我们喜欢Erlang,并且在运行使用它的产品(如RabbitMQ)方面没有问题,但由于已经列出的原因,因此更喜欢上面列出的技术。
肖恩

25

避免使用Erlang的最好理由是,当您无法使用编程的功能方式时。

几周前,我读了一篇反Erlang博客文章,作者对Erlang的批评之一是,他无法弄清楚如何使函数每次以相同的参数调用时都返回不同的值。他真正没有想到的是,Erlang是故意这样做的。这就是Erlang在没有显式锁定的情况下设法在多个处理器上运行良好的方式。纯函数式编程是无副作用的编程。您可以将Erlang扭曲成我们的博客作者想要的那样工作,增加副作用,但是这样做会浪费掉Erlang提供的价值。

纯粹的函数式编程不是唯一正确的编程方法。并非所有数学上都需要严格。如果您确定最好用误用“功能”一词的语言编写应用程序,则最好将Erlang排除在列表之外。


2
rand()在功能设计方面进行了有趣的研究。其中许多标准C库函数都是不可重入的rand()。许多C库实现都有很好的理由提供可重入的替代方案。(例如,我正在使用的计算机上的C库现在提供了纯函数可重入rand_r()。)Erlang确实提供了类似C的random:uniform()函数,但也提供了纯函数random:uniform_s()。应该使用一种版本,使两种语言都可以明确显示内部状态。
沃伦·杨

1
“secure.wikimedia.org/wikipedia/en/wiki/… “一个函数为指定类型的每个输入都精确分配了一个值。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

16

我已经在一些项目中使用过Erlang。我经常将其用于宁静的服务。但是,我不使用它的地方是复杂的前端Web应用程序,其中像Ruby on Rails这样的工具要好得多。但是对于幕后的超级经纪人,我所知没有比Erlang更好的工具。

我还使用了一些用Erlang编写的应用程序。我稍微使用了CouchDB和RabbitMQ,并设置了一些EJabberd服务器。这些应用程序是其领域中最强大,最简单和灵活的工具。

在我看来,不使用Erlang是因为它不使用JVM,这很愚蠢。JVM并不是一种神奇的工具,它可以胜任世界上所有事情。在我看来,能够从众多工具中进行选择而不会陷入单一语言或框架的能力,使专家与代码猴子区分开来。

PS:在上下文中阅读完我的评论后,我发现它看起来像是在将oxbow_lakes称为代码猴子。我真的不是,如果他那样做,我就表示歉意。我只是在概括程序员的类型,我永远不会根据他的评论将这样的人称为否定名字。即使我鼓励他不要让JVM成为某种破坏交易的人,他可能还是一个不错的程序员。


3
我认为整个“它看起来不像C,因此很糟糕”比JVM有点差。如果你问我,那简直太傻了。但是没有人问我,所以我应该保持安静。;)
Rayne 2010年

9

虽然我没有,但互联网上的其他人例如

我们研究了C ++和Erlang在为美国海军实施并行声射线跟踪算法时的相对优势。与基于pthread的C ++编程相比,我们发现并行Erlang的学习曲线小得多,调试环境更好。我们的C ++实现比Erlang程序至少好12倍。尝试在IBM Cell BE微处理器上使用Erlang受到Erlang的内存占用的困扰。 (资源)

还有更贴近我的内心,我记得在ICFP竞赛后回读的内容:

编码非常简单,将伪代码转换为C ++。我本可以使用Java或C#,但目前我正处于使用C ++进行高级编程同样容易的时刻,并且我想保留以下选项:如果有的话,可以快速跳入一些低级的纠结中下去。Erlang是我最喜欢使用的另一种入侵语言,但是担心遇到一些我无法自拔的性能问题。(资源)


哇,我什至不知道Erlang在IBM Cell BE处理器上运行。那么Erlang是否最适合大内存环境?
yazz.com 2010年

8
Erlang是高可靠性高交易环境的绝佳选择。您可以通过基于Erlang的交换机拨打所有电话。并且它在MQ和Jabber等Internet服务器中越来越普遍。
威尔

1
电话交换机是语言的良好温床。AT&T贝尔甚至催生了两种主流语言,即C和C ++。而且他们的电话开关在90年代的大部分时间内都具有最高的FCC测量可靠性。但是到达那里的学习曲线相当高。
MSalters 2010年

7

对我来说,Erlang是动态键入的,这让我感到警惕。虽然我使用动态类型语言,因为他们中的一些只是这样很面向问题(以Python中,我解决了很多与它的问题),我想他们是静态类型来代替。

就是说,我实际上打算尝试Erlang一段时间,而我才刚刚开始下载源代码。因此,您的“问题”毕竟取得了一些成就。;-)


6

我从大学开始就认识Erlang,但是到目前为止,我从未在自己的项目中使用过它。主要是因为我主要在开发桌面应用程序,而Erlang并不是制作出色的GUI的好语言。但是我很快将实现一个服务器应用程序,并且我将尝试一下Erlang,因为这就是它的优点。但是我担心我需要更多的库,所以也许我会尝试使用Java。


2
Joe Armstrong不是专门为X Windows协议编写Erlang适配器吗?我以为用Erlang编写GUI实际上很容易。
康拉德·鲁道夫

4
是的,您可以使用Erlang编写GUI。但是,如果您想要更高级的功能(例如WPF),这将非常棘手。
乔纳斯(Jonas)2010年

6

原因如下:

  • 因为它看起来与习惯于C语言族的人都不一样

  • 因为我希望能够在Java虚拟机上运行,以利用我所了解和理解的工具(例如JConsole)以及JIT和GC多年来的努力。

  • 因为我不想重写多年来建立的所有(Java)库。

  • 因为我不了解Erlang的“生态系统”(数据库访问,配置,构建等)。

基本上,我熟悉Java,Java的平台和生态系统,并投入了大量精力来构建可在JVM上运行的内容。这是容易得多移动到斯卡拉


23
许多语言看起来都不像C。无论如何,这是真正的利弊吗?我当然理解语法上的偏爱,但是我不确定我认为这是完全无视语言的真正原因。
Rayne'2

7
这些都是很好的理由,但实际上您是否使用Erlang编程?这个问题是针对实际尝试过的人的。
Daniel C. Sobral

3
那里有些不错的地方,但是总体答案对我来说是“我决定反对它,因为我真的很喜欢Java”。
ZJR

2
@Rayne Sheesh,冷静下来。克里斯不是在攻击你。恰恰相反,他只是简单地说,由于年轻,您已经做了这么长时间了,并且很容易适应变化。如果有的话,他将您的年龄视为优势。他不再共享一种,因此他对事物的看法有所不同。例如考虑驾驶。在美国驾驶30年的人比在英国驾驶的人要适应更多的麻烦。
Daniel C. Sobral

4
@ZJR-答案不是我真的不喜欢Java(相反,我现在在scala中做所有事情),但是我真的很了解JVM!Java和JVM是不一样的!
oxbow_lakes

6

我决定将Erlang用于我的项目,该项目将在单个多处理器系统上与大量共享数据一起运行,并与Clojure一起使用,因为Clojure确实获得了共享内存并发。当我研究分布式数据存储系统时,Erlang非常适合,因为Erlang确实对分布式消息传递系统很有用。我将项目与语言中的最佳功能进行比较,并据此进行选择


5

将其用于专有的多层二进制协议的消息网关。服务器的OTP模式以及服务之间的关系以及二进制模式匹配使开发过程非常容易。对于这种用例,我可能会再一次使用Erlang而不是其他语言。


4

JVM不是工具,而是平台。尽管我都赞成选择最佳的工具来完成工作,但平台已经基本确定。除非我是从头开始独立开发某项东西,并且不想重用任何现有代码/库(三个方面已经不可能孤立地存在),否则我可以自由选择平台。

我确实使用多种工具和语言,但主要针对JVM平台。对于大多数(即使不是全部)项目,Erlang和某些概念一样有趣。

西尔维奥


4

虽然我喜欢Erlang运行时和OTP平台的许多设计方面,但发现它是开发中非常烦人的程序语言。逗号和句点完全la脚,通常需要重写许多行的最后一个字符。代码只是更改一行。同样,在Ruby或Clojure中一些简单的操作在Erlang中是乏味的,例如字符串处理。

对于依赖共享数据库的分布式系统,Mnesia系统确实非常强大,并且可能是一个不错的选择,但是我使用一种编程语言来学习和获得乐趣,一旦我超越了基本知识,Erlang的烦人因素就开始超过乐趣因素银行帐户教程,并开始为XMPP服务器编写插件。


3

从并发的角度来看,我爱Erlang。Erlang确实做到了并发性。我主要由于语法而没有使用erlang。

我不是专业的函数式程序员。我通常使用C ++,因此我渴望在样式之间进行切换(OOP,命令式,元数据等)。感觉就像是Erlang强迫我去敬拜不可变数据的神圣牛一样。

我喜欢它的并发方法,简单,美观,可伸缩,功能强大。但是在我一直在用Erlang编程的整个过程中,我一直在思考,老兄,我更喜欢Java的子集,该子集不允许线程之间的数据共享和使用的Erlangs并发模型。尽管Java最好限制语言与功能集兼容Erlang的进程和通道的语言。

就在最近,我发现D编程语言通过熟悉的c样式语法和多范式语言提供了Erlang样式并发。我还没有尝试任何与D并发的东西,所以我不能说它是否是完美的翻译。

因此,在专业上,我使用C ++,但我会尽最大努力为大型并发应用程序建模,就像在Erlang中一样。在某些时候,我想给D的并发工具一个真正的试驾。


2

我什至不去看Erlang。

有两个博客文章为我提供了帮助:

  1. Erlang机器会遍历整个列表以确定是否有消息要处理,而获取消息的唯一方法就是遍历整个列表(我怀疑通过pid过滤消息还涉及遍历整个消息列表)

    http://www.lshift.net/blog/2010/02/28/memory-matters-even-in-erlang

  2. 确实没有奇迹,Erlang不会提供太多服务来处理不可避免的过载-例如,仍然留给应用程序程序员来处理消息队列中的可用空间检查(可能是通过遍历队列来找出当前消息)。长度,我想没有内置机制可以确保发件人之间的公平性。

    erlang-如何限制或模拟消息队列?

(1)和(2)都比我的书幼稚得多,而且我确信在Erlang机器中还有更多类似性质的软件“宝石”。

所以,对我来说没有Erlang。

看起来,一旦您不得不处理在过载下需要高性能的大型系统,C ++ + Boost仍然是唯一的游戏。

接下来我要看D。


2

我想将Erlang用于一个项目,因为它具有惊人的可扩展性以及CPU数量。(我们使用其他语言,偶尔碰壁,使我们不得不调整应用程序)

问题在于我们必须在多个平台上交付应用程序:Linux,Solaris和AIX,不幸的是,目前没有为AIX安装Erlang。

只需进行很小的操作即可排除移植和维护AIX版本的Erlang的工作,并且禁止客户使用Linux作为我们应用程序的一部分。

我仍然希望AIX Erlang到来,以便我们可以使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.