又是快一个月没有更新了,呵呵呵(挠头中…)。最近一直在搞PHP的那个server(其实是在天天party吧魂淡!+_+),首先从IOStream入手。现在已经有了一个简单的实现,等全部做好了再来发一篇帖子。言归正传,这篇博客主要想讨论一个问题,就是现在越来越热闹的“动态语言编译器”。
所谓“动态语言编译器”,顾名思义,就是把动态类型语言,尤其是PHP, Python等编译成静态代码如C再执行的工具。随着Web开发的不断流行和深入,动态语言的使用面也越来越广,而动辄100M日访问量的强大压力也对语言的执行效率提出了新的要求。由此“动态语言编译器”应运而生。它们当中的杰出代表当属HIPHOP (Facebook开发的PHP-C编译器),以及Shed-skin (Python-C编译器)。
开宗明义——我对动态语言编译器的两个观点:
动态语言中的动态特性要慎用
这是我一直以来都强调的一点。动态特性在给予我们编程方便的同时,也带来了代码结构性降低、可维护性差等诸多缺点。近来的开发工作令我越来越发现,相对于驾驭静态语言而言,使用动态语言开发对于程序员的能力和自律性要求更高。这一点对于1M日访问量以下的网站是微不足道的,但是对于20M以上的网站而言却不可不防。事实上像Facebook/Zynga这样的大型公司都在PHP上面吃了不少苦头,而Facebook更是毅然重写了绝大部分代码并做到全站编译化,以杜绝PHP的流弊。
因此,我建议将“可用的动态性”仅仅限于以下的几个方面:
有趣的是,现代静态语言都不谋而合地已经或正在实现以上的几点。Java是这方面的先行者,基本实现了以上的大部分特性(反射、范型、匿名类)并正在实现其他的功能(JSR 335: Lambda Expressions);而就连以保守(性能优先)而著称的C++,也在新版本11中包括了以binding/lambda为特点的新功能。从这个意义上来说,静态语言也已经动态化了。
另一方面,那些“坏的”动态性则应当在编程中予以避免。比如“多类型赋值”,即将无继承关系的类型,如数字类型、字符串型赋值到同一个变量上;又或者是臭名昭著的“eval”,在程序执行过程中动态生成新的程序(Geek很喜欢这个。程序生成程序、人工智能、想想都很酷。),等等。这些除了能显得这段程序与众不同并为开发思维带来混乱以外,不会带来任何实质性的好处。
(或许) 动态语言编译器只是“在错误的地点解决了一个错误的问题”
事实上我对于动态语言编译器的认识也经历了一个从完全赞同到持保留态度的过程。至于相关的编译器们,如PHP的Java版Quercus、C++版HIPHOP;Python的Unladen-Swallow、Shed-skin、pypy,我都曾经或多或少地使用或试用过。它们在执行性能方面的改进都是令人赞赏的。但是也普遍有以下的问题:
如果我们深入地想一下,这些编译器解决了什么问题呢?它们事实上是将动态语言变成了静态语言的一种“方言”,即用动态语言的语法来写静态语言的程序。理解了这一点,也就可以理解主流动态语言社区对于这种类型的工作并不感冒的原因了。
该怎么办?
上面的内容讨论的主要是“问题”。下面来谈谈我心中的解决方案:
总而言之,具体问题具体分析。在应用某个解决方案之前,一定要对它的优缺点有详尽的了解和分析。
以上是得悉http://code.google.com/p/shedskin/发布新版本后的一点感想。
联系客服