Erlang是面向对象的吗?

Mr.*_*. X 27 oop erlang

消息传递是Erlang的基本组成部分.Alan Kay 认为,在他面向对象编程的观点中,消息传递是一个比对象更重要的概念(他"发明"了这个术语!).

Erlang可以被认为是面向对象的编程语言(àlaSmalltalk)吗?

Fra*_*rar 36

乔阿姆斯特朗已经记录在案,说他认为Erlang"可能是唯一的面向对象语言"(上下文中添加了"OO in Alan Kay意思"这个词).在同一次采访中,约翰逊指出了肖恩·科彭弗在他的回答中所说的相同的东西:在小的,二郎是一种纯粹的功能语言; 在大型的过程中,它看起来就像凯式的面向对象.

  • 啊该死,我完全忘记了那次采访。+1把它放在那里。InfoQ 与 Joe Armstrong 进行了一些交流,听他谈论厄兰格人如何看待事物非常有趣。 (2认同)

vir*_*tor 17

引自维基百科的引用来自这里:

Benjamin Cuire Pierce和其他一些研究人员认为任何将OOP提炼到最小特征的尝试都是徒劳的.

但看着他们自己的徒劳尝试:

  • 动态调度 - 如果您将Erlang进程视为对象,那么是的,它是受支持的.
  • 封装 - 如果您将消息发送/响应视为方法调用,则支持它.
  • 子类型多态 - 有点 - 如果你足够地扩展行为的定义,它是受支持的
  • 对象继承(或委托) - 没有任何正确性检查,你可以将一个对象替换为另一个 - 所以让我们说它没关系
  • 打开递归 - 支持它(发送到自己的进程)

所以是的 - 有了一些烟雾和闪光,你可以尝试声称Erlang是面向对象的.但我可以使用相同的技巧将C表示为OO语言,因为您可以在其中使用OO样式并手动实现vtables.

任何看待Erlang的理智人的答案都可能是"不"Erlang是一种功能/消息传递导向的语言.

另一个答案可能是"为什么要分类"/"谁需要知道"?

  • X先生明确地谈到了OO的意思,就像Alan Kay所说的那样,这个"OO"在今天的含义相当不那么蓬松.显然,凯在凯意义上不是OO,因为该语言没有消息传递的概念.(并且消息传递不是方法调用!) (5认同)

Sea*_*ver 8

我认为在更高层次上,Erlang是面向对象的,因为你相信这个术语中讨论的原始概念.我的意思是隔离,消息传递,多态.

Erlang的进程可以保持状态,对该状态执行操作,并且它们与其他进程隔离,因为它们不能直接相互影响.由于任何进程都可以接收任何消息(并且消息可以很容易地委托给可以向原始发送者发送回复的另一个进程),我相信它也可以实现多态性.

当然,较低级别的Erlang会显示其功能方面,但我认为在更高级别(您在进程之间传递和协调消息的位置),Erlang会以面向对象的方式运行.你不能陷入困境,认为面向对象是关于类,继承和方法调用(与消息传递不同).这只是我们在大多数主流语言中为我们提供范式的方式.


jbo*_*chi 8

Joe Armstrong在他的博客中发表了关于OO的帖子并回答了这个问题.

随着Erlang的流行,我们经常被问到"Is Erlang OO" - 当然,真正的答案是"当然不是" - 但我们并没有大声说出来 - 所以我们发明了一种巧妙的回答方式这个问题旨在给人留下Erlang(有点)OO的印象(如果你挥手很多)但不是真的(如果你听了我们实际说过的话,并仔细阅读小字).

顺便说一下,这篇文章对OO来说是一个非常有趣的批评:http://harmful.cat-v.org/software/OO_programming/why_oo_sucks