.NET逆襲 用Mono這只猴子玩轉(zhuǎn)Dalvik
甲骨文和谷歌正就谷歌在Android中使用Java一案展開一場10億美元的大較量。但是Java并非在Android中建立本地應(yīng)用的唯一方法。事實(shí)上,它甚至不是***的文法:Xamarin 開發(fā)組已經(jīng)將C#提供給Android開發(fā)者作為一個(gè)高性能、低功耗的Java的替代語言。Xamarin 的平臺(tái),Mono,是.Net框架的一個(gè)開源的實(shí)現(xiàn)。它使得開發(fā)者用C#寫成的程序,能運(yùn)行在帶有Java的操作系統(tǒng)上,然后與iOS和Windows Phone共享同一代碼。
不同于Sun對(duì)Java的做法,微軟向ECMA(歐洲電腦制造商協(xié)會(huì))提交了C#和.NET VM標(biāo)準(zhǔn)化申請(qǐng),并一路保證這些標(biāo)準(zhǔn)完全符合ISO牢固專利承諾。.NET框架同樣也為微軟受法律約束的社區(qū)承諾所覆蓋。
去年七月,Xamarin 開發(fā)組在波士頓小聚,討論Mono在iOS和Android中的成長。查爾斯河一天的蕩舟過后的晚宴席間,開發(fā)組將注意力轉(zhuǎn)向了如何提升Android上應(yīng)用的性能并降低能耗,使他們的Mono更加適合于Android。
Xamarin 開發(fā)組(當(dāng)時(shí)還只是家小公司)
一次次地,開發(fā)組回到最根本的話題:Dalvik是個(gè)年輕的虛擬機(jī),它不如Mono那么高效與協(xié)調(diào),并受制于Java的許多性能極限,而且享受不到來自甲骨文的熱點(diǎn)(HotSpot)的高端優(yōu)化。那次晚宴開發(fā)組冒出的一個(gè)瘋狂的想法,是將Android的源碼翻譯成C#。Android將能從C#的性能特性如結(jié)構(gòu)體、P/調(diào)用、真實(shí)泛型以及他們更加成熟的運(yùn)行時(shí)中受益。
雖然七月什么也沒有發(fā)生,但這一想法深深扎根在了開發(fā)組的心里。
快進(jìn)幾個(gè)月:專用于Android的Mono做得非常好,開發(fā)組開始再次考慮提升自己產(chǎn)品在Android上的性能。如果掃除Java,使用更快的 C#并同時(shí)去除Dalvik的極限,結(jié)果將會(huì)怎么樣?Xamarin 能否創(chuàng)造出一個(gè)完全不含Java,并且突破Dalvik VM極限的Android電話?
它如此瘋狂,Xamarin 開發(fā)組決定嘗試。于是他們開始了一個(gè)小型的專案工作組項(xiàng)目,致力于做一個(gè)從Android到C#的機(jī)器翻譯工作。他們稱這一項(xiàng)目為XobotOS。
XobotOS研究項(xiàng)目
努力的結(jié)果是,今天,他們已經(jīng)將Android大多數(shù)布局和控件完全移入了C#。下圖是運(yùn)行在一個(gè)Linux 工作站的XobotOS 的截圖,不涉及一點(diǎn)Java
到達(dá)這一個(gè)節(jié)點(diǎn),需要將Android Java源碼的主要部分翻譯成C#。因此你可以想見上圖代表的里程多么有意義。那他們是如何做到的呢?
基于Sharpen的Java翻譯
Android的代碼庫包含一百萬多行Java代碼,而且他們知道必須得與Android的新發(fā)行操持同步——事實(shí)上,2011年的時(shí)候他們是從 Android 2.x 的源碼起步的;隨后當(dāng)谷歌在今年早期開放Ice Cream Sandwich 源碼的時(shí)候,他們已經(jīng)將XobotOS 升級(jí)到了Android 4.0。因此對(duì)于他們,唯一可行的選擇是,做一個(gè)Java到C#的機(jī)器翻譯,在這一過程中構(gòu)建并維護(hù)任何必要的工具。
開發(fā)組所使用的作為起點(diǎn)的工具是Sharpen。Sharpen因幫助Frank Krueger在兩個(gè)月內(nèi)將Java小程序移植到一個(gè)贏獎(jiǎng)了的iPad應(yīng)用而著名了起來。
開發(fā)組對(duì)Sharpen做了改進(jìn),使之成為了一個(gè)高度改進(jìn)的通用的Java2C#翻譯工具。他們將在發(fā)布XobotOS源碼的同時(shí)發(fā)布這一新版本的Sharpen,希望更多的人能夠從中受益,并參與貢獻(xiàn)。
性能
一旦你讓Android在Mono上運(yùn)行,首先想到的一個(gè)問題一定是——Mono的性能同Dalvik相比如何?
當(dāng)C#出來的時(shí)候,微軟以一些意義重大的方式修改了該語言,使之更加易于優(yōu)化。值類型的引入,使小的對(duì)象占用更低的負(fù)載,并使虛函數(shù)opt-in而非opt-out,十分適合更加簡單的VM。之后,Java和C#在泛型的實(shí)現(xiàn)上出現(xiàn)的分歧。Java走了完全向后兼容的道路,而C#則將這一支持放到了運(yùn)行時(shí)中。C#的做法形成了一個(gè)易用、易于理解的泛型機(jī)制,并且更加高效與完整。
自那時(shí)開始,兩大語言以及各自的運(yùn)行環(huán)境都有了持續(xù)的發(fā)展與改進(jìn)。C#從一個(gè)略微優(yōu)秀的Java,長成了一個(gè)比Java多走了一光年遠(yuǎn)的語言。擁抱動(dòng)態(tài)編程,帶來異步機(jī)制,引入迭代器,功能性編程構(gòu)建,擁抱并行并實(shí)現(xiàn)了一個(gè)偉大的泛型。許多這些特性都來自于Don Syme 的調(diào)查和他的持續(xù)給該語言注入新思想的F#開發(fā)組。
而且,Mono作為一個(gè)虛擬機(jī),已經(jīng)在過去的十年里充分地成長;如今,馬上要考慮其第八版的發(fā)布工作了。
所有這些加起來,你可以從開發(fā)組運(yùn)行的一個(gè)簡單的二叉樹實(shí)現(xiàn)的基準(zhǔn)測試(如下圖)中,看到Java和C#在結(jié)構(gòu)體和泛型性能上巨大的差別。
下一步怎么走
目前,開發(fā)組已經(jīng)在Github上發(fā)布了XobotOS。你可以親手試試。
作為一家公司,Xamarin 的目標(biāo)是提供建立移動(dòng)應(yīng)用***的平臺(tái),因此XobotOS 將不是他們今后工作的重心。但是使用它也是一個(gè)不錯(cuò)的體驗(yàn)。并且正如結(jié)果所顯示的,部分技術(shù)已經(jīng)在它的幫助之下浮出水面,它們或?qū)⑦M(jìn)入我們將來的產(chǎn)品中:
直通Skia的圖形訪問:當(dāng)前用于Android的Mono仍是通過Java訪問底層圖形庫;使用Xamarin 建立XobotOS的代碼,開發(fā)組將可以跳過中間件,使用Mono的P/Invoke直接連接到Sika中的本地渲染代碼。
Java2C#工具:開發(fā)組新版本的Sharpen 已經(jīng)作為其XobotOS發(fā)行的一部分發(fā)布。
用C#代碼取代Java代碼:開發(fā)組已經(jīng)有了用C#代碼替換某些性能關(guān)鍵且C#能提供更優(yōu)解決方案的的Java代碼塊所必要的工具。他們的計(jì)劃是從這一調(diào)查項(xiàng)目中取材,將它們集成到自己的產(chǎn)品當(dāng)中。
一個(gè)因?yàn)檎J(rèn)為它好玩而啟動(dòng)的項(xiàng)目,最終竟為公司的產(chǎn)品提供了一些意義重大的益處。創(chuàng)業(yè)很有必要集中精力辦實(shí)事,但偶爾你應(yīng)該嘗試某些瘋狂的想法,以取得進(jìn)步?;蛟S谷歌某天會(huì)感謝Xamarin,這也說不定。
Xamarin 的很多職位正在招人,有志者可與他們將攜手,***移動(dòng)開發(fā)的先潮!
【編輯推薦】