Bitccode實(shí)際上只是LLVM的中間語言。當(dāng)您使用LLVM工具鏈編譯源代碼時翅溺,源代碼被翻譯成一種名為Bitcode的中間語言脑漫。然后對Bitcode進(jìn)行分析、優(yōu)化未巫,并最終轉(zhuǎn)換為所需目標(biāo)CPU的CPU指令窿撬。
這樣做的好處是启昧,所有基于LLVM的前端(如clang)只需要將源代碼轉(zhuǎn)換為Bitccode叙凡,從那里起,無論源語言密末,它的工作是一樣的握爷,因?yàn)長LVM工具鏈不關(guān)心Bitcode是由C, c++跛璧, obc, Rust, Swift或任何其他源語言生成;一旦有了Bitccode,其余的工作流程總是相同的新啼。
Bitccode的一個好處是追城,您可以稍后為另一個CPU生成指令,而不必重新編譯原始源代碼燥撞。例如座柱,我可以編譯一個C代碼到Bitccode,并讓LLVM生成一個x86 cpu的運(yùn)行二進(jìn)制文件物舒。但是色洞,如果我保存了Bitcode,我可以告訴LLVM也從Bitcode創(chuàng)建一個ARM CPU的運(yùn)行二進(jìn)制文件冠胯,而不需要編譯任何東西火诸,也不需要訪問原始的C代碼。生成的ARM代碼就像我從一開始就編譯到ARM一樣好荠察。
如果沒有Bitccode置蜀,我將不得不將x86代碼轉(zhuǎn)換為ARM代碼,因此這種轉(zhuǎn)換產(chǎn)生的代碼會更糟糕悉盆,因?yàn)榇a的原始意圖通常會在編譯CPU代碼的最后一步丟失盯荤,這也涉及到CPU特定的優(yōu)化,這對其他CPU沒有意義焕盟,而Bitccode很好地保留了原始意圖廷雅,只執(zhí)行所有CPU都會受益的優(yōu)化。
擁有所有應(yīng)用程序的Bitccode允許蘋果為特定的CPU重新編譯Bitcode京髓,使應(yīng)用程序與不同類型的CPU或完全不同的架構(gòu)兼容航缀,或只是從新的編譯器版本的更好優(yōu)化中受益。例如堰怨,如果蘋果明天發(fā)布了一款使用RISC-V而不是ARM CPU的iPhone芥玉,那么所有帶有Bitcode的應(yīng)用都可以重新編譯成RISC-V,并原生支持新的CPU架構(gòu)备图,盡管應(yīng)用的作者甚至從未聽說過RISC-V灿巧。
我想這就是為什么蘋果希望所有應(yīng)用程序都采用Bitccode格式的原因。但這種方法一開始就存在問題揽涮。一個問題是Bitcode不是一種凍結(jié)的格式抠藕,LLVM每次發(fā)布都會更新它,他們不能保證完全向后兼容蒋困。Bitccode從來都不是用于永久存儲或存檔的穩(wěn)定表示盾似。另一個問題是不能使用匯編代碼,因?yàn)閰R編代碼不會發(fā)出Bitccode雪标。另外零院,你不能使用沒有Bitcode的預(yù)先構(gòu)建的第三方庫溉跃。
最后但并非最不重要的是:據(jù)我所知,蘋果迄今為止從未使用過Bitccode的任何優(yōu)勢告抄。盡管過去要求所有的應(yīng)用程序都包含Bitccode撰茎,但這些應(yīng)用程序也必須包含針對所有支持的cpu的預(yù)構(gòu)建的胖二進(jìn)制文件,而蘋果總是只發(fā)布這些預(yù)構(gòu)建的代碼打洼。例如龄糊,對于曾經(jīng)擁有32位ARMv7和64位ARM64版本的iphone,以及Bitccode募疮,在應(yīng)用細(xì)化期間绎签,蘋果會移除32位或64位版本,以及Bitccode酝锅,然后發(fā)布剩余的內(nèi)容诡必。好吧,但如果沒有Bitcode搔扁,他們也可以這么做Bitccode不需要瘦架構(gòu)的胖二進(jìn)制!
重新構(gòu)建不同的架構(gòu)需要Bitccode爸舒,但蘋果從未這樣做過。沒有一個32位的應(yīng)用程序神奇地變成64位的蘋果重新編譯位代碼稿蹲。當(dāng)蘋果按需重新編譯Bitcode時扭勉,沒有64位的應(yīng)用程序能夠神奇地用于32位系統(tǒng)。作為一名開發(fā)者苛聘,我可以向你保證涂炎,iOS App Store總是準(zhǔn)確地提供你自己構(gòu)建和簽名的二進(jìn)制代碼,而不是蘋果自己從Bitcode創(chuàng)建的任何代碼设哗,所以沒有任何服務(wù)端優(yōu)化唱捣。即使當(dāng)蘋果從英特爾切換到M1,也沒有macOS應(yīng)用程序神奇地轉(zhuǎn)換為原生ARM网梢,盡管蘋果擁有Bitcode震缭,應(yīng)用商店中的所有x86應(yīng)用程序都可以這樣做。相反战虏,蘋果仍然發(fā)布了x86版本拣宰,并讓它在Rosetta 2中運(yùn)行。
因此烦感,通過強(qiáng)制所有代碼以Bitccode的形式提供給開發(fā)者各種各樣的缺點(diǎn)巡社,而不使用Bitccode所能給你的任何優(yōu)勢,會讓整個過程變得毫無意義∈秩ぃ現(xiàn)在所有的平臺都遷移到ARM64晌该,在幾年內(nèi)甚至不會再有胖的二進(jìn)制文件了(一旦x86對Mac的支持被放棄了),繼續(xù)使用那些東西的意義是什么?我猜蘋果抓住這個機(jī)會徹底埋葬了這個想法。即使有一天他們將RISC-V添加到他們的平臺上气笙,開發(fā)人員仍然可以同時發(fā)布包含ARM64和RISC-V代碼的胖二進(jìn)制文件。這一理念非常有效怯晕,非常簡單潜圃,除了“更大的二進(jìn)制文件”之外沒有任何缺點(diǎn),這是服務(wù)器端應(yīng)用程序細(xì)化可以解決的問題舟茶,因?yàn)樵谙螺d過程中只需要包含當(dāng)前平臺的代碼谭期。