Erlang/Elixir Erlang 真的很好!

numbcoder · 2014年09月13日 · 最后由 posee 回复于 2018年10月25日 · 35690 次阅读
本帖已被管理员设置为精华贴

趁着 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 工程师,待遇丰厚,有兴趣的拿简历砸我吧!(相信你能找到我的联系方式)😄

👏 加精

另外,Erlang 就是动态语言

#2 楼 @Numbcoder Erlang 有变量啊,只是变量不可变,没有副作用

#5 楼 @yukihiro_matz 有了 ruby,为啥还需要 elixir?

#6 楼 @flowerwrong 有了 c,为啥还需要 Ruby, 什么场景用什么,用最合适的工具

#5 楼 @yukihiro_matz Joe 大神还是那么犀利!

#6 楼 @flowerwrong #7 楼 @yukihiro_matz 可以考虑下 Julia。单纯从语法和速度上来讲。

#11 楼 @yfractal 这个看起来还是挺优雅的,只是感觉它想做的事太多了,而且生态圈还需要慢慢培养

写的挺好

#14 楼 @Numbcoder 确实是。。。Julia 在功能上太贪婪了。。。

但觉得语法本身还是很精简的。

@yukihiro_matz matz 换新头像啦

#4 楼 @yukihiro_matz 我觉得这个是翻译坏了。根据一元二次方程这样的说法,应该翻译称元才对。

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

没错,之前学了 Erlang 之后,我就想:如果这世界是虚拟的,那只会是用 Erlang 这种语言开发出来的。😄

文档写的不错~~ 值得一看~

#20 楼 @bhuztez 大神现身,请大神多指教! 恩,Macro 虽坑,但还是比那些没有的要好吧。

11 年的时候加了一个 erlang 的邮件列表,joe 大 经常在里面回答各类问题,让人感动,joe 大即是一位学富五车的学者,同时也是一位非常牛逼的程序员,他希望自己设计实现的 erlang 能被更多的人使用,这种心态就和我们大部分的程序员一样,希望自己开发的产品能被广大的人民群众使用,我读过两本 erlang 的书,<>(封面是只袋鼠) 和 <> http://learnyousomeerlang.com, 读的很吃力,一是因为我是边敲代码边读,二是因为 erlang 确实和以前学的 c, java, ruby 等语言有很大的不同对我来说有种颠覆的感觉,所以现在推荐由 joe 大 亲自写的书 <>,已经有第二版了,读这本书时你可以感觉到 joe 大 就好像站在你的面前教你写 erlang 一样,想不会都难,不管怎样学学 erlang 开阔下视野,拓展下思维都是件很有意义的事情。

学习了 Erlang 并且维护了一段时间 openpoker 项目后,编程的思路大大扩展,绝对有必要学。

打自己的车,招个聘: 我们正在寻找 Erlang/Elixir工程师,待遇丰厚,有兴趣的拿简历砸我吧

ErLang ==> 12306

#30 楼 @yukihiro_matz 已经不在 163 了,这是我们之前的招聘贴 https://ruby-china.org/topics/20976

Erlang 大法好……

赞,有空看看

Elixir 大法好~

Erlang 确实很强大,只是学习起来比 Ruby 要难。 有空再看看 Elixir

朝哥啥时候开始转战 Erlang 了,能再牛点么……

不好!看了半天,看的眼睛疼,木有 ruby 看起来 sexy !

国内也有公司开始用 elixer 了,赞!

为什么不用 clojure?

#39 楼 @rasefon Erlang 的语法很多人都接受不了,你就更别提 clojure 了,虽然它更接近 Lisp,而且是基于 JVM 的,感觉很容易被底层架构所限制

@Numbcoder 你是 Elixir 教主吧,哈哈,在你的传教下,已经开始学习了,Elixir 感觉不错

#41 楼 @xiongxin8802 担当不起啊,我也是初学者,一起加油,哈哈

我也是想把 Pomelo 换到 Elixir........

#43 楼 @xieren58 你们用 Pomelo 做的什么应用?换成 Elixir 可以,但是要自己实现客户端到服务端的协议

#44 楼 @Numbcoder Pomelo 有协议解析模块吗?

@Numbcoder 你们是 erlang + redis + mysql?

#47 楼 @xieren58 erlang + redis + mongodb

#48 楼 @Numbcoder 有点激进呀。。👍

用 Erlang 写个开源的 pomelo 替代么?

正在学习 erlang,一反常态的函数式编程,很像在学习数学

这大法够好呀。。。

与 ruby“走得近”的应该是 rust,erlang 太远了

#52 楼 @magicdawn 的你字符编码问题吧,我这 Mac utf-8 没问题。 #53 楼 @yehualiu 就因为前面两个字母一样的?

55 楼 已删除

十一学了些 erlang,感觉是语言内核很小,但是用起来很复杂(OTP 等)。不知 erlang 的实际应用除了做网站外还有什么?

当年号称 Java 杀手的 Scala,说白了其实就是在 JVM 上造了一个 Erlang,我倒是看到了 JVM 是个多么牛的 VM

#57 楼 @ywjno 不如说在 JVM 上造了一个 haskell,erlang 没有那么复杂。他们只是一个 actor 阵营而已。

#58 楼 @halfelf 我只是引用楼主说的一句话来突出 JVM 是个很牛的 VM 而已

#59 楼 @ywjno JVM 是很牛,这个我不否认,但是也有自己的局限性,把其他平台的东西强行引入,不一定能发挥它的优点

#56 楼 @nowherekai Erlang 最适合用来处理多个“进程”间的通信,聊天室属于此类,游戏属于此类,以此类推。做网站还是 Rails 吧。

#61 楼 @hpyhacking 恩,用 ChicagoBoss 写了个 hello world 级别的网站,这个框架号称是模仿 Rails 的,用起来还是比 Rails 差很多。我挺喜欢 erlang 的语法和理念的,有机会用 erlang 写点其他东西玩玩。

重点在于可以通过 Erlang 接触到新的编程方式。

elixir 真的很适合 用过 ruby 的新手~~

65 楼 已删除

感觉楼主基本上没有说到 erlang 的特点和精髓。erlang 的并发也是要看多层面的。在大项目和超大并发的状况下需要调优的地方太多了,甚至连 erlang 的 vm 本身都需要打特定的 patch。

既然是 Pomelo 在做一个 erlang, 请问一下楼主有没有推荐的 Erlang 的服务端框架?

numbcoder Elixir 会成为明日之星么?似乎是 提及了此话题。 11月30日 20:45
yukihiro_matz 回复

不能修改变量值,增加操作如何做?

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