Page 158 - 《软件学报》2024年第6期
P. 158
2734 软件学报 2024 年第 35 卷第 6 期
式等元素的正则表达式规则, 对源程序进行结构化解析, 提取程序信息, 并将代码分割成逻辑块, 处理块中的每一
行. 每类 SwarmL 元素被拆分成携带语法信息的符号流.
程序语言元素 表达式 语句
SwarmL APP 变量定义 参数定义 TreeNode StringBuilder LeftPara Expr RightPara
Operator
扫描 解析 DataType Name Scope SourceVar DataType Name Scope SourceVar
分类结构
进程
函数
化存储 类 Name Type
理 删除注释 词法分析 分解
处 信息提取 State Expression
预
化 删除换行符 变量名 关键字 类方法
式 基础终结符 getName() getType()
格
删除冗余空格 运算符 辅助符号 getState() getExpr()
图 6 源程序预处理和结构化解析流程
FVD = <Keyword, VarName, NodeType, VpnName, DataType>;
为了给源程序解析后的存储提供统一的数据结构和操作, 本节定义了包含 TreeNode 类的 StringBuilder 数据
结构. 其中 TreeNode 类主要由 Name、Type、Expression 等属性参数组成, 负责结构化存储 SwarmL 元素的各项
属性信息, 例如场变量的名称, 数据类型等. 提供了 getName、setName、getType 等类方法来实现对属性参数的访
问和操作. 然后, 将源程序字符串集合组合成抽象语法树存储在 StringBuilder 数据结构中. 在后续编译过程中通过
查询访问语法树结点, 生成标准化语义模块的相关信息. 以全局参数表达式的解析为例, 提取出其运算符以及左右
两侧参数的信息并存储于 StringBuilder 数据结构中. 在图 6 右侧的抽象语法树中, Expr 是该表达式对应的语法树
结点类型, 访问该结点可以获取运算符, 左右参数的名称, 数据类型, 计算域, 参数所指向的场变量等信息.
3.2 源程序至标准化语义模块序列编译算法
针对第 1.4 节所分析的编译挑战, 本节提出将符合用户串行思维、面向系统全局编程的场变量和全局参数表
达式编译为面向单个节点执行的标准化语义模块序列的编译算法, 以及将声明式、面向邻域编程的 Swarm 并行
语句转换为 C 语言代码的编译算法.
3.2.1 全局串行的场变量定义语句编译算法
场变量支持显式刻画分布式建筑物理场, 允许用户以全局声明式的编程范式在域中符合条件的所有节点上直接
定义变量, 而无需考虑节点之间的任务分配和数据交互. 而在程序运行时, 该计算任务需要根据场变量对应的节点类
型和域来创建虚拟计算网络, 该网络在域 VPN 中, 由节点类型为 NodeType 的节点组成. 网络中触发该场变量定义计
算任务的节点被确定为发起点, 以发起点作为根节点逐级建立通信生成树 [2] . 在发起点定义临时变量, 并赋初值给新
定义的变量. 然后将被定义变量的名称、分布属性等字段发送给下游节点, 网络中所有节点都按照此逻辑执行. 最后,
所有节点都根据发起点传来的若干被定义变量的名称、分布属性等字段, 在本节点定义场变量在本地投影的变量.
由于场变量定义语句 (FVD) 和标准化语义模块 (SSM) 元素之间的匹配关系较为复杂, 本文采用模型管理方法 [33]
形式化定义两者之间的映射关系, 其具有足够的语义表现力和处理能力, 如图 7(a) 所示. 场变量定义中的关键字被映射
为语义模块类型和名称. 场变量名称, 节点类型集合, 域名称和数据类型都被映射为语义模块的输出变量. 如下所示.
SSM = <M Id , M Name , M Type , Var In , Var Out >;
SSM.M Id = Pre(SSM.M Id ) +1;
FVD.Keyword = M.s1, M.s1 = (SSM.M Name , SSM.M Type );
(FVD.VarName, FVD.NodeType, FVD.VpnName, FVD.DataType) = M.s2, M.s2 = SSM.Var Out .
本节提出将符合用户串行思维、面向全局编程的场变量定义语句转换为标准化语义模块的编译算法, 其旨在
解决第 1.4 节的编译挑战 1. 算法流程如图 7(b) 所示, 当编译系统根据正则表达式检测到源程序段是场变量定义