我知道 Cosmos 和 SharpOS 已经制作了自己的编译器来从 C# 构建二进制代码,但是您可以使用 Microsoft 的 .NET AOT 来做同样的事情吗?将 C# 编译为 x86,即。我假设您必须省略 using 语句,就像操作系统开发中包含语句一样。任何反馈表示赞赏。谢谢
编辑:我想在内核开发中使用 C# 的主要原因是托管代码带来的内存管理,尤其是单个地址空间属性。是否有必要启动 JIT 编译器,然后编译 C#?还是那个时候环境仍然太残缺?感谢您的反馈
简短回答:不,使用 ngen.exe / AOT编译器不足以编译内核。
长答案:ngen.exe / AOT 编译器削减了 JIT 编译器的工作,但 CLR 不仅仅是一个 JIT 编译器 - 即使不引用任何其他程序集,它也提供内存管理、垃圾收集、类型等功能检查和异常处理(以及除此之外的一大堆其他事情)。
是的,使用 ngen 确实让您更接近在 C# 中生成内核,但它并没有让您更接近 - 您仍然需要解决大量其他问题,通过编写一个编译器更容易解决这些问题针对您的预期环境(而不是 CLR)。
更新:如果您想要 C# 的“托管”部分,那么您需要为自己创建一个托管环境来运行您的代码,即垃圾收集器等......(或尝试让 CLR 等现有的工作,这将可能更难)。即使在底层操作系统的支持下,这也是一项非常艰巨的任务,当您是操作系统时更是如此(尽管绝不是不可能的——毕竟这正是像 Singularity 和 Cosmos 这样的项目所做的)。
我发现这个资源用于将 IL 编译为本机代码,用于 cosmOS 项目
不,你不能用 ngen 做到这一点。ngen 输出本身不够低级,无法在没有所有支持的 CLR 和 Windows 基础设施的情况下启动内核。
您提到的其他项目将 CLR 的子集编译为二进制文件,这是一个略有不同的过程。
你不能。C# 是一种托管语言,这意味着它的代码(IL 代码)将在运行时编译...您可以编写自己的编译器,将 C# 编译为本机计算机代码,但这会让您没有很多 .NET 的功能有,例如垃圾收集器、内存管理、JIT 编译器,并且将类似于 C++,只是使用 C# 语法
作为一个抽象的想法,我认为您可以使用 JIT 编译器和垃圾收集器创建一个小的 CLR 替代方案,它将嵌入到您的应用程序中,但这会增加您的应用程序大小并且您将需要更多资源......