2008编程语言盘点

去年最受欢迎的语言和往年一样,没有变化,仍然是:Java、C、C++、PHP、Basic。前几名的语言要在短短的一两年有变动,是不太可能的。这五个语言哪个不是占据Top 5的位置五或十年以上?估计2009年仍然是这样的局面,由这几个语言独占鳌头。

但C#已经在快步进逼BASIC,可能再过两年就可以进入前五名。C#上升,BASIC下降,某种程度上反映出微软的VB程序员正转换到C#语言。C#正在逐渐累积和Java抗衡的能量。

在2009年,最值得重视的编程语言好消息,应该就是C++了。C++ 0x的x最终被设定为9,将于2009年推出这个标准。经过十年的经验累积,许多C++既有的缺点都将在这个标准中获得改善,值得我们期待。

得益于Google的强力背书下,Python这几年小有斩获,现在已经变成通用型脚本语言的第一选择,Python兴起,导致Perl风华难再,两者消长的态势相当明显。而且在2008年末,大家期待已久的Python 3.0也终于推出了。

现今,我们生活在Web的时代,Web后端或许百家争鸣(Java、PHP、.NET、……),但Web前端还是JavaScript一枝独秀。尽管JavaScript语言存在许多为人所诟病的地方,但JavaScript的重要性仍会持续上升。

对Delphi来说,我承认我过去看走了眼,认为它会持续触底,但2008年显然是Delphi重新被群众拥抱的一年。Delphi曾经拥有许多高手级的使用者,甚至对Visual Basic造成威胁,但是过去这几年在Java和.NET的出现之后,以及Web应用席卷全球后,Delphi明显地被边缘化了。外患加上内忧(Borland公司内部的变动),使得Delphi的形势相当不佳,连原文书都找不到几本。在Borland将开发工具部门切割出CodeGear,接着CodeGear又被Embarcadero买下之后,Delphi好像又渐渐有起色了,但说它拨云见日还太早。

如果说Delphi触底反弹,那么遭遇完全相反的就是Ruby了,近期Ruby的招聘大幅降低。对于一个窜升太快的语言,需求稍微有跌落,是正常现象。Ruby长期应该仍会是缓慢上升的格局。

今年是Lua丰收的一年,能见度大增,除了用在游戏软件开发之外,也陆续被一些重要的商业软件商所采用(例如Adobe公司)。我看好Lua,因为在嵌入式语言领域,还没有其他语言可以与之匹敌。

说到Adobe,今年推出AIR之后,好像市场的热度还没起来,所以Adobe的官方语言ActionScript依然载浮载沉。我希望它能在2009年有更好的表现。

Erlang在2008年的表现不错,持续缓慢上升。Java平台上的两个语言Groovy与Scala也开始受到关注。这些新语言某些程度也相对地呼应了函数式编程(functional programming)与动态语言崛起的现实状况。

根据Net Applications在2009年1月的数据显示,Apple计算机的市场占有率已经达到9.63%,而且iPhone在过去这一年半的销售数字更是相当抢眼。受其影响,开发MacOS应用软件的官方语言Objective-C也大有斩获,越来越受到重视。要不是Apple的笔记本太贵我买不起,否则我早就开始学Objective-C了。

我注意到过去一年有一个奇怪的语言忽然冒出头,叫做Alice。Alice是一个3D动画的制作环境,适合用来辅助说故事。这个语言之所以叫做Alice,该不会是和“Alice’s Adventures in Wonderland(爱丽斯梦游仙境)”的故事有关?

容我在此有一点私心介绍一下REBOL语言。根据目前的开发进度来看,2009年将会是REBOL 3.0发布的一年。我希望大家多多关注这个语言。你可以到我的REBOLOGY博客(http://RebolLovesJerry.blogspot.com)上看看它的动态。

分析完重点语言之后,就整体来看,我们会发现动态语言和函数式语言越来越受欢迎。我自己就是从C、C++到Java、C#,再到Erlang、REBOL,我使用的语言越来越动态、越来越偏函数式编程。

动态语言受欢迎

由于动态语言越来越受欢迎,.NET和Java都注意到这样的现象,试图让动态语言可以更容易地整合到自己的平台上。Java阵营的Da Vinci Machine,微软的DLR(Dynamic Language Runti-me)都是这种趋势下的产物。我们可以预期在不久的未来,动态语言会更加蓬勃发展。

动态语言势力之广,可能远远超出你的想象,下面列出常见的动态语言:D、JavaScript、ActionScript、Erlang、Groovy、Lisp、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Smalltalk、Tcl、VBScript。

究竟动态语言有什么样的魅力?因为动态语言可以用更简单的方式,做到静态语言很难做到的事。我很难用三言两语介绍动态语言的特点,而且动态语言的定义也似乎见仁见智,值得写一篇专文好好地介绍。

函数式语言崭露头角

除了动态语言,函数式语言也是一种趋势,连微软都推出了F#。去年年中我在台湾微软讲过两场F#的讲座,听众不少,显示大家对这类编程技术相当好奇。

函数编程(FP)长期以来没有出现在主流的商业软件世界,真正让FP无法被接受的原因可能是“执行效率”。传统上,函数式编程语言的效率确实比命令式(imperative)编程语言来得差,这在商业系统上是不能忍受的。但是这个原因却有了变化。今天,我们有了新的衡量标准:“简单”、“快速开发”比其他因素都更重要,因为现在软件的复杂度已经到了我们无法忍受的地步,而IT产业的竞争也比以往激烈许多。

想要“简单”、“快速开发”,就要用比较高阶的抽象,因此函数式编程比命令式编程更适合现在的开发环境。这些年来硬件的进步,使得函数式编程的效率不再是大问题;甚至由于编译技术的进步,函数式编程语言的执行速度,现在也已经不再是吴下阿蒙。

近年来硬件的发展,使得局势似乎180度反转成为对FP有利的局面:多CPU、多核心、超线程(Hyper Threading)的硬件架构普及,以及分布式运算的流行,这根本就是专为滋养FP繁殖而打造的环境。

但是,大多数的程序员想从OO或者procedure式的编程方式,转到FP,难度是不小的。

语言联合国

当一个系统比较大的时候,使用混合语言编程是很常见的,因为:

每个语言都有适合使用的时机,一个大系统可以分成多个次系统或模块,每个次系统都有不同的特质,适合采用不同的语言。

大系统开发时,开发者的人数变多。每个人倾向于使用自己熟悉的语言和工具。

以我自己的例子来说,基于上面的考虑,我规划的系统,同时使用C++、C#、REBOL、Lua,未来可能还会加入Erlang。我们用C++进行系统编程(处理低阶的,和操作系统相关的部分),使用C#写跨平台的服务器(未来考虑用Erlang取代),使用REBOL写解析器和编译器,使用Lua作内部脚本语言。每个语言各适其所。

使用混合语言的开发方式,另一个好处是程序员擅长什么就用什么。学习一个语言到精通的地步,需要很长的时间。我们无法要求自己团队的程序员都能使用某个我所熟悉的语言,可以退而求其次,让他们用自己最熟悉的语言,只要开发出来的东西符合我们规定即可。

使用混合式语言开发,只要模块切割得当,接口定义清楚,架构设计正确,那么绝对是可行的。这是我的经验之谈。

但是也请注意,混合多语言可能会导致维护难度的提高。当开发某模块的人离职,且当初他所使用的语言没有其它人会,这个时候麻烦就来了。

混合多种语言开发系统,有可能要面对语言之间的阻抗(impedance)问题,就好像不同国家之间会有不同的文化隔阂一样。好的系统设计应该要考虑到这一点,减少模块之间的接触点,设法让语言之间的阻抗降到最低。

我的建议

如果你想培养一个全能的联合国梦幻开发团队,我的建议是要集合下面的语言人才:

C:进行系统开发
C++:进行COM与传统的微软技术开发
C#:进行现代的微软技术开发
PHP:进行Web后端开发
JavaScript:进行Web前端开发
Objective-C:进行Mac或iPh-one开发
Java:毕竟许多地方还是会用到Java
Python:进行脚本开发

如果有一支这样的梦幻团队,应该是任何软件都能很快地开发出来吧!我想。

2009年,估计全世界经济都处于低谷,这个时候,身为程序员的我们,更应该好好学习一两个语言,为未来做准备。我的建议是,如果你只会系统语言,就挑一个脚本语言学习;如果你只会脚本语言,就挑一个系统语言学习;如果你只会Procedure语言,就挑一个OO语言学习;如果你只会OO语言,就挑一个函数式语言学习;如果你只会静态语言,就挑动态语言学习。如果你都会了就挑逻辑式语言(Prolog)学习。如果你是个怪胎,什么都会了,连Prolog都会了,那么就学习REBOL吧!

我会的语言有:C、C++、PHP、JavaScript、Delphi、C#