C3 0.8.2:小幅改进

Hacker News Top 工具

摘要

C3 0.8.2 是 C3 编程语言的一个小幅更新,增加了可复用的库目标模板、泛型反射、位结构属性、新的 @param 选项,并修复了多个 bug。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/15 16:44

# C3 0.8.2 小幅改进 来源:https://c3-lang.org/blog/0_8_2_a_modest_improvement/ https://github.com/c3lang/c3-web/edit/main/docs/blog/posts/c3_0_8_2_a_modest_improvement.mdC3 0.8.2 发布了。本次发布带来了一系列语言人体工程学改进——最值得注意的是库的可重用目标模板和泛型 constdef——以及新的反射功能和一轮错误修复。 与 0.8.1 相比,这次发布相对较小,但无论如何,以下是新内容: ## 语言变化与改进¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#language-changes-improvements) ### 库的可重用目标配置¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#reusable-target-configurations-for-libraries) 库现在可以在其清单中暴露一个模板映射,项目可以通过 `template: "library/template"` 将模板拉取到目标中。模板属性先加载,目标本地设置会覆盖它们,因此库可以交付合理、可共享的构建配置,而不必要求每个用户复制粘贴设置。 ### 泛型的反射¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#reflection-for-generics) `Foo::is_generic(...)`、`Foo::generic_qname` 和 `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 } ``` ### 位结构体属性¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#bitstruct-properties) 位结构体成员获得了 `bitoffset` 和 `bitsize` 属性: ``` 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 } ``` ### 新的 @param 选项:own、init 和 drop¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#new-param-options-own-init-and-drop) 现在可以在参数上标注比 in/inout/out 更多的内容: 1. `own` 表示函数将在某种程度上保留该变量超出函数作用域。 2. `drop` 表示指针及其指向的数据在函数返回时将失效。 3. `init` 表示函数将初始化指针所指向的数据。 编译器可以将此用于静态分析,同时也为函数或宏提供了文档。 ``` <* @param [own] f *> fn void foo(Foo* f) { some_global.foo = f; } ``` ### 内联汇编栈对齐¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#asm-stack-alignment) 在 0.8.2 之前,所有 asm 块都会栈对齐,这与 C 的行为不符。现在已修复。栈对齐现在通过 `@align` 选择加入: ``` asm // 未对齐 { syscall; } asm @align // 栈对齐 { syscall; } ``` ### Windows 改进¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#windows-improvements) 现在可以直接设置 Windows 子系统。Windows 仍然可以使用 `@winmain` 隐式设置窗口子系统,但现在所有子系统都可用,从而支持如 EFI 应用程序等场景。 ## 标准库¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#standard-library) - 添加了 `Atomic.compare_exchange`。 - 添加了 `array::contains_slice` 和 `array::index_of_slice`,用于数组上的子串式搜索。 - 添加了 `log::register_dynamic_category`,供库动态定义其自身的日志类别。 - `String.indexOf` 和 `rindex_of` 现在支持查找空字符串。 ## 修复¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#fixes) ### 标准库修复¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#stdlib-fixes) - `String.to_double()` 现在能正确处理非规格化(subnormal)结果——之前非常小的接近浮点下限的值会出错。 - 带有大写 F 后缀的浮点字面量之前会被错误地类型化为 double 而不是 float。 - JSON 序列化现在能正确处理 Unicode 和 \\v(#3353)。 - IPv6 解析:"a::b:c:d:e:f:0" 现在被接受为有效格式。 - 修复了 BackedArenaAllocator 销毁时的回归问题,该问题可能导致崩溃。 - 修复了 macOS 上导致栈跟踪被破坏的回归问题。 ### 编译器修复¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#compiler-fixes) - `$stringify` 有时会在输出中额外包裹括号。 - 带有别名的 `constdef` 向量被错误地降级。 - 编译器在将结构体连接到 `untypedlist` 时断言。 - `untypedlist` 未被检测为无效的枚举关联值类型或指针类型。 ## 致谢¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#thank-yous) 再次强调,如果没有 C3 社区,这次发布是不可能实现的。我衷心感谢所有通过提交 issue、PR 以及普通讨论做出贡献的人。 ### 本次发布的 PR 贡献者¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#pr-contributors-for-this-release) **标准库:** AtomicSynth、Book-reader、GuineaPigUuhh 和 Manu Linares **编译器与工具链:** Book-reader、Johannes Müller、Manu Linares、Osama Badeeb、rickyadastra 和 Rodrigo Camacho **CI/基础设施:** Hade 和 Manu Linares ### 变更日志¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#change-log) 点击查看完整变更日志### 变更/改进¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#changes-improvements) - `@weak` 现在适用于所有声明。 - 为 asm 块添加 `@align` 以进行栈对齐。栈对齐不再是默认行为。 - 允许直接设置 Windows 子系统。 - 为位结构体成员添加 `bitoffset` 和 `bitsize` 反射属性。#3219 - 改进将 char 数组转换为 String 时的错误消息。#3343 - 添加 `Foo::is_generic(...)`、`Foo::generic_qname` 和 `Foo::generic_args`。#2909 #3329 - 添加 `own`、`init` 和 `drop` 参数注解。 - `constdef` 现在可以是泛型的。 - 库现在可以通过其清单中的 `templates` 映射暴露可重用的目标配置,项目通过 `template: "library/template"` 从目标引用。模板中的属性先加载,并可以被目标本地设置覆盖。 ### 标准库变更¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#stdlib-changes) - 添加了 `Atomic.compare_exchange`。 - 添加了 `array::contains_slice` 和 `array::index_of_slice`。 - `String.indexOf` 和 `rindex_of` 现在接受查找空字符串。 - 添加了 log::register_dynamic_category,供希望动态定义其自身类别的库使用。 ### 修复¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#fixes_1) - `$stringify` 有时会包含括号。 - 在某些情况下销毁 BackedArenaAllocator 时的回归问题。#3332 - `"a::b:c:d:e:f:0"` 未被解析为有效的 ipv6 字符串。 - 带有别名的 `constdef` 向量被错误降级。#3335 - 编译器在将结构体连接到 untypedlist 时断言。#3326 - `untypedlist` 未被检测为无效的枚举关联值类型或指针类型。#3342 - 使用非 POSIX libc 时的回归问题。 - 递归定义带有函数类型的可选结构体时崩溃。#3358 - `String.to_double()` 未正确处理非规格化结果。 - 带有大写 'F' 后缀的浮点字面量被错误地视为 `double` 而不是 `float`。 - JSON 序列化未正确处理 Unicode 和 `\\v`。#3353 - 在 `&a - &b` 中,如果其中一个或两个都是可选的且结果未赋值,语义检查不正确。 - macOS 上的回归问题,破坏了栈跟踪。 ### 想深入了解 C3?¶ (https://c3-lang.org/blog/0_8_2_a_modest_improvement/#want-to-dive-into-c3) 查看文档 (https://c3-lang.org/getting-started/introduction/) 或下载并试用 (https://c3-lang.org/getting-started/prebuilt-binaries/)。 有问题?来 Discord (https://discord.gg/qN76R87) 和我们聊聊。

相似文章

Gecode 6.3.0 和 6.4.0 已发布

Lobsters Hottest

经过长时间停更后,Gecode 6.3.0 和 6.4.0 现已发布,带来了现代化的构建系统(CMake)以及更新后的 MiniZinc 集成。

Claude Opus 4.8:"微小但切实的改进"

Simon Willison's Blog

Anthropic 发布了 Claude Opus 4.8,这是对其前代产品的一次小幅增量改进,重点提升了诚实性并降低了幻觉率,同时还引入了新功能,如对话中系统消息和更低的提示缓存最小值。

QBE - 编译器后端:版本 1.3

Lobsters Hottest

QBE 1.3 是一个重要的编译器后端版本,新增了 7000 行代码,引入了一种新的 IL 匹配算法,针对 coremark 基准测试进行了优化(性能从 gcc -O2 的 40% 提升到超过 63%),支持 Windows ABI 和位置无关代码生成。