編譯器移植到.NET Core失敗記錄和對.NET未來感想


 

.NET Core是微軟力推的新平台,影響力好像還越來越大。為了對這一行業趨勢有所准備,最近把自己搞的編程語言的編譯器從.NET移植.NET Core,以實現跨平台在Linux上運行,然而失敗了。

 

 

 

原因是.NET Core類庫中AppDomainAssemblyBuilderModuleBuilderILGenerator等等缺失了一些很核心的方法或類型,導致無法編譯通過。

 

核心缺少這些無法編譯成功,也不能生成最終的二進制文件。那些以前可以在.NET CLR上運行的開源語言.NET Core對它們來說已經沒有了吸引力,現在沒有一個跟進到.NET Core上,所以也沒有辦法從開源項目中獲得幫助。比如說Clojure CLR,我下載了它最新的編譯器源碼,它還是用System.Reflection.Emit命名空間生成IL指令。

 

 

微軟要在.NET Core上廢棄了System.Reflection.Emit那一套東西。我拼命研究的那套生成IL的知識要作廢了。這讓我想到了SliverlightXNAWindows Phone的下場。我辛辛苦苦鑽研到的這部分知識又被歸零了,讓我想到了刷卡時為零(薩卡什維利外號)

 

我又想到現在微軟現在是用Roslyn編譯C#的,而且Roslyn是開源的。我就下載了Roslyn源碼,並且進行了分析。發現源碼中PEAssemblyBuilder有一些.NET Core中缺少的方法,但是這個它是internal sealed類,不對外開放,不提供給大家使用。

微軟不但在.NET Core上廢掉了以前的System.Reflection.Emit,而且不提供新的替代功能,看來它排除其它人,要一己之力建設.NET生態,.NET超越Java的可能性也大致確定。感覺誠意太少。

 

我感覺那些老外紛紛放棄在.NET上開發語言是明智的。Java平台上不斷有GroovyScalaKotlin等等語言出現,在.NET上不可能有了。微軟在.NET上是唯一的主宰,想廢掉哪個就馬上廢掉,不需要像JavaJCP組織那樣開會投票,也不需要詢問.NET程序員的意見,執行效率極高。

 

 

缺少的方法或類型如下:

AppDomain

缺少方法

DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access);

 

AssemblyBuilder

缺少方法

DefineDynamicModule(string name, string fileName, bool emitSymbolInfo);

SetEntryPoint(MethodInfo entryMethod, PEFileKinds fileKind);

Save(string assemblyFileName);

 

ModuleBuilder

缺少方法

DefineDocument(string url, Guid language, Guid languageVendor, Guid documentType);

 

ILGenerator

缺少方法

MarkSequencePoint(ISymbolDocumentWriter document, int startLine, int startColumn, int endLine, int endColumn);

 

LocalBuilder

缺少方法

SetLocalSymInfo(string name);

 

缺少枚舉類型 PEFileKinds

 

AssemblyBuilderAccess

缺少枚舉值

Save,

RunAndSave,

ReflectionOnly

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM