C3 0.8.2:小幅改进
摘要
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) 和我们聊聊。
相似文章
@injaneity: pi-computer-use v0.4.3 现已发布!此次更新使我们与 Codex 达到同等水平(不得不承认,他们在最近一次更新中大幅提升了表现……)
pi-computer-use v0.4.3 已发布,实现了与 Codex 的功能对等,新增了幽灵光标、子代理并行任务以及改进的批处理,使得延迟降低约 50%,并能更好地处理如 Microsoft 应用等复杂场景。
Blaise v0.10.0:本地后端、线程与增量编译
Blaise v0.10.0 通过 QBE 增加了本地后端支持、线程功能和增量编译,推动这款现代 Object Pascal 编译器向自托管和更广泛的平台支持迈进。
Gecode 6.3.0 和 6.4.0 已发布
经过长时间停更后,Gecode 6.3.0 和 6.4.0 现已发布,带来了现代化的构建系统(CMake)以及更新后的 MiniZinc 集成。
Claude Opus 4.8:"微小但切实的改进"
Anthropic 发布了 Claude Opus 4.8,这是对其前代产品的一次小幅增量改进,重点提升了诚实性并降低了幻觉率,同时还引入了新功能,如对话中系统消息和更低的提示缓存最小值。
QBE - 编译器后端:版本 1.3
QBE 1.3 是一个重要的编译器后端版本,新增了 7000 行代码,引入了一种新的 IL 匹配算法,针对 coremark 基准测试进行了优化(性能从 gcc -O2 的 40% 提升到超过 63%),支持 Windows ABI 和位置无关代码生成。