John Jiang

          a cup of Java, cheers!
          https://github.com/johnshajiang/blog

             :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
            131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
          Android = Java
          近期Java社區(qū)正熱議Oracle對Google的侵權(quán)訴訟,恰巧前幾日在java.net中看到一篇博文,文章作者也借此事件表達(dá)了Android=Java的觀點(diǎn)。由于我對Java移動(dòng)開發(fā)、Android都沒太關(guān)注過,文章細(xì)細(xì)讀來,有些許進(jìn)益,譯在此處,可能對大家也有幫助。(2010.08.22最后更新)

              Java社區(qū)正忙于討論Orace針對Google Android平臺(tái)的專利訴訟。我已在多個(gè)場合道出了我的觀點(diǎn),但還是需要一個(gè)評論性的文章來重復(fù)一下我在每個(gè)場合中都作出的相同評論...所以,本博文會(huì)將我的想法竹筒倒豆子般地和盤托出。

          第八個(gè)千禧年問題:Android=Java?
              幾日前,有聲明稱有研究者已證明了P!=NP,這導(dǎo)致了編程社區(qū)中的極大熱忱--至少是直到兩天前,當(dāng)?shù)谝粋€(gè)評閱者指出了該證據(jù)中幾處錯(cuò)誤時(shí)。在我的計(jì)算機(jī)科學(xué)專業(yè)中我已學(xué)過這門課,但不能否認(rèn)地是,我不懂高等數(shù)據(jù)以至于不能理解這些證明(P=NP?是克雷數(shù)學(xué)研究所的千禧年問題之一就是一個(gè)很好的理由)。所以,讓我們談?wù)勔粋€(gè)更為簡單的等式:Android是否等價(jià)于Java?注意,我說的不是等于,而是等價(jià),就如同P=NP那樣。

          等價(jià)的類/字節(jié)碼格式
              在許多層面上,Android = Java是明顯正確的。Android應(yīng)用使用Java語言編寫,使用JDK中的javac編譯器(或其等價(jià)品,如ECJ)進(jìn)行編譯。這就產(chǎn)生了標(biāo)準(zhǔn)的 Java字節(jié)碼(.class文件)。然后,這些文件被轉(zhuǎn)化成Android的.dex文件,實(shí)際上就是Java類的另一種不同格式的文件罷了。但你也能將GIF圖像轉(zhuǎn)化成優(yōu)質(zhì)的PNG格式,盡管這兩種圖像文件的字節(jié)碼流完全不同,但它們都同樣的優(yōu)秀。
              等價(jià)的文件格式有大量的實(shí)現(xiàn)細(xì)節(jié),常常是為了優(yōu)化。例如,如果我們不需要復(fù)雜且不同的跨框架壓縮技術(shù),僅僅是滿足于低效率的視頻流,我們就能避免所有違反MPEGLA視頻編碼專利的麻煩了。
              Android設(shè)計(jì)不同的類文件出于多種動(dòng)機(jī);但繞開Sun的知識(shí)產(chǎn)權(quán)肯定是主因。不管怎樣,Google不能遠(yuǎn)離Java。這兩種類文件格式非常等價(jià)。它們只是在低層次的數(shù)據(jù)結(jié)構(gòu)方面不同,但它們的語法是一致的,也存儲(chǔ)完全相同的信息。我可以肯定JavaSE或JavaME的VM能很容易地在它的系統(tǒng)類加載器中加入一個(gè).dex解析器去加載"Android類"。
              Android SDK依賴.java -> .class -> .dex轉(zhuǎn)換,這一轉(zhuǎn)換精于細(xì)節(jié)且是無損的。"無損"是非常重要:雖然GIF=PNG,但有損的JPG文件則不能完全相等--它不能解碼出完全相同的信息。如果 JVM和Dalvik真是完全獨(dú)立的,你就很難寫出一個(gè)相對簡單的工具無妥協(xié)的去將編譯后的代碼從一種形式轉(zhuǎn)換到另一種形式:沒有信息丟失;當(dāng)為了補(bǔ)償在一個(gè)VM所擁有而在另一個(gè)VM卻沒有的重要特性時(shí);轉(zhuǎn)換后的文件不會(huì)變大;當(dāng)按照一個(gè)VM的核心API去實(shí)現(xiàn)另一個(gè)VM的核心API時(shí),不需要額外的運(yùn)行時(shí)層。
              (我知道dx翻譯器有多么的復(fù)雜。我已看過它的源代碼。字節(jié)碼翻譯器很大,它是一個(gè)完整的反編譯/重編譯器,完全使用SSA構(gòu)建。但這種翻譯只是在理論上比較細(xì)微;但在設(shè)計(jì)上,從Java到Dalvik字節(jié)碼的影射還是平滑的。棧相對于寄存器架構(gòu)只是在優(yōu)化細(xì)節(jié)方面有所不同;而在關(guān)鍵方面,如VM層的類型系統(tǒng),則是一致的。)

          等價(jià)的虛擬機(jī)
              也能很容易的證明Dalvik=JVM。不僅僅是在源代碼或字節(jié)碼格式方面:它們的運(yùn)行時(shí)對應(yīng)部分也是如此。一旦Dalvik VM加載了一個(gè)"Android類",它走起來像Java類,叫起來也像Java類。如果你懂Java編程(能了解其高級和底層細(xì)節(jié)),你就懂 Android編程。只是一個(gè)學(xué)習(xí)新API和框架理論的問題罷了。它們是等價(jià)的系統(tǒng)。
              還記得Microsoft的.NET嗎?當(dāng).NET被介紹出來時(shí),Java社區(qū)很快就公開抨擊.NET只是Java的翻版。當(dāng)時(shí)我也在那群抨擊的人群中,但現(xiàn)在我知道這么做會(huì)更好些。然而.NET是一個(gè)龐大的翻版;C# 1.0語言。區(qū)別任一語言程序的最方便方法就是風(fēng)格規(guī)范--如,toString()相對于ToString()。但在更關(guān)鍵的VM規(guī)范方面,Microsoft做了很好的功課。CLR,CLI和核心框架都完全不同于Java,所以我們不能說JVM=CLR。你不能使用一個(gè)簡單的文件格式轉(zhuǎn)換器工具作用于被編譯的Java類,然后將獲得信息直接運(yùn)行在純粹的.NET運(yùn)行時(shí)環(huán)境上。
              想要證據(jù)嗎?只要看看IKVM。這是一個(gè)非常有趣的項(xiàng)目,它能使Java跨越編譯運(yùn)行在.NET環(huán)境中,所以你的Java代碼可不經(jīng)過修改運(yùn)行在CLR之上(或其它同等的.NET運(yùn)行時(shí)環(huán)境,如Mono)...但IKVM不是一個(gè)簡單的類dx文件轉(zhuǎn)換器。對于任何超過HelloWorld的應(yīng)用程序,將 Java類及其核心API適配轉(zhuǎn)換到.NET是非常復(fù)雜的。每個(gè)平臺(tái)的內(nèi)在特性,像反射,安全,并發(fā),異常處理,字節(jié)碼規(guī)范,I/O及其它核心API,在特性上都非常相似,但在細(xì)枝末節(jié)處則完全不同--強(qiáng)行讓IKVM......,則Java代碼能運(yùn)行在.NET VM上。這也需要一個(gè)非常龐大的額外的運(yùn)行時(shí)層,基本上要把全部的OpenJDK源代碼適配到JavaSE API。我追蹤IKVM的開發(fā)已有多年了--通過閱讀極棒的IKVM Blog--所以我有一個(gè)需要作出大量努力的好主意去將Java代碼和JavaSE應(yīng)用適配到.NET。(該工作還沒全完成;已完成的部分則常有些性能問題。)
              (舊有的Visual J++ Visula J#并不是一個(gè)簡單的Java-.NET解釋器。我不會(huì)討論它,但完全可以說Visual J#對Java的兼容要大大劣于哪怕是非常早期的IKVM版本。)
              在討論中我引入了P=NP的例子;有些人可能會(huì)引入圖靈等價(jià),并說任何圖靈完備的平臺(tái)/語言/VM都是相互等價(jià)的。確實(shí)如此,但和我們要討論的問題并不相干。圖靈模型過于通用;如果僅按表面意思來使用它將會(huì)摧毀整個(gè)軟件專利系統(tǒng)(盡管這不是壞事!)。我們需要先在沙盤中勾勒出JVM等價(jià)的輪廓,與圖靈等價(jià)相比,這更接近于實(shí)際需要。依我的觀點(diǎn),無論是細(xì)微的二進(jìn)制格式翻譯,甚至于上層的源代碼和運(yùn)行時(shí)兼容,都可以明確地將Android置于Java等價(jià)的陣線中。

          等價(jià)的API與運(yùn)行時(shí)環(huán)境
              Android使用了許多JavaSE API的子集。這些(來自于Harmony的)API是全新的實(shí)現(xiàn),但它們將JavaSE作為模型。如果不是由于TCK協(xié)議的問題,Harmony甚至?xí)@得JavaSE認(rèn)證。并不能改變Harmony與JavaSE API是完全等價(jià)的這一事實(shí)--這是故意為之,并非偶然。正如JRuby名人Charles Nutter最近寫到的:
              Android支持一個(gè)粗糙(但龐大的)Java 1.5類庫子集。這個(gè)子集足夠的大,只需要很少的限制,就能使得如JRuby這般復(fù)雜的項(xiàng)目基本上無需修改就可運(yùn)行在Android上
              看起來,Dalvik足夠接近JVM,它應(yīng)該就完全遵從大部分JVM的規(guī)范,包括完整及非常細(xì)節(jié)的JMM(Android支持Java風(fēng)格的線程與并發(fā),直至高級的java.util.concurrent包)。有太多"Dalvik是一個(gè)新的VM"或"Dalvik不能運(yùn)行Java類"的話(在討論該問題的90%的博客和論壇中都會(huì)發(fā)現(xiàn)這樣的言論)。

          最后的思考
              本篇并不是關(guān)于Oracle針對Google訴訟的是非曲直。我將會(huì)忽略(可能會(huì)刪除)任何跑題的評論(不在Android=Java這一論題之內(nèi))。對于"Android與Java完全不相干"這一無意義的言論我只能表示厭惡;Google和Android的擁躉們必須找到比這更好的論證。
              (當(dāng)訴訟的全部細(xì)節(jié)和結(jié)果出來之前,對這一訴訟的將來我保留自己的全部判斷。除非你有內(nèi)部消息(我沒有),請不要太天真保持冷靜!我們真的不知道 Oracle或Google的全部意圖和計(jì)劃。自從2007年Google首次發(fā)布Android(這導(dǎo)致了JavaME生態(tài)系統(tǒng)的極大分裂),雖然 Sun十分憤怒但仍不得不夾著尾巴,我們不知道這幕后的故事。我不會(huì)認(rèn)同任何價(jià)值數(shù)以十億計(jì),且由股東控制的公司所持的利己主義的動(dòng)機(jī)。)
              我不認(rèn)為Google創(chuàng)建一個(gè)基于Java但偏離Java甚遠(yuǎn)的平臺(tái)(如.NET所做的那樣)是無競爭力的。在保持對已有Java代碼和類庫巨大兼容性,Java人才及Java工具鏈之間的平衡性的意愿時(shí),Dalvik和Android框架會(huì)讓你獲得盡可能多的好處。
              顯然,Android=Java不能在雙方面都包含進(jìn)來(不是雙射)。每個(gè)平臺(tái)都有一些獨(dú)一無二的 API,當(dāng)然,Android是一個(gè)完整的操作系統(tǒng),它包括一個(gè)基于Linux的內(nèi)核,圖形和電話棧,等等。我顯然只談及普通的部分:基于Java的用戶空間/應(yīng)用框架要依賴Java源代碼和類(無論是哪種格式的),API(包含數(shù)以千計(jì)的通用JavaSE API),以及非常引人注目的類Java的虛擬機(jī)。對Android與其它Java平臺(tái)關(guān)系的準(zhǔn)確描述可能要使用到版本或測評的概念。我記得一個(gè)博客說過像"Android沒有'J'"這樣的話。好的,還不晚:我的建議是將Android的名稱修改為Java GE(Java Google Edition)。這就能一勞永逸地消除困惑;-)

          posted on 2010-08-22 19:49 John Jiang 閱讀(1988) 評論(0)  編輯  收藏 所屬分類: Java翻譯MobileAndroid
          主站蜘蛛池模板: 祁连县| 奉节县| 平乐县| 奉新县| 南安市| 龙游县| 罗甸县| 阿拉善盟| 崇州市| 天全县| 开化县| 绥芬河市| 嵊州市| 仙桃市| 那坡县| 潮安县| 大足县| 贵港市| 南雄市| 贵定县| 诸城市| 桂阳县| 明溪县| 曲阳县| 黔西县| 龙海市| 玉树县| 桐城市| 东光县| 渝中区| 饶河县| 株洲县| 宜兰市| 北票市| 南岸区| 中山市| 南木林县| 太原市| 赣榆县| 平原县| 邛崃市|