关于演员模型的内容要少得多,而更多地是关于在 C++ 中正确编写类似于 OTP 的东西有多难。此外,不同的操作系统提供了完全不同的调试和系统工具,Erlang 的 VM 和几种语言结构支持一种统一的方式来确定所有这些进程都在做什么,而这很难以统一的方式完成(或者也许可以完成)完全)跨多个平台。(重要的是要记住,Erlang/OTP 早于“演员模型”一词的当前流行,所以在某些情况下,这类讨论是比较苹果和翼手龙;伟大的想法倾向于独立发明。)
所有这一切意味着虽然你当然可以用另一种语言编写“演员模型”程序套件(我知道,我已经在 Python、C 和 Guile 中这样做了很长时间,但在遇到 Erlang 之前没有意识到这一点,包括一种形式的监视器和链接,在我听说过“演员模型”一词之前),了解您的代码实际产生的过程以及它们之间发生了什么非常困难。Erlang 执行的规则是操作系统在没有重大内核大修的情况下根本无法做到的——内核大修可能总体上不会有益。这些规则表现为对程序员的一般限制(如果你真的需要,可以随时绕过)和系统为程序员保证的基本承诺(如果你真的需要也可以故意破坏)。
例如,它强制两个进程不能共享状态以保护您免受副作用。这并不意味着每个函数都必须是“纯粹的”,因为一切都是引用透明的(显然不是,尽管使您的程序尽可能多地引用透明是大多数 Erlang 项目的明确设计目标),而是两个进程不会不断地创建与共享状态或争用相关的竞争条件。(顺便说一下,在 Erlang 的上下文中,这更多的是“副作用”的含义;与 Haskell 或玩具“纯”语言相比,知道这可能有助于您破译一些关于 Erlang 是否“真正实用”的讨论.)
另一方面,Erlang 运行时保证消息的传递。在您必须完全通过非托管端口、管道、共享内存和公共文件进行通信的环境中,这是非常错过的,而操作系统内核是唯一管理的(与 Erlang 相比,这些资源的操作系统内核管理必然非常少)运行时提供)。这并不意味着 Erlang 保证 RPC(无论如何,消息传递不是RPC,也不是方法调用!),它不保证您的消息被正确处理,也不保证您是一个进程尝试发送消息以存在或活着。如果您发送的东西在那个时候恰好是有效的,它只是保证交付。
建立在这个承诺之上的是监控和链接是准确的承诺。并且基于此,一旦你掌握了系统正在发生的事情(以及如何使用 erl_connect...),Erlang 运行时就会使“网络集群”的整个概念消失。这使您可以跳过一组棘手的并发案例,这使您在编写成功案例的代码方面有了很大的领先优势,而不是陷入裸并发编程所需的防御技术的沼泽中。
所以它并不是真的需要Erlang,这门语言,它是关于已经存在的运行时和 OTP,以一种相当干净的方式表达,并且用另一种语言实现任何接近它的东西都非常困难。OTP 只是一个很难遵循的行为。同样,我们也不需要C++,我们可以只使用原始二进制输入、Brainfuck 并将 Assembler 视为我们的高级语言。我们也不需要火车或轮船,因为我们都知道如何走路和游泳。
综上所述,VM 的字节码有很好的文档记录,并且已经出现了许多可以编译到它或与 Erlang 运行时一起使用的替代语言。如果我们将问题分解为语言/语法部分(“我是否必须了解 Moon Runes 才能进行并发?”)和平台部分(“OTP 是最成熟的并发方式吗?它会引导我解决最棘手的问题吗?” ,在并发分布式环境中发现的最常见的陷阱?”)然后答案是(“否”,“是”)。