CJIT:透過增強可用性將 C 語言帶入即時 (Just-In-Time) 時代

CJIT,或稱 C Just in Time,是一個引人注目的專案,旨在透過提供一個微型且可移植的編譯器與解釋器來簡化 C 開發工作流程。受 Terry Davis 的 HolyC 原則啟發,並建立在 Fabrice Bellard 的 TinyCC 強大基礎之上,CJIT 尋求讓 C 語言在各種平台上進行快速原型設計與即時部署時變得更加易於使用。這項由 Jaromil 與 Dyne.org 團隊發起的倡議解決了 C 開發中常見的摩擦點,將其定位為一種無需傳統建置環境開銷的快速實驗與執行工具。

本文深入探討 CJIT 的核心功能、它與前代產品的區別,以及社群的反應與見解,強調其在改變開發者如何利用 C 進行腳本編寫與快速應用程式開發方面的潛力。

什麼是 CJIT?

CJIT 被呈現為一個單一二進位檔的 C 編譯器與解釋器,旨在實現最大的可移植性與易用性。它將 TinyCC 編譯器連同其必要的標頭檔與標準函式庫封裝成一個小於 2MB 的精簡套件。這種設計理念消除了對複雜安裝、路徑配置或專用 IDE 的需求,使其成為需要快速設定環境的理想選擇。

它從 TempleOS 作業系統所使用的類 C 語言 HolyC 中汲取靈感,這暗示了其對簡單性與程式碼直接互動的關注。雖然 HolyC 較為深奧的面向並未被詳細說明其直接影響,但一種高度整合、即時編碼的體驗精神似乎是其驅動力量。

關鍵功能與可用性增強

CJIT 透過幾項改善使用者體驗的改進,解決了 C 開發中的常見痛點:

  • 即時部署:作為一個單一執行檔,CJIT 不需要進行系統級安裝、簽署 EULA,或進行 IDE 設定。這種「單一檔案 <2MB 大小」的方法確保了即時可用性。
  • 跨平台相容性:它支援 MS/Windows、Apple/OSX 以及 GNU/Linux,使其成為在不同作業系統上工作的開發者的多功能工具。
  • 多檔案執行:與標準的編譯器呼叫方式不同,CJIT 可以接受萬用字元來攝取多個 C 原始碼檔案、預編譯物件或共享函式庫,並將其整合進單次執行中。每個檔案匯出的符號 (symbols) 在同一次執行上下文 (context) 中對所有人都是可見的。
  • 自動函式庫發現:CJIT 會自動定位各個目標平台的常見系統函式庫,消除了開發者手動指定函式庫路徑與設定的需求。
  • 動態函式庫呼叫:它提供了使用任何在動態函式庫中找到的共享函式功能的能力,擴展了其與現有系統功能整合的實用性。
  • 快速原型設計:這些功能的結合使開發者能夠以空前的速度編寫與執行 C 應用程式,促進了快速原型設計的工作流程。

CJIT vs. TinyCC:深入探討

雖然 CJIT 是建立在 TinyCC 之上的,但一個常見問題是它與單純使用 tcc -run 有何區別。Hacker News 上的一位評論者提供了一個清晰的區別摘要:

CJIT 在可用性方面有所改進。目前 CJIT 改善了三個主要的 UX(使用者體驗)面向:它作為一個單一執行檔運作,其中嵌入了 TinyCC 編譯器、其所有標頭檔與標準函式庫。透過這種方式,不需要進行任何系統級安裝、檢查路徑或設定建置資料夾。它支援將多個檔案加入到一次執行中:可以接受萬用字元來攝取任何 C 原始碼、預編譯物件或共享函式庫。每個檔案匯出的符號在同一次執行中對所有人都是可見的。 它會自動尋找各個目標平台的常見系統函式庫,避免了重複這些設定並尋找正確路徑的需求。

這澄清了 CJIT 一個核心點:CJIT 並非對 C 編譯的根本性重新構想,而是對 TinyCC 周圍的開發者體驗進行了顯著的增強,專注於便利性並減少冗餘程式碼 (boilerplate)。

社群回饋與考量因素

Hacker News 的討論揭示了社群中一些有趣的點與問題:

可移植性與依賴性

雖然 CJIT 旨在實現可移植性,但部分使用者遇到了特定的依賴性問題。例如,一位使用者指出,專門為 cjit-x86_64-ubuntu-24.04 發行的版本在 Arch Linux 上無法運作,原因是缺少 libgcc_s.so.1,這暗示了 dlopen 的問題。這突顯了在 Linux 生態系中建立真正通用的二進位檔的持續挑戰,即使是對於追求極小依賴性的專案來說也是如此。

自我編譯能力 (Self-Hosting)

一個值得探討的問題是 CJIT 是否能編譯自己,這是 GCC 與 LLVM 等編譯器的一個常見基準。專案的 FAQ 中並未明確提到這一點,這使其成為社群未來探索的有趣領域。

作為腳本語言的潛力

有人建議將 CJIT 與 Fil-C(一種專為腳本編寫設計的 C 解釋器)等專案搭配使用,設想將 C 語言作為一種「真正名副其實的腳本語言」。這指向了對利用 C 的效能與在更動態、類腳本的環境中使用 C 的更廣泛興趣。

替代方案與靈感來源

Mir,另一個提供自定義 JIT 工具(包括 C 編譯器)的專案也被提及作為類似功能的替代方案。此外,HolyC 的靈感也引發了 curiosity,使用者們在想,除了即時 C 環境的通用概念之外,HolyC 究竟如何具體地影響了 CJIT。

微小觀察

一些使用者注意到了一些細節,例如文件中的經典「hello, world」範例使用了 fprintf(stderr, ...) 而非更常見的 printf。其他人則對網站的視覺設計進行了評論,稱其為「壓縮感」或類似於某些 AI 生成的審美風格。

使用 SDL 進行圖形化應用程式開發

CJIT 也透過整合 SDL (Simple DirectMedia Layer) 擁入圖形化 C 應用程式的世界。專案文件明確歡迎開發者進入這個令人興奮的領域,並提到 SDL 自 1998 年以來的悠久歷史。這種用於圖形開發的「內建電池 (batteries included)」方法進一步增強了 CJIT 對於快速原型設計(超越命令列工具)的吸引力。

結論

CJIT 代表了 C 開發工具領域中一次深思熟慮的演進,專注於透過可移植性、簡化的部署與智慧型依賴管理來增強使用者體驗。藉由建立在 TinyCC 之其上,並從 HolyC 汲取靈感,它為尋求在更靈活、即時 (just-in-time) 的方式下利用 C 的效能與控制力之開發者提供了極具吸引力的解決方案。雖然像通用二進位檔相容性等挑戰仍然存在,但 CJIT 使 C 開發變得更快速、更易於進行快速原型設計與腳本編寫的價值主張仍然強大,邀請開發者們來探索其功能於廣泛的應用場景中。

Sources