Ser*_*nov 6 .net delphi compiler-construction backend
我正在尝试为.NET平台创建我的语言的后端.用Delphi编写的前端和解释器.非托管API只允许类型定义但不发出MSIL.
有哪些方法可以从非托管代码生成MSIL?不使用Reflection.Emit并使用ILasm来实现这一目标?谢谢.
Delphi的.NET代码生成器将IL作为字节码直接发送到内存中,就像x86代码生成一样,但是具有适当的头部等.也就是说,代码生成器直接发送对应于编码的IL格式的字节,异常表等.它不是用API做的,而是用老式的方式:一次写一个字节的代码.
之后,Delphi的内置链接器与其他人一起工作IMetaDataEmit以生成元数据,并IMetaDataEmit::SetRVA告知元数据代码将位于可执行文件中的位置.将元数据复制出来,IMetaDataEmit::SaveToMemory然后将其复制到链接器已构建的PE中,并相应地修补CLR标头以指向元数据开始.
这是很多代码,其中一些是繁琐的,因为它的大部分内容都是通过Delphi现有的x86链接器进行的,它实现了分支优化和消除未使用的代码(智能链接),严格来说,.NET通常不需要这些代码. .
如果我们再次这样做,我们可能会完全避免使用.NET API来创建元数据,并直接从规范生成整个内容.API最终成为优化的黑盒子,并且累积了大量的编译时间.