如果你已经购买了函数式编程范例,那么你很可能同时喜欢Erlang和Haskell.两者都具有纯粹的功能核心和其他优点,如轻量级线程,使其非常适合多核世界.但也存在一些差异.
Erlang是一种商业上经过验证的容错语言,具有成熟的分发模型.它具有看似独特的功能,能够通过热代码加载在运行时升级其版本.(太酷了!)
另一方面,Haskell拥有任何主流语言中最复杂的类型系统.(我将'主流'定义为任何已发布的O'Reilly书籍的语言,因此Haskell很重要.)它的直线单线程性能看起来优于Erlang,其轻量级线程看起来更轻.
我正在尝试为我的编码生涯中的其余部分组建一个开发平台,并且想知道是否有可能将Erlang和Haskell混合以实现最佳的平台.这个问题有两个部分:
请回答任何经验(积极或消极),想法或建议.事实上,任何反馈(没有直接滥用!)都是受欢迎的.
更新
感谢迄今为止的所有4个回复 - 每个回复教我至少一个我不知道的有用的东西.
关于其余的编码生活事物 - 我把它略微舌头放在脸颊上引发争论,但实际上是真的.我有一个项目,我打算继续工作直到我死,它需要一个稳定的平台.
在我上面提到的平台中,我只会编写Haskell,因为将自动生成样板Erlang.那么Haskell会持续多久?好吧Lisp仍然和我们在一起,看起来不会很快消失.Haskell是BSD3的开源软件,已达到临界质量.如果编程本身在50年左右仍然存在,我预计Haskell或者Haskell的一些不断演变仍将存在.
更新2 以回应rvirding的帖子
同意 - 实现一个完整的"Erskell/Haslang"通用虚拟机可能并非绝对不可能,但确实非常困难.尽管如此,将垃圾收集器级别作为VM之类的东西共享虽然仍然很难,但听起来要小一些.在垃圾收集模型中,函数式语言必须有许多共同点 - 不可变数据(包括thunk)的无处不在和非常快速分配的要求.因此,将通用性与单片VM紧密捆绑在一起这一事实似乎有些奇怪.
虚拟机确实有助于达到临界质量.看看像F#和Scala这样的"精简"功能语言是如何起飞的.Scala可能没有Erlang的绝对容错能力,但它为许多与JVM绑定的人提供了一条逃生路线.
虽然拥有单个堆会使消息传递速度非常快,但它会引入许多其他问题,主要是因为它必须是交互式且全局不中断的,因此GC变得更加困难,因此您无法使用相同的简单算法.进程堆模型.
当然,这对我来说非常有意义.GHC开发团队中非常聪明的人似乎试图通过平行的"停止世界"GC来解决部分问题.
http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf
(显然,"停止世界"不会因为它的主要用例而对一般的Erlang飞行.)但即使在"停止世界"的用例中也是如此,它们的加速似乎并不普遍.所以我同意你的观点,不太可能有一个普遍最好的GC,这就是我在我的问题第1部分中指出的原因.
GHC运行时可以配置为仅使用一个核心,或本地计算机上的所有核心,或其间的任何组合.
通过这种方式,对于给定的用例,我可以在基准测试后选择使用Erlang方式,并运行一个GHC运行时(使用单线程GC)和每个核心一个Erlang进程,让Erlang在内核之间复制内存以获得良好的局部性.
或者,在处理器上具有4个核心/处理器且具有良好内存带宽的双处理器计算机上,基准测试可能表明我运行一个GHC运行时(使用并行GC)以及每个处理器一个Erlang进程.
在这两种情况下,如果Erlang和GHC可以共享一个堆,那么共享可能会被绑定到以某种方式在单个核上运行的单个OS线程.(我在这里深入了解,这就是我提出这个问题的原因.)
我还有另一个议程 - 独立于GC的功能语言基准测试.我经常读到OCaml v GHC v Erlang v ...的基准测试结果,并想知道不同的GC会对结果造成多大的影响.如果选择GC可以与功能语言的选择正交怎么办?GC究竟有多昂贵?看到这个恶魔倡导者的博文
http://john.freml.in/garbage-collection-harmful
由我的Lisp朋友约翰弗雷姆林,他迷人地,给他的帖子标题"自动垃圾收集是垃圾".当John声称GC很慢并且没有真正加速那么多时,我希望能够用一些数字来对抗.
erlang garbage-collection haskell functional-programming ghc
长期的C++程序员(就是我)探索其他语言,并想知道是否值得学习D 2.0.(这是D的重新编写.)到目前为止,我喜欢我所看到的 - 许多务实,明智的选择.现在,我想了解更多,并想知道是否有可能做到以下几点:
总之,我想有一个D 2.0编译器,后端能够生成Javascript.
所以我的问题有两个部分:
对于上下文,我想要上述的原因是我可以在D 2.0中实现一堆业务逻辑,然后在纯Javascript(即没有Flash/Silverlight/Java)Web应用程序中使用该业务逻辑.
更新
我有三个答案,其中两个是主题,一个不是,因此被忽略.
@FeepingCreature认为它永远不会发生,因为"它与D的目标环境太不协调".我很想知道这意味着什么,并且已经问过了.
相比之下,@ Nekuromento指出理论上已经可以使用LDC,其次是LLVM Javascript后端.我检查了两个链接.LDC对D 2.0的支持看起来像是正在进行的工作.但我猜它会在某个时刻到达那里.LLVM Javascript也没有经过优化或缩小,但它从演示中看出它们的工作原理.所以我认为这至少足够有用.
更新2
好的 - 这似乎是迄今为止最好的解决方案.
我会很快选择一个最好的答案,但我真的想要一些更明智的意见.
更新3
有关我为什么要这样做的更多信息.
以下是我希望实施的一个项目的具体示例.它将是一个几何建模库,可能只由我编写,花了几年时间编写,最终达到大约100,000行代码.我希望它包含尽可能接近零的错误,因此,我不希望在Javascript中实现它.我希望它能够在服务器,桌面和浏览器上运行.(在"浏览器中"我的意思是没有任何插件,如Flash,Silverlight或Java的帮助.)事实是,在Javascript上运行的浏览器中的代码将保留一段时间.项目将越来越需要一个战略来处理这个问题.
更新4
我希望得到更多的答案,但没有得到它们.好吧,没关系.感谢所有的反馈,包括@dsimicha的刺激性评论.(我希望有时可以在技术上不同意,同时保持文明.)我接受了@Nekuromento的回答.
更新5 2018-07-18
七年过去了,LDC v1.11支持编译和链接到WebAssembly.3