事件驱动/异步语言列表

12

我正在研究一个需要非常可扩展性的系统。我已经开始使用异步/事件驱动的方式编写服务器端代码。我已经尝试了 Ruby 的 EventMachine 和 Node.js。

EventMachine 很酷,但是没有异步文件 I/O,而我需要这个功能。接口也有点奇怪。

Node.js 非常棒,但它... 嗯... 它是 JavaScript。

请问 Stack Overflow 社区能否列出其他具有强大异步支持的语言呢?要符合条件,该语言需要支持闭包,并具有异步文件 IO、http 等库。如果有像 Node.js 一样用比 JavaScript 更强的语言编写的工具就更好了。

Lisp? Python 有 Twisted,对吧?


7
你在 JavaScript 中缺少什么?如果 node.js 对你有用,不要因为它是 JavaScript 而将其丢弃。 - Martin Gordon
9
你的评论“嗯...这是JavaScript”让我觉得你拒绝了Node.js,是因为它过去的声誉,而非现在的能力。它可能是你正在寻找的真正解决方案,但我认为你应该深入了解一下。 - Jordan Running
3
我只是在开玩笑。实际上,我是在JavaScript上长大的,但由于其弱的面向对象支持,在编写大型代码时可能非常困难。我一直在享受使用Node.js编程,并且肯定还没有拒绝它,但如果有更好的面向对象语言,那就太棒了。 - Sean Clark Hess
7
你可能需要进一步澄清“更好的面向对象编程”是什么意思。我认为它比大多数其他明显的“面向对象”语言更符合Alan Kay关于消息传递和后期绑定的概念。 - Ken
从 Haskell 网站上:「抽象是构建模块化、可维护程序的关键,以至于询问任何新语言所提供的抽象机制都是一个好问题。」我认为在 JavaScript 中进行抽象更加困难,因为它没有原生类、异常和命名空间等特性。 - Sean Clark Hess
我同意抽象是关键,但我甚至不清楚面向对象编程是否是必要的抽象。而且我肯定没有看到原型基础的面向对象编程比基于类的面向对象编程更糟糕的证据。 - Ken
4个回答

20

Erlang 可能是服务器端代码天生可扩展性最高的语言(它通过异步、协作式任务切换“在幕后”为你管理多进程),但如果你可以忍受其奇特的语法和(通常)奇特的语义。

Python 有 twisted(非常通用的所有网络任务),tornado(专门针对服务器端异步处理),以及 stackless(广泛用于 MMP 网络游戏),更不用说标准库中的旧但仍可用的 asyncore(还有更老的“Medusa”,它在 asyncore 之上增强了其功能)。

Go 利用非常轻量级的“无栈” goroutineschannels 来实现必要的同步。


那么 gevent 呢?它不是另一个值得关注的 Python 异步 IO 库吗? - Balthazar Rouberol

16
我建议你重新审视一下node.js。在面向对象编程语言中使用库进行事件驱动编程的最大问题之一(而不是首先使用事件驱动编程语言)是通常所有其他现有库都不是事件驱动的,将事件驱动和同步I/O混合使用非常尴尬。事实上,这几乎是不可能的,或者更准确地说,它是可能的,但会破坏首先使用事件驱动I/O的所有好处。(请注意,您使用的任何第三方库(以及它们使用的库等),包括语言本身的标准和核心库,都必须是事件驱动的,才能真正获得好处。否则,您将花费大部分项目时间编写现有库的异步包装器。)
现在,如果使用基于事件的库是如此糟糕,那么为什么我推荐node.js?简单:ECMAScript没有任何同步I/O库(因为它根本没有任何I/O库),因此混合问题根本不存在。(实际上,它有一些I/O库,例如XmlHttpRequest或Web Sockets,但猜猜:它们已经全部是基于事件的。)
node.js自己实现了所有I/O库,全部都是基于事件的,没有向后兼容性或遗留要求。
否则,所有的编程语言或平台都有一些基于事件或异步 I/O 的库:Ruby 有 EventMachineRev,.NET 有 Rx,JVM 有 NIO,Unix 系统有 kqueue/epoll,C 有 libevlibeio(node.js 和 Rev 是在其之上构建的),Perl 有 AnyEvent(由同一作者基于 libev 构建)等等。

2
我越来越喜欢node.js了。导入模块的能力解决了大部分抽象问题。还有其他像node一样从头异步设计的系统吗? - Sean Clark Hess
@SeanClarkHess Lisp实际上是创建异步实现的好选择,因为该语言存在于许多不同的方言和情况中,就像JavaScript一样。但是我不知道有人经历过这个可怕的工作 :-) - Luca Matteis

4

F#有异步工作流,这是编写异步代码的绝佳方式。


4

既然您对Lisp感兴趣,那么您可能想考虑一下Clojure——这是一个针对JVM的Lisp方言,具有强大的并发性。通过在代理中运行,几乎任何东西都可以异步运行。当然,它还提供了无痛访问整个Java生态系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接