***近整个J***a阵营都陷于一场讨论Or***e和Google之间关于Android平台的专利***官司的混战中。来自“外刊IT评论”的***新翻译文章向您解释***近 Or***e 想要告 Google 的 Android 系统的原因。该文章解释 Android 平台与 J***a 千丝万缕的关系。
文章内容如下:
***近整个J***a阵营都陷于一场讨论Or***e和Google之间关于Android平台的专利***官司的混战中。我已经在很多地方都发表过我的观点,但这确实是个 重大的话题,需要在所有地方反复重申这个观点 … 所以,这篇文章就是要再次的完全的揭露事实真相。
第八大千禧年问题: Android = J***a?
前几天,有研究者宣称找到了P != NP的证据,这在编程界引起了不小的兴趣——至少为此狂热了好几天,直到开始有评论家指出证据中有很多的缺陷。我在做计算机科学系学生时研究过这个题目,但说实话,我的高等数学的水平还达不到看懂这些证据的水平(P = NP? 是克雷数学研究所提出的七个千禧年数学问题中的一个。)所以,还是让我们来讨论一个稍微简单点的问题:Android是否相当于J***a?请注意,我并没有说相等,我说的是相当,就像P = NP里的那样。
相当的类/字节码格式
在很多层面上,Android和J***a都有明显的相当。Android应用程序是用J***a(TM)语言写成的,使用JDK的j***ac(或等效工具,例如ECJ)来编译。这个过程产生标准的J***a字节码(.class文件)。这些文件再转化成Android的.dex文件,从使用的角度来看,它就是一种不同格式的J***a class文件。不错,这是一种更***的格式;对Sun自从1994年以来的设计有了很大的改进。但就如你可以把一个GIF格式的图片转换成更***的***的完全等效的PNG格式,尽管它们的字节流完全的不同。
等效的文件格式在细节的实现上非常的不同,主要是为了优化。就好比,如果我们简单的满足于低效率的视频数据流,没有采用***的、跨不同框架的压缩技术,那我们就可以避免跟MPEGLA视频***专利做斗争的麻烦了。
Android特异的classfile设计有好几种动机;而为了避免和Sun的知识产权保护冲突显然是一个主要的因素。不管怎样,Google并没有走的离J***a足够远。两种文件格式非常的类似。它们在特定的底层数据结构上有区别,但这些结构体在语法上一致的,存储完全相同的信息。我相信在J***aSE或J***aME VM里可以轻易的在它们的系统classloader里添加一个.dex分析器来加载”Android classes”。
Android SDK 依赖于.j***a -> .class -> .dex 转换的事实情况既微不足道也毫无损失。“毫无损失”的事实很重要:当GIF = PNG 时,跟受损的JPG文件就不等了 —— 它***不出完全相同的信息。如果JVM和Dalvik都各自***,你很难写出一个相对简单的工具将一种编译过的代码转换成另一种 —— 而且不做任何妥协:不丢失信息,不使用冗余来补偿某种特征在一种VM中是first-class而在另一种中却不是的情况,不需要额外的runtime层 上在一种VM中实现另一种VM的核心API。
(我知道dx转换器有多么的复杂。我看过它的源代码。那个字节码转换器是一个巨大的,全功能的反编译/重编译器,通 过SSA构造完成。但是这个转换器在概念上仍然是无足轻重的;从J***a字节码到Dalvik字节码的映射在设计上是很平滑的。堆栈相对于寄存器架构中细 节上进行了优化;而重要的东西,例如VM层的类型系统是完全一致的。)
VM相当
这Dalvik 和 JVM 的相当也是很容易看清楚的。并不只是源代码或字节码格式上的问题:它们的runtime对等物上也一样。一但一个”Android class”被加载到Dalvik VM里,它就会像J***a class一样运行,像J***a class一样工作。 如果你懂得J***a编程(深入到***的,底层的细节),你也就懂得Android编程。你只需要学一些新的API和框架概念。他们是对等的系统。
是否记得微软的.NET? 当.NET刚出世时,J***a阵营迅速的反击指责.NET是对J***a的剽窃。我也是其中的一份子,但今天我看问题更清楚了。是的,它过去是个严重的剽窃产品;C# 1.0 就是一个… 区分一种语言和另一种语言***简单的方法就是看它们的惯用风格 —— 例如toString() 相对于 ToString()。 但在***重要的VM规范里,微软做了很大的功课。它的CLR,CLI,和核心框架,都非常的不同于J***a,所以我们不能说JVM = CLR这个等式。你不可能使用一个简单的文件格式转换工具把你编译好的J***a class转换成能在.NET runtime上运行的代码。
要证据吗?你只需看一看IKVM就知道了。这是一个非常有趣的项目,它能够使J***a和.NET跨平台兼容,于是,你的J***a代码可以在不做修改的情况下在CLR(或者是等效的.NET runtime,比如Mono)上运行… 但IKVM并不是一个简单的、类dx的 文件格式转换器。对J***a class的转化、对J***a核心API的适配,都是十分的复杂,即使对一个简单的HelloWorld程序也是这样。各个平台的内部机制,如反射,安 全,并行,异常处理,字节码验证,I/O,以及其它核心API,特征上大致相同,但是在细节上完全不同,一些死胡同的情况会迫使IKVM不得不钻越一个又 一个的火圈来让J***a代码运行到了.NET VM上。它需要依赖于一个巨大的额外的runtime层,来适配从OpenJDK源代码里来的完整J***aSE API。我大致的关注IKVM的开发已经有数年了 —— 我阅读这精彩的IKVM 博客 – 所以我完全清楚他们为了让J***a程序和J***aSE应用适配到.NET上所做的巨大的努力。(这项工作仍然没有完工;而且很多部分都需要以丧失某些性能为代价。)
(老的Visual J++ Visual J# 也不是一个简单的 J***a-to-.NET 转换器。我不想讨论它,但我们完全可以说Visual J# 对J***a的兼容并不比***早期的IKVM强多少。)
我把P = NP引进来了讨论;有些人把图灵等效(Turing-equivalence)理论引进来,说任何图灵完备的平台/语言/VM都是相互等价的。这也没错, 但与本论题无关。图灵模型这种方式太泛化了;使用这种表面价值来考量会把更个软件专利系统摧毁(尽管这不是个坏事!)。我们需要在地上为JVM等效画条 线,一条更接近实用需求而远离图灵等效的线。按我的观点,这微不足道的二进制格式转换,穷尽的高层源代码和runtime的兼容,使Android明显的 处于J***a等效的这条线内。
APIs 和 Runtime 相当
Android使用了一个相当大的J***aSE APIs子集。这些APIs (来自于Harmony项目)都是全新的实现,但它们是以J***aSE为模子。如果不是因为TCK许可证问题,Harmony完全可以取得J***aSE认 证。但这并没有改变这样的一个事实:Harmony 和 J***aSE APIs是 完全的等效的 —— 这是特意的,不是偶然的。就像Charles Nutter——有名的JRuby人物——***近写道:
Android支持一个不完整的(但相当大的)J***a 1.5 类库子集。这个子集大到一个复杂的JRuby项目几乎不经任何修改就能在Android上运行,很少有限制情况。
看起来Dalvik对JVM是如此的接近,它不得不完全兼容大部分的JVM规范,包括完全详细的JMM (就像Android支持J***a风格的线程和并发,已经深入到了***的j***a.util.concurrent包里了)。可为什么有如此多的”Dalvik是个新VM“或”Dalvik不能运行J***a类“的说法呢(90%的讨论这场***的论坛和博客都持这种观点)。
***后的思考
这篇博客并不是关于Or***e和Google***官司的***依据的。我将会忽略(我会删除掉)那些跑题的评论(跟Android = J***a不相关的话)。我只是讨厌那些”Android跟J***a完全没关系“的胡说八道;Google和 Android的拥护者必须要找一个更有意义的论据。
(我将拭目以待这场官司的进展,带着我所有的预见,直到所有细节和***终结果都出来。除非你有内部消息(我没有),不要太天真。 保持冷静。 我们并不知道Or***e的 —— 或 Google的 —— 真正的全部动机和计划。我们并不知道这荧幕背后的故事,自从2007年Google***宣告Android的诞生(这导致了J***aME生态环境的崩 溃), Sun就痛恨不已,但***后还是不得不夹着尾巴行事。我不相信任何一个有10亿美金的股东控股公司会有利他主义的动机:Google不会,Or***e不 会,即使我喜爱的老的Sun公司也不会。我们等着看吧。)
我不相信Google没有能力创造出一种既不背离J***a太远,又以J***a风格为基础的平台(就像.NET做的那样)。 Dalvik,以及Android框架,它们可能是在权衡了与大量的现有的J***a程序,类库,J***a天才,和J***a工具链高度兼容的愿望的***后结 果。微软在一咬牙一跺脚后放弃了现成移植J***a带来的好处,创造了全新的.NET。Google没有这样做。
这个Android = J***a等式显然并不是包括所有的东西(不是一一对应的)。每种平台都有自己一些独特的API,当然,Android是一个完整的操作系统,包括一个 Linux-based的内核,图形系统和电信堆栈,等等。很显然,我只是谈论其中***常用的部分:J***a为中心的用户使用区/依赖于J***a源代码、 J***a classes(切不管什么格式)、J***a APIs(包括成千上万的常用J***aSE APIs)和出色的类J***a的虚拟机的应用框架。对于Android和其它的J***a平台之间的关系有个准确的说法,就是使用版本的概念。我曾记得有个 博客说过这样的话”Android里没有’J’“。那么,我现在说也不晚:我建议把Android改名为J***a GE(J***a Google Edition)。这样一来就再也不会导致混淆了。
版权所有©2024 产品网