Page 162 - 《软件学报》2024年第6期
P. 162

2738                                                       软件学报  2024  年第  35  卷第  6  期


                 属性, 并判断该参数在表达式中出现的位置, 进而匹配生成参数对应的                      Ar, Aw, X  变量  (详细对应关系在文献     [6]
                 中第  4.3  节介绍). 最后, 生成  Ar, Aw, X  变量序列以及参数与    Ar, Aw, X  变量的映射关系表, 如图    9(a) 所示.
                    (2) 子语句转换为    C  语言代码
                    具有邻域计算域属性的局部参数表示该参数在邻域中某些节点上的数据集合. 例如, 计算域为                               AllNeighbors
                 的参数   dOpen_Cor_N. Swarm  并行语句对所有邻居的循环、遍历操作是隐式的, 这种描述方式虽然简洁直观, 但
                 在通用化的    C  语言中是不允许的. C     语言支持以数组形式表示多个邻居的数据, 并通过数组运算实现对邻居数据
                 的显式循环、遍历操作. 因此, 需要将          Swarm  并行语句的子语句转换为基于数组运算的             C  语言程序.
                    该部分算法逻辑为, 将对应于          X  变量的参数映射为     C  语言数组, 并生成基于数组运算的          C  语言代码. 以子语
                 句  dOpen_Cor_N = dOpen_Cor_0  为例. dOpen_Cor_0  对应于本地写变量, dOpen_Cor_N  对应于交互变量. 因此, 当
                 解析该语句时, 首先将      dOpen_Cor_0  转换生成  Aw_0  变量, 将  dOpen_Cor_N  转换生成  X1[i] 数组. 构造  for 循环语
                 句, 生成  i 为新定义的   C  语言临时变量, 用于记录      for 循环次数, 获取参数    dOpen_Cor_N  的计算域中包含的节点数
                 目并设置为循环增量上限, 每循环一次都用              X1[i] 来替换参数   dOpen_Cor_N  在  Swarm  并行语句中的位置, 其中
                 X1[i] 表示参数中对应第     i 个邻居的数值, 进而转换生成该子语句对应的             C  语言代码, 如图   9(b) 所示.

                    (3) 根据参数的计算域生成分布式计算属性码
                    节点计算如何触发、计算结果发布对象等分布式计算属性在                      Swarm  并行语句中以参数计算域的形式隐式表
                 示. 因此, 需要根据    Swarm  并行语句中参数的计算域匹配生成各项计算属性对应的属性码. 以计算结果发布对象
                 属性为例, 其描述的是单个节点单次计算的结果需要发送给哪些邻居节点.
                    计算结果发布对象属性的生成算法如下: 当              Swarm  并行语句中不包含对应于        X  变量的参数时, 表示本次计算
                 不会将计算结果告诉任何邻居节点, 生成属性码为                050x00. 当语句中对所有     X  变量的最后一次赋值, 等式左侧         X
                 变量对应的参数计算域为         AllNeighbors 时, 表示将计算结果发布给所有邻居, 生成属性码为            050x0F, 如图  9(c) 所示.
                    综上, 按照步骤     (1)–(3), Swarm  并行语句被编译为标准化语义模块序列.

                 3.3   标准化语义模块至逻辑链编译算法
                    在编译系统中间层, 标准化语义模块序列被按照分支、跳转、循环等语义逻辑组合成与                              SwarmL  程序实际执
                 行顺序一致的逻辑链, 具体实现方法如算法              1  所描述. 以每一个语义模块为基本单元, 首先生成每个模块的编号
                 SSM ID . 然后, 为每个语义模块设置逻辑判断变量, 其对应的是源程序分支、跳转、循环语句中承载条件表达式运
                 算结果的临时变量. 当语义模块不是条件表达式时                (例如场变量定义和赋值语句等), 表示顺序执行关系, 逻辑判断
                 变量  Logical_Var 和逻辑判断条件   Logical_Condition  都为  none, 后续语义模块编号即为本语义模块的编号加          1. 当
                 语义模块是条件表达式时, 表示存在分支、跳转和循环关系, 根据逻辑判断变量取值为                            0  或者  1  来生成后续语义
                 模块编号. 当逻辑判断变量为         1  时, 本语义模块的后续模块的编号即为满足条件后执行的语义模块编号. 反之, 当
                 逻辑判断变量为      0  时, 本语义模块的后续模块的编号即为不满足条件时所执行的语义模块编号. 图                        5  给出了标准
                 化语义模块到逻辑链的编译过程示例.
                    该算法能够确定每个语义模块在实际执行时的后续模块的编号, 进而生成了以语义模块为基本单位且具有完
                 整、直观执行顺序的逻辑链. 逻辑链将全分布式智能建筑系统控制任务描述为若干计算事件经过排列组合而成的
                 序列, 其与  SwarmL  语言所描述的算法逻辑相一致, 足够灵活且接近硬件, 可以生成硬件平台可执行的目标指令程序.

                 算法  1. 标准化语义模块至逻辑链编译算法.

                 输入: 标准化语义模块序列;
                 输出: 逻辑链.

                 1. for each standardized semantic module
                 2.  Generate SSM ID
                 3.  // 生成后续语义模块列表
                             < , ⩽, > , ⩾,!=, == ) then //如果不是条件表达式
                 4.  if O p  ≠ ∀(
   157   158   159   160   161   162   163   164   165   166   167