2021 年你需要知道的关于 Erlang 的一切

今天,我们将看一个相当古老且有些古怪的东西。 你们大多数人可能没有注意到的语言。

虽然 Erlang 不像某些现代编程语言那样流行,但它安静地运行着 WhatsApp 和微信等每天为大量用户提供服务的应用程序。

在这篇文章中,我将告诉你关于这门语言的更多事情、它的历史,以及你是否应该考虑自己学习它。

什么是 Erlang,它在哪里使用?

Erlang 是一种函数式的通用语言,旨在构建具有高可用性保证的可扩展、并发系统。

它于 1980 年代末在爱立信建造,用于处理电话交换机。 当时,电话交换系统是最复杂的系统之一,就像现在的互联网一样。 出于这个原因,用于对其进行编程的语言需要支持高并发和零停机时间。

在经历了多种现有的语言选择之后,公司的三个人—— Joe Armstrong, Robert Virding, and Mike Williams——决定创建自己的语言。 这导致了最酷的编程语言之一的产生,也许是我见过的最棒的语言营销视频。

那么,这种语言与其他所有语言的区别是什么?

面向过程

Erlang 与其他语言的主要区别在于其基于进程的计算模型。 它使用隔离的、轻量级的进程,这些进程通过消息相互通信。

这些进程可以接收消息,并响应消息,创建新进程,向其他进程发送消息,或修改它们的状态。 换句话说,Erlang 遵循Actor模型。 如果您在 JVM 上使用过 Akka,您会感到非常熟悉。

001

这些进程是隔离的,创建速度很快,并且只占用少量内存。 通过创建更多进程可以轻松扩展您的系统。 由于这些进程无法辨别其他进程是在同一个核心上还是在另一个地方,因此您可以轻松地水平扩展(通过添加更多机器)和垂直扩展(通过添加核心)。

函数式

人们通常将 Erlang 与 Scala 和 Haskell 等其他语言归为一门函数式编程语言(FP)。 FP的一些特征是:

  • 经常使用纯函数
  • 高阶函数
  • 模式匹配

有关函数式编程的更多信息,您可以在introduction to FP中找到。

Erlang有什么长处

首先,当涉及跨网络的多个代理之间的消息传递时,Erlang 是一个不错的选择,因为它很好地映射了语言的基本结构。

它非常适合:

  • 聊天应用。消息应用程序,包括一些著名的例子,如微信和 WhatsApp,使用 Erlang 来处理大量并发用户。 Erlang 有一个很棒的消息传递平台,叫做 ejabberd,可以用来创建大型聊天应用程序。 消息队列系统。 RabbitMQ 是一个实现 AMQP 和其他协议的开源消息代理,对于 Erlang 来说是一个巨大的成功案例。
  • 区块链。 Aeternity 是一个用于可扩展、安全和去中心化 dapp 的区块链,它使用 Erlang 来实现其节点。
  • 二进制操作。从历史上看,Erlang 必须支持快速实现用于电信目的的二进制协议。因此,它具有使二进制操作更加舒适的功能,例如二进制文件的模式匹配。例如,您可以使用 Erlang 作为十六进制编辑器。
  • 其他分布式高性能服务。如果您需要处理来自金融科技项目中大量地方的交易或创建竞价/用户匹配平台,Erlang 也不是最糟糕的选择。

您可以在我们的 Elixir 和 Erlang 公司列表中查看 Erlang 的一些常见用例。

这看起来很复杂。 我可以在 Erlang 中构建 Web 应用程序吗?

是的。 总体而言,Erlang 非常适合创建快速且可扩展的 Web 应用程序。 如果你到达那里,这是非常有益的。 不过,有一些警告。

您的 Web 应用程序(以及任何其他使用 HTTP 的应用程序)的核心将是 Cowboy,但除此之外,您还需要了解 Web 应用程序的组成部分并分别为每一层选择您的工具。

现实中有很好的文档,但新手级别的介绍性材料相对稀少,而且你不会找到所有内容的教程。 它不是 JavaScript。

总而言之,如果您决定构建 Web 应用程序,使用 Elixir(一种基于 Erlang 构建的语言)可能是更好的选择。

为什么要在项目中使用 Erlang?

与其他编程语言相比,Erlang 具有三个显着优势,这主要源于该语言的独特构建方式。

  • 并发。 Erlang 虚拟机 BEAM 使用轻量级的执行线程(称为进程)。 它们是完全隔离的,在所有 CPU 上运行,并通过消息进行通信。 由于这一点以及语言的功能特性,在 Erlang 中编写并发程序并不难。
  • 可扩展性。 Erlang 非常适合现代计算和当今多核 CPU 的分布式特性。 Erlang 进程允许我们通过添加更多机器和向现有机器添加更多内核来轻松扩展系统。
  • 可靠性。 Erlang 有一个座右铭——“Let it crash”。 由于独特的容错方法,监督系统可以快速重启轻量级进程,从而帮助您构建自愈系统。 虽然这可能看起来不可靠,但它处理了大多数不是由于严重的实现错误引起的错误。

Let it crash

在本节中,我将尝试深入了解 Erlang 应用程序的结构以及“Let it crash”的理念如何在现实生活中发挥作用。

实际上,Let it crash并不是为了用户或系统而崩溃。 这是 Erlang 极力避免的事情。 相反,它是在失败不可避免地发生时遏制失败,因为在生活中,事情有时确实会失败。 最差的情况发生了。 让我们看看 Erlang 是如何清理它的。

基本上,一个 Erlang 应用程序是一个进程树。

002

在树的底部叶子,我们有工作进程——那些做大部分工作的进程。 在他们之上,我们有主管,他们启动工人并检查他们。

监督者自己可以被监督; 我们可以在这里轻松地在树的顶部添加一个 Grand Supervisor。

003

如果进程崩溃,它会向其主管发送一条消息。 根据监管策略集,要么只重启进程,要么重启其主管下的所有进程。

如果在一段时间内重启连接的工作人员并没有解决问题给定的次数,主管将终止其所有子进程,然后终止自身。 此时,尝试处理问题的责任被向上推到下一个监督层。

004

只有当顶级主管失败时,它才会重新启动并且应用程序崩溃。

Erlang vs. Elixir

Erlang 不是唯一在 BEAM 上运行的语言。 还有很多其他的。 主要的是Elixir。

Elixir是什么?

005

Elixir 由 José Valim 在 2010 年代初创建。 他采用 Erlang 并在其上增加了一个薄层,该层具有更现代的语法,类似于 Ruby。

由此产生的语言是对 Erlang 和 Ruby 的改进。 在 2015-2016 年,它的主要 Web 框架 Phoenix 发布时,它的受欢迎程度大幅上升。

您可以在我们对 Elixir 的介绍中了解更多关于 Elixir 和 Phoenix 的信息。

Elixir 相对于 Erlang 的优势

Elixir 实际上并没有为 Erlang 添加很多新功能。你可以在 Elixir 中做的所有事情,你也可以在 Erlang 中做,并且可以相互调用两种语言。 Elixir 的大部分优势源于它具有更现代的、类似 Ruby 的语法这一事实,这导致它比 Erlang 更受欢迎。

下面是 Elixir 相对于 Erlang 的优势:

  • 现代语法。如果您已经用几乎任何其他流行的编程语言进行了编程,Elixir 的语法就会更容易理解。它删除了一些样板代码,可以提高开发人员的生产力。
  • 较高的知名度。 Elixir 在很长一段时间内一直是两者中更受欢迎的一种,因此有关 Elixir 的内容更加最新,而且还有更多内容。
  • 构架。如果您从事 Web 开发,Phoenix 是目前最好的框架之一,如果您想做 Web 开发和函数式编程,它绝对是最方便的。谈到框架,Elixir 也有 Nerves——一个很棒的嵌入式软件框架。如果这是你想走的路线,Elixir 是更好的选择。

Erlang值得学习吗?

那么,为什么要学习这种语言呢?原因有以下三个:

  • 您正在关注使用 Erlang 的特定领域的职位。例如您喜欢聊天应用程序,并且想在 WhatsApp 工作。这是合理的。
  • 您想编写非常小的、可移植的程序,并且依赖尽可能少。 Erlang 实际上使您能够开箱即用地做很多事情。
  • 你是一个真正好奇的人,想要发现新的编程方式,而不会对底线产生直接的好处。在这种情况下,我欢迎你加入 BEAM 的行列。

如果最后一个是真的,我实际上会为你指明通往 Elixir 的道路。虽然这两种语言都很好用,但 Elixir 似乎是最近更流行的一种。它会给你更多的工作机会,也会更容易学习。

之后,您可以学习 Erlang 以及它的成功之处。了解 Erlang 在 Elixir 下的功能将帮助您编写更好的 Elixir 代码,并使您更有可能被聘为 Elixir 开发人员。

无论如何,我认为你不会后悔学习 BEAM 的任何部分,即使它不全是阳光和彩虹(BEAM 语言有时会变得很奇怪)。如果您想知道从哪里开始,我会推荐Learn You Some Erlang for Great Good!或我们的 Elixir 初学者指南。

Related Posts

2021 年你需要知道的关于 Erlang 的一切

今天,我们将看一个相当古老且有些古怪的东西。 你们大多数人可能没有注意到的语言。 虽然 Erlang 不像某些现代编程语言那样流行,但它安静地运行着 WhatsApp 和微信等每天为大量用户提供服务的应用程序。 在这篇文章中,我将告诉你关于这门语言的更多事情、它的历史,以及你是否应该考虑自己学习它。 ## 什么是 Erlang,它在哪里使用? Erl

Read More

Erlang JIT中基于类型的优化

这篇文章探讨了 Erlang/OTP 25 中基于类型的新优化,其中编译器将类型信息嵌入到 BEAM 文件中,以帮助JIT(即时编译器)生成更好的代码。 ## 两全其美 OTP 22 中引入的基于SSA的编译器处理步骤进行了复杂的类型分析,允许进行更多优化和更好的生成代码。然而,Erlang 编译器可以做什么样的优化是有限制的,因为 BEAM 文件必须

Read More

Erlang JIT之路

自从Erlang 存在,就一直有让它更快的需求和野心。这篇博文是一堂历史课,概述了主要的 Erlang 实现以及如何尝试提高 Erlang 的性能。 ## Prolog 解释器 Erlang 的第一个版本是在 1986 年在 Prolog 中实现的。那个版本的 Erlang 对于创建真正的应用程序来说太慢了,但它对于找出Erlang语言的哪些功能有用,哪

Read More