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

15
我试图理解Smalltalk中对象/消息与Erlang中进程/消息之间的区别。我阅读了以下关于该主题的帖子
据我所知,在Smalltalk中,所有内容都是一个对象,并且所有内容都具有相同的“对象/消息”抽象 - 即使数字1也是只能通过消息传递访问的对象。 在Erlang/Elixir中,1是一个进程吗?Erlang中的所有内容都是响应消息/程序范例的吗?你可以向Erlang中的数字发送消息吗?
非常感谢。

整数1不是一个进程,因此您无法向其发送消息。您可以将整数的状态包装在一个循环进程中,并向该进程发送消息,例如增加或减少其值的指令。但是这样一来,它将不再是值1了。请参阅此处的Elixir示例https://dantswain.herokuapp.com/blog/2015/01/06/storing-state-in-elixir-with-processes/ - GavinBrelstaff
感谢您的回答! - FullyFunctional
1个回答

25
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之间的另一个相似之处。
我在我的另一个答案中写了一点关于这个的内容。

谢谢,这很有帮助! - FullyFunctional

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接