前几天在推上偶然看到 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 的网站看了介绍,原来是为了庆祝大学 50 年发起了灯塔计划基金,这些课程是这个计划的一部分,课程有三个内容,前两位老师都是科学家级别的 Simon 和 Armstrong,分别讲了函数编程和并发编程,还有第三位老师讲了 OTP。
与 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)).
语言都有些个性的,代码中大写是变量,$是字符,唯一比较怪异的是=<这个小于等于。还有比较有意思的末尾的逗号、分号和句号。
代码可以称得上简洁优雅吧,容易看懂。
主要特点是容错和并发。
轻量级进程,我在我的笔记本上实验了一下,百万进程 15 秒,我对比了 Ruby 的 gem celluloid 只能开 500 个。 适用于社交、支付、游戏等开发。最著名的有 Whatsapp 社交 app,我很好奇微信后端是什么语言开发的?
这个现在是热门话题,七周并发那本书里讲了七个模型,其中也有 Erlang 的 Actor 和 Go 的 CSP 模型。
我觉得 Actor 模型是不错的,容易理解。
12 年接触的,简单试了下,不过确实没看懂。主要有几个障碍,一个是语法不习惯,还有就是对并发缺乏经验,不熟悉递归。去年学 Elixir 后逐渐增加了认识和好感。
一篇博客用阿凡达里的飞龙来比喻学习 Erlang:
诚然,学习骑飞龙可能是艰难的事情,但一旦你掌握了它,你会感叹你以前的生活是如何过的。