news 2026/9/17 22:13:30

C3 语言项目贡献指南:从 c3c 编译器到标准库的完整参与路线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C3 语言项目贡献指南:从 c3c 编译器到标准库的完整参与路线

C3 语言项目贡献指南:从 c3c 编译器到标准库的完整参与路线

【免费下载链接】c3cCompiler for the C3 language项目地址: https://gitcode.com/GitHub_Trending/c3/c3c

C3 是一个面向构建高性能原生软件的通用编程语言,其官方编译器为 c3c,项目还包含标准库与各类工具。本文以官方贡献指南 CONTRIBUTING.md 为骨架,结合仓库内的源码、测试套件与风格规范,系统讲解开发者如何从零参与 C3 语言、c3c 编译器、标准库与周边工具的贡献,读完即可掌握提 PR、写测试、维护模块以及合理使用 AI 助手的完整实战路径。

C3 项目的组成

在动手贡献之前,需要先理解 C3 项目由哪几部分构成。根据 CONTRIBUTING.md 的划分,整个项目包含四大部分:

  1. C3 语言本身:即语言规范(language specification),定义了语法与语义;
  2. C3 编译器 c3c:负责把 C3 代码编译为原生可执行文件的编译器本体,位于本仓库的 src/compiler 目录;
  3. C3 标准库:随编译器一同分发的标准库实现,位于 lib/std 目录;
  4. 各类工具:如编辑器插件、安装脚本、CI 工具等,本仓库中的 scripts、install、docker、wrapper 等目录即属此类。

不同的组成部分有不同的贡献方式、质量要求和审查流程,下文逐一展开。

一、如何贡献到 C3 语言本身

C3 语言本质上就是语言规范。语言本身的演进不需要直接改编译器代码,你可以通过以下方式参与:

  1. 提交增强请求(enhancement request):对语言的改动提出正式的功能请求;
  2. 反馈现有特性:在 Discord 社区讨论,或通过提交 issue 反馈对现有语言特性的看法;
  3. 参与语言规范编写:帮助完善和维护语言规范文档;
  4. 参与语法(grammar)工作:帮助打磨语言的形式化语法定义。

这类贡献的价值在于:语言层面的每一个改动都会辐射到编译器、标准库和所有用户代码,因此在动手写代码之前,先在语言规范层面形成共识是最稳妥的路径。

二、如何贡献到 c3c 编译器

编译器是 C3 项目最核心的组成部分,其源码位于 src/compiler,包含语义分析(sema_*.c)、代码生成(c_codegen.cllvm_codegen*.c)、词法/语法解析(lexer.cparser.c)等 60 余个 C 源文件。编译器贡献方式按优先级排列如下:

  1. 提交 bug 报告:官方明确标注这是"by far the most important thing"(迄今为止最重要的事),编译器的正确性依赖社区的 bug 反馈;
  2. 改进诊断信息/错误消息:让编译器在出错时给出更清晰、更可操作的提示;
  3. 重构现有代码:这需要深入理解编译器内部结构,适合有经验的贡献者;
  4. 增加对更多架构的支持:目前编译器已有abi/c_abi_aarch64.cabi/c_abi_riscv.cabi/c_abi_wasm.cabi/c_abi_win64.cabi/c_abi_x64.cabi/c_abi_x86.c等多套 ABI 实现,新增架构意味着新增对应 ABI 与目标支持;
  5. 增加对更多后端(backend)的支持:目前仓库同时维护 C 代码生成(c_codegen.c)与 LLVM 后端(llvm_codegen.c)两套后端,贡献者可在此基础上探索新后端。

编译器代码风格须知

修改编译器 C 代码时,请遵循 CODESTYLE.md 中针对 C 源码的约定,关键规则包括:

  • 命名:常量与宏使用大写下划线蛇形(THIS_IS_A_CONSTANT);用户自定义类型使用大写驼峰(MyLittleType);函数与变量使用小写蛇形(my_little_function);作用于特定对象的函数应以类型名的小写蛇形作为前缀,如type_info_new
  • 大括号:采用 Allman 风格,{独占一行;
  • 缩进:统一使用 Tab,源码中禁止出现 CRLF;
  • 间距:控制语句与括号之间留空格(if (foo)),逗号后留空格,赋值运算符两侧留空格,但括号内侧不留空格;
  • goto 标签不缩进case语句缩进一个 Tab,case内的代码再缩进一层。

编译器内部机制要点

CODESTYLE.md 还披露了编译器内部的重要实现细节,理解这些有助于写出符合架构的代码:

  • Arena 分配器:编译器使用一个直到编译器退出才释放的 arena 分配器;此外还有针对DeclAst等特定类型的分配器,这些分配器在代码生成阶段之前会被丢弃,因此任何代码生成阶段的代码都不能引用这些分配器管理的对象
  • 动态数组:编译器内部大量使用基于 arena 的动态数组,创建方式是把指针声明为NULL后用vec_add追加元素:
Foo *foos = NULL; vec_add(foos, (Foo) { 1, 2 });

遍历则使用VECEACH宏;

  • 字符串临时缓冲区global_context中提供了字符串 scratch buffer,处理临时字符串时应优先使用它配套的相关函数。

依赖约束

编译器设计上刻意保持最小依赖:目前 c3c 只依赖 LLVM 和 libc,外加一个可选的 libcurl。贡献代码时不要随意引入新的外部库——外部库存在维护性问题,应当尽量"重写所需功能的子集"而不是"整库复制需要单独更新的库"。

三、如何贡献到标准库

标准库位于 lib/std,覆盖集合(collections)、哈希(hash)、加密(crypto)、编码(encoding)、数学(math)、网络(net)、IO(io)、线程(threads)等数十个模块。贡献方式包括:

  1. 提交标准库 bug;
  2. 编写额外的单元测试;
  3. 通过 issue 建议新功能;
  4. 参与标准库新增功能的实现;
  5. 修复标准库中的 bug;
  6. 维护标准库的某一部分(详见下文"维护标准库模块")。

小型新增(small stdlib additions)

如果只是给现有模块增加一两个函数,直接提一个 pull request 即可。但必须满足三个硬性要求:

  1. 遵循代码规范:保证统一的命名、缩进、大括号风格(标准库的风格要求见 CODESTYLE.md 后半部分,详见下一小节);
  2. 在发布说明中加一行:即 releasenotes.md,仓库的发布说明按版本号组织(如0.8.4 Change list),并在### Stdlib changes一节记录标准库变更;
  3. 确保有单元测试

大型新增(non-trivial additions)必须经历"孵化"

无论一项新增功能最终是否被批准合入,它都必须经历孵化过程(incubate):

  1. 先独立实现:以独立项目的形式实现并运行良好,证明设计是可靠的。这样做的好处是社区成员可以参与进来,甚至可以创建竞争性实现进行比较;
  2. 完成后提案合入:只有当实现被认为"完成"时,才可以提案加入标准库。

官方指南强调,这一流程能大幅提升新增功能的质量。此外,任何新功能在进入标准库之前,都需要一整套完整的单元测试

标准库风格规范要点

CODESTYLE.md 从第 152 行开始给出了 C3 标准库的专属风格要求,遵循它们能显著加快 PR 被接受的进度:

  • 大括号放在下一行
// 推荐 fn void foo(String bar) { @pool() { ... }; }
  • 缩进使用 Tab,不使用空格,源码中无 CRLF;
  • 类型名使用 PascalCase,而非Ada_Case:写enum MyEnum,不要写enum My_Enum
  • 绑定 OS 库时的类型命名:优先保留原始名称;无法保留时二选一——加前缀(HANDLEWin32_HANDLE)或把首字母大写(mode_tMode_t);
  • 变量、函数、方法和全局量使用 snake_case:写some_globalopen_file,不要写someGlobalopenFile;绑定 OS 库时同样优先保留原名,其次加win32_前缀或把首字母小写(GetWindowLongPtrWgetWindowLongPtrW);
  • 方法第一个参数使用self:除非有充分的理由,否则方法的第一参数统一命名为self
  • 分配器参数:分配器参数一律命名为allocator,并作为第一个常规参数传入。

测试是硬性要求

无论是新增还是修复,标准库改动都应配套测试。仓库中标准库测试的固定位置是 test/unit/stdlib,其目录结构与lib/std的模块划分一一对应(collectionshashcryptomaththreadstime等),例如字符串相关测试位于 test/unit/stdlib/string.c3。

维护标准库的某一部分

单一维护者无法覆盖整个标准库,因此 C3 项目采用按模块配置维护者的模式:每个模块需要一位或多位维护者,负责:

  • 审查该模块相关的 pull request;
  • 主动推动模块代码达到"pristine"(至臻)质量。

如果你想长期深度参与某个模块,成为其维护者是最有影响力的贡献方式。

四、如何贡献到各类工具

项目中的各类工具(编辑器插件等)贡献方式相对简单:一般直接提 pull request。但由于每个工具可能有不同的维护者,具体规则以维护者为准,提 PR 前建议先与对应维护者沟通确认。

本仓库中与工具相关的目录包括 install(安装脚本)、scripts/tools(CI 与打包脚本)等,它们同样是可贡献的对象。

五、AI 在贡献中的使用规范

这是 CONTRIBUTING.md 中最新加入的重要章节,核心立场是:AI 工具不改变贡献者的责任。官方将 AI 视为工具,而非对理解和努力的替代。

Pull Request 相关要求

  • 你必须完全理解并能解释提交的所有代码
  • 代码必须达到正常标准:风格、清晰度与测试缺一不可;
  • 尊重维护者时间:不要把 PR 审查当成 AI 的反馈循环——如果审查所花精力超过了实现本身,该 PR 可能被直接拒绝;
  • 如果代码中有相当部分是 AI 生成的,必须透明声明
  • 版权风险:AI 生成代码的法律地位尚不确定,未来可能被认定为受版权约束;因此直接复制粘贴的 AI 生成代码不能被接受

Issue 与报告相关要求

  • 提交前核实所有论断、错误信息和可复现步骤
  • 不要直接粘贴 AI 的原始输出,应当用自己的话写出简洁的报告。

附:如何验证你的改动——仓库测试体系

贡献指南强调测试的重要性("If it isn't tested it doesn't work",见 CODESTYLE.md),仓库为此搭建了完整的测试体系,了解它能让你的 PR 更容易通过审查:

  • 编译器测试套件:位于 test/test_suite,按语言特性分目录组织(abiarraysbitstructcompile_timemacrosgenericserrorsexpressionsstatements等 50+ 个分类),测试文件以.c3t(应成功编译运行)与.c3(应报错的负向测试)区分;
  • 标准库单元测试:位于 test/unit/stdlib 及 test/unit/regression;
  • 测试运行器:test/src/test_suite_runner.c3 是一个用 C3 自身编写的并行测试驱动,支持--threads [N]多线程并行、--stdlib <path>指定标准库路径、--skipped只跑跳过的测试等参数;
  • CI 脚本:scripts/tools/ci_tests.sh 汇总了全部回归测试,用法为./ci_tests.sh <path_to_c3c_binary>,它会并行执行示例编译、init/vendorCLI 测试、动态库/静态库测试、测试项目、WASM 编译检查、BSD 交叉编译、HTTP 服务器集成测试等,最后在前台串行执行单元测试。网络相关的测试可通过设置SKIP_NETWORK_TESTS环境变量跳过。

总结

参与 C3 项目并不要求一步到位:最简单的起点是提交一个 bug 报告,或为标准库写一两个函数的补丁(记得带单元测试和发布说明);进阶路径是深入编译器内部做重构、扩展架构与后端支持,或申请成为某个标准库模块的维护者。无论走哪条路,请务必先阅读 CODESTYLE.md 的风格规范,遵循 AI 使用政策,并用仓库现成的测试体系验证自己的改动——这正是让 C3 持续演进、保持高质量的关键所在。

【免费下载链接】c3cCompiler for the C3 language项目地址: https://gitcode.com/GitHub_Trending/c3/c3c

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 22:10:56

OSI七层模型解析与网络故障排查实战

1. OSI七层模型概述计算机网络领域有个经典的理论框架&#xff0c;就像建筑行业的施工蓝图一样重要——这就是OSI七层模型。1984年国际标准化组织&#xff08;ISO&#xff09;发布的这个参考模型&#xff0c;把复杂的网络通信过程分解成七个逻辑层&#xff0c;每层都有明确的职…

作者头像 李华
网站建设 2026/9/17 22:10:52

2023上半年软考数据库系统工程师上午真题复盘与备考指南

“数据库系统工程师”这个中级资格在软考里一直是报考大户&#xff0c;2023年上半年那场考试更是特别——它是软考机考改革前一场大规模的传统笔试&#xff0c;上午的《基础知识》科目仍然沿用75道单选题、150分钟、45分及格的老规矩。我在考场上最大的感受是&#xff1a;这张卷…

作者头像 李华