Page 189 - 《软件学报》2025年第8期
P. 189

3612                                                       软件学报  2025  年第  36  卷第  8  期


                 此后, 据  MIR  内容及  LLVM IR  规范进行相应的逻辑转换, 生成        LLVM IR  代码, 再使用   LLVM  生成汇编代码, 最
                 后进行编译链接生成二进制代码.

                 词法分析, 语法分析          脱糖         类型推断, 类型检查      优化, 借用检查           优化
                  宏展开, 名称解析                        trait 解析

                      源程序            AST             HIR            MIR          LLVM IR        汇编代码

                                                     图 8 Rust 编译过程

                    值得一提的是, Rust 语言的表面        (surface) 语法富含大量的语法糖, 而对于这些语法, Rust 语言社区尚未给出
                 一套正式的操作语义定义. 相比之下, MIR           显著简化了语言的复杂性. MIR        拥有一组精简的操作集, 通过去糖处理
                 简化掉了    Rust 表面层的许多复杂特性, 例如循环和模式匹配语句, 且函数体以控制流图的形式清晰呈现. 同时,
                 MIR  中仍然保留了    Rust 所有权和借用概念的核心, 这些概念在类型系统中占据着重要位置. 此外, MIR                     还保留了
                 泛型定义, 使得语言的通用性得以延续. 因此, 与复杂的表面                Rust 语法相比, MIR  提供了一个更为简洁和易于操作
                 的环境, 同时保留了语言的关键特性. 同时, MIR            提供了丰富的应用程序接口           (API), 这些  API 允许开发者访问、
                 提取和操作    Rust 程序的  MIR  表示. MIR  的这些特性使其不仅在编译过程中扮演着关键角色, 而且还是进行深入
                 程序分析和逻辑推理的理想选择. 如今, MIR            已经成为形式化语义深入研究和精准高效验证工具开发的对象. 很
                 多验证工具与     Rust 编译器的紧密集成, 在      Rust 编译器完成类型检查之后提取          MIR  及类型和借用检查信息, 再进
                 行进一步的分析推理.

                 3   针对  Rust 形式语义的研究工作

                    类型系统作为      Rust 语言的基石, 对程序的正确性、安全性和效率起着至关重要的作用. 大多数对                        Rust 的形
                 式化语义研究工作捕捉了         Rust 类型系统的核心, 描述      Rust 类型推断和借用检查的过程, 并给出类型系统的可靠
                 性证明, 表明遵循     Rust 所有权、借用和生命周期规则的程序是内存和线程安全的. 还有一些工作没有借助类型系
                 统, 而是主要建模了      Rust 以内存管理为核心的操作语义来描述             Rust 的形式规范, 包括所有权系统、借用检查、
                 生命周期规则等. 对      Rust 的形式化语义的研究工作提供了一种精准清晰的语义框架以便开发人员更深入地学习
                 和探索这一新兴编程范式的机制和特性, 同时也为后续开发                   Rust 程序验证工具提供了坚实的理论基础. 本节首先
                 对类型系统的概念进行精炼的概述, 并特别聚焦于                 Rust 语言的类型系统, 此后分别介绍基于          Rust 类型系统的语
                 义研究工作和基于纯操作语义的            Rust 语义研究工作. 表   1  总结了不同形式语义模型研究工作的差别. 其中, “正确
                 性保证”表示该工作是否使用了机械化的证明               (如借助   Coq  证明助手  [18] 证明) 确保语义模型正确性, “内存模型”表
                 示该工作是否精准地刻画了          Rust 的内存模型.

                                            表 1 Rust 形式语义模型研究工作总结对比

                                                                                          支持语言特性
                    研究工作      正确保证 类型系统 数据结构 内存模型            生命周期         验证性质
                                                                                      Unsafe Closure 并发 Trait
                    RustBelt [13]  ●    ●     MIR      ○   生命周期逻辑       并发、内存安全        ●     ○    ●   ○
                           [19]
                  RustHornBelt   ●      ●     MIR      ○   生命周期逻辑       并发、内存安全        ●     ○    ●   ○
                          [15]
                  RefinedRust    ●      ●     MIR      ●   生命周期逻辑        功能正确性         ●     ○    ○   ○
                        [20]
                    Oxide        ○      ●     Rust     ○     Polonius    功能正确性         ○     ●    ○   ○
                        [21]
                     Flux        ○      ●     MIR      ●      NLL         类型安全         ○     ●    ○   ○
                       [22]
                     FR          ○      ●     Rust     ○      词法      类型安全, 功能正确性      ○     ○    ○   ○
                        [23]
                    Patina       ○      ●     Rust     ○      词法          类型安全         ○     ○    ○   ○
                            [24]
                 StackedBorrows  ○      ○     Rust     ●      栈表示       编译优化, UB       ●     ○    ○   ○
                        [25]
                    KRust        ○      ○     Rust     ○      词法         功能正确性         ○     ○    ○   ○
                          [26]
                   RustSEM       ○      ○     Rust     ○      NLL       并发、内存安全        ●     ●    ●   ●
   184   185   186   187   188   189   190   191   192   193   194