作为一种通用的面向并发的编程语言, Erlang与其它语言相比有什么特点?在学习Erlang有哪些地方需要注意呢?接本文以系列文的形式对此展开讨论,希望起到抛砖引玉的作用。
Erlang是丑小鸭?
每一门编程语言的推出都是有目标的。大多数的目标是为了:提升性能,提升开发者表现力,提升开发者生产力,如 Haskell,Python,Go等都是以这三点为主要设计核心的。
Erlang的推出则是为了打造一款高并发高扩展性的实时系统。例如应用于电信,银行,商业,即时通讯等场合。 Erlang的运行时系统内置了对并发,分布式,容错等的处理。可见与其它以速度,简洁,表达性见长的语言相比,Erlang无疑就是只默默无闻的丑小鸭。
Erlang的容错能力是它与生俱来的的能力,因为这是电信领域的重要需求。但是这并不代表 Erlang是复杂的、不具表达力的。
语法
Erlang的语法是很简单的,总共只有 550行代码。因此尽管erlang语法与主流语言比有所不同,但是掌握起来也是很轻松地。连贯性是它的亮点,请看如下代码:
我们在 erlang shell中执行它
再来看一个复杂一点的代码:
这个例子里使用了模式匹配功能,稍后再详细讲。现在尝试调用 fac函数:
怎么样?它的语法不复杂吧,我想只有 Lisps可与之媲美简单性。
表达性
当说到 Erlang表达性的时候,第一时间想到的可能是消息传递,过程创建和管理。然而这里的重点是模式匹配,特别是接收消息后,模式匹配可使其处理变得非常简便。请相当这个以下这个模式匹配的例子:
首先,我们想访问 Body和Headers变量。Shell提示的非常清楚:变量是非约束的。接下来尝试做更有趣的。
复制之前的代码后,接下来我们将会使用到 http库(ibrowse):
然后执行 shell
回到之前的代码里,
这里从 ibrowse里调用了send_req函数。第一个参数是URL。第二场数是headers列表,即我们想发送的请求。在这里我们没有发送任何的header。最后,第三个参数是我们指定的请求动作。
接下来看看其执行结果:
其输出是包含 4个元素的数组,{Term1,…,TermN}。Erlang数组与Python数组是很相似的。第一个元素是“ok”信息,说明程序执行正常。第二个元素是302,HTTP状态码302表示用户被重定向。第三个元素是google返回给我们的headers结果。
接下来尝试存储该结果:
其运作过程是:我们发送了一个请求给 google,然后google对此进行响应并返回结果。ok是一个原子,302是一个字符串。他们都没有被指派,因为他们不是变量。但为什么这里使用了“=”号?原因在于Erlang中“=”号是作用不是指派。由于Erlang支持模式匹配机制,“=”在这里会作为匹配符来使用。它会尝试寻找“=”号左右两部分的共同点,然后把值与非约束变量进行绑定,因此最后会把值指派到正确的变量。
所以从 ibrowse得到的结果是:send_req,Erlang会认为我们得到了一个以元素ok和302为开头的一个四元数组。然后因为Headers和Body是非约束的,所以把Google返回的对应内容进行指派。
也就是说,模式匹配是与它语言的 switch或if/else/elif有着异曲同工之妙。
过程和消息
在函数式编程里函数的地位是举足轻重的。他们可以被指派到变量,或是作为参数传给其它函数或从其它函数里作为返回值返回。不妨把函数看作是其它类型。
在 Erlang创建一个过程是很简单的,这里使用了内置的spawn函数进行过程创建。
Spawn的作用是创建新过程并返回 PID过程标识。
如果你想针对消息进行处理,而不仅仅局限于在 shell中检视结果,可以进行如下处理:
这里创建了一个 Echofun函数,作用是接收消息并显示。
写在最后
以上是有关 Erlang入门的初步介绍,有关消息传递,模式匹配,轻过程等更多内容将会在后续继续讲解。