Erlang/Elixir 来自英国的 MOOC:Erlang 福音

chenge · 2017年07月05日 · 最后由 steve 回复于 2017年07月29日 · 6659 次阅读

前几天在推上偶然看到 Erlang 三剑客之一的 Virding 分享了一个网站,看得出有人是深爱着二郎神语言,网站名为 “spawned 避难所”,spawnedshelter,可能是调侃下语言中的 spawn 并发原语吧。

网站全面介绍了 Erlang,堪称大全:

Why Erlang?
Introduction
Learning Erlang
Advanced Erlang
Erlang design choices and BEAM Internals
Useful tools and libraries
Testing
Debugging, tracing and logging
Profiling
Performance
Erlang wants to talk to the outside world!
Parsing
Learn through reading some awesome code!
Community
Other BEAM languages

我这几天跟着学习了一下,感觉很有意思,跟大家分享一下。

英国 Kent 大学的研究生 MOOC:Kent Master Classes

网站中有这个课程,我上 Kent 的网站看了介绍,原来是为了庆祝大学 50 年发起了灯塔计划基金,这些课程是这个计划的一部分,课程有三个内容,前两位老师都是科学家级别的 Simon 和 Armstrong,分别讲了函数编程和并发编程,还有第三位老师讲了 OTP。

  • 函数编程(迷你表达式语言的编译和虚拟机)
  • Erlang 的并发编程
  • OTP 行为和发布

Erlang 语言特点

与 Elixir 类似,主要是模式匹配和递归。学起来也不难,估计需要几周时间。主要包括函数编程、并发编程和支持并发编程的 OTP。并发编程就 3 个原语,非常简练实用。

简单的代码实例

-module(simple-erlang).
-compile(export_all).

%quick sort

qsort([])    -> [];
qsort([H|T]) ->
  Small = [X || X <- T, X =< H],
  Large = [X || X <- T, X > H],
  qsort(Small) ++ [H] ++ qsort(Large).

% public
atoi([$- | String]) -> % negative
  -1 * atoi(String, 0);
atoi(String) -> % non-negative
  atoi(String, 0).

% internal
atoi([], Acc) ->
  Acc;
atoi([C | Rest], Acc) when C >= $0, C =< $9 ->
  atoi(Rest, 10 * Acc + (C - $0)).

语言都有些个性的,代码中大写是变量,$ 是字符,唯一比较怪异的是=<这个小于等于。还有比较有意思的末尾的逗号、分号和句号。

代码可以称得上简洁优雅吧,容易看懂。

Erlang 的长处和适用范围

主要特点是容错和并发。

轻量级进程,我在我的笔记本上实验了一下,百万进程 15 秒,我对比了 Ruby 的 gem celluloid 只能开 500 个。 适用于社交、支付、游戏等开发。最著名的有 Whatsapp 社交 app,我很好奇微信后端是什么语言开发的?

关于并发

这个现在是热门话题,七周并发那本书里讲了七个模型,其中也有 Erlang 的 Actor 和 Go 的 CSP 模型。

我觉得 Actor 模型是不错的,容易理解。

我的 Erlang 简单经历

12 年接触的,简单试了下,不过确实没看懂。主要有几个障碍,一个是语法不习惯,还有就是对并发缺乏经验,不熟悉递归。去年学 Elixir 后逐渐增加了认识和好感。

结束语

一篇博客用阿凡达里的飞龙来比喻学习 Erlang:

诚然, 学习骑飞龙可能是艰难的事情, 但一旦你掌握了它, 你会感叹你以前的生活是如何过的。

微信肯定是 c/c++ 了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号