基于闭包算法的同步语言航天C代码自动生成方法与流程

文档序号:15636038发布日期:2018-10-12 21:29阅读:286来源:国知局

本发明涉及同步语言技术,特别涉及一种基于闭包算法的同步语言航天c代码自动生成方法。



背景技术:

同步语言技术是基于反应式系统的同步假设(synchronoushypothesis)理论的形式化描述语言,其内涵是指对于每一个输入,系统都会在下一次输入之前完成计算并进行。这个假设保证了每一个反应之间不会出现重叠。因此,同步模型不考虑时间的量化信息,而是关注事件的到达顺序与事件间的同步。将连续的物理时间抽象为离散的多个逻辑时间序列。同步语言基于同步假设的理论,在每一个逻辑时间关注系统的功能行为。在反应式系统中,将系统的交互抽象为“输入-计算-输出”。同步语言将“输入-计算-输出”过程抽象为在一个逻辑时间内完成,即这一过程消耗时间为0。通过这样的方式,开发人员可以更多的关注验证系统功能的可靠性以及合理性。

目前主流的同步语言包括esterel,lustre,signal以及quartz等。而其中signal由于具有多时钟(multi-clock)的特点,并且采用数据流方程的组合作为建模形式,因此适合描述分布式或并发系统,这种技术已成功应用于空客a350的舱门控制系统中。但是目前的同步语言与c语言代码的异构之间存在转换复杂的问题,现有研究对于这一方面的问题研究较少。本专利针对这一问题,提出一种面向同步语言的航天领域软件系统高安全c语言代码生成方法,为解决这类问题有效的提供了一定的理论基础以及实现方法。



技术实现要素:

本发明的目的在于提供一种基于闭包算法的同步语言航天c代码自动生成方法,用于解决上述现有技术的问题。

本发明一种基于闭包算法的同步语言航天c代码自动生成方法,其中,包括:将每一个方程式看作为一个实例,通过获得连接conn,得到所有结点间关系的元组<结点1,结点2>,其中结点类型分为输入,操作以及输出三种类型;对所有的元组进行标记为false和true,其中false为未检查,true为已被检查,初始标注均为false;通过同步语言模型闭包划分算法组成闭包,包括:对所有的元组进行标注,为未检查或检查,遍历所有的二元组,以队列为媒介检查所有的元组,通过各个元组之中的公共结点将二元组中的结点联结起来;无公共结点的元组和具有相关关系的所有结点分别组成闭包;通过同步语言模型闭包内部排序算法进行排序,包括:在得到每个独立闭包生成的树后,通过树的后序遍历,以左右根的形式遍历整棵树形成的闭包,得到内部的正确排序;同步语言模型闭包间排序算法包括:将多个闭包间的运算关联看作是运算的流程图,图中的顶点代表每一个子运算,这些运算用闭包的输入和输出来描述,用有向边表示闭包间的运算优先顺序,有向图构成了相应的运算流程aov网,首先通过闭包之间的运算顺序构建aov网,对于每个闭包的输出存储输出结点的出度,判断闭包中的输入是否是其他闭包的输出,如果是,则将输入结点所对应的输出结点的闭包记录,针对每一个闭包的输出进行如下操作:记录当前输出结点所在闭包的编号;遍历其他闭包的输入,如果发现当前闭包的输出结点是当前所遍历的其他闭包的输入结点,则将该其他闭包输出结点的出度数值加一;记录当前遍历闭包的输出结点;每个闭包的输出结点存储的数据包括<所在闭包编号,作为输入结点的闭包的对应输出结点,出度>,通过拓扑排序获得拓扑序列,包括:找到出度值为0的输出结点,将该结点所在的闭包编号存储至拓扑序列中;删除该结点的边,更新闭包中的出度值;重复上述方法,直到所有闭包都已加入拓扑序列。

根据本发明的基于闭包算法的同步语言航天c代码自动生成方法的一实施例,其中,同步语言模型闭包间排序算法详细流程包括:a、遍历闭包集合,设当前闭包编号为li,记录输出结点ri;b、检索其他闭包,设为lj(i≠j),获取lj的输入,如果发现li的输出结点ri是lj的输入结点,则将lj的出度数值dj加1;c、重复a和b,直到i=n,其中,n为闭包总数;每个闭包的输出结点存储的数据包括<所在闭包编号li,作为输入结点的闭包的对应输出结点ri,出度di>;d、遍历闭包集合找到所有出度值为0的闭包,储至拓扑序列中;e、将出度值不为0的闭包的出度值减去1;f.重复d和e,直到所有闭包都已加入拓扑序列。

根据本发明的基于闭包算法的同步语言航天c代码自动生成方法的一实施例,同步语言模型闭包划分算法具体包括:s1、输入所有conn;s2、将conn两端的结点取出作为二元组<结点1,结点2>的两部分保存起来,形成一个元组的集合c1;s3、检索c1中二元组,是否遍历结束,若遍历结束,则执行s4,否则执行s5;s4、将整体划分为多个闭包,跳转s19;s5、从元组的集合c1中取出一个元组t1;s6、若元组t1的标记为true,则执行步骤s3,否则执行步骤s7;s7、将元组t1标记为true,并将元组t1中的结点按照结点顺序放入队列,二元组t1以结点2为根,结点1为左孩子建立关系树;s8、判断队列是否为空,如果为空,则认为一个闭包划分结束,并把该闭包加入闭包集合,跳转步骤s3;s9、将队首结点出队;s10、创建另一个包含所有元组的集合ci;s11、检索集合ci中的下一个二元组,设该二元组为t2,若t2和t1有且只有一个重叠结点,执行s12,若不存在这样的二元组t2,执行s8;s12、判断二元组t2的标记,若二元组t2的标记为true,执行步骤s11,否则,执行步骤13;s13、判断二元组t2中的结点1与出队列的结点是否相同,如果相同执行步骤s14,否则,执行步骤s15;s14、将二元组t2的结点2放于队列尾,并将二元组t2标记为true,把二元组t2的结点2设置为结点1的父结点;s15、将二元组t2的结点1放于队列尾部,并将二元组t2标记为true;s16、判断出队列的结点是否有左孩子,如果有,则执行步骤s17,否则,执行步骤s18;s17、出队列的结点的左孩子与二元组t2的结点2对应的父结点两个端口,端口靠前的为左孩子,否则为右孩子,跳转s11;s18、将二元组t2的结点1作为结点2的左孩子,跳转s11;s19、结束。

同步语言能够表达确定性并发行为,非常适合分析设计航天领域系统。本发明提出的一种面向同步语言的高安全c语言代码生成方法成功解决了同步语言与c语言异构之间转换复杂的问题,并将该方法应用于航天领域软件子系统中,验证了结果的准确性,安全性以及可靠性,同时本专利提出的相关算法为航天领域软件建模工作提供了理论基础和方法支持。

附图说明

图1所示为同步语言模型闭包划分算法的详细流程图;

图2所示为同步语言模型闭包间拓扑排序算法流程图。

具体实施方式

为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

一个同步语言程序是一个连接输入和输出信号的方程式集,一个信号用一个值和说明它出现或缺省的逻辑时钟来表示。因此,代码自动生成问题可以抽象为:在生成一个方程式集的c语言代码过程中,多个方程式之间,以及一个方程式内部,如何去准确划分独立方程式,如何去正确定位方程式之间的先后顺序。

在本发明基于闭包算法的同步语言航天c代码自动生成方法中,将每一个方程式看作为一个实例,通过获得实例中的连接conn,能够得到所有实例结点间关系的元组描述<结点1,结点2>,其中结点类型分为输入,操作以及输出三种类型,在c语言代码生成的过程中,需要考虑的问题包括:如何对多个实例进行划分,将每个实例单独划分为一个闭包;如何对闭包内部的操作数和运算符进行合理排序,如何规定闭包间的前后依赖关系,确定唯一的闭包间顺序。

针对这些问题,基于闭包算法的同步语言航天c代码自动生成方法,具体包括:提出同步语言模型的闭包划分算法,闭包内部排序算法,以及闭包间的拓扑排序算法。

图1所示为同步语言模型闭包划分算法的详细流程图,如图1所示,同步语言模型闭包划分算法具体包括:

由于真实情况下,同步语言的实例集合庞大,多个运算之间可能是独立的,为了区分这些独立的子集合,将这些子集合定义为闭包,在代码生成前,需要对实例集合中的单独实例进行闭包的划分,同时闭包中的运算,输出唯一,输入作为他们的前驱结点,这样的结构可以用树形结构来表示,所以,在闭包划分的过程中同时建树。为了提高算法效率,本发明同步语言模型闭包划分算法在建树过程中采用三叉链表的形式表示一棵树,即每一个树中的结点存放三个指针,分别指向父结点,左孩子结点以及右孩子结点。

闭包的划分以及建树过程中,使用到的数据结构包括用于维护待检查结点的队列queue,每个结点在建树过程中需要作为树中的结点保存即tnode类,结点与结点之间构成树tree类。tnode以及tree类的部分实现用元组形式表1如下:

表1

本发明在设计了闭包元组数据结构的基础上,提出了同步语言模型闭包划分算法包括:首先对所有的元组进行标记,false/true(未检查/已被检查),初始标注均为false。遍历所有的二元组,以队列为媒介检查所有的元组(队列中的元素为元组中的结点,队首结点出队后,后续结点前移),通过各个元组之中的公共结点(如<node1,node2>,<node2,node3>两个元组中node2为公共结点)将二元组中的结点联结起来;无公共结点的元组和具有相关关系的所有结点分别组成了闭包。

如图1所示,同步语言模型闭包划分算法的详细流程包括:

s1、输入所有conn;

s2、将conn两端的结点取出作为二元组的两部分保存起来,形成一个元组的集合c1;

s3、检索c1中二元组,是否遍历结束,若遍历结束,则执行s4,否则执行s5;

s4、闭包划分完毕,跳转s19;

s5、从c1中取出下一个二元组,用t1表示;

s6、若t1的标记为true,则执行步骤s3,否则执行步骤s7;

s7、将t1的标记为true,并将t1中的结点按照结点顺序依次放入队列,同时,将该二元组以第二个结点为根,第一个结点为左孩子建立关系树;

s8、判断队列是否为空,如果为空,说明出队的所有结点的父子关系便建立起来,则认为一个闭包划分结束,并把改闭包加入闭包集合,跳转步骤s3;否则执行s9;

s9、将队首结点出队;

s10、创建另一个包含所有元组的集合ci;

s11、检索ci中的下一个二元组,设该二元组为t2,若t2和t1有且只有一个重叠结点,即出队结点,执行s12;若不存在这样的t2,执行s8;

s12、若t2的标记为true,执行步骤s11,否则,执行步骤13;

s13、判断t2中的结点1与出队结点是否相同,如相同,执行步骤s14,否则执行s15;

s14、将t2的结点2放于队尾,并将t2标记为true,同时把t2的结点2设置为结点1的父结点;

s15、将t2的结点1放于队尾,并将t2标记为true;

s16、判断出队结点是否有左孩子,如果有则执行步骤s17,否则,执行步骤s18;

s17、凭据左孩子结点与t2的结点2对应的父结点两个端口,端口靠前的为左孩子,否则为右孩子,跳转s11;

s18、将t2的结点1作为结点2的左孩子,跳转s11;

s19、结束。

同步语言模型闭包内部排序算法包括:

划分好闭包之后,代码生成需要针对每一个闭包实现对应的正确的表达式,所以同步语言模型闭包内部排序算法首要目的是保证操作数之间以及操作数与操作符的顺序的准确性以及唯一性。

算法的准确性设计思想是:通过观察发现,每一个闭包内部的各个结点关联符合树的特征,每个作为输出的结点可以看作树的根结点,由于操作的输出唯一,所以可以对每个划分好的闭包建立一颗树,通过树的后序遍历可以获得正确的后缀表达式序列,通过堆栈的操作,实现代码生成的表达式内容。

算法的唯一性设计思想是:为了保证代码生成的唯一性,主要考虑的是如何保证同一个操作中的输入结点之间的先后顺序。本专利中规定了一种比较规则,比较两个输入结点对应在该操作的inport端口名称,名称靠前的顺序在前,如此则可以保证生成代码的唯一性。

算法的详细流程是:在得到每个独立闭包生成的树后(通过同步语言模型闭包划分算法得到),通过树的后序遍历,即以左右根的形式遍历整棵树形成的闭包,也就是表达式的后缀形式,就可以得到内部的正确排序。

图2所示为同步语言模型闭包间拓扑排序算法流程图,如图2所示,同步语言模型闭包间排序算法包括:

闭包间的排序算法,主要通过使用拓扑排序的思想对闭包之间进行排序,在实际工作中,我们可以将多个闭包间的运算关联看作是运算的流程图,图中的顶点代表每一个子运算,这些运算用闭包的输入和输出来描述,用有向边表示闭包间的运算优先顺序,这样的有向图构成了相应的运算流程aov网。由于前面的算法已经将实例集合划分出各个闭包,并将闭包内的输入,操作以及输出结点存储为元组的形式,在闭包间排序算法中,首先通过闭包之间的运算顺序构建aov网,对于每个闭包的输出需要存储该输出结点的出度,以及该闭包中的输入是否是其他闭包的输出,如果是则将输入结点所对应的输出结点的闭包记录,针对每一个闭包的输出进行如下操作:

a.遍历闭包集合,设当前闭包编号为li,记录其输出结点ri;

b.检索其他闭包,设其为lj(i≠j),获取lj的输入(所有叶子结点),如果发现li的输出结点ri(根结点)是lj的输入结点,则将lj的出度数值dj加1(初始出度为0);

c.重复1,2直到i=n(n为闭包总数)。

经过上述操作后,每个闭包的输出结点存储的数据包括<所在闭包编号li,作为输入结点的闭包的对应输出结点ri,出度di>,接下来通过拓扑排序的算法思路获得拓扑序列,操作过程如下:

d.遍历闭包集合找到所有出度值为0的闭包,将该闭包存储至拓扑序列中。

e.更新其他闭包的出度值(出度值减一)

f.重复d,e,直到所有闭包都已加入拓扑序列。

g.闭包间拓扑排序结束。

拓扑序列的中闭包的顺序即为c语言代码生成的排序。

同步语言能够表达确定性并发行为,非常适合分析设计航天领域系统。本发明提出的一种面向同步语言的高安全c语言代码生成方法成功解决了同步语言与c语言异构之间转换复杂的问题,并将该方法应用于航天领域软件子系统中,验证了结果的准确性,安全性以及可靠性,同时本专利提出的相关算法为航天领域软件建模工作提供了理论基础和方法支持。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1