Erlang,一名通向未来的编程语言!

Posted 程序大官猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Erlang,一名通向未来的编程语言!相关的知识,希望对你有一定的参考价值。

Erlang 在构建高可用服务上有其独特的优势,这与 Web 服务的要求不谋而合,其设计理念值得每一名 Web 后端开发工程师去了解。


语言并不那么重要,重要的是蕴含在语言之中的设计理念和设计思想。


不可变状态

Erlang 是一种一次性赋值(single-assignment variable)的动态类型函数式编程语言。单次赋值意味着每个变量只能被赋值一次,如果试图在变量被赋值后改变它的值,程序会出错。


如果你初次接触单次赋值这个概念,可能会感到很难理解,但这并不是 Erlang 的原创。函数式编程的重要特点之一就是「不可变状态」(immutable state),Erlang 正符合这个特点。


实际上,在 Erlang 里,变量获得值是一次成功模式匹配操作的结果。如果你有着 C-like 编程语言的背景,你一定知道 = 表示的是一个赋值语句,而且大有各种入门书籍告诉你务必要与数学中的 = 符号区分开来,并很可能会举出 i = i + 1 这样在 C-like 语言中很常见,但在数学中明显不存在的式子(除非是在反证法中)。而在 Erlang 里,是一次模式匹配操作,Lhs = Rhs 的真正意思是:计算右侧(Rhs)的值,然后将结果与左侧(Lhs)的模式相匹配。这更多的像是回归了数学中 = 符号的本意。实际上,这也并不奇怪,函数式编程这种编程范型就是为了将电脑运算视为数学上的函数计算,同时还要避免使用程序本身的状态和易变的对象。


Guess

那为什么「不可变状态」会让编程变得更美好呢?

一个表面上明显的好处是让调试程序变得更简单。引起程序出错的常见原因就是变量得到了意料之外的值,为了防止意料之外的状态进入内部,我们可能不得不在 API 入口处进行参数校验,这意味着我们不得不写出大块的「防御式编程」的代码(这与后文要讲到的 “Let it crash” 特性一脉相承)。在 C-like 的语言里,变量可以被多次修改,因此每一个修改了变量值的地方都有可能是错误产生的地方,而在 Erlang 里,检查这样的错误只需要 check 一处即可。


另一个更深层次的好处是,「不可变状态」是使得程序运行不会产生副作用的保证之一,而没有副作用意味着可以让程序并行,这与后文的 Actor 并发模型又是一脉相承的。


Actor 并发模型 

并发模型有很多种,大多数人最熟悉的还是 Java 所采用的基于锁和线程的并发模型,但也有其他的如 Golang 采用的 CSP 模型和 Erlang Actor 模型,如果你对并发模型感兴趣,可以参阅《七周七并发模型》这本书。


如果是传统编程语言来为多核 CPU 编程,就不可避免的需要程序员去对付共享内存的问题。进而为了不破坏共享内存,自然而然地又产生了「锁」的概念,即在必要的时候给这些内存加锁来解决共享内存的问题,而且访问这些共享内存的程序在操作共享内存时还万万不能崩溃,否则很可能产生难以追踪且无法预料的错误(可以与后文的 “Let it crash” 特性对比)。

这就跟《人类简史》中所说的「农业社会是人类构建错误社会形态的开始」的概念类似,我们很可能从一开始就构建了不正确的模型,从而只能滚雪球式的将错就错、一错到底。而在 Erlang 里,没有可变状态,没有共享内存,也没有锁,这使得要让程序并行变得很简单。


Erlang 的基本并发单元是进程(Process),它们是一些独立的小型虚拟机。但这与操作系统的进程并不相同,Erlang 的进程是是隶属于编程语言而不是操作系统的。一方面,这意味着 Erlang 是跨平台的,而且它在任何操作系统上都会具有相同的逻辑行为,使得编写可移植的代码完全不是问题;另一方面,这些进程是 Erlang 虚拟机自身实现的,所以它们非常的轻量,创建和销毁都十分快速,占用的资源也非常小,这意味着大量的进程可以并存。


当然,Erlang 的进程是不共享任何内存的,它们相互之间完全独立,而唯一的交互方式是消息(CSP 模型也是如此)。


总结:


Erlang是一种具有并发特征的编程语言,所以Erlang程序本质上在具有并行能力的计算机上运行时要比其它程序都快的多。而唯一能阻挡它运行的更快的问题就是Erlang程序中可能存在一些必须顺序执行的瓶颈。


并行程序中有需要顺序执行的部分,这正应验了Amdahl定律。


以上是关于Erlang,一名通向未来的编程语言!的主要内容,如果未能解决你的问题,请参考以下文章

Erlang 二十年,如何在编程语言中占据一席之地?

干货 | Go/Python/Erlang编程语言对比分析及示例

一名freshman的自述与未来几年编程目标

云原生 | 42Docker快速部署高可靠性编程语言Erlang

Erlang游戏程序员换语言转行,你有啥好的建议吗?

读书凯文凯利,通向未来的12个趋势