Java进化的尽头

转载需声明:原文链接网址:http://www.artima.com/weblogs/viewpost.jsp?thread=221903

Java: Evolutionary Dead End

我在比利时安特卫普举办的Javapolis大会上刚做完一个主题演讲。现在是周五早上,前一天Josh Bloch作了发言,谈到了在closures(闭包)建议方面的争论。现在他就坐在我的对面吃早餐,我们更进一步谈论了这个话题。

当初我开始抱怨的时候,理由就很简单:Java作为一种语言过于繁杂(noisy)了。读代码要比写代码费劲得多,凭这一点就直接增加了软件开发的实际成本。计算机的时钟周期是一类非常稀缺的资源,凡是毫无效益地耗光这些资源的东西—即使是表面看无伤大雅的一句多余的System.out.println()—都会剥夺可能有重要用途的循环周期,并降低编程语言的效率(Steve
Yegge在最近的文章中谈到了这个问题
)。

Josh在演讲中提到向Java generics添加最后一个通配符可能会极大增加语言复杂性。Neal Gafter则建议应该具体化generics。而这两个人最开始都是Java
generics的绝对支持者,他们对于我的批评文章的反应就说明了这一点。现在似乎出现了变化,我注意到一些人开始提出“generics确实很不错,但是…”(虽然最近Tim Bray称这些人是个祸害)。

我们对于复杂度唯一能够掌控的是抽象:隐藏无关紧要的部分(“分而治之”就是一种变化)。Java的自身矛盾性就在于它忽略了复杂性问题的一个关键方面,就是代码的可读性没有被看作为一个重要问题。似乎如果是IDE为你写的代码,那么这些代码即使是再复杂(本来不必这么复杂)也没关系。

Josh进一步阐述了他关于复杂性的观点。他说,这并不是某一孤立的特性才具有的复杂性,因为这经常是直观可见的。这是一个将一个新特性以各种可能的方式与语言其它特性结合而形成的合成复杂性。当你将一个特性硬塞进已有的语言而不是从头开始认真仔细地进行设计时,你就不可能控制这种特性是如何与其他已有特性相融合的了。合成复杂性可以导致令人吃惊的问题,特别是在增加了特性后且做什么都于事无补的时候。吃早餐时Josh说这种复杂性会为Java困惑者们提供丰富的参考依据,令他们兴趣盎然,可是对于整个社区来说却没有一丁点好处。

稳定性 VS 特性嗜好者

我从与Josh共进早餐中领悟到的是我是一名特性嗜好者(feature junkie)。特性是这样一类好玩的游戏:一旦你掌握了它们,它们就可以以令人着迷的方式来运用。所以我总是在思考在新特性方面语言的演化问题。你也许会发现你也是一名特性嗜好者。

所以,当Java Generics一类的特性被糟糕地(我认为)加入到语言中时,我感到十分沮丧,我认为在增加特性时他们没有做该做的事。

但在我看来,该做的事绝不是一点不增加新特性。而是如果你不能正确处理,那么该语言可能就会不再成长并变得更相对稳定些,直到放弃对每一种已有语言特性的追求。

勿需证明,C最好的特性之一就是很多年以来它没有作任何改变。C++也十分稳固。所以这么说来让Java稳定下来也不见得是坏事。

这并不是说类似generics和closures的特性就“不好”。完全相反,当将它们精心设计到一种语言中时,它们可以十分清晰且功能强大。然而回想当初,Java是有这样的机会的。Bill
Joy在语言最初版本之前强烈要求加入closures和generics等内容,但没人理睬。

很多年以来人们一直容忍着,然后突然间generics就必须要硬塞进语言之中。这显然和当年C#出现generics的情形极为相似。后者也是要在Java5中制造出几个其他特性。似乎增加这些特性的紧迫性不是来自于要使用Java解决现实问题,而是Sun在试图保持与微软的C#进行竞争的感觉。这或许并非是空穴来风,因为Java必须首先要以粗犷方式破茧而出的原因,是其认为存在一个必须要赢取的市场窗口。一个依仗市场推进力设计出来的程序设计语言最终要以白忙活一场而步入终结。

兼容性的圣杯

一种选择是正确地加入新特性并破坏向后兼容性。作为一个特性嗜好者我会选择这样做,因为它不会将降低语言的完整性。而该方法一直以来未被采纳是因为向后兼容性总是语言的利器之一。我注意到Python在早期版本中战战兢兢地小范围破坏了向后兼容性。这个变化实际上没有引发任何反对声音。结果是Python正计划扩大向后不兼容的范围。Ruby也在考虑去掉一些Perl特性以简化语言。那些不想拥抱这些变化的人不会进步,他们实际也是出于保守而不愿进步。很多公司出于这个原因仍旧一直使用Java1.1。他们也将不会受这场争论的影响,因为无论如何他们都没打算接受这些变化。

我们如果由于向后不兼容而无法正确地加入新特性,当语言的变化到来时我们就无法施展拳脚了。我们处在的位置和C++一样。C++常常在设计方面饱受批评。而我作为标准委员会的成员的这八年里,经历了在每一个语言特性上的争论。这些特性并非是反复善变,而是谨小慎微和深思熟虑过的。导致语言最终变得复杂和困难的正是要保持对C的向后兼容性。一旦你打算与任何一样事物都保持向后兼容性,你就必须准备好因增加特性而破坏语言。如果Java不想破坏向后兼容性,那么它就不可避免要接受新特性所具有的毫无收益的复杂性以及无法完整实现等特点。我在《Thinking
in Java(第四版)》
中谈到过这个问题,Java Generics只是对真正generics的一个苍白的模仿,而对于closures更有价值的建议之一(我想它该叫做“CPA”,但在Javapolis大会的演讲中没听到过该词—也许有人会告诉我正确叫法)是对真正closures的不完整实现。但实际上有个完整实现会更好些,因为它会使代码更清晰、更简单易懂。

基础级新特性应该在新的语言中有所体现,其作为语言整个体系的一部分来精雕细琢地进行设计,而不是事后才想起来添加进去。在我看来,Java当前最好的退出策略(exit strategy)是Scala。我甚至听到了一些顶尖的程序员说在这个问题上他们并不在乎Java发生了什么事,因为他们正打算转向Scala。

如果Java要完整地存在下去,它就必须像C一样:成为一匹能靠得住的“驮马”。实际上,将来任何语言上的变化都必须能够使语言和其使用方法变得简单和清晰(比如修复classpath问题),并且充实丰富(比如说)那些被打入冷宫的不完整的库(像JMF)。

然而,类似closures这样重要且基础级的语言特性虽然在理论上极其吸引人,但一旦将其强行加进在抽象清晰性上重视向后兼容的语言中时,就会在实践过程中付出巨大的成本。因此在这个问题上我们必须变得异常保守。

(我们会在即将到来的JavaPosse摘要中讨论这个以及其他Java方面的重要问题:http://www.mindviewinc.com/Conferences/JavaPosseRoundup/

时间: 2024-08-02 13:05:51

Java进化的尽头的相关文章

迷你MVVM框架 avalonjs 沉思录 第1节 土耳其开局

#cnblogs_post_body p{ text-indent:2em; margin-top: 1em; } 正如一切传说的开端那样,有一远古巨神开天辟地,然后就是其他半神喧宾夺主.我们对最巨贡献与创建力的远古巨神懵懂不知,却对巫师们的话语津津乐道.这同样也是我们前端的现实. MVVM是来自.NET,另一个遥远的界域.前端,相对于后端,怎么看都是蛮夷之地.JS这个肩负着前端一切交互工作的语言,竟然被视为恶魔,屡屡被屏蔽禁用.些微可用的脚本,变量与函数没有组织地野蛮生长着,直到JAVA的传教

我想要的程序开发语言特性——之“面向对象”——之“退化”

先从一个例子开始讲起,以下是jdk1.7中的迭代器接口的代码(去掉了注释的部分): public interface Iterator<E> {    boolean hasNext();    E next();    void remove();} 程序开发的老油条们都不太喜欢这个接口的remove方法,原因可能是: 我们为自己实现Iterator接口时,基本不需要这个方法,但我们却不得不@Override它,此时通常我们会直接在方法体中写一行throw new UnsupportedOp

《黑客帝国》完全解析(转)

万事皆有始亦有终——<The Matrix>影评之终结篇  一.前言 从 Matrix I 到 Matrix III,整整四年,一对名叫沃卓斯基(导演加编剧)的兄弟给科幻电影带来一次史无前例的冲击,无论从思想上还是视觉效果上都超过了以往任何一部科幻电影,从来没有一部科幻电影能够创造这么多的 Fans 也没有任何一部科幻电影能像 Matrix 这样引发如此大规模的讨论——讨论剧情,讨论主题,讨论特效,讨论演员,笔者绝不敢自称 100% 的看懂了(我把看懂定义为“理解沃卓斯基兄弟眼中剧情和主题的原

Java的进化? Kotlin初探与集成Android项目

欢迎Follow我的GitHub, 关注我的CSDN. Kotlin是基于JVM的编程语言, 由JetBrains公司开发, 目前已经开源. IntelliJ IDEA, PyCharm, Android Studio等IDE, 就是出自于JetBrains公司. 介绍: Statically typed programming language for the JVM, Android and the browser. 100% interoperable with Java? 用于JVM,

Java Swing的进化

摘 要:Swing已是一个比较老的工具集了,在美观的用户界面出来之前需要开发很长时间.它缺少一些你在开发富UI时所需的组件.幸运地是,像 Substance,SwingX及Java Look-and_Feel图形仓库这样的开源项目使这一切变得不同.作者Steven Haines向你展示了如何无痛苦地向你的Swing UI中添加树表,语法高亮,以及其它更多的东西. 在最近这些年里,用户界面设计与开发已经发生了很大的改变,一些人可能会说Java平台已经停滞不前了.发布于1997年的Swing仍然是在

(转)通天塔导游讲述C,C++,Lisp,Java,Perl,(我们在亚马逊用到的所有语言),Ruby (我就是喜欢),和Python

https://code.google.com/archive/p/windows-config/wikis/TourDeBabel.wiki 通天塔导游 (译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来. 巴别塔不建自毁,与其说上帝的分化将人类的语言复杂化,不如说是人类自身心灵和谐不再的分崩离析.之所以后来有了翻译,不仅是为了加强人类之间的交流,更寄达了一种愿望,希望能以此消除人际

JDBC的进化3

这次进化完成后,JDBC的进化就需要设置一个savepoint了,然后提交一下,提交到我们的脑袋硬盘中. 上一次说到了利用Statement对象来发送sql语句到数据库.然而这样的话,会暴露出两个问题. 那么问题来了!!! 问题1: 在执行executeUpdate(String sql)和executeQuery(String sql)方法时,我们需要拼写sql字符串,就像下面这样: String sql = "insert into customers values(21, 'yushen1

Java发展史之Java由来

Java:由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的詹姆斯·高斯林(James Gosling)等人于1990年代初开发,它最初被命名为Oak.Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言. Java从第一个版本诞生到现在已经有十九年的时间了.时间若白驹过隙,转瞬即逝.弹指间19年过去了,在下图所展示的时间线中,我们看到JDK已经

深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入理解Java并发之synchronized实现原理 Java并发编程-无锁CAS与Unsafe类及其并发包Atomic 深入理解Java内存模型(JMM)及volatile关键字 剖析基于并发AQS的重入锁(ReetrantLock)及其Condition实现原理 剖析基于并发AQS的共