首页 > 技术文章 > 编译器移植到.NET Core失败记录和对.NET未来感想

tkt2016 2020-04-03 13:40 原文

 

.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

 

 

推荐阅读