Erlang 中的进程和 Smalltalk 中的对象确实是一回事。
乍一看,这并不奇怪:Erlang 是一种Actor Model 语言。 Actor 模型是由 Carl Hewitt 发明的,他将消息驱动的评估模型基于 Smalltalk 的消息驱动评估模型。 (实际上,Actor 和 Objects 是一回事;它们只是在某些细节上有所不同。)反过来,Alan Kay 在设计 Smalltalk 时受到了 Carl Hewitt 的 PLANNER 的影响。
所以,Actor 和 Objects 之间有着密切的关系,因此 Erlang 的 Processes 和 Smalltalk 的 Objects 如此相似也就不足为奇了。
除了一件事:Erlang 的设计者不知道 Actor 模型!!!他们是在后来才知道的,尤其是在 1990 年代后期,乔·阿姆斯特朗(Joe Armstrong)在 Seif Haridi(关于编程范式的权威书籍的合著者)的指导下撰写了他的博士论文。
Joe Armstrong 写了一篇文章,强烈反对 OO (Why OO Sucks),但后来当他意识到 Erlang 实际上非常面向对象时,他改变了主意。事实上,他甚至声称 Erlang 是this interview with Joe Armstrong and Ralph Johnson 中唯一面向对象的语言。
这是一个有趣的案例,进化生物学家称之为convergent evolution,即两个不相关的物种在相似的外部压力下进化为相似。
不过,Erlang 和 Smalltalk 之间仍有很多关系:
Erlang 最初是作为 Prolog 的并发扩展(即使 Erlang 成为自己的独立语言,第一个实现也是用 Prolog 编写的),直到今天仍然深深植根于 Prolog。 Prolog 深受 Carl Hewitt 的 PLANNER 的影响。
Smalltalk 也深受后来的 ARPANet(甚至后来的互联网)的影响; Erlang 是为网络系统设计的。
然而,Erlang 和 Smalltalk 之间的重要区别之一是并非所有事物都是进程。 1 是一个数字,而不是一个进程。您无法向号码发送消息。
Erlang 有多个“层”:
-
Functional Erlang:一种最典型的、动态类型的函数式语言,具有一些从 Prolog 继承的“奇怪”,例如统一。
-
并发 Erlang:函数式 Erlang + 进程和消息。
-
分布式 Erlang:并发 Erlang + 远程进程。
-
容错 Erlang:分布式 Erlang + 在 OTP 库中编码的某些设计模式,例如主管树和
gen_server。
用 Erlang/OTP 编写的容错系统通常看起来像我们可以识别为“面向对象”的系统。但这些对象的内部通常会以比面向对象的风格更实用的方式实现。
有趣的是,Erlang 所承受的“进化压力”,换句话说,Erlang 的设计者试图解决的问题(可靠性、复制、冗余……)与导致细胞进化的压力相同。 Alan Kay 辅修微生物学,并明确地将 OO 建模为生物细胞。这是 Erlang 和 Smalltalk 之间的另一个相似之处。
我在another answer of mine 中写了一些关于此的内容。