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  语言变量, 将对邻居
   155   156   157   158   159   160   161   162   163   164   165