我试图了解Smalltalk中的对象/消息与Erlang中的进程/消息之间的区别。我阅读了有关该主题的以下文章。
据我了解,在Smalltalk中,所有事物都是一个对象,并且所有事物都具有相同的“对象/消息”抽象-甚至数字1
都是只能通过消息传递才能到达的对象。是1
在Erlang / Elixir中进行的过程吗?Erlang中的所有内容是否都是对消息/程序范例的响应?您可以向Erlang中的号码发送消息吗?
非常感谢。
我试图了解Smalltalk中的对象/消息与Erlang中的进程/消息之间的区别。我阅读了有关该主题的以下文章。
据我了解,在Smalltalk中,所有事物都是一个对象,并且所有事物都具有相同的“对象/消息”抽象-甚至数字1
都是只能通过消息传递才能到达的对象。是1
在Erlang / Elixir中进行的过程吗?Erlang中的所有内容是否都是对消息/程序范例的响应?您可以向Erlang中的号码发送消息吗?
非常感谢。
Answers:
实际上,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有多个“层”:
gen_server
。用Erlang / OTP编写的容错系统通常看起来像我们可能识别为“面向对象”的东西。但是这些对象的内部通常会比面向对象的样式更实用。
有趣的是,Erlang面临的“进化压力”,换句话说,Erlang的设计人员试图解决的问题(可靠性,复制性,冗余性……)与导致细胞进化的压力相同。艾伦·凯(Alan Kay)擅长微生物学,并在生物细胞上明确建立了面向对象模型。这是Erlang和Smalltalk之间的另一个相似之处。