关于 Erlang 的一些想法
断断续续学习和使用 Erlang 几个月了,感觉跟之前看待这门语言有了点变化,还是挺有意思的。
作为初学者可能理解不太准确,但有些东西还是可以记录一下。
关于函数式编程
刚开始从其他语言转移到函数式语言的时候还害怕所谓的思维转换,实际上担心有点多余
入门并不难,能理解把循环写成尾递归的过程就基本没什么问题了
更少的心智负担,不再需要考虑是传值还是传引用,以及糟糕的副作用
在某些问题上更接近思维过程,不需要关心怎么做,只需要关心做什么
比如 erlang 的 quicksort 可以这么写(注意这并不是高效的写法):
qsort([]) -> []; qsort([Pivot | T]) -> qsort([X || X <- T, X < Pivot]) ++ [H] ++ qsort([X || X <- T, X >= Pivot]).
关于 Erlang
- 语法简单
- 没有大量的复杂的概念,不像某些《Thinking in XXXX》,看完巨厚一本书你发现自己还是啥也不懂
- 没有大量的奇技淫巧
- 大概看了一个多月,就基本可以把 ejabberd 代码从头到尾过一遍了
- 多看多用,我自己入门看的 《Erlang Programing》
- pattern match
- 用过才知道有多好用
- 据说效率极其惊人
- 据说 C# 也要加入了
- 并发
- process
- 需要并发执行一个任务的时候,最容易想到的就是新开一个 process 去处理
- Erlang 的 process 是轻量的,开启和关闭消耗也小,不需要操心各种并发问题
- 避免锁
- 实际上开始写命令式代码的时候,我倒是不怎么担心死锁,担心的反而是应该在哪里加锁……
- Erlang 的并发模型没有试图去解决锁的问题,而是从根源避免了它,那就是根本不允许全局变量共享(当然你需要共享,可以使用 ETS 或者外部数据库)
- 对我而言,这种做法减轻了不少心智负担
- process
- 鼓励崩溃和热更新
- 写代码的时候 Server 不用不停重启刷新的感觉太好
- 效率
- 入门快
比如我这种不合格的程序猿看了一点《Erlang Programing》就开始写 ejabberd 的模块了 - 很容易用
比如我这样不合格的程序猿也可以很顺利的手写稳定的服务器了
- 入门快
- 部分不怎么好的地方
- 字符串的处理
- 没有单独的字符串类型,而是用 List,从编码效率到处理效率,都不怎么好看
- 正则表达式的转义让人蛋疼无比
- unicode 字符
可能一不小心就容易坑了,当然这点在慢慢改进了 - record
可能 OTP17 后的 map 会方便点 - 工具链
从 IDE 到 debug profile 到 compile,体验都比较……怎么说呢,原始吧。
目前用 Intellij IDEA + Erlang Plugin,还凑合。 - 出了问题搜索不到
嗯,这个时候就会嫌弃 Google 不够智能不能帮你写代码了
- 字符串的处理