领导理论的演进,不改变语言如何助推Java的不断演进

Java所获得的巨大成功证明了这种设计方式是正确的,但如果这依然是当今Java的重要目标的话,那么其结果就是语言的演进将变得非常缓慢。除此以外,Java是一门成熟、使用广泛的语言这个事实也将导致其演进过程充满了困难。

一方面,添加到语言中的每个特性都可能在一定程度上造成不可预料的结果,这么做会疏远那些已经使用了该语言的开发者。另一方面,本身很完美的特性可能在同语言中的其他特性进行交互时产生不可预料的结果。更糟的是,一旦增加了某个语言特性,几乎就不可能再将其移除了,即便是该特性会对整个语言产生不利影响也没办法。为了证明某个新特性是正确的,语言设计者必须确信从长远来看,该特性会给语言带来好处,而不是短期效益或是针对某个问题的快速解决方案,之后就变得可有可无了。

为了降低风险,语言设计者通常都会创建单独的一种语言或是分支来进行试验,比如Pizza语言就是在实现前用来测试Java泛型的。这种方式的问题在于试验的参与者非常小众并且都是自己想参与进来的;显然他们对语言特性很感兴趣,很多人都是学者或研究员。但是,在普通的程序员开始使用这些特性时,那些学者或是研究员认为很棒的特性可能会变得很糟。

为了直观感受一下这种情况,请考虑关于Java 7闭包特性的激烈争论。一段时间以来,有人在提案中给出了闭包的实现,但最终却还是没有达成共识。随后,Sun决定不打算在JDK 7中添加完整的闭包支持。这时争论的焦点转向为Java是否变得越来越复杂了,在Java 5中添加泛型(尤其是通配符语法)时就已经出现了这种争论;在Java已经通过匿名内部类部分实现该功能的情况下,完整的闭包支持是否是正确的呢。需要完 整闭包支持的两个重要场景是简化fork/join API(添加到了JDK 7中以改进多核编程)的使用以及辅助资源的清理。Josh Bloch的ARM block提案(期望通过Project Coin加入到JDK 7中)就第二个问题给出了另一种解决方案。Cliff Click博士在面向Java的可扩展、非阻塞编程风格的研究中给出了关于fork/join的另一种方案,随着处理器核心数的不断增 加,这种方案看起来更合理。如果这一切都成为可能的话,那么Java中使用闭包的地方将变得非常少了,语言根本没必要提供这个特性。

话虽如此,但对于编程语言来说,持续不断地平稳发展还是非常重要的。因此本文探究了如下3种技术以向Java中增加新的语言特性而又不改变语言本身,他们 是客户化领域特定语言(DSL)、Java 6的注解处理器(通过库来增加可选的语言特性)以及将语法糖从语言迁移到IDE中。每项技术都可以让众多的主流开发者以非侵入的方式体验这些新特性,最棒 的想法则可以融入到语言核心当中。

客户化DSL

在这3项技术中,人们谈论最多的还是DSL。该术语的确切含义至今尚未统一,但出于讨论的目的,我们在这里简单地把它看作是用于解决特定问题、应用范围很窄 的一种语言而非用于解决所有计算问题的通用语言。这样,DSL就并非是图灵完备(non-Turing complete)的。当然了,还是会有一些边际情况存在的,比如说Postscript是一种图灵完备的语言, 但根据我们方才的定义,它也是一种DSL。

如上所述,DSL并非新概念。其他类似的DSL还有正则表达式、XSLT、Ant以及JSP等等,所有这些都需要某种客户化的解析器对其进行处理。Martin Fowler还说fluent interfaces/API也可以看作是另一种DSL,称之为内部DSL。他说内部DSL是直接在宿主语言中开发出来的。这对于Lisp和 Smalltalk开发者来说很容易理解,而最近Ruby社区也开始对内部DSL情有独钟了。

虽然很多知名的DSL都是由商业公司开发和维护的,但一些企业开发团队也已经使用该技术来创建能够快速解决其问题的语言了,但毕竟还是小众,这可能是 DSL领域门槛比较高的缘故吧。负责DSL的团队必须要设计语言、构建解析器和其他工具来支持开发团队,还要对每个新员工进行培训,让其了解DSL的工作 机理。这时,涌现出了能够支援DSL开发的工具,这极大地改变了当前的状况。Intentional Software所开发的Intentional Domain Workbench比Java还要久远,它首度实现了该工具的功能。

该项目创建于微软研究院,Charles Simonyi博士在1995年所发表的论文“The Death of Computer Languages, the Birth of Intentional Programming”描绘了其愿景。2002年,Simonyi创建了Intentional Software以继续实现其想法,大家可以看看介绍该系统的视频,极具震撼力。目前该产品的版本是1.0,但只有极少数的合作者能够访问。

其他一些软件公司也在研究这个概念,其中就包括以IntelliJ IDEA Java IDE而扬名天下的JetBrains,JetBrains最近发布了Meta Programming System(MPS)1.0版。MPS并没有使用解析器而是直接使用了Abstract Syntax Tree(AST)。它提供了一个类似于文本的投影编辑器(projectional edITor)以便程序员能够操纵AST,同时该编辑器也可用于编写语言和程序。当程序员使用投影时就会为树上的每个节点创建一个文本投影,这样变换就会 反映到节点当中。开发者可以通过这种方式以任意组合(通常称之为语言组合)扩展和嵌入语言。JetBrains正在内部使用该产品,最近发布的bug追踪 产品YouTrack就是使用该系统开发的。




Tags:  助推器 领导理论的演进

延伸阅读

最新评论

发表评论