.NET Core是微軟力推的新平台,影響力好像還越來越大。為了對這一行業趨勢有所准備,最近把自己搞的編程語言的編譯器從.NET移植.NET Core,以實現跨平台在Linux上運行,然而失敗了。
原因是.NET Core類庫中AppDomain、AssemblyBuilder、ModuleBuilder、ILGenerator等等缺失了一些很核心的方法或類型,導致無法編譯通過。
核心缺少這些無法編譯成功,也不能生成最終的二進制文件。那些以前可以在.NET CLR上運行的開源語言.NET Core對它們來說已經沒有了吸引力,現在沒有一個跟進到.NET Core上,所以也沒有辦法從開源項目中獲得幫助。比如說Clojure CLR,我下載了它最新的編譯器源碼,它還是用System.Reflection.Emit命名空間生成IL指令。
微軟要在.NET Core上廢棄了System.Reflection.Emit那一套東西。我拼命研究的那套生成IL的知識要作廢了。這讓我想到了Sliverlight、XNA、Windows Phone的下場。我辛辛苦苦鑽研到的這部分知識又被歸零了,讓我想到了刷卡時為零(薩卡什維利外號)。
我又想到現在微軟現在是用Roslyn編譯C#的,而且Roslyn是開源的。我就下載了Roslyn源碼,並且進行了分析。發現源碼中PEAssemblyBuilder有一些.NET Core中缺少的方法,但是這個它是internal sealed類,不對外開放,不提供給大家使用。
微軟不但在.NET Core上廢掉了以前的System.Reflection.Emit,而且不提供新的替代功能,看來它排除其它人,要一己之力建設.NET生態,.NET超越Java的可能性也大致確定。感覺誠意太少。
我感覺那些老外紛紛放棄在.NET上開發語言是明智的。Java平台上不斷有Groovy、Scala、Kotlin等等語言出現,在.NET上不可能有了。微軟在.NET上是唯一的主宰,想廢掉哪個就馬上廢掉,不需要像Java的JCP組織那樣開會投票,也不需要詢問.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