close

因為並沒有好好的受過CS教育,隨著碰的東西越來越多,一些東西逐漸混淆在一起,直到這次嘗試把Protobuf透過Unity放上IOS使用時因為觀念的不正確終於炸了,所以重新花了半天複習了一下這幾樣東西並做個筆記,每一個條目其實都可以單獨找到專業與圖文並茂的流程解釋,想深入了解還是一個一個去看比較好。

 

範圍由大到小來白話並簡易的消歧義這六個東西:

動態語言(Dynamically typed languages)

執行期才編譯的語言,因此像型別錯誤這種基本問題也不會事先被發現。會在運行跑到那行時直接死給你看,執行期才編譯慢一些也是難免,但可以獲得高度彈性的替換優勢。

代表語言:JavaScript、Ruby、PHP。

 

靜態語言(Statically typed languages)

說白點就是你要"Compile"然後產出一個exe, dll之類東西的語言,一些基本的錯誤會在編譯時發現。

代表語言:C/C++、C#、JAVA。

 

什麼!!媽媽說C/C++跟C#是不同類型的語言,怎麼會一樣是靜態語言??

它們的確是不一樣的而且差很多,但就動/靜態語言這個分類來說是屬於同一類型。

 

受到執行階段管理的程式碼(Managed Code)

Managed Code就是其執行受到執行階段管理的程式碼 ,這句是微軟說的,也就是說可以被系統GC(垃圾回收)。在編譯器編譯程式時,並不是將它編譯成最終的Native Code(機械碼),而是IL(中繼語言),而在執行期才透過.NET Framework CLR或JVM這類虛擬機產出最終的Native Code,所以在第一次生成的時候會慢一些。好處是跨平台,只要虛擬機能跑在哪,IL就能在哪執行。

我不確定這個名詞是不是專屬於C#並用來區分與C++的不同處。

 

不受到執行階段管理的程式碼(Unmanaged Code)

像C++是直接編譯成最終Native Code,並且需要自行管理記憶體New/Delete不然就Leak給你看的就是Unmanaged Code。因為直接編成最終的Native Code,所以每個平台都需個別編譯,少了轉換的過程快一點也不為過。

Managed Code = IL,以外的全都算Unmanaged Code不知道能不能這樣理解。

 

動態編譯(JIT Just-In-Time)

這是指IL在轉換成Native Code時的差別,跟動態語言有那麼點87%像也很容易搞混,但看字面也知道是即時轉換,但這邊最少是拿已編譯過的IL即時轉換,東西多少是保證過的,而不像動態語言是指根本還不知道能不能正常跑的原碼。

 

靜態編譯(AOT Ahead-Of-Time)

一次轉換成Native Code,所以這個狀態下其實就很接近C++的感覺了,但還是有跨平台的優勢。因為是一次性先行轉換,編譯順序的問題會使一些反射或虛函數生成的模板功能無法使用。值得注意也是我最一開始遇到的問題就是IOS限定AOT而不允許JIT,這連帶阻斷了做到熱更新的可能性。

 

碎碎念一下,一直以來我都認為JIT/AOT是IL與虛擬機之間的事,與我Coding並沒有太大關係,因為很少寫到衝突的語法所以受限於JIT才能用的寫法坑也很少踩到過,所以這次看到Protobuf無法在IOS運行時第一個直覺是這關AOT什麼事,Win32的時候明明就跑的好好的阿!(抱頭)。

附上=JIT無法使用的語法文檔=

arrow
arrow
    文章標籤
    C# C++ JIT AOT managed code
    全站熱搜

    不來嗯 發表在 痞客邦 留言(1) 人氣()