Zen C 是一種現代系統編程語言,可編譯為人類可讀的 GNU C/C11。它提供了一套豐富的特性,包括類型推斷、模式匹配、泛型、Trait、async/await 以及具有 RAII 能力的手動內存管理,同時保持 100% 的 C ABI 兼容性。
加入官方 Zen C Discord 服務器,參與討論、展示 Demo、提問或報告 Bug!
Zen C 項目包含多個倉庫。下面是主要的倉庫列表:
| 倉庫 | 描述 | 狀態 |
|---|---|---|
| zenc | Zen C 核心編譯器 (zc)、CLI 和標準庫。 |
活躍開發 |
| docs | 官方技術文檔與語言規範。 | 活躍 |
| rfcs | 徵求意見稿 (RFC) 倉庫。塑造語言的未來。 | 活躍 |
| vscode-zenc | 官方 VS Code 擴充功能(語法高亮、程式碼片段)。 | Alpha |
| www | zenc-lang.org 的源代碼。 |
活躍 |
| awesome-zenc | 精選的 Zen C 範例列表。 | 不斷增加 |
查看這些使用 Zen C 構建的項目:
- ZC-pong-3ds: Nintendo 3DS 上的 Pong 克隆版。
- zen-c-parin: 使用 Parin 的 Zen C 基礎範例。
- almond: 用 Zen C 編寫的極簡網頁瀏覽器。
| 通用 | 語言參考 |
|---|---|
git clone https://github.com/zenc-lang/zenc.git
cd zenc
make clean # 移除舊的構建文件
make
sudo make install
#### Development Targets
```bash
make format # Auto-format all source files with clang-format
make format-check # Verify formatting without changing files
make lint # Run format-check + shellcheck on test scripts
make bench # Run performance benchmarks
make WERROR=1 # Build with -Werror (warnings as errors)
### Unit Testing Framework
Zen C features a built-in testing framework with **per-test isolation**, **named output**, and **non-fatal assertions**.
For full details, see the [English README](../README.md#unit-testing-framework).
### Windows
Zen C 對 Windows (x86_64) 提供完備的原生支援。你可以使用提供的批处理脚本配合 GCC (MinGW) 進行構建:
```cmd
build.bat
這將構建編譯器 (zc.exe)。網路、檔案系統和程序操作通過平台抽象層 (PAL) 得到完全支援。
或者,如果你有類 Unix 環境(MSYS2、Cygwin、git-bash),也可以使用 make。
Zen C 可以通過 Cosmopolitan Libc 編譯為 Actually Portable Executable (APE)。這將生成一個單個的可執行文件 (.com),能夠原生運行在 Linux, macOS, Windows, FreeBSD, OpenBSD, 和 NetBSD 上的 x86_64 和 aarch64 架構上。
前提條件:
cosmocc工具鏈(必須在 PATH 中)
構建與安裝:
make ape
sudo env "PATH=$PATH" make install-ape產物:
out/bin/zc.com: 便攜式 Zen-C 編譯器。已將標準庫嵌入到可執行文件中。out/bin/zc-boot.com: 一個自包含的引導安裝程序,用於設置新的 Zen-C 項目。
用法:
# 在任何支持的操作系統上運行
./out/bin/zc.com build hello.zc -o helloZen C 分為可選模組。使用 ZC_* 標誌在構建時選擇功能:
| 標誌 | 預設值 | 排除項 |
|---|---|---|
ZC_LSP=0 |
1 | LSP 伺服器 (~8 個檔案) |
ZC_REPL=0 |
1 | 互動式 REPL (~6 個檔案) |
ZC_PLUGINS=0 |
1 | 外掛系統 |
ZC_ZEN=0 |
1 | --doc / --facts 模式 |
ZC_BACKENDS=0 |
1 | 非 C 後端 (JSON, Lisp 等) |
ZC_TRE=0 |
1 | TRE 正則表達式庫 |
make # 所有功能 (3.3 MB)
make lite # 無 LSP、REPL、Zen (2.9 MB)
make core # 僅編譯器 (2.7 MB)
make minimal # 最小構建 (2.6 MB)
# 自定義選擇:
make ZC_LSP=0 ZC_REPL=0 # 排除 LSP 和 REPL禁用的命令會顯示清晰的提示訊息而不會崩潰:zc lsp → "LSP support not included"。
# 編譯並運行
zc run hello.zc
# 構建可執行文件
zc build hello.zc -o hello
# 交互式 Shell
zc repl
# 文檔 (遞迴)
zc doc main.zc
# 文檔 (單文件, 無檢查)
zc doc --no-recursive-doc --no-check main.zc
# 顯示 Zen Facts
zc build hello.zc --zen你可以設置 ZC_ROOT 來指定標準庫的位置(標準導入如 import "std/vector.zc")。這允許你從任何目錄運行 zc。
export ZC_ROOT=/path/to/zenc有關更多詳細資訊,請參閲官方語言參考。
Zen C 包含一個涵蓋基本功能的標準庫 (std)。
點擊查看所有標準庫模塊
| 模塊 | 描述 | 文檔 |
|---|---|---|
std/bigfloat.zc |
任意精度浮點運算。 | 文檔 |
std/bigint.zc |
任意精度整數 BigInt。 |
文檔 |
std/bits.zc |
底層位運算操作 (rotl, rotr 等)。 |
文檔 |
std/complex.zc |
複數算術 Complex。 |
文檔 |
std/vec.zc |
可增長動態數組 Vec<T>。 |
文檔 |
std/string.zc |
堆分配的 String 類型,支持 UTF-8。 |
文檔 |
std/queue.zc |
先進先出隊列 (環形緩衝區)。 | 文檔 |
std/map.zc |
泛型哈希表 Map<V>。 |
文檔 |
std/fs.zc |
文件系統操作。 | 文檔 |
std/io.zc |
標準輸入/輸出 (print/println)。 |
文檔 |
std/option.zc |
可選值 (Some/None)。 |
文檔 |
std/result.zc |
錯誤處理 (Ok/Err)。 |
文檔 |
std/path.zc |
跨平台路徑操作。 | 文檔 |
std/env.zc |
進程環境變量。 | 文檔 |
std/net/ |
TCP, UDP, HTTP, DNS, URL. | 文檔 |
std/thread.zc |
線程與同步。 | 文檔 |
std/time.zc |
時間測量與睡眠。 | 文檔 |
std/json.zc |
JSON 解析與序列化。 | 文檔 |
std/stack.zc |
後進先出棧 Stack<T>。 |
文檔 |
std/set.zc |
泛型哈希集合 Set<T>。 |
文檔 |
std/process.zc |
進程執行與管理。 | 文檔 |
std/regex.zc |
正則表達式 (基於 TRE)。 | 文檔 |
std/simd.zc |
原生 SIMD 向量類型。 | 文檔 |
Zen C 提供內置的語言服務器 (LSP) 和 REPL 以增強開發體驗。
Zen C 語言服務器 (LSP) 支持標準的 LSP 特性,用於編輯器集成:
- 轉到定義
- 查找引用
- 懸停信息
- 補全 (函數/結構體名,方法/字段的點補全)
- 文檔符號 (大綱)
- 簽名幫助
- 診斷 (語法/語義錯誤)
啟動語言服務器(通常在編輯器的 LSP 設置中配置):
zc lsp它通過標準 I/O (JSON-RPC 2.0) 進行通信。
Read-Eval-Print Loop (REPL) 允許您使用現代的程序內 JIT 編譯(由 LibTCC 提供支持)互動式地嘗試 Zen C 程式碼。
zc repl-
JIT 執行:程式碼在記憶體中編譯並直接在 REPL 程序中執行,以實現極速的快反饋。
-
交互式編碼:輸入表達式或語句以立即求值。
-
持久歷史:命令保存在
~/.zprep_history中。 -
啟動腳本:自動加載
~/.zprep_init.zc中的命令。
| 命令 | 描述 |
|---|---|
:help |
顯示可用命令。 |
:reset |
清除當前會話歷史 (變量/函數)。 |
:vars |
顯示活躍變量。 |
:funcs |
顯示用戶定義的函數。 |
:structs |
顯示用戶定義的結構體。 |
:imports |
顯示活躍導入。 |
:history |
顯示會話輸入歷史。 |
:type <expr> |
顯示表達式的類型。 |
:c <stmt> |
顯示語句生成的 C 代碼。 |
:time <expr> |
基准測試表達式 (運行 1000 次迭代)。 |
:edit [n] |
在 $EDITOR 中編輯命令 n (默認:最後一條)。 |
:save <file> |
將當前會話保存到 .zc 文件。 |
:load <file> |
將 .zc 文件加載並執行到會話中。 |
:watch <expr> |
監視表達式 (每次輸入後重新求值)。 |
:unwatch <n> |
移除監視。 |
:undo |
從會話中移除最後一條命令。 |
:delete <n> |
移除索引為 n 的命令。 |
:clear |
清屏。 |
:quit |
退出 REPL。 |
! <cmd> |
運行 shell 命令 (如 !ls)。 |
Zen C 包含一個內建的語言伺服器,用於編輯器整合。
- 安裝與設定指南
- 支援的編輯器: VS Code, Neovim, Vim, Zed, 以及任何支援 LSP 的編輯器。
使用 zc lsp 啟動服務器。
Zen C 程序可以使用標準的 C 調試器(如 LLDB 或 GDB)進行調試。
為了在 VS Code 中獲得最佳體驗,請安裝官方的 Zen C 擴充功能。對於調試,您可以使用 C/C++(由 Microsoft 提供)或 CodeLLDB 擴充功能。
將這些配置添加到您的 .vscode 目錄中,以啟用一鍵調試:
tasks.json (構建任務):
{
"label": "Zen C: Build Debug",
"type": "shell",
"command": "zc",
"args": [ "${file}", "-g", "-o", "${fileDirname}/app", "-O0" ],
"group": { "kind": "build", "isDefault": true }
}launch.json (調試器):
{
"name": "Zen C: Debug (LLDB)",
"type": "lldb",
"request": "launch",
"program": "${fileDirname}/app",
"preLaunchTask": "Zen C: Build Debug"
}Zen C 旨在與大多數 C11 編譯器配合使用。某些特性依賴於 GNU C 擴展,但這些擴展通常在其他編譯器中也能工作。使用 --cc 標誌切換後端。
zc run app.zc --cc clang
zc run app.zc --cc zig點擊查看編譯器支持詳情
| 編譯器 | 通過率 | 受支持特性 | 已知局限性 |
|---|---|---|---|
| GCC | 100% (全面) | 所有特性 | 無. |
| Clang | 100% (全面) | 所有特性 | 無. |
| Zig | 100% (全面) | 所有特性 | 無. 使用 zig cc 作為替代 C 編譯器. |
| TCC | 98% (高) | 結構體, 泛型, Trait, 模式匹配 | 不支持 Intel ASM, 不支持 __attribute__((constructor)). |
Warning
編譯器構建警告: 雖然 Zig CC 作為 Zen C 程序的後端非常出色,但使用它構建 Zen C 編譯器本身可能會通過驗證,但會生成無法通過測試的不穩定二進制文件。我們建議使用 GCC 或 Clang 構建編譯器,並僅將 Zig 用作操作代碼的後端。
Zen C 測試套件包含針對 MISRA C:2012 指南的驗證。
Important
MISRA 免責聲明 本項目完全獨立,與 MISRA (Motor Industry Software Reliability Association) 沒有任何關聯、官方認可或商業合作關係。
由於嚴格的版權限制,測試用例僅通過數字標識符列出指南,避免發布內部具體規範。需要原始文檔的用戶,請前往 MISRA 官方門戶網站 獲取真實可靠的指南材料。
Zig 的 zig cc 命令提供了 GCC/Clang 的替代方案,具有出色的跨平台編譯支持。使用 Zig:
# 使用 Zig 編譯並運行 Zen C 程序
zc run app.zc --cc zig
# 使用 Zig 構建 Zen C 編譯器本身
make zigZen C 通過 --backend 標誌支援多種輸出後端。每個後端生成不同的目標格式:
| 後端 | 標誌 | 副檔名 | 描述 |
|---|---|---|---|
| C | --backend c |
.c |
預設 — GNU C11 |
| C++ | --backend cpp |
.cpp |
相容 C++11(也可使用 --cpp) |
| CUDA | --backend cuda |
.cu |
NVIDIA CUDA C++(也可使用 --cuda) |
| Objective-C | --backend objc |
.m |
Objective-C(也可使用 --objc) |
| JSON | --backend json |
.json |
機器可讀的 AST,用於工具 |
| AST 轉儲 | --backend ast-dump |
.ast |
人類可讀的 AST 樹(除錯) |
| Lisp | --backend lisp |
.lisp |
轉譯為 Common Lisp(sbcl --script) |
| Graphviz | --backend dot |
.dot |
視覺化 AST 圖(dot -Tpng ast.dot -o ast.png) |
後端特定選項可以通過 --backend-opt 設定:
# 美化輸出 JSON
zc transpile file.zc --backend json --backend-opt pretty
# 顯示完整原始內容(不截斷)
zc transpile file.zc --backend lisp --backend-opt full-content
# 或使用便捷別名:
zc transpile file.zc --backend json --json-pretty
zc transpile file.zc --backend lisp --backend-full-content所有後端選項都是自說明的 — 未知的 -- 標誌會自動對照已註冊的後端別名進行檢查。
Zen C 可以通過 --backend cpp 標誌(簡稱 --cpp)生成 C++ 兼容的代碼,從而實現與 C++ 庫的無縫集成。
# 直接使用 g++ 編譯
zc app.zc --backend cpp
# 或者轉譯用於手動構建
zc transpile app.zc --backend cpp
g++ out.cpp my_cpp_lib.o -o app包含 C++ 頭文件並在 raw 塊中使用 C++ 代碼:
include <vector>
include <iostream>
raw {
std::vector<int> make_vec(int a, int b) {
return {a, b};
}
}
fn main() {
let v = make_vec(1, 2);
raw { std::cout << "Size: " << v.size() << std::endl; }
}
Note
--cpp 標誌會將後端切換為 g++ 並發出 C+ 兼容的代碼(使用 auto 代替 __auto_type,使用函數重載代替 _Generic,以及對 void* 進行顯式轉換)。
Zen C 通過轉譯為 CUDA C++ 來支持 GPU 編程,使用 --backend cuda 標誌(簡稱 --cuda)。這使你在維持 Zen C 人體工程學語法的同時,能夠利用內核中的強大 C++ 特性(模板、constexpr)。
# 直接使用 nvcc 編譯
zc run app.zc --backend cuda
# 或者轉譯用於手動構建
zc transpile app.zc --backend cuda -o app.cu
nvcc app.cu -o app| 屬性 | CUDA 等效項 | 描述 |
|---|---|---|
@global |
__global__ |
內核函數 (運行在 GPU,從主機調用) |
@device |
__device__ |
設備函數 (運行在 GPU,從 GPU 調用) |
@host |
__host__ |
主機函數 (明確僅 CPU 運行) |
Zen C 提供了一個簡潔的 launch 語句用於調用 CUDA 內核:
launch kernel_name(args) with {
grid: num_blocks,
block: threads_per_block,
shared_mem: 1024, // 可選
stream: my_stream // 可選
};
這轉譯為:kernel_name<<<grid, block, shared, stream>>>(args);
使用帶有 @global 的 Zen C 函數語法和 launch 語句:
import "std/cuda.zc"
@global
fn add_kernel(a: float*, b: float*, c: float*, n: int) {
let i = thread_id();
if i < n {
c[i] = a[i] + b[i];
}
}
fn main() {
def N = 1024;
let d_a = cuda_alloc<float>(N);
let d_b = cuda_alloc<float>(N);
let d_c = cuda_alloc<float>(N);
defer cuda_free(d_a);
defer cuda_free(d_b);
defer cuda_free(d_c);
// ... 初始化數據 ...
launch add_kernel(d_a, d_b, d_c, N) with {
grid: (N + 255) / 256,
block: 256
};
cuda_sync();
}
Zen C 為常見的 CUDA 操作提供了一個標準庫,以減少 raw 塊的使用:
import "std/cuda.zc"
// 內存管理
let d_ptr = cuda_alloc<float>(1024);
cuda_copy_to_device(d_ptr, h_ptr, 1024 * sizeof(float));
defer cuda_free(d_ptr);
// 同步
cuda_sync();
// 線程索引 (在內核內部使用)
let i = thread_id(); // 全局索引
let bid = block_id();
let tid = local_id();
Note
注意: --cuda 標誌設置 nvcc 為編譯器並隱含 --cpp 模式。需要安裝 NVIDIA CUDA Toolkit。
當使用相容的後端編譯器(GCC 14+, Clang 14+)時,Zen C 支援現代 C23 特性。
auto: 如果__STDC_VERSION__ >= 202300L,Zen C 會自動將型別推導映射到標準 C23auto。_BitInt(N): 使用iN和uN型別(例如i256,u12,i24)存取 C23 任意位元寬度整數。
Zen C 可以通過 --backend objc 標誌(簡稱 --objc)編譯為 Objective-C (.m),允許你使用 Objective-C 框架(如 Cocoa/Foundation)和語法。
# 使用 clang 編譯(或 gcc/gnustep)
zc app.zc --backend objc --cc clang使用 include 包含頭文件,並在 raw 塊中使用 Objective-C 語法 (@interface, [...], @"")。
//> macos: framework: Foundation
//> linux: cflags: -fconstant-string-class=NSConstantString -D_NATIVE_OBJC_EXCEPTIONS
//> linux: link: -lgnustep-base -lobjc
include <Foundation/Foundation.h>
fn main() {
raw {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"來自 Objective-C 的問候!");
[pool drain];
}
println "Zen C 也能正常工作!";
}
Note
注意: Zen C 字符串插值通過調用 debugDescription 或 description 同樣適用於 Objective-C 對象 (id)。
Zen C 内置了測試框架,允許你使用 test 關鍵字直接在源文件中編寫單元測試。
test 塊包含一個描述性名稱和要執行的代碼體。測試不需要 main 函數即可運行。
test "unittest1" {
"這是一個單元測試";
let a = 3;
assert(a > 0, "a 應該是一個正整數");
"unittest1 通過。";
}
要運行文件中的所有測試,請使用 run 命令。編譯器將自動檢測並執行所有頂層 test 塊。
zc run my_file.zc使用內置的 assert(condition, message) 函數來驗證預期。如果條件為假,測試將失敗並打印提供的消息。
Zen C 可以通過 src/public/*.h 中的公共標頭檔作為 C 函式庫使用。這些標頭檔無需 -DZC_ALLOW_INTERNAL 即可編譯,並提供了將編譯器嵌入到您自己的工具中的穩定 API:
#include <zc_core.h>
#include <zc_driver.h>
#include <zc_diag.h>
int main(void) {
ZenCompiler compiler = {0};
compiler.config.input_file = "source.zc";
return driver_run(&compiler);
}編譯方式:
cc -I src/public -I src -I src/utils my_tool.c -o my_tool安裝後(make install):
cc -I /usr/local/include/zenc my_tool.c -o my_tool公共 API 涵蓋:
zc_core.h—CompilerConfig、ZenCompiler、ASTNode、Type類型,解析器入口點,類型內省輔助函數zc_driver.h—driver_run()、driver_compile()(完整管線編排)zc_codegen.h—codegen_node()、emit_preamble()、format_expression_as_c()zc_analysis.h—check_program()、check_moves_only()、resolve_alias()zc_diag.h—zerror_at()、zwarn_at()、zpanic_at(),診斷報告zc_utils.h—Emitter(輸出緩衝區)、load_file()、z_resolve_path()
使用 sudo make install 安裝以部署標頭檔、二進位檔、手冊頁和標準函式庫。
我們歡迎各類貢獻!無論是修復 Bug、完善文檔,還是提出新功能建議。
請參閱 CONTRIBUTING_ZH_TW.md 了解有關如何貢獻、運行測試和提交拉取請求的詳細指南。
關於安全漏洞報告的說明,請參閱 SECURITY_ZH_TW.md。
本項目使用了第三方庫。完整許可證文本可在 LICENSES/ 目錄中找到。
- cJSON (MIT 許可證):用於語言服務器中的 JSON 解析和生成。
- zc-ape (MIT 許可證):由 Eugene Olonov 開發的原版 Zen-C 實際上便攜的可執行文件 (APE) 端口。
- Cosmopolitan Libc (ISC 許可證):使 APE 成為可能納基礎庫。
- TRE (BSD 許可證):用於標準庫中的正則表達式引擎。
- zenc.vim (MIT 許可證):官方 Vim/Neovim 插件,主要由 davidscholberg 編寫。
- TinyCC (LGPL 許可證):用於高效能 REPL 評估的基礎 JIT 引擎。