争论 OOP in Erlang
官方的 Erlang-Question Maillist 确实是个值得“长期潜水”的地方——因为,这里时常会有“水怪”出没,比方,象火爆的 Joe Armstrong 爷爷和热辣的 Ulf Wiger 大叔之类。比方说,讨论象“争论 Erlang 到底 OO 不 OO”这样的“诱饵话题”,通常会比较容易吸引到“大水怪”们跑过来……,然后就有好戏看了。就算话题本身的乐趣有限,争论本身也不会让人失望。通过争论,我们能够看到各种各样的背景、引用、推论、思维方式乃至文化……,这些可都是人类精神世界多样性的珍贵样本,比起技术本身也毫不逊色。
以下为 BLAH,没时间的同学自行跳过。
一个开源游戏项目的诞生
自从众多“主流开发者”第一次听说以来,直到现在,Erlang 仍然是一门“有点怪异的小众语言”。可它也有一个充满活力的小社区。在 Maillist 中我们常能“围观”到一些有趣事件的发生,最近,我们就能亲眼目击到《一个开源游戏的诞生》这出大戏。
Erlang 在游戏业素有盛名,国内和国外有一些游戏或多或少的采用了 Erlang 系的技术方案。这是有原因的,一方面,这个行业在整个计算机领域中处于并发与分布问题的最前线,他们是最有动力去尝试用其他的语言来解决手头碰到难题的一群人。另一方面 Erlang 本身消息驱动的要素,与游戏这一特定的开发领域在抽象模型上又有着高度的重合。
五年前,DevMaster 上 Joel Raymont 的那篇《Writing Low-Pain Massively Scalable Multiplayer Servers》(中文版《轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统》),在整个技术领域引起了非常大的反响,某种程度上,起到了大大推广 Erlang 语言的效果。但是,由此而诞生的 OpenPoker 项目,从纯粹的开源软件视角上看,却不幸成为了一个“犹抱琵琶半遮面”的半吊子项目——没有社区、没有交流、没有文档,源码没有完全公开——作者本人还要靠着这个项目的咨询费来养家糊口,一个纯粹的单人开源项目。这实在是一件非常可惜的事。作为一条事后的章鱼预言家,我敢说,如果一开始就打定主意去做一个开源的软件,比如说,就象 CouchDB 的 Damien Katz 和 MochiMedia 的 Bob Ippolito 一样,把全副身家都押宝在 OpenSource 的商业模式上, OpenPoker 完全可能走得更远。
开源软件搞了这么多年,从一开始的 SourceForge 到现在的 GitHub 和 BitBucket 我们终于有了“开源并不只是把源码放出去就可以了”的共识。开源软件其实是一套软件价值观——以软件本身的质量为核心价值。同时也是一套开发组织管理的哲学——当最初的项目创始人耗尽了他的热情,软件可以轻松的移交到新的开发者手上,通过这种热情的接力,软件能够日渐完善和历久常青。它是围绕着软件本身,以程序员的诉求为重点的开发方式,有着一套完整的依托于互联网的方法和设施。开源最终会导向可进化的,更高质量的软件产品。在开源软件这团热气腾腾的五彩祥云之中,热情是其原动力,灵活的团队是其灵魂,充分而高效的交流和协作则是这种开发方式的固有特色,至于社区、文档、特性管理乃至源码本身,这些我们所能见到的“特色”都只是交流协作的某种“外在形式”而已。
对于 Erlang + OpenSource + Game 而言,五年以前的 OpenPoker 错失了一次绝好的机会,如果上天再给一个重来一次的机会呢?现在看起来,这个机会已经来了,那就是 PEMMOX (Project Erlang Massively Multiplayer Online eXperience)项目。
各位童鞋请自备梯子墙头围观
http://www.trapexit.org/forum/viewtopic.php?p=57004
http://groups.google.com/group/pemmox/topics
众位游戏界的 Erlangor ,请把你们带有中国风的 ID 加到 Authors List 中去吧。
一篇有趣的 OO 讨论
在程序设计语言的圈子里,有关 OO 的争辩,几乎是各大社区每过一阵就会又发生一次的“风景”。单就辩论本身而言,对于一部分同学来说,因为围观的次数实在太多,无论是辩论的过程还是结论,其实大都已经不再新鲜。
但,从另外一个角度来说,每次这样的辩论,几乎总是能给我们带来一些新鲜的“猛料”。他们在辩论之中的引用、类比、或是提及,就像是一本好书末尾的“引用来源”列表(这个东西我们历来都不重视啊)。我们所要做的只是轻点鼠标按图索骥而已。这样的阅读通常都很让人愉快,因为它们每每都能给我带来“新鲜的空气”。不知其他人是否也有同感,或许是因为国外的治学风气更好(注明引用来源的好习惯),又也许是语言的隔阂(这些好东西都是英文的),再不就是我个人的理论基础太薄弱(太不喜欢读论文),原因不太可考;反正单就我自己而言,每次阅读这些东西都能让我在受益匪浅(长见识啊)的同时又切身体会到与其他科技“发达国家”之间学术水平的遥远差距(人家几十年前的论文,对我来说根本就是闻所未闻)。
这一次,激烈的辩论发生在 Clojure 社区。大家可以点下面的链接围观(也可以当作提高英语水平的好“毒物”):
照例,提醒一句,总是有些好东西在墙外,请自备工具。
CouchDB —— 可以期待的美好未来
有关 CouchDB 的最新动向是: Damien Katz 已经离开了 IBM ,他和他的团队,在 200w $ 投资的帮助之下,开始创业。美国投资人的魄力与专业素养,让我这个中国软件人羡慕不已,什么时候我们中国也会出现这种“纯粹谈技术就能够决定是否投你”的投资人呢?新公司名叫 Couch IO (请注意,名字当中,没有出现 DB 这两个字母)。是的,开源软件界备受瞩目的新星 —— CouchDB 团队已经踏上了全新的旅程,他们正朝着下一个目标进发。我很愿意见到他们取得成功!

在 CouchDB 狐狸书 中,作者 Jan Lehnardt 描述了一种全新的 Web 开发模式,有这样一句话来形容这种新的开发方式。
CouchDB has changed the way I think about developing web applications
在有着 10+ 年 Web 开发经验的我看来,尤其是在确实理解了他们心目中的开发方式之后,我觉得,这并不是一句阿谀奉承的面子话。而是,实事求是地说 —— 完全没有夸张的成分。
我在这里极其“概略”的介绍一下这种匪夷所思开发方式的若干基本要素:
Read more…
有趣的 Erjang 项目
Kresten Krab Thorup 是一位有着 20 多年程序设计语言实现经验的大牛。
I have been doing language implementation for 20 years. I was at NeXT doing the Objective-C compiler for some years in early-mid 90’s. I have worked on severa rounds of gcc, the GNU Objective-C, the palmos-m68k port, the JVM interpreter inside GNU Compiled Java. I have also contributed little pieces to JRuby, and a ton of other language stuff.
貌似是一位靠谱程度相当之高的同学。他在 GitHub 上设立了一个 Running Erlang On JVM 的项目 —— Erjang,到目前为止,已经达到可以顺畅运行 RingTest 的完成度,有兴趣的同学可以 git clone git://github.com/krestenkrab/erjang.git 弄回来玩一玩。Erjang 的大致设计思路是:
It loads Erlang’s binary .beam file format, converts it into Java’s .class file format, and loads it into the JVM. It will eventually have it’s own implementation of all Erlang’s BIFs (built-in-functions) written in Java. Those are being implemented as I stumble upon them in testing.
当然了,这是“终极目标”,当前实现版本的状况是:
Right now Erjang relies on an external Erlang process to utilize some of the beam handling code in the standard library (e.g., so I don’t have to parse .beam files), but Erjang would eventually be able to self-host the required modules. Right now, Erjang also uses jinterface to talk to other Erlang nodes, but that will needs porting/rewriting, I think.
稍有常识的技术人员都知道,如果不是过过嘴瘾的话,这样的“终极目标”将会意味着多大的工作量,但是有 20年+ 专业经验值的牛人通常都是非常 unpredictable 的物种。因而,这些工作对他而言到底需要多少时间,确实也很难说。
我知道,看到这样的项目,和我一样,第一反应,你肯定也会产生这样的疑问 —— Erlang 的 BEAM 已经是一个有着相当长时间历史的成熟 VM ,在很多方面都已经做了高度优化,为其他 VM 所不及;而 Erlang 在 Language 和 VM 的配合上也颇多好评,为人称道。那么,Kresten 这么做又有什么必要呢?
实际上,这个问题在 Reddit 上确实也引来了一大堆激烈的争论。Kresten 本人为此单独写了一篇 Erjang, Why? 来讲述自己的观点,有兴趣了解的朋友可以点[这里]延伸阅读。以下是我的 blah ,不喜欢 blah 的同学可以直接略过。
对于我个人而言,似乎还看不见 Erjang 的实用意义(说不定是因为我短视呢)。
但,无论如何,人家牛人 Kresten 同学既然都已经做出来了,总归也不会是一件坏事。 JVM Team 好歹也是 20年+ 以上大量开发团队的智慧结晶,必有过人之处,两相对照,肯定能发现一些 BEAM 团队没有考虑到的地方。通常而言,一个语言出现多个实现,彼此互相对照和竞争,绝对是一件好事。比如说,在 Kresten 的 blog 中就已经提到,它在 fib 的测试上发现 BEAM 在 bignum 的运算表现上不如 JVM 的好。
除了这些“整体上”的好处,Erlang 在 JVM 的实现,想必会也受到 JVM 体系固有的限制,如果因而破坏语言本事的一些核心特性,比如,进程的独立性,GC的独立性之类的,那么在具体选择时,就值得我们这些使用者再三斟酌了。
———-我是分隔线————-
顺便要抱怨一下。今天点 Firefox 地址栏里的 RSS 图标想要直接订阅 Kresten 的 blog ,发现 fusion.google.com 居然也被该死的功夫网给墙了,纯粹一个工具,能颠覆什么?这帮魑魅魍魉怎么就怕成这样了?
大家大多都有翻墙经验,随便设置一下就好了。但是,其他人怎么办?一个这么好的功能,就这样被这些破玩意给糟蹋了,凭什么?想来都让人上火。希望大家和我一样,多向身边的人传播翻墙技巧。日拆一砖,就不信丫能在世界的东方永远屹立不倒。
SNDA 并购 MochiMedia
在 Erlang 领域富有盛名的开源 Web 开发框架 MochiWeb ,其作者也就是知名的 Bob Ippolito ,他的公司名叫 MochiMedia 。日前传出消息,这间公司已被 SNDA 以 8000w 美刀的价格收购,交易将以 6000w cash + 2000w stock 的方式,于 2010 年第一季度完成执行。
辛苦创业,终于取得重大成果,Bob Ippolito,可喜可贺!
与此同时,我们也不得不说,盛大这次表现出了远超国内同行的不俗品味与独到眼光。此次“采购”,无论是从中国的互联网企业资本运作的时机与实操层面,还是从能在全球 Erlang 技术圈激起的影响而言,都大有可圈可点之处。如果掌控良好,能够顺利克服海外收购的文化适应性问题,可以预期 MochiMedia 大有成为 SNDA 新“矿脉”的可能。
对于我等一众 Erlangors 来说,资本层面的这些运作都是“高层”的事,离大家还是比较遥远。最实惠的是,大概可以开始期待,在不久的将来,也许我们能在某次 Erlounge 上近距离目击 Bob Ippolito 偶像 himself !
CPiE-CN 发布《Erlang 并发编程》第一部分 中文译稿
我一直都觉得 Erlang 中文社区是一个又小又很活跃的技术社区,这里的人和事常常都能让人感觉到某种淡淡散发出来的温暖,不知道大家对此是否也有同感。
临近圣诞,又有好消息传来。由连城同学发起的 CPiE-CN 项目(成员包括:王飞、Ken Zhao、张驰原、丁豪、赵卫国、吴峻)宣布了他们近一年辛勤努力的辉煌成果——Erlang 官方的重量级技术文档《Concurrent Programming in Erlang》Part I主体部分(除附录B、E和参考文献列表以外的所有内容)的中文译稿。
还记得我对 Erlang 的第一印象,就是来自于旅游途中的火车上,对这份文档 pdf 英文原版厚厚一沓打印稿的缓慢阅读(我想我得感谢枯燥的列车旅行让我具有了某种阅读这种枯燥文档的合适心境),老实说,这并不能算得上是一次愉快的阅读体验。现在好了,有了这份 CPiE-CN 团队精心翻译的中文版,可以想象,将会帮助多少人更顺畅的通过这条小径,步入 Erlang 独特的世界。
这里是发表在 liancheng 同学博客上的消息发布原文。
我想 Erlang 中文社区的所有用户都应该向这些志愿者们的辛勤劳动致以崇高的敬意:
- 连城(序、致谢、简介、第1章、第2章、第3章、第9章、全文校对)
- 王飞(第4章、第8章)
- Ken Zhao(第6章)
- 张驰原(第5章)
- 丁豪(第7章)
- 赵卫国(附录C、附录D)
- 吴峻(附录A)
(for 那些眼神不大好的同学们)再一次推荐,精彩的中文译稿在[这里]。
WebSocket 和 Erlang
好久没有露面的 Joe 大爷又在 Maillist 里出现了。这一次,他老人家在自己的 Google Chrome 浏览器上体验了一把 HTML5 的核心特性 —— 顺手用寥寥数十行的 Erlang 代码捣鼓出来了一个 WebSocket 服务器的参考实现(围观群众起哄:胜之不武,这本来就是 Erlang 的拿手好戏嘛)。咱还是照旧,废话少说,先上代码:
- <body>
- <script>
- alert("hello");
- if ("WebSocket" in window) {
- var ws = new WebSocket("ws://localhost:1234");
- ws.onopen = function() {
- // Web Socket is connected. You can send data by send() method.
- ws.send("hello from the browser");
- };
- ws.onmessage = function (evt) {
- var data = evt.data; alert(data);
- };
- ws.onclose = function() {
- alert("closed");
- };
- } else {
- alert("sad");
- };
- </script>
- </body>
- -module(local_server).
- -compile(export_all).
- start() ->
- {ok, Listen} = gen_tcp:listen(1234, [{packet,0},
- {reuseaddr,true},
- {active, true}]),
- spawn(fun() -> par_connect(Listen) end).
- par_connect(Listen) ->
- {ok, Socket} = gen_tcp:accept(Listen),
- spawn(fun() -> par_connect(Listen) end),
- wait(Socket).
- wait(Socket) ->
- receive
- {tcp, Socket, Data} ->
- io:format("received:~p~n",[Data]),
- Msg = prefix() ++
- "WebSocket-Origin: http://localhost:2246\r\n" ++
- "WebSocket-Location: ws://localhost:1234/\r\n\r\n",
- gen_tcp:send(Socket, Msg),
- loop(Socket);
- Any ->
- io:format("Received:~p~n",[Any]),
- wait(Socket)
- end.
- prefix() ->
- "HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade:
- WebSocket\r\nConnection: Upgrade\r\n".
- loop(Socket) ->
- receive
- {tcp, Socket, Data} ->
- Data1 = unframe(Data),
- io:format("received:~p~n",[Data1]),
- gen_tcp:send(Socket, [0] ++ "hello from erlang" ++ [255]),
- loop(Socket);
- Any ->
- io:format("Received:~p~n",[Any]),
- loop(Socket)
- end.
- unframe([0|T]) -> unframe1(T).
- unframe1([255]) -> [];
- unframe1([H|T]) -> [H|unframe1(T)].
技术的部分已经说完了,就象 Joe 老头的那 48 行代码那样——简单明了,连注释都不需要。下面借 Joe 老头的光,顺便 Blah 一下。
Joe 老头说:
But I think it will kill ajax and comet and all that crap. Ajax is painful if you only want to send very small amounts of data, you still have to spend all your time parsing the http headers. Comet and long-poll etc will die since they are totally unecessary.
What I hope will happen that Google will pre-empt some action in firefox and this will push Microsoft into action – I can’t understand why this has taken so long after all it’s merely a question of *removing* code from the browser and giving access to the low-level socket interface.
It will make applications symmetric – anything that involved pushing data to the client was tricky hence the horrific workarounds that comet and long-poll involved – now things like chat in the browser become symmetric push/pull applications.
About time say I – I’ve waited years for this.
见过我的同学都知道,我关注这个领域(Ajax -> Erlang)有日子了,一直都在各种场合大肆吹嘘 Erlang 和 Ajax 是“天生的一对”。因此,大概也可以冒充半块砖(家)吧,老实说,对于 WebSocket 我也很兴奋,但对于它的前景我却不象 Joe 老头一样乐观。
从技术角度,不难预见 WebSocket 的普及将会带来 Web 应用领域的另外一场巨变。为了适应这一“气候变化”,现有的“技术物种”(框架怪兽和模式恐龙)必将再次剧烈进化,灭绝掉其中的几种也大有可能(其中之一就是现在的 OS 将会被“边缘化”)。然后,当当当,新的 Web 和一大堆新名词又将“横空出世”。但,就目前而言,这场变革还没有大幕拉开的迹象(至少远比我们这些观察家期望的要慢得多)。这无关技术,听起来好像很阴谋论,但这确实更像是一场智谋的较量。
多年以来,邪恶的 M$ 先通过免费和 OS 绑定来占领市场,然后通过有预谋的 IE 不作为,使得浏览器市场出现了畸形的“安定团结”局面。这些长期“被河蟹”的绑定用户,他们开始觉得浏览器就应该是这样缓慢、不安全、而且功能受限的。他们这群人,既是变革的最大受益者,但与此同时,却也正是这一变革当前最大的障碍,具有讽刺意味吧(历史何其相似)。
然而,第一个可以体验 WebSocket 的 Google Chrome 却并非第一个实现这一特性的浏览器。FireFox 早就已经实现了,然而这个特性却一直停留在 trunk 之中(有好奇心的童鞋可以看这里顺便练练英文),尘封已久。作为旗手兼宣传队和播种机的 Google Chrome 是第一个把 WebSocket 拿出来 show 的。记得当初 Google Chrome 计划推出时不少人还有疑惑——“为什么不直接加入OpenSource 的 Firefox 项目呢?”,现在回想起来,是不是有点豁然开朗的意思?
窑洞的墙壁上挂着一张巨大的世界地图,Google 主教和 M$ 长老分别站在地图前的左右两侧,叉着腰、拿着红蓝铅笔,做沉思装……。
又到了万众期待的押宝时刻,想冒一把险,给自己整个“xx框架创始人”头衔的同学,赶紧了。
Erlang OTP r13 的新气象
Nov 25 日 Erlang OTP R13B03 已经发布!那么,这次发布,又有什么新东西呢?
- Release plans
发布计划?虽说在其他的 OpenSource 项目中已经稀松平常,但对于一直以来低调再低调的 Erlang 团队来说,好像还是第一次听说哦。 - New Build Process for Documentation
新的文档生成系统?貌似关系不大……,有文档看就行啦。 - GIT repository
没错!而且是基于 GIT 的哦。可以到这里参观学习,Fork、Watch、Download、Ticket、Patch、Issue……终于成真! - New erlang.org WEB-site
几十年如一日的 erlang.org 终于准备要一改长久以来的严肃面孔,实在可喜可贺。[还没上线哪] - Native Implemented Functions (NIFs)
NIF!用过 Java 的同学是不是“情不自禁”地想起了 JNI 呢?虽说是 R13B03 刚刚才推出的实验性设施,但快刀 yufeng 同学已经迅猛无比的博了一篇,请看这里。
就到这里,先写这么多。
-EOF-
Recent Comments