當前位置: 妍妍網 > 碼農

.NET9 AOT完全自舉了嗎?

2024-03-26碼農

點選上方 藍字 江湖評談 設為關註




自舉:自己把自己舉起來,似乎有點難以理解。程式語言裏面其實很簡單。

舉個例子: Python直譯器是 Python語言編 寫的, 用Python直譯器來解釋Python套用層級的框架,語法 ,以及其它功能,即謂之自舉。 .NET的前端編譯器是Roslyn,它是C#寫的,但CLR/JIT後端編譯則是C++。所以算不上自舉。 .NET AOT呢?

AOT編譯器ILC是C#寫的,構建了記憶體模型,載入MSIL,以及呼叫JIT。但在.NET9之前,目的檔Obj是由llvm後端構建的,所以它也算不上自舉。.NET9裏面,Obj目的檔生成引入了C#程式碼,取代了LLVM這塊。但為了相容之前的LLVM-ObjWriter.dll這塊也是保留了,並沒有刪除,預設卻是取代了之前的LLVM的生成,兩者並存C#程式碼預設。

那麽.NET9裏面的AOT算不算自舉呢?.NET9 AOT編譯器ILC是完全的C#程式碼沒有問題,因為LLVM被取代了(參考: 。但是引導程式,也即是引導目的檔生成可執行的二進制檔的時候,用的C++的BootStrap(參考: . ) 所以嚴格意義上來說,也算不上自舉。

.NET9 AOT也可以說成是完全自舉了,實際上托管型別的語言,一定需要非托管的語言來載入引導執行。這就類似於作業系統的引導程式,開機之後,需要一個引導程式把指令引導到Windows系統上。比如進行MSVC後,.NET裏面一般都會生成一個非托管的Exe,它即是載入引導檔。再比如,CLR Host即是一個非托管引導,否則托管DLL是無法直接執行的。

以上個人結合理解。

往期精彩回顧