面向Android上Dalvik運行時的C# 編譯器dot42簡介

jopen 11年前發布 | 25K 次閱讀 Android

Mono for Android最大的缺點是需要在Mono上面構建,這與Android預期的運行時完全不同。盡管能夠直接訪問完整的CLR的確有些優勢,但是它與 Android的Dalvik 運行時之間的封送調用(marshalling call)可能非常昂貴。那為什么不跳過IL代碼直接生成Dex代碼呢?

事實上這有點夸張。dot42編譯器實際上并沒有跳過IL。恰恰相反,它讀取IL代碼并將其轉換為一種叫做RL或Register Language的新語言。IL和RL主要的差異在于IL是基于棧的(有點像Java的字節碼),而RL基于寄存器。在轉換為RL后,會執行一系列的優化,而且最終產品會被重新編譯。最后的編譯為我們生成Android上Dalvik運行時的dex代碼。

.Net原始調試信息在該過程的每個步驟中都會維護,當然它必須從Windows/.NET PDB格式轉換為dex的調試信息格式。dot42使用Android調試橋接器來連接Visual Studio調試工具。

Android庫可以通過直接引用JAR文件來訪問。“編譯后,調用會被重定向為對原始Android庫的調用。”類型間的某些映射是必須的,但這主要由編譯器解決。例如,java.lang.Boolean被映射為C#的Nullable。

因為dot42生成的是dex代碼,所以有些C#特性無法使用。其中最值得注意的是用戶定義值類型,也就是struct,因為Dalvik中并不存在,所以根本沒法映射。

在使用dot42時,往往需要決定選擇常見數據結構的C#版本還是 Android版本。例如,應該使用.Net的List還是Java的ArrayList?據Ewout Prangsma介紹,如果關注內存和下載大小,開發者應該首選Java版本。即使他們的List實現基本上是對ArrayList的很薄的包裝,有些額外的代碼仍然需要打包并傳到手機上去。

dot42是商業產品,正常批量許可是每開發者499歐元起。

載自: http://www.infoq.com/cn/news/2013/03/dot42

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!