趁着 Elixir 1.0 发布之际,我再来鼓吹一下 Erlang 大法!
貌似与 Erlang 社区走的最近的也就是 Ruby 社区了,这也就有了 Elixir 的诞生。Erlang 一直是以并发和分布式而著称,但因为 Functional Programming 的语法,导致其一直不被很多开发者接受。
我接触 Erlang 的时间也不长,但我觉得 Erlang 是真的蛮好的!
我之前是在 Pomelo 团队,也用 Pomelo 框架开发过几百万连接同时在线,服务器节点上百个的分布式应用,各种坑爹问题都遇到不少,可是直到我真正熟悉了 Erlang/OTP,我才发现这才是我一直想要的东西,其实 Pomelo 一直在做的就是要在 Node.js 上造一个 Erlang!(不过由于 Node.js 异步单线程的特点,所以这个方向也算是走对了)
下面我来说说 Erlang 的特点:
我不知道这个词形容是否准确,或者叫工业化。Erlang 语言设计的目标非常清晰明确,就是为了构建高并发、分布式网络应用而生。从语言设计层面就已经考虑了很多应用层要考虑的问题,比如说:多核、容错,分布式,负载均衡,代码热更新。我很少见到有编程语言 的设计,会去考虑应用层的东西,一般来说,负载均衡、分布式这些都应该是应用层自己去解决的问题,但是 Erlang 却在语言层面已经帮你做了一定的考虑。
Erlang 语法规则非常简单,关键字少,模块清晰,核心 API 也不多,学习起来还是很容易的,关键是要转变以前的语言思维。
模式匹配和递归用起来还是蛮爽的。
Erlang 的 Macro 也很强大,也可以实现很多的 Meta-Programming
Erlang 是动态编译型语言,但是可以通过 spec
来实现静态类型检测,增强代码健壮性。
Erlang 中的变量一旦赋值,就不可更改了,这也就决定它更容易实现并发。传统语言线程模型需要加锁,来实现线程之间的数据共享,Erlang 则不需要,因为变量赋值之后是不可更改的。传统线程模型通过共享实现线程之间的通讯,而 Erlang 通过通讯来实现进程之间的数据共享。 由于是无状态的,所以 Erlang 能轻易的做代码热更新。
Erlang 是基于 Actor 模型实现的轻量级进程并发,单台机器可以跑出上百万个轻量级进程 现在比较热门的 Golang 也是以并发性好而大受欢迎,Goroutine 虽然与 Actor 异曲同工,但在分布式和容错性方面,应该是不如 Erlang 的,代码热更新应该也不太容易。 当年号称 Java 杀手的 Scala,说白了其实就是在 JVM 上造了一个 Erlang
Erlang 的社区看起来是很荒凉的,不像其他语言,开源项目一堆一堆的。其实这是正常的,首先 Erlang 本身就不是为构建 Toy Program 而生的,小工具小网站什么的 Erlang 显然不合适,Couchdb,Rabbitmq 这种才是 Erlang 的拿手好戏。其次就是有 OTP,其他的也就需要一些什么 Http Server,Driver 之类的库了,而这些是都有的。 这里有个 Erlang 资源 清单
而 Ruby 社区看中了 Erlang 平台又想写代码写的更爽一点,所以就在 ErlangVM 上创造了 Elixir,Elixir 和 Erlang 的库是可以共用的。
所以 Elixir 可以搞起了!
PS: Elixir 在语法规则上比 Erlang 要更复杂一些,也灵活许多,在标准库上也有一些增强,比如 String
,比 Erlang 方便很多。Erlang 则显得更纯粹,简单直接!
我们正在招聘 Erlang / Elixir 工程师,待遇丰厚,有兴趣的拿简历砸我吧!(相信你能找到我的联系方式)
Any sufficiently complicated concurrent program in another language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang. -- Robert Virding's First Rule of Programming
Erlang 的 Macro 也很强大,也可以实现很多的 Meta-Programming
Erlang 的 macro 是和 C 一样的坑货吧。Erlang 元编程主要是靠 parse_transform
11 年的时候加了一个 erlang 的邮件列表,joe 大 经常在里面回答各类问题,让人感动,joe 大即是一位学富五车的学者,同时也是一位非常牛逼的程序员,他希望自己设计实现的 erlang 能被更多的人使用,这种心态就和我们大部分的程序员一样,希望自己开发的产品能被广大的人民群众使用,我读过两本 erlang 的书,<>(封面是只袋鼠) 和 <> http://learnyousomeerlang.com, 读的很吃力,一是因为我是边敲代码边读,二是因为 erlang 确实和以前学的 c, java, ruby 等语言有很大的不同对我来说有种颠覆的感觉,所以现在推荐由 joe 大 亲自写的书 <>,已经有第二版了,读这本书时你可以感觉到 joe 大 就好像站在你的面前教你写 erlang 一样,想不会都难,不管怎样学学 erlang 开阔下视野,拓展下思维都是件很有意义的事情。
WhatsApp 团队 32 个人,服务了 4.5 亿(现在是 6 亿)用户,已经够说明 Erlang 靠谱了。
支撑 4.5 亿活跃用户的 WhatsApp 架构概览 http://www.csdn.net/article/2014-02-27/2818559-an-overview-at-whatsapps-19b-architecture'
WhatsApp 月活用户达 6 亿 http://www.36kr.com/p/214815.html
#30 楼 @yukihiro_matz 已经不在 163 了,这是我们之前的招聘贴 https://ruby-china.org/topics/20976
#52 楼 @magicdawn 的你字符编码问题吧,我这 Mac utf-8 没问题。 #53 楼 @yehualiu 就因为前面两个字母一样的?
#56 楼 @nowherekai Erlang 最适合用来处理多个“进程”间的通信,聊天室属于此类,游戏属于此类,以此类推。做网站还是 Rails 吧。
#61 楼 @hpyhacking 恩,用 ChicagoBoss 写了个 hello world 级别的网站,这个框架号称是模仿 Rails 的,用起来还是比 Rails 差很多。我挺喜欢 erlang 的语法和理念的,有机会用 erlang 写点其他东西玩玩。
感觉楼主基本上没有说到 erlang 的特点和精髓。erlang 的并发也是要看多层面的。在大项目和超大并发的状况下需要调优的地方太多了,甚至连 erlang 的 vm 本身都需要打特定的 patch。