今天我和你聊聊 Java 语言,这也是我使用最久最熟悉的编程语言之一。
读博士的时候我做过两个领域。刚刚进入莱斯大学的时候进的是程序语言设计组。组里当时有两个教授,分别做两个领域。
一个是瓦利德·塔哈( Walid Taha ),主要研究领域是类型系统和嵌入式系统的程序语言设计。另一个是罗伯特·卡特赖特( Robert Cartwright),他喜欢大家叫他 Corky,主要研究的是 Java 的理论和实现。
Corky 教授的研究项目中,有一个叫做 DrJava 的项目。DrJava 是一个轻量级的 Java 开发环境。主要是给在校学生用的,它提供了一个简单直观的交互界面,可以实现类似 Shell 的交互式 Java 代码执行方式。DrJava 在美国大学里有很多人使用,目前已经超过两百万的下载量。
Corky 是个典型的美国教授,与生俱来的花白卷发,清癯的脸庞上一双眼睛炯炯有神,高挺的鼻梁。他常年都是和学生一样的打扮:T 恤牛仔裤加运动鞋。出入的时候,背上总是背着一个蓝灰色的电脑包。
当他不谈学术的时候,你会觉得他有着与年龄不相称的单纯和童真。他会和一群学生一起吃系里免费的披萨和点心,也会和其他教授一起站在系里走廊上聊天和哈哈大笑;然而一旦你和他讨论起 Java,他就变得滔滔不绝,整个人散发出特别的魅力。他对 Java 的理解十分深入,我每次和他对话都颇有收益。
虽然我的导师是瓦利德(Walid),但同在一个语言组,平时的研讨班都在一起,我也就有了很多的机会和 Corky 一起讨论各种程序语言的特性和实现。也就是在那个时候,我对 Java 语言有了比较多深层次的了解。
我和 Java 语言的开发者
我的硕士论文是独立实现的一个程序设计语言,包括它的解释编译和用户界面。这个语言主要用于机器人系统的嵌入式编程和仿真,曾经在一家石油公司的井下控制系统开发中被使用。不过因为我导师的离开和种种其他原因,我博士生涯的后三年转了另一个导师做生物信息学的数据分析和建模。
因为有程序设计语言的研究经验,博士毕业找工作的时候,也投了份简历在 Oracle 的 Java 语言开发组。也因为有这样相应的背景,我很顺利地拿到了 Java 核心类库 (Java Core Library) 开发小组的 Onsite 面试机会。
我去面试的时候应该是 2012 年底,当时面试的那个小组一共好像只有七八个人的样子。Oracle 的面试大部分是白板和聊天,和现在比较主流的面试,上机做题并无 Bug 运行的体验很不相同。我介绍了自己的硕士毕业设计,然后就谈起 Java 新的库或版本可能会增加哪些支持。
2012 年底的时候,Scala 和 Clojure 刚刚火起来不太久,Java 还没有对 Lambda 的支持。而当时整个 Java 团队也正在考虑这件事。话题牵扯到了 Lambda 的实现,正好是我非常熟悉的话题,因为我的导师瓦利德( Walid )主要的研究领域就是函数式语言,而对 Lambda 的实现,也是函数式编程语言的核心。
具体的讨论细节我已经不记得了,不过有两点感触颇深:一是他们对于选择哪些函数进核心库( Core Libarary )非常谨慎。Java 早期是很轻量级的,后来的版本功能越来越强大,但是语言本身也越来越沉重,这也是很多人喜欢 Scala 的原因。
二是实现函数库的语言开发者对每个函数的精度和运行时间的要求到了令人发指的程度,听说他们有时候读无数的论文,看无数的实现,作大量的比较,就只是为了敲定到底应该在最终的函数中使用哪一种实现方式。
比如浮点数是有舍入误差( Rounding Error )的,那么一个数值计算中先算哪一步、后算哪一步带来结果都可能是不同的;而实现中的考虑,往往为了小数点后面十几位以后的一个 1,组里也要反复斟酌很久。