Page 113 - 《软件学报》2026年第2期
P. 113

592                                                        软件学报  2026  年第  37  卷第  2  期


                    抽象语法树解析模块的框架如图            3  所示. 抽象语法树解析模块中的代码解析器使用               Python  标准库中的  AST
                 模块进行代码解析, 首先会将源深度学习框架搭建的神经网络模型代码中的所有字符串, 通过词法分析分割成若
                 干标记   (tokens), 每个标记代表代码中的一个单词、操作符或标点符号等. 这些标记通常是以空格或其他特定字符
                 进行分割. 然后再通过语法分析将标记按照语法规则组成语句和表达式, 并构建成一棵抽象语法树, 来表示代码的
                 结构和逻辑. 该模块的底层实现基于           Python  的解释器架构    CPython, 其语法规则遵循    Python  语言标准, 直接支持
                 Python  语言的最新特性, 最终生成的语法树节点类型包括表              3  中的示例. 此时, 神经网络模型的代码字符串已经解
                 析成承载所有代码信息的抽象语法树.

                                                  抽象语法树解析模块
                                                                               Node
                                                     代码解析器
                                                       tokens
                                                Սم            ეم
                                                ٳ༅            ٳ༅
                                                                          Node  Node  Node
                                 源框架下的
                                  模型代码
                                                                             抽象语法树
                                               图 3 抽象语法树解析模块的框架

                    代码  1  的作用是定义一个简单的卷积神经网络模型, 可以用于图像分类、目标检测等任务. 在训练时, 可以将
                                   forward 方法中进行前向传播, 根据预测结果与真实标签计算损失并反向传播更新模型参
                 训练数据传入该模型的
                 数. 代码中主要包含两条导入模块语句和一个面向对象的类, 且类中包含两个方法. 导入的模块是                             PyTorch  框架专
                 门为神经网络设计的模块化接口            torch.nn, 这段代码定义一个继承自      nn.Module 的类  Model, 表示了一个简单的神
                                              conv, 卷积层的输入通道数为       3, 输出通道数为    64, 卷积核大小为     7×7, 步长
                 经网络模型. 该模型包含一个卷积层
                 为  2, 填充宽度为  3. 方法接收一个输入      x, 将其传入卷积层     conv, 计算输出  o 并返回.
                          net1 = torch.nn.Conv2d(120,240,4,stride = 2)  传递到抽象语法树解析模块后可以得到对应的抽象语法
                    将代码
                 树, 如图  4  所示. 代码中等号左右的变量名称和调用语句分别转换成抽象语法树中的                      Name 节点和   Call 节点, 算子
                 内部的变量名称及其变量值也都转换成抽象语法树中对应的节点.








                             “   ”
                                                                                        “   ”
                                                                                                 2

                                                “    ”                                  List
                                                                   List

                                     “ ”

                     “   ”
                                                    图 4 抽象语法树示例

                  4.3   抽象语法树改写模块
                    在得到抽象语法树解析模块输出的抽象语法树后, 将其作为迁移程序的中间件, 对树中相应的节点进行针对
   108   109   110   111   112   113   114   115   116   117   118