对于自己接触过的东西,总想写点什么总结一下。虽然没有那些技术资深的博主写的东西深,但我觉得挺喜欢这种写总结,能帮自己理清楚一些东西,或许以前还没有想到的东西会豁然开朗,对于其他的面向对象高级语言,写一门脚本语言我个人觉得还是有许多可以借鉴并实现的地方。
写erlang不久,才写过几个月,但总体感觉,一开始会很不习惯。一个月之后等熟悉后会非常喜欢这门强大的脚本语言。我都在想用erlang写端游的服务器也没什么不好,高并发处理的很好,效率也够高。
erlang第一印象,简洁,她没有数据类型,只有{}和[]的组合形式。{}元组,[]列表
对比一下C与erlang写一个数据结构:
struct Point
{
int nPointX;
int nPointY;
}PointObject;
erlang:以英文句号结尾,不是分号
point = {10, 10} .简单明了,结合json的数据格式就容易理解了。也可以{point, 10, 10},这种就类似于了{key--Value}.
person = {person, {name, ITcombox}, {age, 23}, {height, 1.70}, {footsize, 40}}.
另外一个就是列表[]:列表通常用于组合和解析一个复合形式的数据格式,{}和[]的组合精髓在于匹配。
X = [1,2,3,4,5].
Y = X.
Y = [H | T],其中H代表列表的第一个元素,T代表剩下的所有元素,巧妙的使用H和T的关系就可以提取出想要的数据。
TeamMember = [{combox, {age, 23}, {height, 1.70}},{com, {age 20}, {height, 1.78}},{box, {age, 22}, {height, 1.88}}].
如果有使用过json,或者使用过lua的应该很容易理解。应该大部分能写业务逻辑的脚本语言都是这样的数据结构。
其实,我被她吸引的第一件事是快速排序的实现,说到快速排序,一想到C里面就几十行。而erlang实现快速排序,严格来说只需要两行:
qsort([Pivot|Rest]) -> qsort([ X || X <- Rest, X =< Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y > Pivot]). 我对于erlang很好奇,但是一开始也觉得非常非常恶心。erlang的简洁来自于其自身的递归思想和使用lamada表达式,来自于没有数据类型,只使用数据结构。但这也是 让开始看到erlang的代码没什么感觉的原因,而常常因为像写公式一样的语言而感觉倒恶心,常常她简单的几行代码可以处理很多很多事情。这样的要求是你在使用erlang 进行编程的时候一定要有高抽象的思维,你的脑袋的内存容量要足够大,要想到她能简洁的写出就尽量简洁。 erlang还有一个好处,就是养成不使用断点编程,打印RunLog来查看程序运行,这样可以逼着自己下手敲代码前一定要想好了,而且基本上代码写完了自己基本上就知道结果的形式是怎么样的,什么样子的数据结构可以和写出来的函数结果匹配成功,还有一点恶心的是,erlang没有return。、 往往会造成一种错觉,明明就是几句话,怎么就实现了这么多逻辑,如果你还想在使用面向对象语言一样写erlang的话,只能说明你水平不够,而且有点小小的污染erlang的简洁,小小的侮辱。 erlang:ETS/gen_server模版结构/gen_server回调(这是erlang的重点学习的)简洁,高效,不考虑内存,不考虑破坏性赋值。没有类型,拿进程当作面向对象里面的类的对象来做业务处理,一切处理都基于进程,所以erlang的思想是OTP,面向进程编程。而且所有的数据传输都基于进程的通信,与客户端交互进程拿出要rpc的数据,通过TCP传输过去。使用递归实现循环,使用尾递归实现无新增内存消耗无限递归调用。还有一个特别的重点:erlang的ETS数据表非常强大,lua也是如此,应该能处理业务的强大脚本语言的数据表都是这样。erlang的数据表支持其自身提供的API,已经能完成基本所有需求。但是对于游戏中的用户数据当然还是存储到SQLServer里面的。 当然还有一个,写的好的代码都是实现热代码替换,不过接触的只有顺序编程和并发编程,对于分布式编程/多核编程没有接触到。想想面向对象语言里面还是有很多可以借鉴并实现的地方,至少写过erlang后我对于C++的一些机制,如泛型编程,模版的处理的目的和好处有更深的理解,而且觉得写起来更顺手了许多。