https://www.jianshu.com/p/71fffc9a9cac
他們說
閱讀了網上一些文章,其實使用C#進行熱更新是可以的,將需要更新的代碼打包成程序集,然后利用反射即可,但是也提到在IOS平台是不行的,至於為什么不行,就不再說了,然后就是推薦Lua作為熱更新方案,但是,為啥Lua就行?C#就不行?
因為C#是編譯型語言,Lua是解釋型語言?
好多人都說Lua能熱更新,是因為它是解釋型語言,不用編譯,在運行時能動態解釋Lua代碼並運行。這種方法實際上不准確,從某些角度來說是錯的。Lua確實是解釋性腳本語言,但是不是因為是解釋型才能進行熱更新。即使使用C++這種編譯語言,也能進行熱更新,將動態鏈接庫進行更新就是,然后動態加載動態鏈接庫獲取更新的函數地址即可。
而且,還有一點,C#並不能說是一種編譯型語言,C#代碼會被編譯成IL,IL解釋成機器碼的過程可以在運行之前進行也能在運行時進行。如果在運行時進行解釋,那么和Lua不就一樣了嗎,為啥C#不能進行熱更新呢?
JIT對IL進行解釋執行的原理
首先說一下,JIT對IL如何在運行時進行解釋並執行的,大致過程為:將IL解釋為所在平台的機器碼,開辟一段內存空間,要求這段內存空間可讀、可寫、可執行,然后把解釋出的機器碼放入,修改CPU中的指令指針寄存器中的地址,讓CPU執行之前解釋出來的機器碼。
注意這段內存的條件,最重要的一條是必須是可執行的,一般的內存申請我們只是存放數據,但是這里的內存權限要是有可執行權限
IOS限制了什么?
IOS不允許獲取具有可執行權限的內存空間,這就直接要求JIT要以full AOT模式,這種模式會在生成之前把IL直接翻譯成機器碼而不是在運行期間,進行了這種操作C#從某種角度來說和C++一樣,成為了編譯型語言,失去了運行時解釋的功能。
Lua的解釋執行怎么就行呢?
如果Lua的解釋執行原理和C#相同,肯定也不能在IOS平台上運行時解釋執行。Lua是使用C編寫的腳本語言,它在運行時讀入Lua編寫的代碼,在解釋Lua字節碼(Lua自己的指令)時不是翻譯為機器碼,而是使用C代碼進行解釋,不用開辟特殊的內存空間,也不會有新代碼在執行,執行的是Lua的虛擬機,用C寫出來的虛擬機,這和C#的機制是完全不同的,因為Lua是基於C的腳本語言。
總結
說白了,就是由於Lua這種腳本語言的特性,基於已經存在的某種語言的一種新的語言,這也是腳本語言和C#、C++這類語言的本質區別。當然,Lua虛擬機不僅可以使用C寫,也可以用C#寫。使用熱更新也不一定非要用Lua,Python同樣可以,只不過Lua短小精悍,本身代碼長度就不是很大,可以從GitHub上看到。
什么是IL
中間語言(中間代碼)是一種面向語法,易於翻譯成目標程序的源程序的等效內部表示代碼。其可理解性及易於生成目標代碼的程度介於源語言和目標語言之間。常用的中間語言有逆波蘭表示、四元式、三元式和樹表示等。
什么是JIT編譯
作者:派大星_5274
鏈接:https://www.jianshu.com/p/71fffc9a9cac
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
