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

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


                 在  Isabelle/HOL  中以  Iris 语言建模的形式化表示. 程序整体的语义由各个语法单元的语义组成, 而每条语法单元
                 的语义的等价性在第       4.1  节当中得到了证明. 因此, 可以利用语法单元语义一致的结论证明程序的语义一致性.
                    图  8 展示了一个包含了加法和        pre 运算符的  Lustre 程序和对应  C  程序一致性的证明序列. 与第        4.1 节中的证明
                 过程类似,   definition usepre_lustre 和  definition usepre_c 分别是  Lustre 语言和  C  语言代码的定义, 其中  add_lustre、
                 add_c、pre_lustre、pre_c 已经分别定义且证明了等价性. 所以, 在等价性引理            lemma equivalence_property_usepre
                 的证明中, 只需要分别对它们进行展开并进行化简, 就可以证明它们之间的一致性.















                                                图 8 程序语义一致性证明序列

                    上文的证明体现出, 在已经定义了子文法的语义和证明了子文法语义的一致性的基础上, 对于程序一致性的
                 证明在   Isabelle 中可以通过如下的方法证明.
                    (1) 定义  Lustre 源程序和  C  目标程序的语义, Lustre 程序和   C  程序的语义由其子文法递归给出;
                    (2) 定义证明前提和证明目标, 其中证明前提为             Lustre 和  C  程序的前置条件相等, 证明目标为       Lustre 和  C  程
                 序的后置条件相等;
                    (3) 将  (1) 中定义的  Lustre 和  C  程序语义使用  unfolding 命令以文法单元为单位依次展开并化简;
                    (4) 使用  using preconditions by auto  命令应用证明前提  (即前置条件相等) 并进行自动推理并得到证明结论.
                 Isabelle 的自动推理能力有限, 但经过      (3) 的展开, 其形式已经可以自动推导出结论.

                 5   实验与分析

                    本节展示了对提出的基于下推自动机的              Lustre 语言可信编译器进行系统测试的过程和结果, 测试在指定的实
                 验环境   (处理器为   Intel Core i5-13600KF CPU @ 3.50 GHz, 内存为  32 GB, 操作系统为  Windows 11) 下进行.

                 5.1   代码生成测试结果与分析
                    代码生成测试主要进行功能测试, 即测试代码生成的结果是否正确, 测试需要对编译器实现的所有                                Lustre 文
                 法进行测试. Lustre V6  版本共有    73  个文法单元, 本文实现的编译器共支持其中的             72  个. 在  72  个文法单元中, 程
                 序结构定义文法有       49  条, 核心的赋值语句和表达式文法有          23  条. 其中程序结构定义文法在每次测试中都会涉及,
                 只需单独测试其中不常用的部分, 赋值语句和表达式文法为测试的重点.
                    针对  72  个文法单元和对应的      218  个产生式, 本文共构建了      150  个以上的基本测试用例, 旨在测试单条文法的
                 正确性. Lustre 中核心的表达式文法的测试用例数如后文表                9  所示, 其中运算符组合测试是在一个表达式中使用
                 多个运算符, 测试运算符之间的优先级结合性等关系是否正确.
                    对生成的    C  代码进行静态分析, 检查是否存在语法错误, 并将本文编译器生成的代码和官方代码生成器生成
                 的代码的运行结果进行比较, 观察运行结果是否符合预期. 经过测试, 本文实现的代码生成模块在涉及的所有文法
                 单元中均能正确生成目标代码.

                 5.2   形式化验证测试结果与分析
                    形式化验证测试需要针对          Lustre 文法单元给出对应的语义一致性证明. 首先需要对单个运算符的语义一致性
   136   137   138   139   140   141   142   143   144   145   146