Erlang程序设计中文版(书评和笔记)
在最近的一个多月时间里,我利用业余时间学习了Erlang,这是一门面向并发模式编程的语言,她采用函数式的一些思想,加上强有力的库,在20多年的锤炼中,已经算是世界顶级的并发编程语言之一,当然有些不足的是多少年都不变的语法特性使得这门语言的特性比较死板。
先吐槽一下:
1.模块的基本单位是函数,所以你不能导出一个变量,这样我只能通过宏定义来去实现一些匿名函数(但这可能会带来性能上的问题,因为每次都可能创建匿名函数)。
2.没法做延迟计算,所以没法定义一些极限函数。
3.并非真正的FP,这真是刚开始了解到的时候很恼火,spawn(fun() -> test:test(self()) end). 虽然是在函数里运行,但是self()是个副作用函数,我强烈建议Erlang将副作用函数进行标注,就如Clojure一样后缀都加上!
4.少即是多,我同意,但是Erlang的语法糖实在太少了,除了函数、模块和宏没别的了,少不意味着表达力弱啊,但erlang的表达力真的是有点弱,当然模式匹配还是相当方便的说,还有对二进制的处理很是好用
4.很多未公开函数很好,但是却没有文档支持,只能通过阅读源码了解实现,或者去邮件列表找解决方案。
5.实现的一些接口并不是那么的灵活,例如{packet, 2},这个想修改没法改(不包含数据内容长度),只能hack代码,进行编译,很多时候在Erlang语言这层的优化很有限,必须要深入了解她的实现机制,Erlang重在稳定和热更新,效率反倒是其次的,Joe Armstrong说的,只有当你不得不优化代码的时候再去优化吧,先让代码跑起来。
6.我希望能够开放对Module的访问模式,就像Lua一样,可以直接导出更多的匿名函数,这样能少很多很多的敲代码的工作量,还能减少错误,更使得代码看起来更简洁。
7.不好入门,我用了两个星期才算是入道,那种痛苦真的是找不到北,但理解了也就是找到了Erlang解决问题的规范。
8.调试信息看的我累啊,只可能是动态语言和并发语言的通病吗?没用sasl之前,简直是噩梦,用了sasl是眼花。。。
好吧,我还是特别喜欢Erlang的,因为她带给你是整个编程思维的转变,Joe Armstrong估计是不是最早应用Actor模型或者叫SEDA模型的人呢?
在看到第七章-并发的时候,虽然只有两页的篇幅,却道出了Erlang架构体系的设计模式,用了非常拟人的方式介绍了Erlang架构体系的设计精髓。
Joe Armstrong几乎是随意的几句话,却一语道破了Erlang的世界观。在Actor之前,我曾想过如何解决并发的问题,但一直就在锁里转来转去,也想过跳出思维的局限性,可一直没找到好的方式,SEDA这个模型只是了解,没有深入去实现,反倒是这本书彻底给了我方向。
这本书,区区用了四五章就搞掉了几乎Erlang所有的语法特性(期间穿插着实践):
1.数据类型:
a.原子:atom
b.浮点数:number
c.记录:record
d.元组:tuple
e.二进制数据:binary
f.列表:list
g.内建函数:BIF
h.Pid
i.字符串:string
j.引用:reference,
k.函数:fun
l.端口标识: Port Identifier
m.Boolean
2.变量和模式匹配
3.列表解析
4.case/if表达式
5.异常处理
6.模块编译,模块属性,导出,包含.hrl的文件
7.宏定义
8.断言(Guard)
9.消息的发送和接收,超时处理
这本书的实例很多,中文在翻译一些关键的地方的时候,可能是本身中文表达能力在处理科技文献的时候的弱点,必须还是要对照英文进行了解,否则会漏掉一些关键信息。
最后,这本书还是非常值得一读,你不仅能领悟到一门超过20年的语言的设计精髓,还有带给你的是一个Erlang的世界观,只有了解了才知道,绝不后悔。
先吐槽一下:
1.模块的基本单位是函数,所以你不能导出一个变量,这样我只能通过宏定义来去实现一些匿名函数(但这可能会带来性能上的问题,因为每次都可能创建匿名函数)。
2.没法做延迟计算,所以没法定义一些极限函数。
3.并非真正的FP,这真是刚开始了解到的时候很恼火,spawn(fun() -> test:test(self()) end). 虽然是在函数里运行,但是self()是个副作用函数,我强烈建议Erlang将副作用函数进行标注,就如Clojure一样后缀都加上!
4.少即是多,我同意,但是Erlang的语法糖实在太少了,除了函数、模块和宏没别的了,少不意味着表达力弱啊,但erlang的表达力真的是有点弱,当然模式匹配还是相当方便的说,还有对二进制的处理很是好用
4.很多未公开函数很好,但是却没有文档支持,只能通过阅读源码了解实现,或者去邮件列表找解决方案。
5.实现的一些接口并不是那么的灵活,例如{packet, 2},这个想修改没法改(不包含数据内容长度),只能hack代码,进行编译,很多时候在Erlang语言这层的优化很有限,必须要深入了解她的实现机制,Erlang重在稳定和热更新,效率反倒是其次的,Joe Armstrong说的,只有当你不得不优化代码的时候再去优化吧,先让代码跑起来。
6.我希望能够开放对Module的访问模式,就像Lua一样,可以直接导出更多的匿名函数,这样能少很多很多的敲代码的工作量,还能减少错误,更使得代码看起来更简洁。
7.不好入门,我用了两个星期才算是入道,那种痛苦真的是找不到北,但理解了也就是找到了Erlang解决问题的规范。
8.调试信息看的我累啊,只可能是动态语言和并发语言的通病吗?没用sasl之前,简直是噩梦,用了sasl是眼花。。。
好吧,我还是特别喜欢Erlang的,因为她带给你是整个编程思维的转变,Joe Armstrong估计是不是最早应用Actor模型或者叫SEDA模型的人呢?
在看到第七章-并发的时候,虽然只有两页的篇幅,却道出了Erlang架构体系的设计模式,用了非常拟人的方式介绍了Erlang架构体系的设计精髓。
Joe Armstrong几乎是随意的几句话,却一语道破了Erlang的世界观。在Actor之前,我曾想过如何解决并发的问题,但一直就在锁里转来转去,也想过跳出思维的局限性,可一直没找到好的方式,SEDA这个模型只是了解,没有深入去实现,反倒是这本书彻底给了我方向。
这本书,区区用了四五章就搞掉了几乎Erlang所有的语法特性(期间穿插着实践):
1.数据类型:
a.原子:atom
b.浮点数:number
c.记录:record
d.元组:tuple
e.二进制数据:binary
f.列表:list
g.内建函数:BIF
h.Pid
i.字符串:string
j.引用:reference,
k.函数:fun
l.端口标识: Port Identifier
m.Boolean
2.变量和模式匹配
3.列表解析
4.case/if表达式
5.异常处理
6.模块编译,模块属性,导出,包含.hrl的文件
7.宏定义
8.断言(Guard)
9.消息的发送和接收,超时处理
这本书的实例很多,中文在翻译一些关键的地方的时候,可能是本身中文表达能力在处理科技文献的时候的弱点,必须还是要对照英文进行了解,否则会漏掉一些关键信息。
最后,这本书还是非常值得一读,你不仅能领悟到一门超过20年的语言的设计精髓,还有带给你的是一个Erlang的世界观,只有了解了才知道,绝不后悔。
有关键情节透露