什么是Haskell对Node.js的响应?

我相信Erlang社区并不嫉妒Node.js,因为它本身可以实现非阻塞I / O,并且可以轻松地将部署扩展到多个处理器(即使Node.js中没有内置的东西)。 http://journal.dedasys.com/2010/04/29/erlang-vs-node-js和Node.js或Erlang的更多详细信息

那Haskell呢? Haskell可以提供Node.js的一些好处,也就是一个干净的解决方案,可以避免阻塞I / O而无需使用多线程编程?


有许多事情对Node.js很有吸引力

  • 事件:没有线程操作,程序员只提供回调(如在Snap框架中)
  • 回调被保证在单线程中运行:没有竞争条件可能。
  • 好的和简单的UNIX友好的API。 奖金:优秀的HTTP支持。 DNS也可用。
  • 每个I / O默认都是异步的。 这使得更容易避免锁定。 但是,回调中的CPU处理过多会影响其他连接(在这种情况下,该任务应该拆分为更小的子任务并重新计划)。
  • 客户端和服务器端的语言相同。 (然而,我并没有在这方面看到太多的价值,jQuery和Node.js共享事件编程模型,但剩下的却非常不同,我只是看不到在服务器端和客户端之间如何共享代码在实践中是有用的。)
  • 所有这些都包装在一个产品中。

  • 好的,看过@gawi指出的node.js演示文稿后,我可以多说一点Haskell与node.js的比较。 在演讲中,Ryan描述了Green Threads的一些好处,但接着他说他没有发现缺乏线程抽象是一个缺点。 我不同意他的立场,特别是在Haskell的背景下:我认为线程提供的抽象对于使服务器代码更容易正确并且更加健壮至关重要。 尤其是:

  • 每个连接使用一个线程可让您编写表示与单个客户端进行通信的代码,而不是编写同时处理所有客户端的代码。 可以这样想:使用线程处理多个客户端的服务器几乎与处理单个客户端的服务器相同; 主要的区别是前者有一个fork 。 如果你实现的协议非常复杂,同时为多个客户端管理状态机变得非常棘手,而线程则让你只用一个客户端来编写通信脚本。 代码更容易理解,更易于理解和维护。

  • 在单个操作系统线程上的回调是多任务合作,而不是先发制人的多任务,这就是你通过线程获得的。 合作多任务的主要缺点是程序员有责任确保没有饥饿。 它失去了模块性:在一个地方犯了一个错误,并且可能导致整个系统崩溃。 这实在是你不想担心的事情,抢占是简单的解决方案。 此外,回调之间的通信是不可能的(它会死锁)。

  • 在Haskell中并发性并不难,因为大多数代码都是纯的,所以在构造时是线程安全的。 有简单的通信原语。 在Haskell中并发处理自己而不是使用不受限制的副作用的语言要困难得多。


  • Haskell可以提供Node.js的一些好处,也就是一个干净的解决方案,可以避免阻塞I / O而无需使用多线程编程?

    是的,事实上,事件和线程在Haskell中是统一的。

  • 您可以使用明确的轻量级线程(例如,单台笔记本电脑上的数百万个线程)编程。
  • 要么; 您可以基于可伸缩事件通知以异步事件驱动样式进行编程。
  • 线程实际上是以事件的形式实现的,并且跨多个核心运行,具有无缝线程迁移,文档化的性能和应用程序。

    例如

  • 大规模并发的作业编排
  • 并发集合可在32或48核上进行缩放
  • 工具支持分析和调试多线程/多事件程序。
  • 高性能的事件驱动的Web服务器。
  • 有趣的用户:如高频交易。
  • 32核同时收集nbody

    替代文字

    在Haskell中,你既有事件又有线程,因为它是引擎盖下的所有事件。

    阅读描述实施的论文。


    首先,我不认为node.js正在做所有这些回调的正确的事情。 你最终用CPS编写你的程序(continuation passing style),我认为它应该是编译器的工作来完成这种转换。

    事件:没有线程操作,程序员只提供回调(如在Snap框架中)

    因此,考虑到这一点,如果您愿意,可以使用异步样式编写代码,但这样做会导致错过以高效的同步样式编写代码,并且每个请求都有一个线程。 Haskell在同步代码中效率很高,特别是与其他语言相比时更是如此。 这是所有的事件。

    回调被保证在单线程中运行:没有竞争条件可能。

    您在node.js中仍然可能存在竞争条件,但它更困难。

    每个请求都在它自己的线程中。 当你编写必须与其他线程通信的代码时,由于haskell的并发原语使线程安全非常简单。

    好的和简单的UNIX友好的API。 奖金:优秀的HTTP支持。 DNS也可用。

    看看哈克,看看自己。

    每个I / O默认都是异步的(尽管有时候这可能很烦人)。 这使得更容易避免锁定。 但是,回调中的CPU处理过多会影响其他连接(在这种情况下,该任务应该拆分为更小的子任务并重新计划)。

    你没有这样的问题,ghc会在真正的操作系统线程中分配你的工作。

    客户端和服务器端的语言相同。 (但是我并没有看到太多的价值,但是JQuery和Node.js共享事件编程模型,但其他的则非常不同,我只是看不到在服务器端和客户端之间如何共享代码在实践中是有用的。)

    哈斯克尔不可能在这里赢...对吗? 再想一想,http://www.haskell.org/haskellwiki/Haskell_in_web_browser。

    所有这些都包装在一个产品中。

    下载ghc,启动cabal。 每个需求都有一个包。

    链接地址: http://www.djcxy.com/p/42939.html

    上一篇: What is the Haskell response to Node.js?

    下一篇: Real world Haskell programming