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


12

我试图了解Smalltalk中的对象/消息与Erlang中的进程/消息之间的区别。我阅读了有关该主题的以下文章

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

非常感谢。


整数1不是一个过程-因此您无法向其发送消息。您可以将整数的状态包装在循环过程中并发送该过程消息-例如,增加或减少其值的指令。但话又说回来,它将不再具有价值。1。在此处向下滚动到Elixir示例dantswain.herokuapp.com/blog/2015/01/06/…–
GavinBrelstaff

谢谢您的回答!
齐全的

Answers:


18

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

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

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

除了一件事:Erlang的设计师对Actor模型一无所知!他们只是后来才知道这一点,特别是当乔·阿姆斯特朗(Joe Armstrong)在1990年代后期撰写的《赛义夫·哈里迪(Seif Haridi)》(《编程范例》权威著作的合著者)撰写博士学位论文时。

乔·阿姆斯特朗(Joe Armstrong)撰写了一篇文章,强烈反对OO(为什么要使用OO Sucks),但是后来他意识到Erlang实际上是非常面向对象的,因此改变了主意。实际上,在采访Joe Armstrong和Ralph Johnson时,他甚至甚至宣称Erlang是唯一的面向对象语言。

这是一个有趣的例子,进化生物学家将其称为趋同进化,即两个不相关的物种在响应相似的外部压力时演化为相似的物种。

但是,Erlang和Smalltalk之间仍然存在许多关系:

Erlang最初是Prolog的并发扩展(甚至当Erlang成为自己的独立语言时,第一个实现也是用Prolog编写的),直到今天仍深深植根于Prolog。Prolog在很大程度上受到了Carl Hewitt的PLANNER的影响。

Smalltalk还受到后来成为ARPANet(甚至后来的Internet)的严重影响。Erlang是为网络系统设计的。

但是,Erlang和Smalltalk之间的重要区别之一是,并非所有事物都是一个过程。1是一个数字,而不是一个过程。您无法将电话发送到号码。

Erlang有多个“层”:

  • 功能性Erlang:一种最典型的,动态类型化的功能性语言,具有从Prolog继承的一些“奇特特征”,例如统一。
  • 并发Erlang:功能性Erlang +进程和消息。
  • 分布式Erlang:并发Erlang +远程进程。
  • 容错Erlang:在OTP库中编纂的分布式Erlang +某些设计模式,例如主管树和gen_server

用Erlang / OTP编写的容错系统通常看起来像我们可能识别为“面向对象”的东西。但是这些对象的内部通常会比面向对象的样式更实用。

有趣的是,Erlang面临的“进化压力”,换句话说,Erlang的设计人员试图解决的问题(可靠性,复制性,冗余性……)与导致细胞进化的压力相同。艾伦·凯(Alan Kay)擅长微生物学,并在生物细胞上明确建立了面向对象模型。这是Erlang和Smalltalk之间的另一个相似之处。

我在我的另一个答案中写了一些有关此的内容


谢谢,有帮助!
FullyFunction's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.