第八大千禧年问题:Android = Java?

发表于:2010-9-01 12:59  作者:未知   来源:外刊IT评论

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签:

  要证据吗?你只需看一看IKVM就知道了。这是一个非常有趣的项目,它能够使Java和.NET跨平台兼容,于是,你的Java代码可以在不做修改的情况下在CLR(或者是等效的.NET runtime,比如Mono)上运行… 但IKVM并不是一个简单的、类dx的 文件格式转换器。对Java class的转化、对Java核心API的适配,都是十分的复杂,即使对一个简单的HelloWorld程序也是这样。各个平台的内部机制,如反射,安 全,并行,异常处理,字节码验证,I/O,以及其它核心API,特征上大致相同,但是在细节上完全不同,一些死胡同的情况会迫使IKVM不得不钻越一个又 一个的火圈来让Java代码运行到了.NET VM上。它需要依赖于一个巨大的额外的runtime层,来适配从OpenJDK源代码里来的完整JavaSE API。我大致的关注IKVM的开发已经有数年了 —— 我阅读这精彩的IKVM 博客 – 所以我完全清楚他们为了让Java程序和JavaSE应用适配到.NET上所做的巨大的努力。(这项工作仍然没有完工;而且很多部分都需要以丧失某些性能为代价。)

  (老的Visual J++ Visual J# 也不是一个简单的 Java-to-.NET 转换器。我不想讨论它,但我们完全可以说Visual J# 对Java的兼容并不比最早期的IKVM强多少。)

  我把P = NP引进来了讨论;有些人把图灵等效(Turing-equivalence)理论引进来,说任何图灵完备的平台/语言/VM都是相互等价的。这也没错, 但与本论题无关。图灵模型这种方式太泛化了;使用这种表面价值来考量会把更个软件专利系统摧毁(尽管这不是个坏事!)。我们需要在地上为JVM等效画条 线,一条更接近实用需求而远离图灵等效的线。按我的观点,这微不足道的二进制格式转换,穷尽的高层源代码和runtime的兼容,使Android明显的 处于Java等效的这条线内。

  APIs 和 Runtime 相当

  Android使用了一个相当大的JavaSE APIs子集。这些APIs (来自于Harmony项目)都是全新的实现,但它们是以JavaSE为模子。如果不是因为TCK许可证问题,Harmony完全可以取得JavaSE认 证。但这并没有改变这样的一个事实:Harmony 和 JavaSE APIs是 完全的等效的 —— 这是特意的,不是偶然的。就像Charles Nutter——有名的JRuby人物——最近写道:

  Android支持一个不完整的(但相当大的)Java 1.5 类库子集。这个子集大到一个复杂的JRuby项目几乎不经任何修改就能在Android上运行,很少有限制情况。

  看起来Dalvik对JVM是如此的接近,它不得不完全兼容大部分的JVM规范,包括完全详细的JMM (就像Android支持Java风格的线程和并发,已经深入到了高级的java.util.concurrent包里了)。可为什么有如此多的”Dalvik是个新VM“或”Dalvik不能运行Java类“的说法呢(90%的讨论这场诉讼的论坛和博客都持这种观点)。

  最后的思考

  这篇博客并不是关于Oracle和Google诉讼官司的法律依据的。我将会忽略(我会删除掉)那些跑题的评论(跟Android = Java不相关的话)。我只是讨厌那些”Android跟Java完全没关系“的胡说八道;Google和 Android的拥护者必须要找一个更有意义的论据。

  (我将拭目以待这场官司的进展,带着我所有的预见,直到所有细节和最终结果都出来。除非你有内部消息(我没有),不要太天真。 保持冷静。 我们并不知道Oracle的 —— 或 Google的 —— 真正的全部动机和计划。我们并不知道这荧幕背后的故事,自从2007年Google首次宣告Android的诞生(这导致了JavaME生态环境的崩 溃), Sun就痛恨不已,但最后还是不得不夹着尾巴行事。我不相信任何一个有10亿美金的股东控股公司会有利他主义的动机:Google不会,Oracle不 会,即使我喜爱的老的Sun公司也不会。我们等着看吧。)

  我不相信Google没有能力创造出一种既不背离Java太远,又以Java风格为基础的平台(就像.NET做的那样)。 Dalvik,以及Android框架,它们可能是在权衡了与大量的现有的Java程序,类库,Java天才,和Java工具链高度兼容的愿望的最后结 果。微软在一咬牙一跺脚后放弃了现成移植Java带来的好处,创造了全新的.NET。Google没有这样做。

  这个Android = Java等式显然并不是包括所有的东西(不是一一对应的)。每种平台都有自己一些独特的API,当然,Android是一个完整的操作系统,包括一个 Linux-based的内核,图形系统和电信堆栈,等等。很显然,我只是谈论其中最常用的部分:Java为中心的用户使用区/依赖于Java源代码、 Java classes(切不管什么格式)、Java APIs(包括成千上万的常用JavaSE APIs)和出色的类Java的虚拟机的应用框架。对于Android和其它的Java平台之间的关系有个准确的说法,就是使用版本的概念。我曾记得有个 博客说过这样的话”Android里没有’J’“。那么,我现在说也不晚:我建议把Android改名为Java GE(Java Google Edition)。这样一来就再也不会导致混淆了。


22/2<12

评 论

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道