← 返回信息流
AI 资讯Hacker News·4 天前

Chibil:一款面向 .NET IL 的 C 语言编译器

原标题:Chibil: A C compiler targeting .NET IL

速览

Chibil 是一个新兴的 C 语言编译器项目,其核心目标是生成 .NET 中间语言(IL)代码。该工具旨在为 .NET 平台提供另一种 C 语言编译选项,可能有助于简化跨平台开发或集成现有 C 代码库。

AI 深度解读

Chibil:一款面向 .NET IL 的 C 编译器深度解读

背景

在 .NET 生态系统中,C# 和 F# 是主要的开发语言,而 C/C++ 通常通过 P/Invoke 或 C++/CLI 与 .NET 交互。然而,直接编写原生 C 代码并将其编译为 .NET 可执行文件或库的需求一直存在,尤其是在需要高性能底层逻辑或复用遗留 C 代码库的场景中。

Chibil 是一个开源项目,旨在填补这一空白。它不仅仅是一个简单的 C 到 .NET 的转换器,而是一个完整的 C 编译器,其目标输出是 .NET 的中间语言(IL)。该项目最初在 Hacker News 等开发者社区引发关注,因为它提供了一种将标准 C 代码无缝集成到 .NET 运行时环境中的新途径,并展示了与 Visual Studio 工具链的兼容性。

核心内容

Chibil 的核心功能是将 C 源代码文件编译为 COFF OBJ 格式的目标文件。这些生成的 OBJ 文件在二进制层面与 MSVC 编译器在 /clr 模式下生成的 OBJ 文件完全兼容。这意味着开发者可以使用 Visual Studio 中的 link.exe 将这些对象文件链接起来,生成最终的可执行文件。

编译与链接流程 Chibil 的编译流程设计得与现有的 Windows 开发工具链高度集成。生成的 COFF OBJ 文件可以直接与 C++/CLI 代码混合链接。这种兼容性使得开发者可以在同一个项目中混合使用 C++/CLI 和 Chibil 生成的 C 对象文件,从而利用 .NET 的互操作性特性。

调试支持 Chibil 提供了完整的调试支持。它生成的代码包含正确的行号和局部变量信息。开发者可以在 .NET 调试器中单步执行 C 代码,这与调试原生 C# 代码的体验一致。

标准 C 库的处理 Chibil 不包含完整的标准 C 库(Standard C library)。为了提供基本的运行能力,项目在 crt 目录下提供了一个最小化的 C 运行时库存根(stub)。

  • 该存根提供了一个可运行的 main 函数,接收字符串数组形式的参数,并将其分派给符合 C 标准的 main 函数(包含 argcargv)。
  • 这个存根代码本身是通过汇编编写的,使用 asm2obj 工具将其转换为 COFF 对象文件。
  • 最后,该对象文件可以与 C 代码链接,形成一个具有可运行入口点的完整程序。

从 .NET 代码调用 C 代码 目前,从 .NET 代码中消费(调用)由 Chibil 编译的 C 代码的功能尚未完全实现。

  • 生成的代码默认被放置在全局命名空间中。
  • 如果开发者希望从其他 .NET 代码中调用这些编译后的 C 方法(而不仅仅是运行生成的 EXE),需要使用反射机制。
  • 具体做法是使用 Module.GetMethod 等方法查找方法,并通过反射进行调用。

辅助工具 项目附带了有用的调试和查看工具:

  • tools/coffobjdumper.cs:这是一个 COFF OBJ 转储工具,专门用于转储 .NET OBJ 文件。
  • 它与 ILDASM(桌面版 .NET CLR IL 反汇编器)和 dumpbin.exe 形成互补。ILDASM 可以转储 COFF OBJ 文件中的 .NET 元数据,但不显示方法体;dumpbin.exe 可以转储 COFF 对象的多种信息,但在 .NET 元数据方面支持有限。Chibil 的转储工具填补了这一空白,能够展示 .NET OBJ 文件中的详细信息。

关键要点

  • 二进制兼容性:Chibil 生成的 COFF OBJ 文件与 MSVC /clr 模式生成的文件二进制兼容,可直接使用 Visual Studio 的 link.exe 进行链接。
  • 混合编程支持:支持将 Chibil 生成的 C 对象文件与 C++/CLI 代码混合链接,增强了在 .NET 环境中集成 C 代码的灵活性。
  • 调试体验完整:支持行号和局部变量调试,允许在 .NET 调试器中单步执行 C 代码。
  • 最小化运行时:不提供完整标准 C 库,仅提供一个最小化的 crt 存根以提供 main 入口点,该存根通过汇编和 asm2obj 工具构建。
  • 反射调用机制:目前从 .NET 代码调用 Chibil 编译的 C 方法需依赖反射(如 Module.GetMethod),该功能尚未完全自动化或完善。
  • 专用调试工具:提供了 coffobjdumper.cs 工具,用于转储 .NET OBJ 文件,弥补了 ILDASMdumpbin.exe 在特定场景下的不足。
  • 未来规划:项目计划未来开发自己的链接器,以摆脱对 Windows 平台的依赖,实现跨平台支持。

意义与影响

Chibil 的出现为 .NET 生态系统提供了一种轻量级且兼容性强地将 C 代码引入 .NET 环境的方法。其最大的亮点在于与 MSVC /clr 模式的二进制兼容性,这使得现有的 Windows 开发工具和流程可以无缝接入,降低了迁移和学习成本。

对于需要高性能底层逻辑或希望复用大量遗留 C 代码库的开发者来说,Chibil 提供了一个比 P/Invoke 更紧密、比 C++/CLI 更简单的集成方案。尽管目前标准库支持和从 .NET 调用 C 代码的功能尚不完善,但其核心编译和链接流程已经成熟。

此外,Chibil 对调试支持的重视表明,该项目不仅关注编译正确性,也关注开发者的实际使用体验。未来如果如计划中那样开发独立链接器并实现跨平台支持,Chibil 有望成为 .NET 生态中一个重要的 C 语言前端,特别是在嵌入式 .NET 应用或高性能计算场景中。

查看原文 →github.com