这与 actor 模型关系不大,更关键的是在 C++ 中编写类似 OTP 的程序非常困难。此外,不同的操作系统提供截然不同的调试和系统工具,而 Erlang 的虚拟机和多种语言构造支持一种统一的方法来确定所有这些进程正在做什么,这在多个平台上以统一的方式(或者根本不可能)实现将会非常困难(需要记住 Erlang/OTP 先于当前"actor 模型"术语的热潮,因此在某些情况下,这些讨论比较的是苹果和翼龙。优秀的想法容易独立创新)。
所有这些意味着,虽然你当然可以用另一种语言编写“actor 模型”程序集(我知道,在遇到 Erlang 之前,我已经在 Python、C 和 Guile 中长期这样做了很长时间,包括形式化的监视器和链接,而在此之前我从未听说过“actor 模型”一词),但理解您的代码实际生成的进程及其之间发生的事情非常困难。Erlang 强制执行一些规则,而 OS 简单无法完成重大内核改进 - 这些内核改进可能总体上不会有益。这些规则表现为程序员的一般限制(如果你确实需要,总是可以避开这些限制)和系统为程序员提供的基本承诺(如果您确实需要,也可以故意违反这些承诺)。
例如,它强制执行两个进程不能共享状态来保护您免受副作用的影响。这并不意味着每个函数都必须是“纯”的,即所有内容都是引用透明的(显然不是,尽管使尽量多的程序引用透明是大多数 Erlang 项目的明确设计目标),而是两个进程不会不断创建与共享状态或竞争相关的竞争条件。(顺便说一句,在 Erlang 的上下文中,“副作用”更多的是指这个。了解这一点可能有助于你解密一些关于 Erlang 是否与 Haskell 或玩具“纯”语言相比“真正的功能性”的讨论。)
另一方面,Erlang 运行时保证消息传递。在必须纯粹通过未管理的端口、管道、共享内存和仅由 OS 内核管理的公共文件进行通信的环境中,这是一种非常缺失的东西(操作系统内核对这些资源的管理与 Erlang 运行时提供的极其有限相比,必然极其有限)。这并不意味着 Erlang 保证 RPC(无论如何,消息传递不是 RPC,也不是方法调用!),它不保证您的消息被正确寻址,并且也不保证您尝试发送消息的进程存在或处于活动状态。如果你发送的对象此时有效,它只能保证送达。
建立在这个承诺之上的是监控和链接准确无误的承诺。基于此,Erlang运行时使整个“网络集群”概念在你掌握了系统的运作方式(以及如何使用erl_connect...)后似乎消失了。这使得您可以跳过一组棘手的并发情况,大大地帮助您成功编写代码,而不是陷入为裸的并发编程所需的防御性技术的泥潭中。
因此,问题并不在于需要 Erlang 这种语言,而是在于运行时和 OTP 已经存在,并以相当干净的方式表达出来,而在另一种语言中实现接近它的任何东西都非常困难。OTP 只是一个难以超越的优秀例子。同样地,我们也不真正需要 C++,我们可以坚持使用原始二进制输入、Brainfuck,并将汇编视为高级语言。我们也不需要火车或轮船,因为我们都知道如何步行和游泳。
所有这些都说过了,该虚拟机的字节码已经有了很好的文档,并且出现了许多将其编译或与 Erlang 运行时一起使用的替代语言。如果我们将问题分为语言/语法部分(“我是否必须了解月文才能进行并发处理?”)和平台部分(“OTP 是处理并发的最成熟方法,而且它会引导我避免并发、分布式环境中最棘手、最常见的陷阱吗?”),那么答案是(“不需要”,“是的”)。