十种可能改变IT行业走向的编程语言
然而,新型语言仍然在以惊人的速度不断涌现。有些是学生或者爱好者以个人项目的形式所设计,另一些则是来自大型IT供应商的产品。甚至连中小型企业也不甘势弱,积极针对其所在行业的需要开发出服务用语言。为什么人们如此热衷于这种重复性劳动呢?
答案其实很简单,尽管目前大家手头的语言在功能性与通用性方面已经相当强大,但仍然没有哪种单独的语法规则能够最大程度迎合任何一种实际需求。更重要的是,编程行为自身也处于不断的发展变化当中。多核CPU的崛起、云计算的升温、高流动性与分布式体系结构,这一切的一切都向开发人员提出了新的技术性挑战。要为现有语言——尤其是当下流行的语言——添加最新功能、范例以及模式可以说比登天还难。有时候直接搞一套新语言往往是最佳解决方案。
那么在这里,我将带大家一同纵览十种位居业界前沿的编程语言;其中每种方案都从全新的视角诠释了软件开发工作的艺术性,并以各自不同的特色解决了某些具体问题或是弥补了当下某款主流语言的独有缺憾。它们中有些是已经颇为成熟的项目,而有些则尚处于自身发展的初级阶段。有些可能对于大家来说还相当陌生且显得晦涩但懂,但毋庸置疑的是,它们很可能在未来给开发业界带来颠覆性的突破,并彻底改变今年数年的编程工具发展趋势——至少在新一代语言面世前,它们就是未来的生力军。
实验性编程语言第一位: Dart
JavaScript在为网络页面添加基本交互功能方面表现拔群,但当网页应用程序的体积达到数千行代码时,该语言的局限性就将暴露无遗。谷歌正是基于这种缺憾而推出了Dart,而这种语言也承载了谷歌为网页编程带来全新标准的雄心壮志。
与JavaScript相似,Dart采用了与C语言相似的语法及关键字。然而Dart与JavaScript最为显著的区别在于,前者中的对象明确指向类及接口,这与C++及Java颇有异曲同工之妙。Dart还允许程序员们利用静态式有选择地声明变量。追溯设计者的思路,他们应该是希望Dart与JavaScript一样更易于学习、保有动态特色以及流畅的执行效果,这样一来开发人员就能够在编写代码方面投入较少的时间,产品维护也将更为便捷,同时细小的错误带来的影响也将被降至最低程度。
目前我们还不能用Dart解决太多实际问题。其设计理念是希望该语言能够同时运行于客户机与服务器之上(与Node.js差不多),但现在惟一能够让Dart代码在客户端上运行的办法是将其通过编译转换为JavaScript。甚至它还不能正确作用于每一款浏览器。不过由于Dart以BSD类开源许可方式进行发布,因此任何购买了谷歌版本的厂商都可以随意将其构建于自己的产品当中。谷歌要做的只是说服业界接受这个编程领域的新生儿即可。
实验性编程语言第二位: Ceylon
Gavin King并不承认Ceylon这款他在红帽公司中创造出来的语言肩负着“Java终结者”的历史使命。在King的从业经历中,最为耀眼的一页正是他作为Hibernate——Java对象关系映射框架的创建者所赢得的赞誉。他喜欢Java,但他仍然认为Java还有很多提升空间。
King对于Java的抱怨主要集中在冗长的语法结构,这种语言缺乏一级与高端功能,而且对元编程的支持也相当薄弱。而更令他感到沮丧的是,Java中对于结构化数据定义的声明性语法极为欠缺,用他的话来说这使得Java“与XML根本无法分割。”Ceylon的目标就是解决上述疑难杂症。
King与他的团队并不打算完全从零做起。Ceylon虚拟机就不会出现,此类功能将通过Ceylon编译器将内容转换为Java字节代码,进而运行于JVM当中。不过Ceylon绝不会止步于一款编译器这么简单。该项目的一大雄心是打造一套全新的Ceylon SDK体系来取代Java SDK,引用King对于后者的评价——结构臃肿、笨拙,且从来没有得到“适当的、与时俱进的调整。”
这是一项艰巨的任务,因为红帽公司到目前为止还没有发布过任何一款Ceylon工具。King表示自己期待着能在年内看到一款编译器出现,但不会指望短时间内会有“百分之百由Ceylon编写”的软件问世。
实验性编程语言第三位: Go
解释程序、虚拟机以及托管代码如今正风靡一时。我们真的需要另一款用于将目标内容编译为本地二进制文件的老式语言吗?来自谷歌工程师团队的小组——由Robert Griesemer以及贝尔实验室的传奇式人物Ken Thompson与Rob Pike共同执掌——给出的答案是肯定的。
Go是一种通用型编程语言,且适用于从应用程序开发到系统编程等各种工作需求。从这种意义上来说,它更接近于C语言或C++,而不是Java或是C#。但与后两者一样,Go中也包含着各类现代化功能,包括垃圾收集、运行时间映象以及对并行性的支持。
同样重要的是,Go在设计上有意降低了编程难度。其基础语法与C语言非常相近,但却消除了多余的语法及样板文件,同时简化了对象定义等常用功能的操作。Go项目小组的目标是打造出了一款像动态脚本语言那样拥有亲切代码的语言,并且能够像编译语言那样提供强大的功能性。
Go尚处于创建过程之中,而且其语言规范也仍可能发生变动。也就是说,我们目前已经可以开始尝试使用了。谷歌已经为其打造了对应的可用工具与编译器,说明文档之类也相当丰富;举例来说,Effective Go教程就是大家了解Go与其它早期语言不同之处的上佳起点。
实验性编程语言第四位: F#
函数型程序设计在计算机科学家以及学术界一直都相当流行,但像Lisp以及Haskell这样的纯函数型语言通常被人们认为无法作用于实际应用中的软件开发工作。对于函数型代码,大家抱怨最多的是它们很难与由C++及Java等命令型语言所写成的代码与库相整合。
说起F#(发音为“F=sharp”),这款微软推出的语言在设计上可谓兼顾了功能性与实用性。由于F#在.Net公共语言运行(简称CLR)中属于一级语言,因此能够访问其它CLR语言的所有同类库及功能,包括C#及Visual Basic等。
F#代码与OCaml多少有些类似,但它同时拥有不少相当有趣的特色语法。例如,F#中的数字型数据可以通过分配获得计量单位,进而为科学类计算服务。F#还为异步式I/O、CPU并行处理以及GPU负载分担等功能提供了必要的理论支持。
在度过了微软研究中心中漫长的酝酿期后,F#现在终于同Visual Studio 2010一同面世了。更妙的是,微软这一次不按常理出牌,将F#编译器与代码库通过Apache开源许可呈现在我们面前;大家不仅能够免费使用这款语言,更可以将其引入Mac及Linux系统(通过Mono运行工具)。
实验性语言第五位: Opa
Web开发工作是公认的繁杂无比。就算是最简单的一款Web应用程序也需要不计其数的代码行与多种语言交替使用:HTML与JavaScript处理客户端、Java或PHP应对服务器、SQL负责数据库等等。
Opa其实并不打算单独取代上述任何一种语言。相反,它存在的目的是希望通过为Web编程设定一套全新规范的方式一次性将各类方案直接抹杀。在Opa应用程序中,客户端UI、服务器端逻辑以及数据库I/O都由同一种语言负责实施——也就是Opa本身。
而要完成这一目标,Opa需要将客户端与服务器端框架进行整合。由Opa编译器来决定某个特定程序是否应该运行于客户端、服务器端或是同时运行于二者之上,其后该编译器将输出运行所必需的代码。对于客户端型程序而言,编译器会将Opa的代码内容转换为相应的JavaScript代码,包括其中的AJAX调用。
当然,这样规模的整合型系统也暗藏着一些后台机关。Opa的运行环境将其Web服务器与数据库管理系统捆绑在一起,也就是说我们无法用其它独立的备选方案取代它们的位置。这当然可以算是一点缺憾,但为了保持标准的细致化与完整性,并使得数据驱动的Web应用程序能够以短短数十行代码得以表达,这一切都是值得的。Opa项目完全开源,并且目前已经支持64位Linux以及Mac OS X平台;今后随着工作的深入还将有更多端口得以开放。
实验性编程语言第六位: Fantom
我们是否应该在开发自己的应用程序时考虑对java及.Net的支持?如果使用Fantom来编写代码,那么一切都不必担心,甚至连交换机平台也不在话下。这是因为Fantom在设计上兼顾到了跨平台的可移植特性。Fantom项目中不仅包括能够为JVM或者.Net CLI输出字节代码的编译器,同时也拥有一组能够容纳Java及.Net接口的抽象化API,也就是创建了一套额外的可移植层。
Fanrom的可移植性还有着进一步的扩展规划。目前由Fantom到JavaScript编译器已经可以使用,而接下来我们还可以期望看到包括LLVM编译器、Parrot虚拟机以及iOS版Objective-C在内的各类延展型项目。
不过千万别把可移植性当作Fantom语言惟一的存在理由。虽然它在本质上仍然是以C语言为基础,但它同时也对该原始模型进行了充分改良。Fantom语言试图在某些颇具争议的语法讨论——例如牢固与动态或者接口与类——之中获取中立身份。它不仅增加了对数据结构说明及序列化对象的简化说明,还囊括了对函数型程序设计及并行性创建工作的有力支持。
Fantom是基于Academic免费许可3.0版本的开源项目,并且现在在Windows以及Unix类平台(包括Mac OS X)上已经可以付诸使用。
实验性编程语言第七位: Zimbu
大多数编程语言都从其它早期语言中借用到了某些功能或是语法。而Zimbu则把这种拿来主义精神发挥到了极致。作为Vim文本编辑器作者Bram Moolenaar的另一款得意之作,Zimbu的目标是成为一款速度快、语法简洁、适应移植需求且便于阅读的语言,并最终使得来自任何图形用户界面的应用程序代码得以运行于目标操作系统内核当中。
由于Zimbu与生俱来的杂交血统,其语法也相当独特,但同时却又功能丰富。它采用与C语言相似的表达式及运算符,但却使用自己的一套关键字、数据类型及块状结构体系。另外,它还支持内存管理、线程及通道等功能。
可移植性一直是个关键问题。尽管Zimbu是一款编译型语言,但其编译器输出的是ANSI C码,这就使得文件只能由具备本地C编译器的平台来生成。
遗憾的是,Zimbu项目如今尚处于起步阶段。而其编译器虽然已经能够为自身及其它程序创建一些演示范例,但并不是全部Zimbu有效代码都能够正确运行。不过预期功能目前还不完善,其中一些还只是加以草草设置,因此我相信只要假以时日,这些问题都能得到妥善解决。另外语言规范也很可能随着时间的推移而产生变化,例如在必要时添加新的关键字、类型以及语法等。所以说明文档等材料目前还没有统一的结论。不过如果大家对这种语言有兴趣的话,其初始工具已经在Apache许可基础上得以公布。
实验性编程语言第八位: X10
并行处理一度作为软件开发领域中的独特生态圈存在,但随着多核心CPU及分布式计算技术的日益普及,并行化也崛起成为未来发展的主流方向。遗憾的是,时至今日,编程语言仍然没能跟上时代的步伐。而这正是IBM研究中心苦心开发X10的原因,这是一种以提高开发人员生产效率为主旨的实用型语言,希望在现有基础上将开发效率提高“十倍”。
X10利用划分式全局地址空间(简称)编程模型来解决并行类任务。代码与数据作为各自独立的单位,分别位于一个或多个“空间”当中,这就使得将单线程字节代码(单独空间)向高性能集群中单核心或多核心处理器(多个空间)的多线程处理能力转化的过程更为简便。
X10代码总体来说与Java比较相近;事实上,X10运行环境可以直接作为本地可执行文件以及类文件应用于JVM当中。X10编译器能够输出C++或是Java类型的源代码。达成与Java语言之间的直接操作性是该项目的努力方向。
就目前而言,这种语言虽然还处于发展变化中,但也已经算得上相当成熟。其编译器与运行环境支持一系列平台,包括Linux、Mac OS X以及Windows。包括基于Eclipse的IDE及调试工具等都已经以Eclipse公共许可为基础进行发布。
实验性编程语言第九位: haXe
大多数语言都可以用来编写可移植代码。C语言编译器能够作用于几乎每一种CPU架构,而Java字节代码则能够在一切具备JVM的环境中发挥功效。但haXe(读音为“hex”)能做的则比可移植性更多。它是一款跨平台语言,能够适应各种不同类型的运行环境——包括本地二进制解释程序及虚拟机。
开发人员可以利用haXe编写程序,然后将结果编译为对象代码,例如时下流行的JavaScript、PHP、Flash/ActionScript或者NekoVM等等;而像C#、Java等其它输出模块目前仍处于研发阶段。在核心语言之外有haXe标准库作为补充,其指向各类目标的功能也同样齐全,而且还为目标平台的独特功能配备了专用的函数库。
haXe在语法上与C语言相似,函数集合相当丰富。它的主要优势在于规避了目标平台自身固有的缺陷。举例来说,haXe具备JavaScript所欠缺的严谨归类;它在ActionScript的基础上增加了通用语句及类型推导;它还完全消除了PHP语言在语法方面的设计疏漏与杂乱无序。
虽然仍处于开发阶段,但haXe在其创造者Motion Twin游戏工作室的推动下已经进入商业化运营,因此我们已经应该用严肃的眼光看待它。它支持Linux、Mac OS X以及Windows平台,并采用数款开源类许可相结合的分布模式。
实验性编程语言第十位: Chapel
在高性能计算领域,很少有哪家企业的风头能够盖过Cray,因此Cray公司的原始编程语言Chapel能够上榜也就毫不奇怪了。这是一款在设计上主要考虑到超级计算机及集群实际需求的语言。
Chapel是Cray公司Cascade Program项目的一部分,该项目可谓野心勃勃,其部分计划内资金甚至是由美国国防部高级研究计划局(简称DARPA)所提供。其目标主要是从底层硬件中提取抽象并行算法,进而提高现有架构的性能表现,并使得并行类程序具备更好的可移植性。
Chapel的语法脱胎自许多来源。除了几款我们常见的主流语言(例如C、C++以及Java),它还从像Fortran及Matlab这样的科学类编程语言中借鉴了不少概念型内容。它的并行处理能力在一定程度上与ZPL及高性能Fortran密切相关,另一些Cray早期项目也是它的学习目标。
Chapel最引人注目的特色之一是其“多分辨率编程”功能,这项功能使得开发人员能够在应用程序中引入更多抽象化代码,并在实施中添加更多细节阐述以使得定义本身更加明确。