Erlang的简介

575 阅读9分钟

埃尔朗简介

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

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

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

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

埃尔朗是一种功能性的通用语言,面向构建可扩展的、具有高可用性保证的并发系统。

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

在经历了多种现有的语言选择后,公司的三个人--乔-阿姆斯特朗、罗伯特-维尔丁和迈克-威廉姆斯--决定创造他们自己的语言。这导致了最酷的编程语言之一,也许也是我见过的最棒的语言营销视频

Erlang logo

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

面向过程

埃尔朗与其他语言的主要区别在于其基于进程的计算模型。它使用孤立的、轻量级的进程,通过消息相互通信。

这些进程可以接收消息,并作为对消息的回应,创建新的进程,向其他进程发送消息,或修改其状态。换句话说,Erlang遵循actor模型。如果你在JVM上使用过Akka,你会有宾至如归的感觉。

Erlang processes actors

进程是隔离的,创建速度快,而且只占用少量的内存。通过创建更多的进程来扩展你的系统是很容易的。由于进程不会分辨其他进程是在同一个核心上还是在另一个地方,所以你可以很容易地横向(通过增加机器)和纵向(通过增加核心)进行扩展。

功能性

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

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

关于函数式编程的更多信息,你可以在我们的FP介绍中找到。

Erlang适合做什么?

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

它非常适用于:

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

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

这看起来很复杂。我可以用Erlang构建一个网络应用吗?

可以。总的来说,Erlang很适合创建快速和可扩展的网络应用。如果你能做到这一点,那是相当有成就感的。不过,也有一些注意事项。

你的网络应用(以及任何其他使用HTTP的应用)的核心是Cowboy,但除此之外,你需要知道一个网络应用由什么组成,并为每一层分别挑选工具。

库有很好的文档,但新手级的介绍材料相对稀少,你也不会找到所有的教程。这不是JavaScript。

总而言之,如果你决定建立网络应用,使用Elixir(一种建立在Erlang之上的语言)可能是一个更好的选择。

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

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

  • 并发性:BEAM,Erlang的虚拟机,使用轻量级的执行线程(称为进程)。这些线程是隔离的,在所有CPU上运行,并通过消息进行通信。由于这一点和语言的功能特性,在Erlang中编写并发程序并不难。
  • 可扩展性:Erlang完全适合现代计算的分布式性质和当今的多核CPU。埃尔朗程序使我们能够轻松地扩展系统,包括增加更多的机器和在现有机器上增加更多的内核。
  • 可靠性:Erlang有一个座右铭--"让它崩溃"。由于独特的容错方法,轻量级进程可以被主管系统快速重启,这有助于你建立自我修复的系统。虽然这看起来并不可靠,但它可以处理大多数不是由于严重的执行错误造成的bug。

让它崩溃

在本节中,我将试图让大家深入了解Erlang应用的结构,以及 "让它崩溃 "的哲学在现实生活中是如何运作的。

实际上,让它崩溃并不是要让用户或系统崩溃。那是Erlang极力避免的事情。相反,它是关于当失败不可避免地发生时的遏制,因为在生活中,事情有时确实会失败。该死的事情发生了。让我们看看Erlang是如何清理它的。

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

Erlang app

在树的底部,我们有工人进程--做大部分工作的进程。从他们往上,我们有监督者,他们启动工人并检查他们。

监督者本身也可以被监督;我们可以很容易地在树顶上添加一个大监督者。

Erlang supervision tree

如果一个进程崩溃了,它会向它的监督者发送一个消息。根据设置的监督策略,要么只重启该进程,要么重启其监督者下面的所有进程。

如果在一个时期内,重启连接的工作者不能解决问题,监督者将终止其所有的子进程,然后终止自己。在这一点上,尝试处理问题的责任被向上推到下一个监督层。

handling failure

只有当顶层监督者失败时,它才不会被重新启动,而应用程序也会崩溃。

Erlang vs. Elixir

Erlang并不是唯一在BEAM上运行的语言,还有其他多种语言。其中最主要的是Elixir。

什么是Elixir?

Elixir Erlang meme

Elixir是由José Valim在2010年代初创建的。他在Erlang的基础上做了一个薄层,有一个更现代的语法,类似于Ruby。

由此产生的语言是对Erlang和Ruby的一种改进。它在2015-2016年经历了一个体面的流行高潮,当时它的主要网络框架Phoenix被发布。

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

Elixir相对于Erlang的优势

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

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

  • 现代化的语法:如果你已经用几乎任何其他流行的编程语言进行过编程,那么Elixir的语法就更容易理解。它消除了一定数量的模板代码,可以提高开发人员的生产力。
  • 更高的人气:在相当长的一段时间内,Elixir是两种语言中更受欢迎的,所以关于Elixir的内容是更及时的,而且有更多的内容。
  • 框架:如果你喜欢网络开发,Phoenix是最好的框架之一,如果你想做网络开发函数式编程,它绝对是最方便的一个。谈到框架,Elixir也有Nerves--一个用于嵌入式软件的出色框架。如果这是你想走的路线,Elixir是一个更好的选择。

埃尔朗值得学习吗?

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

  • 你对Erlang所使用的特定领域的职位虎视眈眈。例如,你喜欢聊天软件,你想在WhatsApp工作。这很合理。
  • 你想编写真正小的、可移植的程序,并尽可能减少依赖性。埃尔朗实际上能让你做很多事情,开箱即用。
  • 你是一个真正有好奇心的人,想发现新的编程方式,但又不希望对底线有直接好处。在这种情况下,我欢迎你加入BEAM的行列。

如果最后一种情况属实,我实际上会把你的方向指向Elixir。虽然这两种语言都很好用,但Elixir是最近似乎更流行的一种。它将给你带来更多的工作机会,而且会更容易学习。

之后,你可以学习Erlang以及它的特点。了解Erlang在Elixir下的功能将帮助你写出更好的Elixir代码,并使你更有可能被雇用为Elixir开发者。