← 返回信息流
AI 资讯Hacker News·1 天前

C3 0.8.2 版本带来适度改进

原标题:C3 0.8.2 a Modest Improvement

速览

C3 0.8.2 版本更新,主要提供性能与稳定性方面的适度改进。此版本优化了部分功能,旨在提升用户体验,属于常规迭代更新。

AI 深度解读

背景

C3 是一种系统级编程语言,旨在结合 C 语言的性能与更现代的语法和安全性特性。C3 0.8.2 是 0.8 系列的一个小版本迭代,主要聚焦于语言易用性(ergonomics)改进、新反射能力以及一系列 bug 修复。相比 0.8.1,此版本变化较为温和,但仍带来了对开发者体验有实质提升的功能。

核心内容

语言变更与改进

1. 库的可复用目标模板(Reusable target configurations for libraries)

库现在可以在其 manifest 中暴露一个 templates 映射,其他项目可以通过 template: "library/template" 将模板拉取到自己的目标中。模板属性优先加载,目标本地设置可以覆盖它们。这样库可以提供合理、可共享的构建配置,而不再要求每个用户手动复制粘贴设置。

2. 泛型反射(Reflection for generics)

新增三个与泛型实例化相关的反射机制:

  • Foo::is_generic(...):判断某个类型是否是泛型实例化。
  • Foo::generic_qname:获取泛型类型的完全限定名(如 "std::collections::list::List")。
  • Foo::generic_args:获取泛型类型参数列表。

示例代码:

alias Foo = List{int};
fn void main()
{
    typeid t = List{String}::generic_args[0]; //String::typeid
    String name = Foo::generic_qname;         // "std::collections::list::List"
    bool x = Foo::is_generic(List);          // true
    bool y = int::is_generic(List);          // false
}

3. 位结构属性(Bitstruct properties)

位结构成员现在可以获取 bitoffsetbitsize 属性,通过 $reflect 编译期反射使用:

bitstruct Foo : uint
{
    uint a : 0..1;
    bool b : 6;
    bool c : 10;
    int d : 14..20;
}

fn void main()
{
    int a = $reflect(Foo.a).bitsize;  // 2
    int b = $reflect(Foo.d).bitoffset; // 14
    int c = $reflect(Foo.c).bitoffset; // 10
}

4. 新的参数注解:owninitdrop

现在可以在函数参数上使用比 in/inout/out 更多的注解:

  • own:表示函数会在其作用域之外以某种方式保留该变量。
  • drop:表示指针及其指向的数据在函数返回后将失效。
  • init:表示指向的数据将由函数初始化。

这些注解可被编译器用于静态分析,同时也作为函数或宏的文档。

5. Asm 栈对齐修复

在 0.8.2 之前,所有 asm 块都会强制进行栈对齐,这与 C 的行为不一致。现在已修复:栈对齐不再是默认行为,改为通过 @align 注解主动启用。

6. Windows 改进

现在可以直接设置 Windows 子系统。虽然 Windows 仍然可以通过 @winmain 隐式设置 Window 子系统,但所有子系统现在都可以手动指定,从而支持 EFI 应用程序等场景。

标准库变更

  • 新增 Atomic.compare_exchange
  • 为数组新增 array::contains_slicearray::index_of_slice,用于对数组进行子串风格搜索。
  • 新增 log::register_dynamic_category,允许库动态定义自己的日志类别。
  • String.indexOfrindex_of 现在可以接受查找空字符串。

修复

标准库修复:

  • String.to_double() 现在能正确处理非规格化(次正规)结果——之前接近浮点下界的小幅度值会出错。
  • 带有大写 F 后缀的浮点字面量之前被错误地类型推断为 double 而非 float,现已修复。
  • JSON 序列化现在能正确处理 Unicode 和 \v(#3353)。
  • IPv6 解析:"a::b:c:d:e:f:0" 现在被接受为有效地址。
  • BackedArenaAllocator 销毁时出现的回归问题已修复,可能引起崩溃。
  • 修复了 macOS 上导致堆栈回溯(stack trace)损坏的回归问题。

编译器修复:

  • $stringify 有时会输出多余括号。
  • 带别名的 constdef vector 被错误地降低。
  • 编译器在将结构体拼接到未类型化列表(untypedlist)时会断言。
  • untypedlist 未被视为无效的枚举关联值类型或指针类型,现已检测。 -(还有其他多项修复,详见原文)

致谢与贡献者

此版本离不开 C3 社区的贡献,特别感谢所有提交 issue、PR 以及参与讨论的人。标准库贡献者包括 AtomicSynth, Book-reader, GuineaPigUuhh, Manu Linares;编译器和工具链贡献者包括 Book-reader, Johannes Müller, Manu Linares, Osama Badeeb, rickyadastra, Rodrigo Camacho;CI/基础设施贡献者包括 Hade 和 Manu Linares。

关键要点

  • 库模板:库可以通过 manifest 暴露可复用的构建模板,项目引用后可按需覆盖,简化配置。
  • 泛型反射:新增 is_genericgeneric_qnamegeneric_args,使得泛型实例化可在编译期被检查。
  • 位结构反射bitoffsetbitsize 属性可通过 $reflect 获取,便于元编程。
  • 参数注解扩展owninitdrop 注解增强静态分析和文档性。
  • Asm 栈对齐:不再默认对齐,使用 @align 显式选择,与 C 行为一致。
  • Windows 子系统:支持直接设置任意子系统(EFI 等)。
  • 标准库增强:原子操作、数组子串搜索、动态日志分类;修复了浮点解析、JSON 序列化、IPv6 解析等 bug。
  • 编译器修复$stringifyconstdef 向量、未类型化列表检查等多项修正。

意义与影响

C3 0.8.2 虽然被描述为“温和的改进”,但其中多项特性对库开发者和元编程场景有实质性提升。库模板化构建配置是社区长期期盼的功能,它让库作者能提供一键式的构建体验,降低重复劳动,类似于 Cargo 的构建脚本,但以声明式模板实现。泛型反射将编译期自省能力拓展到泛型领域,使得编写泛型代码的库(如容器、序列化框架)能更好地暴露内部类型信息。位结构反射则进一步强化了 C3 在系统编程中处理底层内存布局的能力。参数注解的扩展借鉴了 Rust 的借用和所有权思想,虽限于静态分析层面,但为未来更精细的内存安全分析打下了基础。Asm 对齐的调整反映了与 C 互操作性的严谨态度,Windows 子系统直接设置则增加了对非传统 Windows 场景(如固件)的支持。整体上,此版本在保持向后兼容的前提下,提升了语言的表达力和工程实践便利性,对 C3 生态的成熟度前进了一步。

查看原文 →c3-lang.org