经过六个月的开发,LLVM 18.1.0 项目发布了——一个兼容 GCC 的工具包(编译器、优化器和代码生成器),可将程序编译成类 RISC 虚拟指令的中间位码(具有多级优化系统)。 生成的伪代码可以在程序执行时直接使用 JIT 编译器转换为机器指令。
从 18.x 分支开始,该项目切换到新的版本号生成方案。与GCC和GDB项目类似,现在在开发过程中使用零版本(“N.0”),第一个稳定版本编号为“N.1”。此更改允许您将基于主线分支的构建与最终发布分支的构建分开。例如,在准备当前版本时,使用 LLVM 18.0 的不稳定分支进行开发,并以编号 18.1.0 发布了第一个稳定版本。将来,如有必要,可以每两周生成一次修正版本,编号为 18.1.1、18.1.2 等。如果对当前分支进行的更改违反了 ABI,则生成的更新将更改版本的第二个数字(即 18.2.0)。
Clang 18 的主要改进:
- 与C语言相关的变化:
- 与 GCC 类似,具有“const”属性的结构、联合和数组现在可以用作常量表达式。
- 枚举现在作为原始整数类型反映在 TBAA(基于类型的别名分析)元数据中,而不是被视为“char”类型。
- 添加了对“counted_by”属性的支持,通过该属性可以在灵活数组结构中指定一个字段,该字段决定灵活数组中的元素数量。该属性可以在 clang 中使用来提高缓冲区溢出检查的效率。
- 未来 C 标准 C23 中定义的功能:
- 添加了对“-std=c23”和“-std=gnu23”标志的支持,以及定义 C202311 标准和 GNU C23 扩展的“__STDC_VERSION__”宏的“23L”值的支持。
- 添加了对“require c23”表达式的支持,以绑定模块以支持 C23 标准。
- 在定义对象时实现了对类型推断的支持,这允许您使用“auto”属性而不是类型来根据初始化表达式的类型来确定变量的类型。例如:“auto y = cos(x);”。
- 添加了头文件支持带有用于检查整数计算的宏。
- 允许将标签放置在复合表达式内的任何位置。
- 在 C23 模式下编译时,不再支持三字符组(将三个 ASCII 字符处理为一个字符的序列)的代码支持,例如,可以使用序列“??=”代替“#”。 Unicode 出现后,对三字母组的支持变得毫无意义。
- 与 C++20 标准相关的功能:已经实现了使用非模板类型的其他参数类型的实验能力,例如,允许指定浮点值、指针和对子对象的引用。
- 与 C++23 标准相关的功能:添加了对“推导此”机制的实验性支持,该机制允许您在模板中使用带有“this”属性的参数,并可以从类函数中找出所属类别该函数调用的表达式(例如,是否为常量)。
- 与未来 C++2c (C++26) 标准相关的功能:
- 添加了在一个作用域中使用多个名称为“_”的占位符变量的功能,例如,以下构造现在是正确的: struct S { int _, _; };无效 func() { int _, _; } 无效其他() { int _; // 之前在 -Wunused 模式下显示警告 }
- 可以在上下文中使用字符串文字,在该上下文中,它们不用于初始化字符数组,也不最终出现在结果代码中,而是仅在编译时用于诊断消息和预处理,例如,作为指令和属性 _Pragma、asm、extern、static_assert、[[已弃用]] 和 [[nodiscard]]。
- 算术计算中枚举值的隐式转换已被弃用。 int main() { 枚举 E1 { e };枚举 E2 { f };布尔 b = e
来源: opennet.ru
