C系编程语言之C3


C3 是基于 C 的编程语言,它是 C语言的一种演变,其目标是在尽可能保留 C 相同语法情况下进行改进。是一种进化,而不是一场革命。采用LGPLv3或MIT协议授权。

C3 is a programming language that builds on the syntax and semantics of the C language, with the goal of evolving it while still retaining familiarity for C programmers. It's an evolution, not a revolution: the C-like for programmers who like C.
C3 大刀阔斧地砍掉了一些 C 的“历史包袱”,又引入了不少现代语言的优秀特性。官方的FAQ中有与D、C++、Rust、Zig、Odin等语言的简单对比。
该门语言找准了一个非常好的定位:它没有试图去完全取代 C,也没有像 Rust 那样引入复杂的所有权系统,而是选择了一条更温和的“改良”路线。其保留了 C 的简洁、高效和控制力,同时又吸收了现代语言的诸多优点,解决了 C 的不少痛点。
如果你是 C/C++ 开发者,厌倦了头文件、宏、手动内存管理的折腾,又不想彻底投入到一门全新的、学习曲线陡峭的语言(比如 Rust),那么 C3 绝对值得花点时间了解一下。它可能不会改变世界,但也许能让人在写底层代码或者高性能应用时,减少一些心智困惑。
1. 告别头文件,拥抱模块化
还记得被 .h 文件支配的恐惧吗?C3 直接用模块(Module) 来管理代码组织和命名空间。一个文件就是一个模块,想用别的模块的功能?直接 import 就行。编译器会自动处理依赖,不用操心头文件路径、循环引用这些事儿。
2. 更安全、更强大的“语义宏”
C 语言的 #define 宏是纯文本替换,没类型检查,容易出问题。C3 搞了一套语义宏(Semantic Macros),它在编译时运行,能理解代码结构,进行更复杂的代码生成和转换,而且是类型安全的。虽然官方文档没细说具体咋用,但听起来就比 #define 高级。
3. 泛型?
C 里面搞泛型要么用 void* 加类型转换(不安全),要么用宏(丑陋且易错)。C3 直接内置了基于模块的泛型。
4. 告别返回值判断,拥抱“Result”式错误处理!
C 语言处理错误,通常是靠函数返回值(比如 -1, NULL)配合 errno 全局变量,写起来繁琐,还容易忘。C3 引入了基于“Result”的零开销错误处理(类似 Rust)。函数可以返回一个包含成功值或错误信息的类型,强制处理可能出现的错误,代码更健壮。还提供了 defer 语句(类似 Go),确保资源能被正确释放,比如文件句柄、锁等,再也不怕忘记 free 或者 fclose 了!
5. 还有一堆好东西
• 切片(Slices): 更安全、更方便地处理连续内存块,再也不怕数组越界了(相比裸指针)。
• 编译时反射和执行: 让你在编译阶段就能检查类型、执行代码,搞些元编程的骚操作。
• 值方法(Value Methods): 就是上面 Stack.push 那种,可以用 my_stack.push() 调用的函数,写起来更自然。
• 带有关联数据的枚举(Associated enum data): 让枚举类型能携带额外信息,更强大。
• 干掉预处理器: 前面说了,#define 的坑没了!
• 更少的未定义行为 + “安全”模式: C3 努力减少 C 语言中那些易出错的未定义行为,并且提供了一个“安全”编译模式,增加运行时检查,帮抓 bug。
一表胜千言:用表格对比下 C 和 C3 的关键区别:
为了证明自己,C3 团队直接把著名的 vkQuake(用 Vulkan API 渲染的 Quake 引擎)的一部分 C 代码用 C3 重写了,并且用 C3 的编译器 c3c 编译通过!这充分说明了 C3 和 C 的互操作性能力;可以把新代码用 C3 写,老代码还用 C,混在一起编译运行,完全没问题!这对想逐步迁移老项目的团队来说,简直是福音。
简单上手试练
1. 下载: 去 GitHub Releases 页面(搜 c3lang/c3c 就能找到)下载对应你操作系统的预编译包(比如 c3-windows.zip, c3-linux.tar.gz, c3-macos.zip)。
2. 解压: 把编译器 c3c (或 c3c.exe) 和标准库 lib/std 解压到你喜欢的地方。
3. 写个 Hello World:
// 创建一个 main.c3 文件
module hello_world; // 定义模块名
import std::io; // 导入标准库的 io 模块
fn void main() {
io::printn("Hello, C3 world!"); // 调用 io 模块的 printn 函数打印带换行符的字符串
}
4. 编译运行: 打开终端(命令行),cd 到你的 main.c3 文件所在的目录,然后运行:
# 假设 c3c 在你的 PATH 环境变量里,或者使用解压后的路径
# 编译器会自动查找同级或上一级目录的 lib/std 标准库
c3c compile main.c3
如果一切顺利,会生成一个名为 hello_world (Linux/macOS) 或 hello_world.exe (Windows) 的可执行文件。运行它,就能看到输出了。
最新版本:0.7
v0.7.0于2025年3月下旬发布。是目前的稳定版本,编译器已经在 Windows、Linux、MacOS 上验证通过了,并且提供了预编译好的二进制文件,下载解压就能用,非常方便。官方 README 里有非常详细的在各个平台(包括 Arch Linux, Fedora, Void Linux, Docker, Homebrew, Scoop 等)的安装和从源码编译的指南,这里就不赘述了,感兴趣可以去 GitHub 仓库看。
官方主页:https://c3-lang.org/
https://github.com/c3lang/
C3 is a programming language that builds on the syntax and semantics of the C language, with the goal of evolving it while still retaining familiarity for C programmers. It's an evolution, not a revolution: the C-like for programmers who like C.
C3 大刀阔斧地砍掉了一些 C 的“历史包袱”,又引入了不少现代语言的优秀特性。官方的FAQ中有与D、C++、Rust、Zig、Odin等语言的简单对比。
该门语言找准了一个非常好的定位:它没有试图去完全取代 C,也没有像 Rust 那样引入复杂的所有权系统,而是选择了一条更温和的“改良”路线。其保留了 C 的简洁、高效和控制力,同时又吸收了现代语言的诸多优点,解决了 C 的不少痛点。
如果你是 C/C++ 开发者,厌倦了头文件、宏、手动内存管理的折腾,又不想彻底投入到一门全新的、学习曲线陡峭的语言(比如 Rust),那么 C3 绝对值得花点时间了解一下。它可能不会改变世界,但也许能让人在写底层代码或者高性能应用时,减少一些心智困惑。
1. 告别头文件,拥抱模块化
还记得被 .h 文件支配的恐惧吗?C3 直接用模块(Module) 来管理代码组织和命名空间。一个文件就是一个模块,想用别的模块的功能?直接 import 就行。编译器会自动处理依赖,不用操心头文件路径、循环引用这些事儿。
2. 更安全、更强大的“语义宏”
C 语言的 #define 宏是纯文本替换,没类型检查,容易出问题。C3 搞了一套语义宏(Semantic Macros),它在编译时运行,能理解代码结构,进行更复杂的代码生成和转换,而且是类型安全的。虽然官方文档没细说具体咋用,但听起来就比 #define 高级。
3. 泛型?
C 里面搞泛型要么用 void* 加类型转换(不安全),要么用宏(丑陋且易错)。C3 直接内置了基于模块的泛型。
4. 告别返回值判断,拥抱“Result”式错误处理!
C 语言处理错误,通常是靠函数返回值(比如 -1, NULL)配合 errno 全局变量,写起来繁琐,还容易忘。C3 引入了基于“Result”的零开销错误处理(类似 Rust)。函数可以返回一个包含成功值或错误信息的类型,强制处理可能出现的错误,代码更健壮。还提供了 defer 语句(类似 Go),确保资源能被正确释放,比如文件句柄、锁等,再也不怕忘记 free 或者 fclose 了!
5. 还有一堆好东西
• 切片(Slices): 更安全、更方便地处理连续内存块,再也不怕数组越界了(相比裸指针)。
• 编译时反射和执行: 让你在编译阶段就能检查类型、执行代码,搞些元编程的骚操作。
• 值方法(Value Methods): 就是上面 Stack.push 那种,可以用 my_stack.push() 调用的函数,写起来更自然。
• 带有关联数据的枚举(Associated enum data): 让枚举类型能携带额外信息,更强大。
• 干掉预处理器: 前面说了,#define 的坑没了!
• 更少的未定义行为 + “安全”模式: C3 努力减少 C 语言中那些易出错的未定义行为,并且提供了一个“安全”编译模式,增加运行时检查,帮抓 bug。
一表胜千言:用表格对比下 C 和 C3 的关键区别:
特性 | C 语言 | C3 语言 | 好处 |
代码组织 | 头文件 (.h) + 源文件 (.c) | 模块 (module) + import | 依赖清晰,编译快,无头文件地狱 |
宏 | #define (文本替换) | 语义宏 (Semantic Macros) | 类型安全,功能更强,不易出错 |
泛型 | void* + 强制转换 / 宏 | 基于模块的泛型 (module {Type}) | 类型安全,代码复用,清晰简洁 |
错误处理 | 返回值 + errno | Result 类型 + defer | 强制错误处理,代码健壮,资源管理方便 |
内存安全 | 手动管理,易错 (野指针、越界) | 切片 (Slices),安全模式下有运行时检查 | 减少内存错误,提高安全性 |
预处理器 | 有 (#include, #define 等) | 无 | 语法更干净,减少意外错误 |
与 C 兼容性 | N/A | 完全兼容 C ABI | 无缝集成现有 C 代码,渐进式迁移 |
现代特性 | 较少 | 编译时反射/执行,值方法,带数据枚举等 | 开发效率更高,代码表达力更强 |
学习曲线 (对C) | N/A | 非常平缓 | C 程序员可快速上手 |
为了证明自己,C3 团队直接把著名的 vkQuake(用 Vulkan API 渲染的 Quake 引擎)的一部分 C 代码用 C3 重写了,并且用 C3 的编译器 c3c 编译通过!这充分说明了 C3 和 C 的互操作性能力;可以把新代码用 C3 写,老代码还用 C,混在一起编译运行,完全没问题!这对想逐步迁移老项目的团队来说,简直是福音。
简单上手试练
1. 下载: 去 GitHub Releases 页面(搜 c3lang/c3c 就能找到)下载对应你操作系统的预编译包(比如 c3-windows.zip, c3-linux.tar.gz, c3-macos.zip)。
2. 解压: 把编译器 c3c (或 c3c.exe) 和标准库 lib/std 解压到你喜欢的地方。
3. 写个 Hello World:
// 创建一个 main.c3 文件
module hello_world; // 定义模块名
import std::io; // 导入标准库的 io 模块
fn void main() {
io::printn("Hello, C3 world!"); // 调用 io 模块的 printn 函数打印带换行符的字符串
}
4. 编译运行: 打开终端(命令行),cd 到你的 main.c3 文件所在的目录,然后运行:
# 假设 c3c 在你的 PATH 环境变量里,或者使用解压后的路径
# 编译器会自动查找同级或上一级目录的 lib/std 标准库
c3c compile main.c3
如果一切顺利,会生成一个名为 hello_world (Linux/macOS) 或 hello_world.exe (Windows) 的可执行文件。运行它,就能看到输出了。
最新版本:0.7
v0.7.0于2025年3月下旬发布。是目前的稳定版本,编译器已经在 Windows、Linux、MacOS 上验证通过了,并且提供了预编译好的二进制文件,下载解压就能用,非常方便。官方 README 里有非常详细的在各个平台(包括 Arch Linux, Fedora, Void Linux, Docker, Homebrew, Scoop 等)的安装和从源码编译的指南,这里就不赘述了,感兴趣可以去 GitHub 仓库看。
官方主页:https://c3-lang.org/
https://github.com/c3lang/