Page 160 - 《软件学报》2024年第6期
P. 160
2736 软件学报 2024 年第 35 卷第 6 期
(GPSta.LeftName, GPSta.Operator, GPSta.RightName) = M.s2, M.s2 = SSM.Var In ;
GPSta.ResultVarName = M.s3, M.s3 = SSM.Var Out .
本节提出将符合用户串行思维的全局参数表达式转换为标准化语义模块的编译算法, 其旨在解决第 1.4 节的
编译挑战 1. 算法流程如图 8(b) 所示, 当识别出源程序段是全局参数表达式时, 生成语义模块的编号在上一个模块
的基础上递增 1. 遍历表达式抽象语法树, 根据表达式中的运算符和左右两侧参数的计算域匹配查询标准化语义
模块类型库, 判断表达式对应的群体智能计算类型, 进而映射生成语义模块类型码 M Typ 和名称 M Name . 识别表达
e
式中的全局数据信息, 提取运算符两侧参数的名称, 生成语义模块的输入变量. 提取代表表达式运算结果的参数名
称, 生成语义模块的输出变量. 图 8(c) 给出全局参数表达式到标准化语义模块的编译转换示例.
模型 A: 模型 B:
全局参数表达式 Map AB 标准化语义模块
GPSta = SSM
s1 s2 s3
与全局参数表达式所采用的全局编程视角不同, Swarm
LeftParameter Operator RightParameter ResultVar = = = M Id M Name M Type Var In Var Out
Name Scope Name Scope Name
(a) 全局参数表达式与标准化语义模块映射关系
标准化语义模块类型库
开始 源程序
提取运算符两侧参数名称
Alarm = FireSource; 0X00000011
识别全局参数表达式 映射生成全局参数表达式 抽象语法树 匹配 生成
语义模块的输出信息
GlobalExpr 标准化语义模块
左侧变量 右侧变量
{
生成标准化语义模块名称 = “Json_Type”: “CBlock_Define”,
上一个语义模块名称+1 结果变量 运算符 Alarm = FireSource “SSM_Id”: “00000004”,
“SSM_Type_Id”: “0x00000011”,
“SSM_Type_Name”: “All_=_StartNode”,
提取表达式运算符以及 生成完整全局参数表达式 “Data”: [
两侧参数的计算域 语义模块 “Result_Var”: “Alarm”,
int Fire All int Fire StartNode “Source_Var”: “FireSource”,
“Operator”: “=”
查询标准化语义模块类型库 结束 ]
匹配生成语义模块类型名称 ROOM EvacuationSystem int ROOM EvacuationSystem int },
(b) 全局参数表达式编译算法流程 (c) 全局参数表达式编译转换案例
图 8 全局参数表达式编译示意图
该算法的关键特征在于: 根据表达式中操作符和全局参数的计算域的组合, 判断该表达式所要执行的群体智
能运算类型, 并生成单个节点执行层面的代码. 上述转换逻辑仅针对包含单个运算符的简单全局参数表达式. 由于
每个表达式标准化语义模块只能描述单个简单表达式的逻辑, 当处理由多个简单表达式组成的复杂表达式时, 需
要按照运算符优先级顺序将其转换为由若干个简单表达式语义模块组成的序列.
3.2.3 面向邻域计算的 Swarm 并行语句编译算法
并行语句使用节点本地及其邻居节点的信息描述群体
智能计算逻辑, 因而语句中出现的都是局部参数. 当描述邻域范围的计算逻辑时, SwarmL 与通用 C 语言的语法相
近. 为了利用现有资源并降低编译难度, 将 Swarm 并行语句转换为 C 语言程序并嵌入标准化语义模块, 以便于直
接调用 C 语言编译器将 C 程序编译为二进制代码并将其链接到目标代码中.
Swarm 并行语句支持以局部参数声明式的描述对多个邻居数据的读写操作, 且无需考虑邻居间参数的读写和
交互机制, 以及计算任务如何触发、计算结果发布给哪些邻居等底层分布式计算属性. 但 C 语言面向节点独立执
行阶段, 需要显式描述参数的读写机制等底层计算细节. 因此, Swarm 并行语句到 C 语言程序转换需要还原
SwarmL 程序所涉及的分布式计算的底层细节. 本节提出将面向邻域并行计算的 Swarm 并行语句转换为标准化语
义模块编译算法, 其旨在解决第 1.4 节的编译挑战 2. 该算法主要包括生成局部参数对应的 C 语言变量, 将对邻居