Erlang中的进程/消息和Smalltalk中的对象/消息有什么区别?

时间:2019-10-27 09:17:29

标签: oop erlang elixir smalltalk message-passing

我试图了解 Smalltalk 中的对象/消息与 Erlang 中的进程/消息之间的区别。我read the following post on the topic

据我了解,在Smalltalk中,所有事物都是一个对象,并且所有事物都具有相同的“对象/消息”抽象-甚至数字1也是一个只能通过消息传递可以到达。 1是Erlang / Elixir中的一个进程吗? Erlang中的所有内容是否都是对消息/程序范例的响应?您可以向Erlang中的号码发送消息吗?

非常感谢。

1 个答案:

答案 0 :(得分:14)

Erlang中的进程和Smalltalk中的对象确实是同一回事。

乍看之下,这并不令人惊讶:Erlang是一种Actor Model语言。演员模型由卡尔·休伊特(Carl Hewitt)发明,他将消息驱动的评估模型基于Smalltalk的消息驱动的评估模型。 (实际上,Actor和Object是同一件事;它们只是在某些细节上有所不同。)Alan Kay在设计Smalltalk时受到了Carl Hewitt的PLANNER的影响。

因此,Actor与Object之间有着密切的关系,因此,Erlang的Process和Smalltalk的Objects如此相似也就不足为奇了。

除了一件事:Erlang的设计师对演员模型一无所知!!!他们只是后来才知道这一点,特别是在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(甚至后来的Internet)的严重影响。 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中写了些关于此的内容。