CJIT: 将 C 带入即时编译时代并提升可用性

CJIT,即 C Just in Time,作为一个引人注目的项目出现,旨在通过提供小巧、可移植的编译器和解释器来简化 C 开发工作流。它受 Terry Davis 的 HolyC 原则启发,并基于 Fabrice Bellard 的 TinyCC 坚实基础构建,旨在让 C 更易于在各种平台上进行快速原型设计和即时部署。该项目由 Jaromil 与 Dyne.org 团队发起,解决了 C 开发中的常见摩擦点,定位为一种无需传统构建环境开销的快速实验与执行工具。

本文深入探讨 CJIT 的核心特性、它与前辈的区别以及社区的反馈与见解,突出其在改变开发者使用 C 进行脚本编写和快速应用开发方式方面的潜力。

CJIT 是什么?

CJIT 被呈现为一个单二进制文件的 C 编译器和解释器,旨在实现最大程度的可移植性和易用性。它将 TinyCC 编译器及其必要的头文件和标准库封装进一个小于 2 MB 的紧凑包。此设计理念消除了复杂的安装、路径配置或专用 IDE 的需求,使其成为快速搭建环境的理想选择。

它受 HolyC(TempleOS 操作系统中使用的类 C 语言)的启发,暗示其关注简洁性和对代码的直接交互。虽然 HolyC 更晦涩的方面并未明确说明,但高度集成、即时编码体验的精神似乎是其驱动力。

关键特性与可用性提升

  • 即时部署:作为单个可执行文件,CJIT 不需要系统范围的安装、签署 EULA 或 IDE 设置。这种“单文件 <2MB 大小”的方式确保了立即可用。
  • 跨平台兼容性:它支持 MS/Windows、Apple/OSX 和 GNU/Linux,成为跨不同操作系统工作的开发者的多功能工具。
  • 多文件执行:不同于标准编译器调用,CJIT 可以接受通配符来一次性加载多个 C 源文件、预编译对象或共享库。每个文件导出的符号在同一执行上下文中对所有文件可见。
  • 自动库发现:CJIT 会自动定位每个目标平台的常用系统库,免去开发者手动指定库路径和设置的需求。
  • 动态库调用:它能够使用动态库中任意共享函数,扩展了与现有系统功能集成的实用性。
  • 快速原型:这些特性的组合使开发者能够以前所未有的速度编写并执行 C 应用程序,促进快速原型开发工作流。

CJIT 与 TinyCC:深入比较

虽然 CJIT 基于 TinyCC,但常见的问题是它与直接使用 tcc -run 有何区别。Hacker News 的一位评论者对这些区别给出了清晰的概述:

主要区别在于可用性。CJIT 目前提升了三个主要的用户体验方面:它作为单个可执行文件运行,内嵌 TinyCC 编译器、所有头文件以及标准库。这样就无需在系统范围内安装任何东西、检查路径或设置构建文件夹。它支持将多个文件加入一次执行:可以接受通配符来加载任何 C 源文件、预编译对象或共享库。每个文件导出的符号在同一执行中对所有文件可见。它会自动为每个目标平台查找常用系统库,避免重复设置并寻找正确路径。

这表明 CJIT 并非对 C 编译的根本性重新构想,而是围绕 TinyCC 对开发者体验的显著提升,侧重于便利性并减少样板代码。

社区反馈与考虑

Hacker News 的讨论揭示了社区的若干有趣观点和问题:

可移植性与依赖

虽然 CJIT 追求可移植性,但部分用户遇到了特定的依赖问题。例如,有用户指出针对 cjit-x86_64-ubuntu-24.04 的发行版在 Arch Linux 上无法运行,原因是缺少 libgcc_s.so.1,暗示了 dlopen 问题。这凸显了在 Linux 生态系统中创建真正通用二进制文件的持续挑战,即便是致力于最小依赖的项目亦如此。

自托管能力

一个相关的问题是 CJIT 能否自编译自身,这在 GCC 和 LLVM 等编译器中是常见的基准。项目的 FAQ 并未明确提及此点,留下了一个供社区未来探索的有趣方向。

作为脚本语言的潜力

有人建议将 CJIT 与 Fil-C(为脚本设计的 C 解释器)等项目结合,设想 C 成为“真正的脚本语言”。这表明了更广泛的兴趣,即在更动态、类似脚本的环境中利用 C 的强大能力。

替代方案与灵感来源

Mir 是另一个提供自定义 JIT 工具(包括 C 编译器)的项目,被提及为对类似功能感兴趣的替代方案。HolyC 的灵感也引发了好奇,用户想了解它在 CJIT 中的具体影响,而不仅仅是即时 C 环境的概念。

小细节观察

一些用户指出了细节,例如文档中经典的 “hello, world” 示例使用了 fprintf(stderr, ...),这与更常见的 printf 不同。还有人评论网站的视觉设计,形容其为 “压缩” 或类似某些 AI 生成的美学。

使用 SDL 的图形应用

CJIT 还通过集成 SDL(Simple DirectMedia Layer)拥抱图形 C 应用的世界。项目文档明确欢迎开发者进入这一令人兴奋的领域,并指出 SDL 自 1998 年起便拥有悠久历史。这种“开箱即用”的图形开发方式进一步提升了 CJIT 在命令行工具之外进行快速原型开发的吸引力。

结论

CJIT 代表了 C 开发工具领域的深思熟虑的演进,侧重于通过可移植性、简化部署和智能依赖管理来提升用户体验。它基于 TinyCC 并汲取 HolyC 的灵感,为希望以更敏捷、即时方式利用 C 的性能和控制力的开发者提供了有吸引力的解决方案。尽管通用二进制兼容性等挑战仍然存在,CJIT 通过让 C 开发更快速、更易于进行快速原型和脚本编写的核心价值主张依然坚实,邀请开发者在广泛的应用场景中探索其能力。

Sources