带你走进Erlang

Posted 分布式系统架构设计艺术

tags:

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

作为一种通用的面向并发的编程语言,Erlang与其它语言相比有什么特点?在学习Erlang有哪些地方需要注意呢?接本文以系列文的形式对此展开讨论,希望起到抛砖引玉的作用。

Erlang是丑小鸭?

每一门编程语言的推出都是有目标的。大多数的目标是为了:提升性能,提升开发者表现力,提升开发者生产力,如Haskell,Python,Go等都是以这三点为主要设计核心的。

Erlang的推出则是为了打造一款高并发高扩展性的实时系统。例如应用于电信,银行,商业,即时通讯等场合。Erlang的运行时系统内置了对并发,分布式,容错等的处理。可见与其它以速度,简洁,表达性见长的语言相比,Erlang无疑就是只默默无闻的丑小鸭。

Erlang的容错能力是它与生俱来的的能力,因为这是电信领域的重要需求。但是这并不代表Erlang是复杂的、不具表达力的。

语法

Erlang的语法是很简单的,总共只有550行代码。因此尽管erlang语法与主流语言比有所不同,但是掌握起来也是很轻松地。连贯性是它的亮点,请看如下代码:


我们在erlang shell中执行它

带你走进Erlang

再来看一个复杂一点的代码:

带你走进Erlang

这个例子里使用了模式匹配功能,稍后再详细讲。现在尝试调用fac函数:

带你走进Erlang

怎么样?它的语法不复杂吧,我想只有Lisps可与之媲美简单性。

表达性

当说到Erlang表达性的时候,第一时间想到的可能是消息传递,过程创建和管理。然而这里的重点是模式匹配,特别是接收消息后,模式匹配可使其处理变得非常简便。请相当这个以下这个模式匹配的例子:

带你走进Erlang

首先,我们想访问Body和Headers变量。Shell提示的非常清楚:变量是非约束的。接下来尝试做更有趣的。

复制之前的代码后,接下来我们将会使用到http库(ibrowse):

带你走进Erlang

然后执行shell

带你走进Erlang

回到之前的代码里,

带你走进Erlang

这里从ibrowse里调用了send_req函数。第一个参数是URL。第二场数是headers列表,即我们想发送的请求。在这里我们没有发送任何的header。最后,第三个参数是我们指定的请求动作。

接下来看看其执行结果:

带你走进Erlang

其输出是包含4个元素的数组,{Term1,…,TermN}。Erlang数组与Python数组是很相似的。第一个元素是“ok”信息,说明程序执行正常。第二个元素是302,HTTP状态码302表示用户被重定向。第三个元素是google返回给我们的headers结果。

带你走进Erlang

接下来尝试存储该结果:

带你走进Erlang

其运作过程是:我们发送了一个请求给google,然后google对此进行响应并返回结果。ok是一个原子,302是一个字符串。他们都没有被指派,因为他们不是变量。但为什么这里使用了“=”号?原因在于Erlang中“=”号是作用不是指派。由于Erlang支持模式匹配机制,“=”在这里会作为匹配符来使用。它会尝试寻找“=”号左右两部分的共同点,然后把值与非约束变量进行绑定,因此最后会把值指派到正确的变量。

所以从ibrowse得到的结果是:send_req,Erlang会认为我们得到了一个以元素ok和302为开头的一个四元数组。然后因为Headers和Body是非约束的,所以把Google返回的对应内容进行指派。

带你走进Erlang

也就是说,模式匹配是与它语言的switch或if/else/elif有着异曲同工之妙。

过程和消息

在函数式编程里函数的地位是举足轻重的。他们可以被指派到变量,或是作为参数传给其它函数或从其它函数里作为返回值返回。不妨把函数看作是其它类型。

带你走进Erlang

在Erlang创建一个过程是很简单的,这里使用了内置的spawn函数进行过程创建。

带你走进Erlang

Spawn的作用是创建新过程并返回PID过程标识。

带你走进Erlang

如果你想针对消息进行处理,而不仅仅局限于在shell中检视结果,可以进行如下处理:


这里创建了一个Echofun函数,作用是接收消息并显示。


写在最后

以上是有关Erlang入门的初步介绍,有关消息传递,模式匹配,轻过程等更多内容将会在后续继续讲解。


以上是关于带你走进Erlang的主要内容,如果未能解决你的问题,请参考以下文章

带你走进rsync的世界

一文带你走进 Rust 和 WebAssembly 的世界

带你走进“华为链”

能量补充站带你走进性能测试

带你走进神一样的Elasticsearch索引机制

《手牵手带你走进python世界》系列五