Page 84 - 《软件学报》2021年第6期
P. 84

1658                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         只在 else 控制的语句块下生成代码(第 6 行).
             表 2(b)模型显示一个分段函数,由两个 BooleanSwitch 组件控制 3 个函数段,其中,BooleanSwitch2 组件嵌套
         在 BooleanSwitch1 下面.当然,分段函数的模型也可以直接通过多分支组件比如 Switch 组件构造,这里仅为了演
         示分支嵌套情况的代码生成.该模型中的两个 BooleanSwitch 组件会生成嵌套的 if-else 语句(第 4 行、第 7 行、
         第 8 行和第 11 行);分段函数的 3 个部分分别生成在这 3 个 if-else 控制的语句块中;最后,SequencePlotter 组件也
         由于数据源的不一致会生成在 3 个 if-else 控制的语句块中.
             表 2(c)模型输出可以被 3 或 7 整除的数,其中,能同时被 3 和 7 整数的数会被输出两遍.在该模型中,
         BooleanSwitch1 和 BooleanSwitch2 组件的 True 和 False 分支分别发生交叉,这会导致 CGLT 中 Display 组件和
         接地组件(表示丢弃数据)的分支标记中会有两个分支路径,且这两个分支路径可能会同时满足.因此,这两个分
         支总共会有 4 种分支执行情况.但是由于接地组件并不会生成代码,所以这里只生成 3 个 if-else 语句块(第 4 行、
         第 6 行和第 8 行).特别地,在 BooleanSwitch1 和 BooleanSwitch2 组件分支都为 True 的情况下,Display 组件会同
         时接收来自两个 BooleanSwitch 组件的数据,也就是生成的 printf 代码会输出两个值.
             另外,我们对一个更复杂的数据流模型进行代码生成实验,见图 4.该模型不仅仅具有分支合并、分支嵌套、
         分支交叉等基本情形,还包含分支嵌套情况下的分支交叉,如图 4 中的 BooleanSwitch1 和 BooleanSwitch2 组件
         的 True 分支交叉于 BooleanSwitch3,Expression4 和 Scale1 这 3 个组件前.在数据流语义下,该模型是合法的.该
         模型会输出两个函数图像,分别如图 5(a)和图 5(b)所示.模型中的 Sin 组件会以一定采样间隔输出正弦曲线上的
         值,由 BooleanSwitch1 和 BooleanSwitch2 组件将正弦曲线分为 3 部分计算.最后,SequencePlotter1 组件会输出计
         算后的其中两部分数据,SequencePlotter2 组件会输出计算后的所有 3 部分数据.













                                   Fig.4    A model with more complex branching
                                       图 4   具有更复杂分支情况的模型


















                 (a)  图 4 模型中 SequencePlotter1 输出的图像                 (b)  图 4 模型中 SequencePlotter2 输出的图像
                                  Fig.5    Function graph of the model output in Fig.4
                                       图 5   图 4 中模型输出的函数图像
   79   80   81   82   83   84   85   86   87   88   89