News Hacker|极客洞察

126 10 天前 dyne.org
🤔CJIT:单文件 TinyCC C JIT,受 HolyC 启发
把 C 做成脚本语言,真不是最糟组合吗?

🎯 讨论背景

CJIT 是一个把 TinyCC(轻量级 C 编译器)打包进单个可执行文件的工具,目标是在运行时直接编译并执行 C 代码,还能自动处理常见系统库和多文件输入。它的重点不是更强的优化器,而是把 C 变成更顺手的交互式工作流,类似 `tcc -run` 但更偏向一键运行和快速试验。项目说明里还明确提到受 HolyC 和 Terry Davis 启发,所以评论区很自然会联想到 TempleOS(Terry Davis 写的实验性操作系统)那种边写边跑、甚至 shell 直接编译代码的风格。讨论同时牵涉到现实兼容性:当前发布包似乎偏 Ubuntu 24.04,Linux 发行版差异、SDL(Simple DirectMedia Layer,跨平台图形/音频库)示例和系统库定位问题都被拿来检验它能否真正像脚本一样用 C。

📌 讨论焦点

项目定位与 `tcc -run` 差异

CJIT 被描述成把 TinyCC、头文件和标准库都打包进一个可执行文件,因此不需要系统级安装、路径配置或额外的 build 目录。它还支持一次吞多个源码、对象文件和 shared library,并自动寻找常见系统库,这让它比普通的 `tcc -run` 更像一个顺手的交互式运行器。有人直接追问这和直接用 `tcc -run` 有什么本质差别,得到的答案主要落在 UX 和即时试验流程上,而不是新的编译原理。还有人顺手问它能否像 GCC 和 LLVM 那样 self-host,说明大家也在看它能走到多完整的 compiler 形态。

[来源1] [来源2] [来源3] [来源4]

安全与供应链风险

CJIT 允许把源文件、对象文件和 shared library 一起喂给执行器,这种“拿来就跑”的设计让人担心会变成供应链攻击的理想入口。反对者的直觉是,自动加载、自动定位系统库和立即执行这些特性,会把恶意依赖、路径污染和不受信任代码的风险一起放大。回应则把这种风格追溯到 Terry Davis 的理念:不是做 sandbox,而是让用户自己阅读并控制代码。这个视角下,CJIT 更适合受信任的本地实验,而不是安全边界清晰的生产环境。

[来源1] [来源2]

C 脚本化与工作流想象

有人提议把 CJIT 和 Fil-C 结合起来,这样就能把 C 变成一种真正的 scripting language。支持者把它想象成兼具“脚本 munging”和持久性能的工具,尤其适合 operational scripts 和快速原型。反对者则直接吐槽这可能是“最糟糕的两全其美”,暗示 C 的低层细节与脚本语言的便利性并不容易兼得。这个分歧显示出评论区对“让 C 更像交互式语言”既有兴趣,也有明显警惕。

[来源1] [来源2] [来源3]

HolyC / TempleOS 源流

项目说明里提到受 HolyC 和 Terry Davis 启发,这个说法让不少人联想到 TempleOS(Terry Davis 写的实验性操作系统)。也有人表示看不出外观或结构上有什么 TempleOS 味道,觉得它更像是把 `tcc -run` 往前推进了一步。随后有评论补充,HolyC 本来就是 JIT compiled,TempleOS 的 shell 其实也是 HolyC REPL,可以动态编译并立即执行代码,甚至直接调用 kernel functions。于是“does it glow?” 这种调侃也出现了,说明这条历史线索对理解项目风格很关键。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6]

兼容性、打包与示例问题

评论里有人注意到发行包明确写着 `cjit-x86_64-ubuntu-24.04`,于是质疑为什么不是更通用的 Linux 构建。实际试用中,Arch 上似乎会因为寻找 `/lib/x86_64-linux-gnu/libgcc_s.so.1` 失败而无法运行,提示它对发行版路径和系统库布局仍然有依赖。TUI demos 被认为表现不错,但 SDL 示例却卡在缺失 symbol,另有人补充说 Linux 下似乎是链接到系统 SDL。这个分组强调的是:概念很酷,但 portability 和示例稳定性还没完全跟上。

[来源1] [来源2] [来源3] [来源4]

其他 JIT/交互式编译器对比

有评论把视线拉到更广的 C JIT 生态,提到 Mir、rcc、antcc 和 xcc 这些项目,其中有的更偏 custom JIT infrastructure,有的则主打像脚本一样运行 C。有人把这种交互式用法类比到 Julia:先在 REPL 里保留状态,再在同一份数据上反复试新代码。更宏观的说法把这条路线追溯到 Lisp 和 Dartmouth BASIC,认为理想的工具链应当同时拥有 interpreter、dynamic compilation 和 AOT,而不是只押注一种模式。这个分组强调 CJIT 并非孤例,而是一个长期存在的“让编译语言更像交互语言”的方向。

[来源1] [来源2] [来源3] [来源4]

站点实现与 Codex 质疑

还有一条旁支集中在网站实现本身。有人猜页面是用 Codex 之类的 LLM 工具做的,但回应指出源码在 GitHub 上公开,站点是 VitePress(一个静态站点生成器)加自定义主题,提交历史也早于 Codex 发布。另有评论觉得页面字体让视觉有点“压缩”,以及 header 里的 tutorial 链接没有真正跳转。这里讨论的不是编译器能力,而是项目包装是否足够清晰和可信。

[来源1] [来源2] [来源3] [来源4]

📚 术语解释

TinyCC(TCC): 一个体积很小、编译速度极快的 C compiler,CJIT 以它为核心来实现即时编译和执行。

JIT: Just-In-Time 编译,代码在运行时才被编译,而不是预先生成可执行文件。

REPL: Read-Eval-Print Loop,交互式输入代码并立刻看到结果的工作方式。

HolyC: Terry Davis 为 TempleOS 设计的语言,支持接近脚本/REPL 的动态编译执行。

TempleOS: Terry Davis 创建的实验性 operating system,常被提及作为 CJIT 风格灵感来源。

SDL(Simple DirectMedia Layer): 常用的跨平台图形/音频库,评论里用来测试 CJIT 的图形示例。