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