微软当年的 J++ 究竟是什么?为什么 Sun 要告它?

微软当年的 J++ 究竟是什么?为什么 Sun 要告它?

J++是什么?

J++是微软的Java实现版本,表达式、关键字、语法规约都和Java一致,符合Java的语言规范,2004年1月停止支持。

Sun为什么要告微软

Sun一开始是授权微软可以使用Java的,随后对微软提起了商标侵权的诉讼,因为Sun的商标授权协议里要求实现必须是“兼容的”,才能使用Java的商标。而微软的MSJVM没有通过Java的符合性测试。最终Sun和微软和解,条件是J++只能开发到1.1.4版本,并且停止MSJVM的分发和下载。

J++的部分技术被回收利用,吸收到了.Net平台,演化成为J#,最终到现在的C#。

J++与Java的不同点

可以看到,J++对Java做了大量的改进,这些改进后来都吸收到了.Net平台以及C#语言当中。

After Math

从法律和道义的角度来讲,微软违约很不厚道这点毋庸置疑,以下主要是从技术的角度来进行评价,一言以概之,时间证明Sun并没有站在先进生产力的一边。

最核心的槽点,可能就是J++搞私有API/不跨平台。但这直接带来了性能上的提升,虽然影响了跨平台,但作为一种工程上的trade off,不一定是坏事,想想当年的电脑有多慢吧。现在微软官方的.Net CLR实现出于性能考虑,同样把不少工作推到了平台相关的native代码层上,也并没有影响mono实现跨平台,可见这个槽点根本就不算个事。

J++可以认为一直延伸到了今天的.Net一系的产品线,所以要评价J++是怎样一种存在,在很大程度上需要把今天的C#/.Net和Java对比。现在Java和C#相比,除了(官方)跨平台,以及因为起步早+成本相对可以较低所以行业应用较多以外,毫无撸点,语言特征方面C#更是甩Java几条街。

J++增加的语法特征,不少延续到了C#上,用过都知道爽。

JNI和C# P/Invoke相比,易用性完全不在一个档次上。

Java至今还鸡肋的泛型,谁用谁蛋碎。

由于mono项目的存在,使得C#跨平台根本不是问题,唯一影响其广泛在开源社区被采用(如默认在Linux发行版中集成)是因为开源社区普遍不待见微软,并且对微软的CP(Community Promise,微软承诺允许开源社区自由的对包括C#在内的部分微软专利产品、规范编写自己的实现)持保留意见。但这并不影响mono的广泛使用,不少的应用程序、开发框架都采用mono作为脚本引擎,比如Unity3D引擎。

最近在研究把CoffeeScript编译到CLR上执行,顺便再说下运行时环境,JVM vs CLR。这么多年来,产生了一些编译到Java byte code,然后在JVM上运行的的语言,比如Scala,但并没有证据表明Sun一开始的设计就考虑到了JVM大生态圈的建立。而.Net CLR则提供了一系列相当凶残的方案,比如DLR(Dynamic Language Runtime),编译器的开发者只需要解析出代码的AST(Abstract Syntax Tree),再加上少量的glue code,就能把一种新语言target到.Net上运行,完全无需操心代码生成、代码优化、runtime等等需要花费大量精力的编译器后端环节,并且能在后续.Net升级时,自动获得新的改进(比如更加NB的代码优化算法)。这代表什么?一个开发者甚至不需要把《编译原理》一书读完,翻了前几章能写个词法分析和语法分析,会解决Grammar的Shift-Reduce conflict,就能撸出一个能用于生产的以CLR为目标平台的编译器出来。不管最后结果会如何,从技术的角度而言,微软的解决方案是更有利于开发生态的建立。

从这些角度来看,J++虽然不能说是完爆Java,青出于蓝四个字还是能提的,进步的态度和力度都是值得称道的。微软在当年受制于Sun的许可协议时,尚且大胆的对Java进行扩展改进,后续衍生的C#/.Net平台的每个新版本的演化力度都不弱,反观Java这么多年来的进展,不免让人呵上一呵。

和微软现在C#的Community Promise相对比,当年Sun给微软的Java授权协议,不得不说实在是太狭隘了,最终在一定程度上限制了自身的发展。