【CSDN 编者按】面向并发的编程语言 Erlang ,在全球范围内其实属于小众语言,但却拥有着强大的并行处理能力和容错机制,并在二十余载后的如今却仍能保持生机,你不想了解一下吗?
整理 | 弯月 责编 | 郑丽媛
出品 | CSDN(ID:CSDNnews)
Erlang 是一门通用编程语言,主要用途是构建并发应用程序,由 Joe Armstrong 在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规模并发活动的程序设计语言和运行环境。Erlang 于 1987 年发布正式版本,最早是爱立信拥有的私有软件,经过十年的发展,于 1998 年发表开放源码版本。现在 Erlang 主要用于电信行业、Web 应用、分布式计算、即时消息、电子商务等领域,负责处理大规模的并发持续连接。
Erlang 颇受欢迎的特点包括:
● 高并发:Erlang 程序员可以处理分布式环境中来自多个来源的输入。
● 容错性:即使一部分程序出错,整个系统也能继续运行,所以非常适合必须长期运行的系统,如 Web 应用程序,或电信平台。
● 代码热加载,更新代码和修改程序不需要重启系统。
● 采用消息传递方式代替共享变量,因此进程间通信的并发程度更高。
● 垃圾回收,提供自动的内存管理,同时提高速度和性能。
然而,Erlang 的缺点之一在于入门难度高于常见的编程语言。作为一种函数式语言,对于新手程序员来说,Erlang 的学习曲线很陡峭。
Erlang 语言由爱立信的员工 Joe Armstrong,Robert Virding 和 Mike Williams 于 1986 年开发。开发该语言的最初目的是为了改进电信应用程序。该语言的设计很大程度上受到了 PLEX 语言的影响。
Erlang的第一个版本是用 Prolog 实现的,但该版本太慢,无法用于电话交换机上。于是,开发团队于 1992 年开发了 BEAM 虚拟机。
BEAM 可以将 Erlang 代码编译成 C 代码。从此,Erlang 开始应用到实际生产中。
但是,1998 年,爱立信禁止在任何新产品中使用 Erlang,因为他们打算将所有产品迁移到非私有的技术上。
由于这项限制,Erlang 的主要作者 Joe Armstrong 和其他 Erlang 程序员开始重新设计 Erlang,最后于 1999 年以开源形式发布了新的 Erlang。此后,Erlang 受到了整个电信界的关注。今天,Erlang 被全世界许多电信运营商和通信软件公司使用,包括 T-Mobile、WhatsApp 等。而爱立信依然负责 Erlang 的维护,并在自己的许多节点和移动网络中(包括LTE网络)广泛使用 Erlang。
那么,与其他语言相比,Erlang 的特点是什么?
首先,Erlang 是一门函数式语言。这意味着它和常见的面向对象语言(如C++、Python)、面向过程语言(如 C)等都不一样。在Erlang中,函数和操作的设计思想和写法都与数学公式十分相似。举一个最简单的例子:斐波那契数列(数列中每一项都是前两项之和)的定义为:
F(0) = 0
F(1) = 1
F(n+2) = F(n+1) + F(n)
那么,使用C语言,你可能需要写一个循环来计算:
int fib(int n)
{
int a = 0, b = 1, c, i;
if( n == 0)
return a;
for(i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return b;
}
可以看到,上面的算法与前面给出的数学公式完全不同,你需要自己想办法用“过程”的方式来表达出原数学公式的意义。
或者你可以采用递归,这样代码更“接近”数学公式:
int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
然而,使用 Erlang,代码和数学公式几乎一模一样:
fibo(0) -> 0 ;
fibo(1) -> 1 ;
fibo(N) when N > 0 -> fibo(N-1) + fibo(N-2) .
其次,Erlang 的计算模型是建立在进程上的。Erlang 使用许多独立的、互相隔离的进程,进程之间通过消息互相通信。
每个进程都可以接收消息并响应消息。进程之间都是独立的,而且创建进程只需要消耗很少的内存。因此,扩展系统只需要创建更多的进程。
提到 Erlang,人们常常会想起另一种语言:Elixir。在上世纪八十年代,Erlang 主要用于电信应用程序。但三十年之后,Erlang 也被用于大型Web应用程序中。例如,Pinterest 需要每秒钟发送大约 14,000 条通知。而 Facebook 每秒需要接受并发送通知 16 亿次。这种高并发性正是 Erlang 大展身手的地方。因此,Erlang 得到了广泛的应用。但是,Erlang 语言本身非常有难度,而且难以编写。毕竟,这是一门来自几十年前的语言,当时语言设计时并没有考虑“易学易用”的问题。对于现代习惯了 Ruby 和 JavaScript 的程序员来说,Erlang 就是一门老古董。而且,Erlang 也没有现代 Web 应用程序所需的许多功能。
于是,Jose Valim 在 2012 年创建了 Elixir 语言。Elixir 代码会编译成 Erlang 字节码,可以在 Erlang 运行时上运行。甚至你可以直接在 Elixir 中编写 Erlang 代码。
Valim 是 Ruby on Rails 开发团队的语言,甚至还写过一本关于 Rails 开发的书。所以,Elixir 的设计思想很大程度上来源于 Rails。它的语法很像 Ruby,而且比 Erlang 易读得多。而且Elixir还扩展了 Erlang,加入了元编程、多态等功能。
与其他语言相比,Erlang 有三个非常显著的优势。
● 高并发:Erlang 的虚拟机 BEAM 使用轻量级线程(称为进程),这些线程互相隔离,能在所有 CPU 上运行,通过消息互相通信。再加上语言本身是函数式的,因此非常适合编写并发应用程序。
● 可扩展性:Erlang 非常适合现代分布式计算和多核心 CPU。通过 Erlang 的进程模型,我们可以非常容易地实现水平扩展,只需要添加更多的机器,或者给现有机器添加更多的 CPU 核心即可。
● 可靠性:Erlang 的格言是“不要惧怕崩溃”。Erlang 中的进程是隔离的,所以一个进程的错误不会影响到其他进程;而且由于是轻量级进程,重启出错的进程的代价也非常低。这样就能提高系统的容错性。
Erlang 虽然是一门古老的语言,但在今天依然能发挥它的潜力。如果你希望从事大规模 Web 应用程序、分布式计算或高并发应用程序方面的开发,则可以尝试一下 Erlang 和 Elixir。从另一个角度来说,Erlang 的函数式编程思想也能为你提供前所未有的视野。如果你从未接触过函数式编程,那么也可以尝试一下 Erlang,相信它能拓宽你的眼界,为你带来新的思路。
参考链接:https://serokell.io/blog/introduction-to-erlang