如果你已经买了进入编程功能的范例,有机会,你喜欢朗和Haskell.两者都具有纯粹的功能的核心和其他善良如轻型螺纹,使他们好适合一个核世界。但也有一些差异。

爱尔兰是一个商业经证明的容错的语言,与一个成熟的分布模型。它有一个似乎独特的功能,在其能力的升级版本在运行时通过热代码装载。(方式爽!)

Haskell,另一方面,拥有最先进类型的系统的任何主流的语言。(我在那里定义的'主流'以任何语言,有一个发表O'Reilly书,所以Haskell计数。) 其直线单线性能优于爱尔兰的和其轻线看起来更轻的了。

我试图把一个发展平台 其余的我编码的生活 并且想知道是否有可能混朗和Haskell,以实现最佳的平台。这个问题有两个部分:

  1. 我想朗使用作为一种容错MPI胶GHC运行情况在一起。会有一个朗进程的每GHC运行时间。如果"不可能发生"和GHC运行时死亡,然后在爱尔兰进程将检测,在某种程度上和死亡。二郎山的热代码装载和分发功能会继续工作。GHC运行时可能被配置只使用一个核心,或所有核心地计算机上,或任何组合。一旦朗库是书面的,其余的二郎级别代码应该是纯粹的样板,并自动生成,在每个应用程序的基础。(也许Haskell DSL为例。) 一个人如何实现至少其中的一些东西?
  2. 我喜欢朗和Haskell能够共享相同的garabage收集器。(这是一个值得进一步的想法于1。) 语言上运行的JVM和CLR实现更大的质量,通过分享一个运行时间。我理解存在技术限制在运行朗(热代码装载)和Haskell(高阶泛的多态性)在JVM或CLR。但是,关于拆分的,只是垃圾收集器?(排序的启动的一个运行的功能的语言。) 分配会显然仍必须非常快,因此,也许这点需要将静态相联系。应该有一些mechansim区分可变堆从堆不可改变的(包括偷懒写一旦存储器)作为全康需要这个。这是否可行,以修改那和GHC这样的垃圾收集器可以分享一堆?

请回答与任何经验(正或负)、想法或建议。事实上,任何反馈(短的直接虐待!) 是值得欢迎的。

更新

感谢所有4的答复的日期--每个教导我的至少一个有用的东西,我不知道。

关于 其余的编码的生活 事情-我把它稍稍舌头在脸颊引发的辩论,但它实际上是真实的。有一个项目,我在介意,我打算上的工作,直到我死了,它需要一个稳定的平台。

在平台上,我提出上述,我只想写Haskell,作为样板朗将自动生成。因此,如何长将Haskell去?好些仍与我们看起来不像是会很快消失.Haskell是BSD3开放源,并已取得重要的质量。如果编程本身仍然是在50年的时间,我希望Haskell,或一些不断演变的Haskell,仍然会在这里。

更新2 在响应rvirding后

同意执行一个完整的"Erskell/Haslang"普遍虚拟机可能不是绝对不可能的,但它肯定会非常困难的。分享的只是垃圾回收水平为什么喜欢一个虚拟机,同时仍然 困难, 声音一个数量级小困难的,我虽然。在垃圾收集模式、功能性的语言必须有很多共同点-unbiquity的不可改变的数据(包括形式转换)和要求很快分配。因此,事实上,共同捆绑紧密地与整体的虚拟机似乎有点奇怪。

Vm帮助实现临界质量。只要看看如何精简版的功能性的语言,如F#和斯卡拉已经采取了关闭。卡拉可能不具有绝对的容错的爱尔兰,但它提供了一个逃跑的路线非常多的人都绑JVM。

同时有一个单堆得 消息传的很快 引入了一些其他问题, 主要是这样做的GC变更 困难,因为它是互动 和全球非中断所以你 不能使用同一简单的算法 作为该进程堆模型。

绝对,这使得完美的感觉到我。非常聪明的人在全康发展的团队出现的是试图解决一部分问题的一个平行的"阻止世界"GC。

http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf

(显然"阻止世界"不会飞一般朗赋予它的主要使用情况。) 但是,即使在使用的情况下,"阻止世界"是确定的,他们的加速似乎不是普遍的。所以我同意你的看法,这是不可能的,有一个普遍最好的GC,其中的原因是,我指定第1部分。我的问题

GHC运行时可配置到 只用一个内核,或者所有核心的 当地机,或任何组合中 之间。

在这一方式,对于给定使用的情况下,我可以,后制定基准、选择去爱尔兰的方式,并运行一个全康运行时(用单线程GC)加上一项朗进程的每个核心,并让朗复制的存储器之间的核对于良好的地方。

或者,可在一个双重处理器的机器有4个核心每处理与良好的记忆带宽上的处理器、制定基准可能表明,我运行一个全康运行时间(一个平行的GC)加上一项朗进程的每个处理器。

在这两种情况下,如果朗和GHC可以分享一堆,分享可能会受到一个操作系统线上运行一个单一的核心。(我得到了我的深入这里,这就是为什么我问一个问题。)

我还有另一个议程基准的功能性的语言独立的GC。我经常阅读的结果的基准OCaml v GHC v朗v...并不知道有多少,结果是混淆的不同的Gc.如果有什么选择的GC可能是正交到选择的功能性的语言?多贵GC?看看这魔鬼的倡导者的博客

http://john.freml.in/garbage-collection-harmful

我口齿不清的朋友约翰Fremlin,其他有迷人的,鉴于他的文章标题"自动化的垃圾收集垃圾"。当约翰*索赔GC是缓慢的,并没有真的加快了这么多,我谨能够反与一些数字。

有帮助吗?

解决方案

很多Haskell和爱尔兰人感兴趣的模型,其中爱尔兰负责监督分布,同时Haskell运行的共享存储器节点的并行做所有的数字运算/逻辑。

一开始朝着这是哈斯克尔-爱尔兰图书馆: http://hackage.haskell.org/package/erlang

和我们类似的努力,在红宝石的土地,通过傲慢: http://github.com/mwotton/Hubris/tree/master

现在的问题是找到一个人实际上推动通过二郎/Haskell互操作程序,找出棘手的问题。

其他提示

你要有一个有趣的时间混合GC之间Haskell和二郎.朗采用每一个过程堆和拷贝的数据之间的进程--如Haskell甚至没有一个概念过程,我不知道你如何将地图上的这个"普遍的"GC两者之间的关系。此外,对于最好的性能,朗使用多种分配,每个稍微调整了行为,我肯定会影响的GC子系统。

如同所有的东西在软件、抽象是有代价的。在这种情况下,我怀疑你们介绍这么多层,获得这两种语言在他们的不匹配,你会跟不是很高性能(或有助)的共同虚拟机。

底线--接受的差别!有巨大的优势,没有运行中的一切都相同的过程中,特别是从可靠性的角度来看。此外,我认为这是一个有点天真的指望一个语言/VM到最后你用你的余生(除非你计划的一个。) 生活一个很短的时间或b。) 成为某种代码和尚,仅适用于单个项目)。软件开发是所有关心理的灵活性和愿意使用现有的最佳工具,以建立快速、可靠的编码。

虽然这是一个很老的线,如果读者仍有感兴趣的话,那么它值得一看 云Haskell, 带来爱尔兰风格的并发和分发的GHC稳定。

即将召开的 分布式流程的平台 图书馆增加了支持检察官办公室式的结构如gen_servers、监督树和其他各种"haskell味的"抽象概念借用和启发朗/OTP。

  1. 你可以使用一个检察官办公室gen_supervisor过程来监测Haskell实例产生open_port().根据"港口"退出,你就能够重新启动或决定,它停止的目的,并让相应朗过程中死。

  2. Fugheddaboudit.即使是这些语言的独立虚拟机你说的有麻烦的数据通过语言之间的时候。你应该只是列化的数据两者之间某种方式:数据库,XML-RPC,类似的东西。

顺便说一下,想法一个单一平台为你的余生大概是不切实际的,也是。计算技术和时尚的变化往往以希望你可以保持使用一种语言直到永远。你非常问题,这一点:没有一种语言做的一切我们可能希望,即使到了今天。

作为dizzyd中提到他的评论并不是所有的数据邮件中被复制时,大型的二进制文件之外存在的过程堆和不会被复制。

使用一个不同的记忆结构,以避免具有独立的每个过程堆肯定是可能和已经在一些较早的实现。同时有一个单一堆让消息传递 非常 快它引入了一些其他问题,主要这样做的GC变得更加困难,因为它是交互式的和全球的非中断,所以你不能用同样的简单的算法为每个进程的堆模型。

只要我们使用具有不可改变的数据结构没有问题的坚固性和安全性。决定在其存储器和GC型号的使用是一个很大的贸易,不幸的是那里的普遍最佳模式。

同时Haskell和爱尔兰都是功能性的语言,他们在许多方面非常不同的语言和有非常不同的方式实现的。它将难以拿出一个"Erskell"(或Haslang)机,它可以处理两种语言都有效。我个人认为它是更好保持他们单独的并且确保您有一个真正的好之间的接口。

CLR支持尾话优化使用明确 tail 操作码(如使用F#),其JVM没有(尚未)有一个等效的,其限制执行这样一种风格的语言。使用独立的 AppDomains不会允许CLR热交换代(例如见 这篇文章 显示它如何可以做到).

与西蒙*佩顿*琼斯的工作只是在走廊从别赛姆和F#队在Microsoft的研究,这将是一个伟大的失望,如果我们没有最终看到一个IronHaskell某种官方地位。一个IronErlang将是一个有趣的项目--的最大的一块工作可能会被迁移绿线程的计划程序没有得到作为重量级作为窗户的工作流程引擎,或是具有运行的光束VM上CLR。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top