Joe Armstrong关于Elixir,Erlang,FP和OOP

在过去几天中,哈布雷(Habré)上发表了许多文章,其中的主要主题(尤其是在评论中)是直率人士和尖锐人士之间的对抗-FP反对PLO的信徒,尽管敦促他们不要争论。 有时会讨论Erlang,我回忆起Erlang的一位创始人乔·阿姆斯特朗(Joe Armstrong)在2018年底在Elixir论坛上写的关于该主题的简短帖子,以回应有关语言范式的问题。 我认为他的评论会很有趣。


Joe Armstrong 2018年9月12日


关于Elixir(和Erlang)的所有好处都与并发有关-仅创建独立的流程和消息传递。 正如Alan Kay反复指出的那样,这正是面向对象编程的本质。


OOP完全专用于对象。 对象响应(或应该响应)消息,并且当您想做某事时,您会向对象发送消息,以及消息的处理方式完全不相关。 将对象视为“黑匣子”,当您需要它们时,只需发送消息,它们就会向您发送消息。


黑匣子内部的代码是起作用的还是强制性的,与内部所有内容的排列方式无关紧要-仅确切地应该做什么才是重要的。


不幸的是,即使基于该模型的第一种成功的面向对象语言(Smalltalk)都在“对象”和“消息”的概念上运行,但是Smalltalk中的后者并不是真正的消息,而只是伪装的同步函数调用。 在C ++中,然后在Java中,重复了相同的错误,并且OOP的主要思想退化为将代码组织为类和方法的奇怪范例。


通过Erlang和Elixir,可以轻松地创建数百万个隔离的进程,通过在它们之间发送消息,一切正常。 系统的体系结构由所需的并行度确定,然后将其直接映射到进程。


用于10,000个用户的Elixir Web服务器不是“一个具有10,000个用户的Web服务器”(与Apache或Jigsaw等类似),而是“每个用户10,000个Web服务器”-同意,这是一个激进的说法。背离传统模式。


使用简单的功能语言描述Erlang / Elixir过程模型的事实几乎是偶然的。 一切都始于逻辑编程系统(Prolog),例如C节点之类的东西完全可以用任何语言编写。 对于Elixir(和任何其他BEAM语言)而言,真正重要的是其虚拟机具有处理大量并行进程的能力。


很长一段时间,我说“ Erlang是唯一真正的面向对象的语言”。 我想现在可以添加到Elixir中了。


对于OOP,基本内容是:


  • 对象之间的隔离(我们有)
  • 后期绑定(我们仅在进程收到消息时才决定要做什么)
  • 多态(所有对象都可以响应相同类型的消息,例如“自己打印”,任何对象都可以知道如何执行此操作)

不那么重要:


  • 分为类和方法
  • 句法
  • 软件模型(功能性或命令性)

在将系统划分为大量彼此通信的小进程之后,其他所有事情(相对)变得容易-每个进程都应该非常简单并且能够执行很多操作,从而大大简化了编程。


Erlang(和Elixir)带给编程的是通信的思想(链接-大约翻译器)。 最初是由Mike Williams提出的,它包括扩大错误处理的可能性,使其能够在流程范围之外进行。 有了这个,我们得到了构建主管树等所有必要的工具。


主管,gen_server以及所有这些爵士乐只是向用户隐藏一些详细信息的库。 简单的内部,使用相同的工具编写-并行过程及其之间的关系。


Erlang并不是作为一种功能性编程语言开发的,而是作为一种用于创建长期的容错系统的工具而开发的。


容错的核心要素是远程错误处理的概念。 如果整个系统出现故障,则必须在另一台计算机上纠正(补偿)故障,因为已经不可能在本地执行此操作-本地计算机无法运行。


这意味着对于容错系统的编程,我们需要(进程)和消息的分发是易于使用的工具,这就是为什么原则上任何容错架构最终都将看起来像Erlang的原因。


创建Erlang的全部目的是简化容错系统的编程,其副作用是易于对可伸缩系统进行编程。


Erlang和Elixir与“其他所有人”之间的区别在于确保并发和容错的机制,这与FP的monad,语法或“纯度”无关。


现在的问题是-您是否要在一个线程中使用回调来模拟并发来处理10,000个用户,还是仍然要创建10,000个并行进程,每个进程都很简单,根本不需要回调?


每个进程都等待它感兴趣的消息,然后执行计算并在接下来的消息中入睡。


我认为普及Erlang / Elixir的最大问题是您需要解释许多并行处理如何帮助解决您的特定问题。 由于最初没有其他通用语言针对并行编程并且没有以任何有意义的方式促进并行编程,因此人们对它的需求尚未得到充分理解和理解。


他们会说:“但是我可以在一个线程中对回调进行所有操作。” 他们做到了,这非常痛苦。 您会问:“如果回调进入循环或引发异常,会发生什么?”,如果他们不理解问题,那么您必须努力并解释问题。 但是,如果问题很明确,请告诉他们,在一个遥远的国家,不需要使用回调程序进行并发编程。


似乎上述所有内容都可以简化为以下几点:请不要将Elixir宣传为一种功能编程语言-事实并非如此。 它是一种并行编程语言(CPL,并行编程语言)。


不要回应“我的功能性语言比您的功能性语言更实用”这样的说法。 并且甚至不用理会单子,立即改变话题。


“-什么是CPL?”
“-您知道,这就是WhatsApp制作的……”


来自翻译


首先,我要对乔·阿姆斯特朗突然去世表示遗憾-他于2019年4月20日去世。 很难低估他对行业发展的贡献以及他作为大众传播者的才能-书本,演讲和在Erlang和Elixir社区的积极工作。


有用的链接:


Source: https://habr.com/ru/post/zh-CN450508/


All Articles