第 7 章 编译器和开发工具
下面的章节包含对 RHEL 8 和 RHEL 9 之间编译器和开发工具的最显著的更改。
7.1. LLVM、R Rust 和 Go 的显著变化
LLVM Toolset 已更新至 19.1.7
LLVM Toolset 已更新至版本 19.1.7。
LLVM 编译器的显著变化:
- LLVM 现在使用 debug 记录,一个用于调试信息的更高效的表示。
Clang 的显著更新:
- C++14 大小的重新分配现在默认启用。
- C++17 支持已完成。
- 添加了对 C++20 支持的改进,特别是围绕模块、概念和类模板参数推导(CTAD)。
- 添加了对 C23、C2c、C23 和 C2y 支持的改进。
如需更多信息,请参阅 LLVM 发行注记 和 Clang 发行注记。
LLVM Toolset 是一个滚动应用程序流,只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。
Rust Toolset 已 rebase 到版本 1.84.0
Rust Toolset 已更新到版本 1.84.0。自之前可用的版本 1.79.0 以来的显著改进包括:
-
新的
LazyCell
和LazyLock
类型延迟了初始化,直到第一次使用为止。它们使用每个实例中包含的初始化功能扩展了早期的OnceCell
和OnceLock
类型。 - 标准库中的新排序实现提高了运行时性能和编译时间。它们还会尝试检测比较器没有产生总顺序的情况,从而导致该 panic 而不是返回未排序的数据。
-
添加了对不透明返回类型的精确捕获。新的
use<..>
语法指定了impl Trait
返回类型中使用的通用参数和生命周期。 对
const
代码添加了许多新功能,例如:- 浮点支持
-
const
直接用于内联汇编 - 对静态的引用
- 可变参考和指针
对
unsafe
代码添加了许多新功能,例如:- 严格的来源 API
-
&raw
指针语法 - 安全寻址静态
-
在不安全的
extern
块中声明安全项目
-
Cargo 依赖项解析器现在是版本感知的。如果依赖项 crate 指定了其最低支持的 Rust 版本,则 Cargo 会在解析依赖关系图时使用此信息,而不是使用最新的兼容
semver
的 crate 版本。
兼容性备注:
-
WebAssembly 系统接口(WASI)目标从
rust-std-static-wasm32-wasi
改为rust-std-static-wasm32-wasip1
。您还可以通过在命令行上使用--target wasm32-wasip1
参数来选择 WASI 目标。如需更多信息,请参阅 对 Rust 的 WASI 目标的更改 上游博客文章。 -
拆分 panic 钩子和 panic 处理程序参数
core::panic::PanicInfo
和std::panic::PanicInfo
现在是不同的类型。 -
extern "C"
函数现在在未捕获的 panics 上中止。使用extern "C-unwind"
来允许跨 ABI 边界的展开。
Rust Toolset 是一个滚动应用程序流,红帽只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。
Go Toolset 已 rebase 到版本 1.23
Go Toolset 已更新到版本 1.23。主要改进包括:
for-range
循环接受以下类型的迭代函数:-
func(func() bool)
-
func(func(K) bool)
func(func (K, V) bool)
调用迭代参数函数会为
for-range
循环创建迭代值。有关参考链接,请参阅 上游发行注记。
-
- Go Toolchain 可以收集使用情况和中断统计信息,以帮助 Go 团队了解 Go Toolchain 是如何使用和工作的。默认情况下,Go Telemetry 不会上传遥测数据,仅将其存储在本地。如需更多信息,请参阅 上游 Go Telemetry 文档。
-
go vet
子命令包含stdversion
分析器,它标记对在引用文件中使用的 Go 版本太新的符号的引用。 -
cmd
和cgo
功能支持-ldflags
选项,来将标记传递给 C 链接器。当您使用非常大的CGO_LDFLAGS
环境变量时,go
命令会自动使用这个标志来避免argument list too long
错误。 -
trace
工具容忍部分破坏的跟踪,并尝试恢复跟踪数据。这在崩溃时特别有用,因为您可以获得导致崩溃的跟踪。 -
在未处理的 panic 或其他致命错误之后,运行时打印的回溯带有缩进,以区分来自第一个
goroutine
的goroutine
的堆栈追踪。 - 使用配置文件引导的优化的编译器构建时间开销降低到个位数百分比。
-
新的
-bindnow
链接器标志在构建动态链接的 ELF 二进制时启用立即函数绑定。 -
//go:linkname
linker 指令不再引用标准库中的内部符号,以及在其定义中没有标记为//go:linkname
的运行时。 -
如果程序不再引用
Timer
或Ticker
,则垃圾回收会立即清理它们,即使还没有调用它们的Stop
方法。与Timer
或Ticker
关联的计时器渠道现在没有缓冲,容量为 0。这确保每次调用Reset
或Stop
方法时,在调用后不会发送或接收过时的值。 -
新的
unique
软件包为规范化值(如interning
或hash-consing
)提供了工具。 -
新的
iter
软件包提供了基本定义,以与用户定义的迭代器一起工作。 -
slices
和maps
软件包引入了几个与迭代器一起使用的新功能。 -
新的
structs
软件包为修改包含 struct 类型的属性(如内存布局)的 struct 字段提供类型。 在以下软件包中进行了次要更改:
-
archive/tar
-
crypto/tls
-
crypto/x509
-
database/sql
-
debug/elf
-
encoding/binary
-
go/ast
-
go/types
-
math/rand/v2
-
net
-
net/http
-
net/http/httptest
-
net/netips
-
path/filepath
-
reflect
-
runtime/debug
-
runtime/pprof
-
runtime/trace
-
slices
-
sync
-
sync/atomic
-
syscall
-
testing/fstest
-
text/template
-
time
-
unicode/utf16
-
如需更多信息,请参阅 上游发行注记。
Go Toolset 是一个滚动应用程序流,红帽只支持最新版本。如需更多信息,请参阅 Red Hat Enterprise Linux 应用程序流生命周期 文档。