Erlang中的进程和Smalltalk中的对象实际上是相同的。乍一看,这并不令人惊讶:Erlang是一种
Actor Model语言。Actor Model是由Carl Hewitt发明的,他基于Smalltalk的消息驱动评估模型构建了消息驱动评估模型。事实上,Actor和Object是相同的东西;它们只在某些细节上有所不同。反过来,Alan Kay在设计Smalltalk时受到了Carl Hewitt的PLANNER的影响。因此,Actor和Object之间存在密切关系,因此,Erlang的进程和Smalltalk的对象非常相似,除了一个问题:Erlang的设计者不知道Actor Model!直到1990年代末,特别是当Joe Armstrong在Seif Haridi(编程范例的权威书籍的合著者)的指导下写出他的博士论文时,他才学习到它。Joe Armstrong曾撰写一篇文章强烈反对面向对象编程(
Why OO Sucks),但后来他改变了主意,认识到Erlang实际上非常面向对象。事实上,他甚至声称Erlang是
this interview with Joe Armstrong and Ralph Johnson中唯一的面向对象语言。
这是一种有趣的进化生物学案例,称之为
收敛进化,即两个不相关的物种在响应相似的外部压力下演化成相似的物种。
然而,Erlang与Smalltalk之间仍然存在许多关联:
Erlang最初是Prolog并发扩展(即使当Erlang成为自己独立语言时,第一个实现也是用Prolog编写的),到今天仍然深深地植根于Prolog。Prolog受Carl Hewitt的PLANNER的影响很大。
Smalltalk也受到后来成为ARPANet(甚至更晚的互联网)的影响很大;Erlang是为网络系统设计的。
然而,Erlang和Smalltalk之间的一个重要区别是:不是所有东西都是进程。1是一个数字,不是进程。您无法向数字发送消息。
Erlang有多个“层”:
-
函数式 Erlang:大多数典型的动态类型函数语言,具有一些从Prolog继承的“奇怪”特性,例如一致性。
-
并发 Erlang:函数 Erlang + 进程和消息。
-
分布式 Erlang:并发 Erlang + 远程进程。
-
容错 Erlang:分布式 Erlang + OTP 库中明确规定的某些设计模式,例如监督树和
gen_server
。
用Erlang/OTP编写的容错系统通常看起来像我们所熟知的“面向对象”的东西。但是这些对象的内部实现通常比面向对象风格更加函数式。
有趣的是,Erlang所面临的“进化压力”,换句话说,Erlang设计师试图解决的问题(可靠性、复制、冗余等),与导致细胞进化的压力相同。Alan Kay在微生物学方面专攻,并明确将OO建模为生物细胞。这是Erlang和Smalltalk之间的另一个相似之处。
我在
我的另一个答案中写了一点关于这个的内容。