他們說(shuō)
閱讀了網(wǎng)上一些文章颖侄,其實(shí)使用C#進(jìn)行熱更新是可以的,將需要更新的代碼打包成程序集享郊,然后利用反射即可览祖,但是也提到在IOS平臺(tái)是不行的,至于為什么不行炊琉,就不再說(shuō)了展蒂,然后就是推薦Lua作為熱更新方案,但是温自,為啥Lua就行玄货?C#就不行?
因?yàn)镃#是編譯型語(yǔ)言悼泌,Lua是解釋型語(yǔ)言松捉?
好多人都說(shuō)Lua能熱更新,是因?yàn)樗墙忉屝驼Z(yǔ)言馆里,不用編譯隘世,在運(yùn)行時(shí)能動(dòng)態(tài)解釋Lua代碼并運(yùn)行。這種方法實(shí)際上不準(zhǔn)確鸠踪,從某些角度來(lái)說(shuō)是錯(cuò)的丙者。Lua確實(shí)是解釋性腳本語(yǔ)言,但是不是因?yàn)槭墙忉屝筒拍苓M(jìn)行熱更新营密。即使使用C++這種編譯語(yǔ)言械媒,也能進(jìn)行熱更新,將動(dòng)態(tài)鏈接庫(kù)進(jìn)行更新就是评汰,然后動(dòng)態(tài)加載動(dòng)態(tài)鏈接庫(kù)獲取更新的函數(shù)地址即可纷捞。
而且,還有一點(diǎn)被去,C#并不能說(shuō)是一種編譯型語(yǔ)言主儡,C#代碼會(huì)被編譯成IL,IL解釋成機(jī)器碼的過(guò)程可以在運(yùn)行之前進(jìn)行也能在運(yùn)行時(shí)進(jìn)行惨缆。如果在運(yùn)行時(shí)進(jìn)行解釋?zhuān)敲春蚅ua不就一樣了嗎糜值,為啥C#不能進(jìn)行熱更新呢?
JIT對(duì)IL進(jìn)行解釋執(zhí)行的原理
首先說(shuō)一下坯墨,JIT對(duì)IL如何在運(yùn)行時(shí)進(jìn)行解釋并執(zhí)行的寂汇,大致過(guò)程為:將IL解釋為所在平臺(tái)的機(jī)器碼,開(kāi)辟一段內(nèi)存空間捣染,要求這段內(nèi)存空間可讀健无、可寫(xiě)、可執(zhí)行液斜,然后把解釋出的機(jī)器碼放入累贤,修改CPU中的指令指針寄存器中的地址,讓CPU執(zhí)行之前解釋出來(lái)的機(jī)器碼少漆。
注意這段內(nèi)存的條件臼膏,最重要的一條是必須是可執(zhí)行的,一般的內(nèi)存申請(qǐng)我們只是存放數(shù)據(jù)示损,但是這里的內(nèi)存權(quán)限要是有可執(zhí)行權(quán)限
IOS限制了什么渗磅?
IOS不允許獲取具有可執(zhí)行權(quán)限的內(nèi)存空間,這就直接要求JIT要以full AOT模式检访,這種模式會(huì)在生成之前把IL直接翻譯成機(jī)器碼而不是在運(yùn)行期間始鱼,進(jìn)行了這種操作C#從某種角度來(lái)說(shuō)和C++一樣,成為了編譯型語(yǔ)言脆贵,失去了運(yùn)行時(shí)解釋的功能医清。
Lua的解釋執(zhí)行怎么就行呢?
如果Lua的解釋執(zhí)行原理和C#相同卖氨,肯定也不能在IOS平臺(tái)上運(yùn)行時(shí)解釋執(zhí)行会烙。Lua是使用C編寫(xiě)的腳本語(yǔ)言,它在運(yùn)行時(shí)讀入Lua編寫(xiě)的代碼筒捺,在解釋Lua字節(jié)碼(Lua自己的指令)時(shí)不是翻譯為機(jī)器碼柏腻,而是使用C代碼進(jìn)行解釋?zhuān)挥瞄_(kāi)辟特殊的內(nèi)存空間,也不會(huì)有新代碼在執(zhí)行系吭,執(zhí)行的是Lua的虛擬機(jī)五嫂,用C寫(xiě)出來(lái)的虛擬機(jī)贴妻,這和C#的機(jī)制是完全不同的帐姻,因?yàn)長(zhǎng)ua是基于C的腳本語(yǔ)言。
總結(jié)
說(shuō)白了贼陶,就是由于Lua這種腳本語(yǔ)言的特性蟆盹,基于已經(jīng)存在的某種語(yǔ)言的一種新的語(yǔ)言孩灯,這也是腳本語(yǔ)言和C#、C++這類(lèi)語(yǔ)言的本質(zhì)區(qū)別逾滥。當(dāng)然峰档,Lua虛擬機(jī)不僅可以使用C寫(xiě),也可以用C#寫(xiě)寨昙。使用熱更新也不一定非要用Lua讥巡,Python同樣可以,只不過(guò)Lua短小精悍舔哪,本身代碼長(zhǎng)度就不是很大欢顷,可以從GitHub上看到。
什么是IL
?? ??? ?中間語(yǔ)言(中間代碼)是一種面向語(yǔ)法捉蚤,易于翻譯成目標(biāo)程序的源程序的等效內(nèi)部表示代碼抬驴。其可理解性及易于生成目標(biāo)代碼的程度介于源語(yǔ)言和目標(biāo)語(yǔ)言之間炼七。常用的中間語(yǔ)言有逆波蘭表示、四元式布持、三元式和樹(shù)表示等豌拙。
什么是JIT編譯
?? ???運(yùn)行時(shí)需要代碼時(shí),將 Microsoft?中間語(yǔ)言?(MSIL) 轉(zhuǎn)換為機(jī)器碼的編譯题暖。