Archive for November 30th, 2007

来自未来的erlang

Friday, November 30th, 2007

来自未来的erlang

erlang算是我认真学的第一门函数式编程语言。而他实在是带来了很多新的概念,预示着未来的发展方向。

对于函数式编程,我在使用Python时就已经开始使用了,只不过,依托Python极其垃圾的函数式编程实现,效率极低。所以除了用来摆酷,没什么实际用途。后来好友jorge也推荐过我学其他的函数式编程语言,如lisp、scheme、guile等等。终究因为没有对应的Windows版本而半途而废。我个人平时大部分时间都使用debian,只不过,我不希望我的程序难于部署。而我编程的成就感也是来自更多的人在使用。

而关于erlang,最早是我们头叫我去研究的。当时他很讨厌公司已有的软件开发和部署方式,也就是load balance+app*n的方式。而且公司常用的几种编程语言,Java、Python都无法利用多核CPU。PHP依赖Apache的多进程fork方式实现了利用多核CPU,但是无法利用数据库连接池等等问题也是很烦躁。于是,最后他发现了erlang这个东西,并且嘱咐我关注一下。

关于erlang的优点,网上有很多介绍,我就从我所关注的几个优点来讲。

1、函数式编程。函数式编程语言具有特有的简单性,尽管对于我们这类从过程式语言,并升级到面向对象语言的程序员来说,思想的转弯太大。但是如果转过来以后,却面对着桃花源一样的简单性。从效果上讲lambda算子与图灵机具有相同的作用,过程式语言可以完成的功能,用函数式语言一样可以实现。

2、并行计算。现代已有的过程式语言和面向对象语言在并行计算方面都有很恶心的复杂性。虽说简单的讲有线程、异步、协程等几种方式,但是并发控制却是大多数程序员心中的噩梦。而同时又要面对神出鬼没的死锁。

3、集群计算。这个变态的时代,我们都很无奈,当几千个并发(仅仅是短连接)向你涌来时,除了加机器还能有什么办法。但是加机器就有个艺术的问题了。load balance是不可或缺的,但是lb的价格足以让任何级别的公司心痛。而erlang内置的集群支持则可以平衡的将负载分配到各个erlang服务器上。

4、错误处理。当然,即便是连C这类的语言其实也是有错误处理的,但是错误处理有个层次的问题。如果你满足于函数调用返回错误码,那就算了。但是问题是错误的发生可能比你想象的更加离奇。也许是服务器的电源线不小心被踢掉了;也许是你新部署的应用被运维的同事当木马给杀掉了;甚至仅仅是因为你没有交机房的网费而被拔掉了网线。而在这时,你都要自己写程序来监控么,噩梦,绝对的噩梦。还好,这个世界上有erlang这个东西,确保你可以在多台计算机上分别部署应用并互相监控。并且在某台服务器出错时,不至于让整个应用挂掉。

其实每一种成功的编程语言都有其最成功的应用领域,面对不断扩大的服务器规模、多核CPU、CPU频率的制约,erlang将是未来相当一段时间的成功者。