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

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

         Nonetheless, the code generation ability of various tools for data flow model is uneven, especially for the branching actors. It is well
         known  that current mainstream modeling tools adopt various ways to avoid complex  branch modeling and  the  generation  of  its
         corresponding code. However, branch modeling is very important, and it makes the data transfer logic of the data flow more clearly by
         using branch actors. In order to solve the problem of code generation caused by complex branch modeling, this study proposed a code
         generation method based on branch schedule marking for data flow model aimed at complex branch combinations. As for the algorithm
         proposed in  this study,  firstly,  the  scheduling order  of the model was determined  by topological sorting.  Secondly, a code  generation
         location table based on control flow was constructed according to the branch marks which marked by the influence of different branches.
         Finally,  code generation of various  mainstream  languages  could be  carried out in  terms of the  code generation  location table.  By
         constructing four instances of data flow  models with  complex branches for code generation and  comparing them  with Simulink and
         Ptolemy in terms of lines of code generation and elapsed time, this study further illustrates the universality of proposed code generation
         methods in complex branch combinations and the value and significance of this work.
         Key words:    model-driven development; data flow; code generation; branch; embedded system

             模型驱动开发在嵌入式系统领域中被广泛使用,它具有低代码、不易出错、容易仿真和验证的特点                                   [1−5] .其
         中,数据流模型是使用最为广泛的计算模型.在数据流模型中,组件按照先后顺序执行,读取组件输入端口的数
         据,并将计算得到的结果通过输出端口和相应的连线向后续组件传递.例如加减法组件,首先在组件的输入端口
                                                                              [6]
         获得加数和减数等输入数据,将加数相加、减去减数,最后在组件的输出端口输出结果 .数据流模型中更高级
         的功能还包括复合组件和状态机等,复合组件是将一些基础组件进行封装,作为一个更大的计算单元使用.一般
         地,复合组件是可以嵌套的,而状态机的应用,使得状态转换相关的控制逻辑的建模更加方便.数据流中的这些
         组件通常被组合起来使用,从而描述整个模型系统.
             数据流模型及相关的支持工具在工业界和学术界越来越得到人们的关注,例如 Simulink,Ptolemy-II 等                        [7−14] .
         但是,这些工具强大的建模能力却给模型验证和代码生成带来了非常大的挑战,所以很多建模工具要么对模型
         进行约束限制,要么不支持某种功能的代码生成.比如,Ptolemy-II 就不支持数据流模型中分支组件的代码生成.
         代码生成器有限的代码生成能力会很大程度上限制工具的使用场景,因为在工业界,很多开发人员不仅仅希望
         工具能够进行建模和仿真,还希望能够支持代码生成,以减少他们的编码工作                           [15−17] .
             我们分别调研了工业界和学术界使用较多的两种建模工具:Simulink 和 Ptolemy-II.经调查,我们发现,它们
         都弱化了对于数据分支组件的支持.在 Simulink 中,用户可以通过 If 子系统或者 Switch Case 子系统来实现分支
         表达,这种表达方式会将不同分支中的组件分别包装在不同的子系统组件中,这里的子系统也属于一种复合组
         件.这样一来,一方面不便于观察和修改模型的逻辑和结构;另一方面,当我们需要嵌套分支的时候,就需要用嵌
         套多层的子系统去实现,这对于建模来说是相当繁琐的.根据我们的了解,企业中的开发人员大多选择直接在模
         型中嵌入代码去实现分支逻辑的计算.在 Ptolemy-II 中,建模和仿真是支持分支组件的,但正如前面提到的,它不
         支持数据流模型中分支组件的代码生成;另外,对于 Ptolemy-II 中代码生成能力较强的针对离散事件模型的代
         码生成器,也直接按照事件传递机制去生成代码.也就是说,生成的代码是一整套离散事件模拟器                                  [18] .然而,通过
         这种方式生成的代码几乎无法在实际生产中使用,因为它太过庞大,并且运行效率非常低.
             综上所述,不能很好地支持分支组件及其代码生成是影响这两种建模工具使用的比较重要的因素之一.可
         想而知,分支组件对于数据流模型的建模来说至关重要,它能很好地将模型中的分支逻辑表达出来.更重要的
         是,分支组件的代码生成可以支撑起整个建模工具的完备性,这不但要求代码生成器能处理简单的分支表达,还
         要求它能够处理任意复杂的分支组件的组合,因为任何分支路径合的表达在建模层面都是有意义的.
             对分支组件的控制流分析是非常复杂的,对带有分支组件的数据流模型进行控制流转换主要会面临 3 个
         挑战.
             (1)  分支组件所带来的两个或多个控制流分支什么时候可以合并.当然,面对这个问题,最坏的方法是将
                 分支之后的所有组件在每个分支中都生成代码.这种方法显然会生成大量的冗余代码,特别是当存在
                 分支嵌套的时候,生成的代码量将会呈指数增长.所以,为每个分支确定一个合适的分支合并位置是
                 关键;
   69   70   71   72   73   74   75   76   77   78   79