编译器移植到.NET Core失败记录和对.NET未来感想
.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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2018-04-03 MSIL实用指南-比较运算