一种MSVL语言的编译系统及方法与流程

文档序号:18684894发布日期:2019-09-13 23:50阅读:392来源:国知局
一种MSVL语言的编译系统及方法与流程
本发明属于计算机程序设计语言及应用
技术领域
,尤其涉及一种MSVL语言的编译系统及方法。
背景技术
:目前,时序逻辑作为一种系统建模与验证的形式化工具,已广泛应用于软件工程、数字电路设计等领域。时序逻辑主要有三大分支:线性时序逻辑(LTL),分支时序逻辑(CTL)以及基于区间的时序逻辑(ITL和CHOP逻辑)。投影时序逻辑(PTL)是一种新的基于区间的时序逻辑,包括无限模型,过去操作和一个新的投影操作。它适用于描述带有时序区间的软硬件系统,可以处理顺序,并发,投影等结构,具有较强的表达能力。时序逻辑语言MSVL是PTL的一个可执行子集,是一个集建模(Modeling)、仿真(Simulation)和验证(Verification)为一体的时序逻辑程序设计语言。MSVL可以将程序的书写、性质描述和验证统一在时序逻辑的框架中进行,对软硬件系统使用时序逻辑程序设计语言进行建模,对系统期望的性质采用时序逻辑公式来描述,将模型和性质统一在时序逻辑的框架中,从而可以实现对软硬件系统的形式化验证。自上世纪70年代末,许多时序逻辑程序设计语言相继被提出。时序逻辑是一种用于描述和验证实时系统实时性的重要方法,很多基于时序逻辑的编程语言都可以描和证明同一逻辑框架下的程序。Cactus基于分支时间时序逻辑,XYZ/E,THLP,Chronolog,Tempura以及Tokio基于区间时序逻辑,TLA也是一种基于时序逻辑行为的描述语言。和上述形式化语言相比,MSVL在建模验证并行系统等方面具有显著的优势。与传统的命令式语言例如C和JAVA语言相比,MSVL具有建模,仿真和验证三种功能,极大地方便用户对大型程序的检测和应用。因此,实现MSVL语言的编译器具有重要的应用价值。MSVL语言可以用于描述系统的顺序、并发、非确定、非终止、自治、同步通信等行为。因为MSVL包含赋值、条件、循环等语句,具有命令式程序设计语言的特征。使用MSVL语言,可以完成模型检测中系统建模、性质描述、性质验证等一系列工作,在投影时序逻辑的基础上,实现一种统一的模型检测方法。目前,MSVL语言已被广泛应用于各种领域的建模与验证中。为了执行MSVL程序,并对MSVL程序进行动态验证。现有技术使用解释器对MSVL进行仿真、建模和验证。解释器在处理中小型程序时,具有实现简单、使用方便等优点,但是面对大型程序,解释器执行效率低下。因此,实现MSVL编译系统可以大大提高MSVL程序的执行和验证效率。综上所述,现有技术执行MSVL程序效率低。技术实现要素:本发明的目的在于提供一种(Modeling,SimulationandVerificationLanguage)MSVL语言的编译系统及方法,旨在解决现有技术执行MSVL程序效率低的问题。本发明是这样实现的,一种MSVL语言的编译系统,其主要用于程序的形式化验证领域,所述MSVL语言的编译系统包括:MSVL前端和底层虚拟机(LowLevelVirtualMachine,简称LLVM)后端;其中MSVL前端将输入的MSVL程序转换为IR代码,LLVM后端对IR代码进行优化并转为机器码。所述MSVL前端包括词法语法分析模块,预处理模块和中间代码生成模块;其中词法语法分析模块用于对输入的MSVL程序进行词法语法分析,生成语法树;预处理模块对语法树进行预处理;中间代码模块根据预处理后的语法树生成中间代码。所述LLVM后端包括目标代码生成模块。其中目标代码生成模块根据中间代码和目标机器生成对应的目标机器码。本发明的另一目的在于提供一种所述MSVL语言的编译系统的MSVL语言的编译方法,所述MSVL语言的编译方法对MSVL中的简单语句用NormalForm的方法进行预处理,对复杂语句,分别对每个并发分量进行预处理,并对每个并发分量创建一个线程。进一步,所述MSVL语言的编译方法包括以下步骤:步骤一,将MSVL程序导入词法语法分析模块,并将源程序转化为记号流,并将记号流转化为MSVL程序语法树;步骤二,将语法树导入预处理及语义分析模块,根据语义将各个语句预处理为对应的格式;步骤三,根据LLVM中间代码(IntermediateRepresentation,简称IR)的生成规则,将预处理所得程序转化为LLVM的中间代码IR;步骤四,根据LLVM的中间代码IR及目标机器生成对应的可执行机器码。进一步,所述将MSVL程序导入词法语法分析模块,并将源程序转化为记号流,并将记号流转化为语法树,输入是一个MSVL程序,输出是一棵语法树;其中用到词法分析器Flex和语法分析器Bison;首先对调用词法分析器Flex对输入的MSVL程序进行词法分析,将字符序列转化为记号流;再调用语法分析器Bison对记号流进行语法分析,识别出MSVL程序中的语法结构,生成语法树。进一步,所述字符序列包括MSVL语言中的关键字、数值、字符串、标示符、运算符、间隔符以及注释符;所述MSVL语言中的语法结构包括赋值语句、顺序语句、分支语句、循环语句、函数、MSVL中的next语句、frame语句、await语句、or语句、conjunction语句、parallel语句、projection语句、always语句;Pre(P)用于对MSVL程序P进行预处理,其中P是待处理的MSVL程序,P'是预处理后的MSVL程序;具体包括:步骤一,如果P是赋值语句x<==e,P'=P;否则转到步骤二;步骤二,如果P是skip、x:=e、nextp、p||q、pandq、{p1,...,pm}prjq,P'=PreNf(Nf(P));否则转到步骤三;步骤三,如果P是if(b)then{p}else{q},P'=if(b){Pre(p)}else{Pre(q)};否则转到步骤四;步骤四,如果P是while(b){p},P'=while(b){Pre(p)};否则转到步骤五;步骤五,如果P是p;q,P'=Pre(p);Pre(q);否则转到步骤六;步骤六,如果P是porq,P'=if(b){Pre(p)}else{Pre(q)};否则转到步骤七;步骤七,如果P是await(c),P'=Pre(while(!c){skip});否则转到步骤八;步骤八,如果P是len(n),P'=Pre(i<==0andwhile(i<n){i:=i+1});否则转到步骤九;步骤九,如果P是frame(x),将变量x插入到frame符号表中;否则转到步骤十;步骤十,如果P是localx:p,在进程p中声明变量x;否则结束。进一步,在步骤二中,Nf(P)将MSVL程序P转换成正则形式;PreNf(Nf(P))对MSVL程序P的正则形式进行预处理,其中R是待处理的MSVL程序的正则形,R'是预处理后的MSVL程序,函数printState()用于输出程序中的变量信息;(1)如果R的形式是andempty,R'=x1=e1,...,xm=em;printState();否则转到(2);(2)如果R的形式是andnextpf,R'=x1=e1,...,xm=em;printState();Pre(pf);否则转到(3);(3)如果R是trueandnextpf:R'=printState();Pre(pf);否则结束;对MSVL程序中的复杂语句的预处理,其中P是待处理的MSVL程序,P'是预处理后的MSVL程序;(1)如果P是p||q,P'=createThread(Pre(p),PAL);createThread(Pre(q),PAL);否则转到(2);(2)如果P是pandq,P'=createThread(Pre(p),AND);createThread(Pre(q),AND);否则转到(3);(3)如果P是{p1,...,pm}prjq,P'=createThread(Pre(p1),PRJ);...;createThread(Pre(pm),PRJ);createThread(Pre(q),PRJ);否则转到(4);(4)如果P是alw(p),P'=createThread(while(true){createThread(Pre(p))},ALW);否则结束。进一步,用LLVM提供的接口函数将预处理后的MSVL程序P'转成LLVM的中间代码IR,具体包括:从语法树中取出基类型;而后递归遍及语法树,返回由基类型产生的复合类型结构;使用中间表示语言声明变量,并将变量名和变量地址作为键值对插入符号表中;对于分支语句,将其分为两个语句块,每个语句块使用标签作为标志,每个语句块中的语句作为不同的个体翻译,分别生成中间代码,并在执行时根据分支语句中条件的跳转到不同的语句块;对于循环语句,分为循环体和循环结束两部分,每部分分别生成中间代码,根据循环条件的真假跳转到不同的语句块,若循环体结束,会无条件跳转到循环条件判断的位置;对于函数声明,将之前声明的局部变量符号表压栈,借助于变量声明语句,将函数声明中的形参声明为局部变量,对于函数体,作为单独的语句块生成中间代码;当函数体翻译完毕,如果函数没有返回值,在函数体最后生成返回语句;最后将局部变量符号表从栈中弹出;对于函数调用语句,根据取值语句,依次取出实参值,并将实参值传递给待调用的函数,并等待函数返回。本发明的另一目的在于提供一种利用所述MSVL语言的编译方法的线程调度机制,所述线程调度机制在MSVL程序执行的过程中,对创建的线程动态的组织成一棵线程树,其中线程树中的结点类型是LEAF,PAL,AND,ALW,PRJ;结点PAL,AND,ALW和PRJ分别表示parallel语句,conjunction语句,always语句和projection语句;结点LEAF表示一个简单语句。本发明的另一目的在于提供一种利用所述MSVL语言的编译系统的程序形式化验证系统。本发明提供的MSVL语言的编译系统及方法,很好地解决了现有技术执行MSVL程序效率低,影响了程序验证和执行的效率的问题,提高了MSVL程序的执行和验证效率。根据程序本身复杂程度的不同,其执行速度可提高几十倍乃至上百倍。并且一次编译成功后程序可以反复执行,无需再次编译;目前本发明可执行规模为十万行以上的MSVL程序,而现有技术对于同等规模的程序无能为力。本发明可以将MSVL程序的执行与MSVL程序源码之间解耦。对MSVL源程序进行一次编译,转换成对应的中间代码,并根据目标机器生成可执行码。程序便与源码脱离,可反复执行,不需再次编译;而现有技术效率低下的原因之一就是对执行过程中重复执行的语句块或函数需要多次解释。使用此方案可大大提高MSVL程序的执行效率。与现有技术相比,本发明具有以下优势:程序解释器执行时间(秒)编译器执行时间(秒)Sys(35377行)1992Mcml(36281行)16008Sha(44577行)1742Cf_Fir(37473行)4004Cf_Cordic(20257行)3704LTLNfBA(8887行0300124组合数(1000行)3200.8附图说明图1是本发明实施例提供的MSVL语言的编译系统结构示意图;图中:1、MSVL前端;1-1、词法语法分析模块;1-2、预处理模块;1-3、中间代码生成模块;2、LLVM后端;2-1、目标代码生成模块。图2是本发明实施例提供的MSVL语言的编译方法流程图。图3是本发明实施例提供的MSVL程序。图4是本发明实施例提供的图3中的MSVL程序经过词法语法分析后生成的语法树的一部分。图5是本发明实施例提供的对图4中的语法树生成的部分中间代码。图6是本发明实施例提供的对图5中的中间代码生成的可执行码文件。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。下面结合附图对本发明的应用原理作详细的描述。如图1所示,本发明实施例提供的MSVL语言的编译系统及方法包括:MSVL前端1和LLVM后端2。所述MSVL前端1包括词法语法分析模块1-1,预处理模块1-2和中间代码生成模块1-3;所述LLVM后端2包括目标代码生成模块2-1。如图2所示,本发明实施例提供的MSVL语言的编译方法包括以下步骤:S101:将MSVL程序导入词法语法分析模块,并将源程序转化为记号流,并将记号流转化为MSVL程序语法树;S102:将语法树导入预处理及语义分析模块,根据语义将各个语句预处理为对应的格式;S103:根据LLVM中间代码IR的生成规则,将预处理所得程序转化为LLVM的中间代码IR;S104:根据LLVM的中间代码IR及目标机器生成对应的可执行机器码。所述将MSVL程序导入词法语法分析模块,并将源程序转化为记号流,并将记号流转化为语法树,输入是一个MSVL程序,输出是一棵语法树;其中用到词法分析器Flex和语法分析器Bison。首先对调用词法分析器Flex对输入的MSVL程序进行词法分析,将字符序列转化为记号流;再调用语法分析器Bison对记号流进行语法分析,识别出MSVL程序中的语法结构,生成语法树。所述字符序列包括MSVL语言中的关键字、数值、字符串、标示符、运算符、间隔符以及注释符。所述MSVL语言中的语法结构包括赋值语句、顺序语句、分支语句、循环语句、函数、MSVL中的next语句、frame语句、await语句、or语句、conjunction语句、parallel语句、projection语句、always语句。一个MSVL语句是简单语句如果它不是一个并发语句,或者它是一个并发语句p||q,pandq,{p1,...,pm}prjq或者alw(p),并且p1,...,pm,p和q中不包含条件语句和循环语句。否则它是一个复杂语句。Pre(P)用于对MSVL程序P进行预处理,其中简单语句的预处理是基于NormalForm方法,其步骤如下,其中P是待处理的MSVL程序,P'是预处理后的MSVL程序。步骤一:如果P是赋值语句x<==e,P'=P;否则转到步骤二;步骤二:如果P是skip、x:=e、nextp、p||q、pandq、{p1,...,pm}prjq,P'=PreNf(Nf(P));否则转到步骤三;步骤三:如果P是if(b)then{p}else{q},P'=if(b){Pre(p)}else{Pre(q)};否则转到步骤四;步骤四:如果P是while(b){p},P'=while(b){Pre(p)};否则转到步骤五;步骤五:如果P是p;q,P'=Pre(p);Pre(q);否则转到步骤六;步骤六:如果P是porq,P'=if(b){Pre(p)}else{Pre(q)};否则转到步骤七;步骤七:如果P是await(c),P'=Pre(while(!c){skip});否则转到步骤八;步骤八:如果P是len(n),P'=Pre(i<==0andwhile(i<n){i:=i+1});否则转到步骤九;步骤九:如果P是frame(x),将变量x插入到frame符号表中;否则转到步骤十;步骤十:如果P是localx:p,在进程p中声明变量x;否则结束。其中,在步骤2中,Nf(P)将MSVL程序P转换成正则形式。PreNf(Nf(P))对MSVL程序P的正则形式进行进一步预处理。对MSVL程序P的正则形R的预处理步骤如下,其中R是待处理的MSVL程序的正则形,R'是预处理后的MSVL程序,函数printState()用于输出程序中的变量信息。步骤1:如果R的形式是andempty,R'=x1=e1,...,xm=em;printState();否则转到步骤2;步骤2:如果R的形式是andnextpf,R'=x1=e1,...,xm=em;printState();Pre(pf);否则转到步骤3;步骤3:如果R是trueandnextpf:R'=printState();Pre(pf);否则结束。对MSVL程序中的复杂语句的预处理步骤如下,其中P是待处理的MSVL程序,P'是预处理后的MSVL程序。步骤1:如果P是p||q,P'=createThread(Pre(p),PAL);createThread(Pre(q),PAL);否则转到步骤2;步骤2:如果P是pandq,P'=createThread(Pre(p),AND);createThread(Pre(q),AND);否则转到步骤3;步骤3:如果P是{p1,...,pm}prjq,P'=createThread(Pre(p1),PRJ);...;createThread(Pre(pm),PRJ);createThread(Pre(q),PRJ);否则转到步骤4;步骤4:如果P是alw(p),P'=createThread(while(true){createThread(Pre(p))},ALW);否则结束。用LLVM提供的接口函数将预处理后的MSVL程序P'转成LLVM的中间代码IR。其具体包括:从语法树中取出基类型;而后递归遍及语法树,返回由基类型产生的复合类型结构;使用中间表示语言声明变量,并将变量名和变量地址作为键值对插入符号表中。其中,对于分支语句,将其分为两个语句块,每个语句块使用标签作为标志,每个语句块中的语句作为不同的个体翻译,分别生成中间代码,并在执行时根据分支语句中条件的跳转到不同的语句块。其中,对于循环语句,分为循环体和循环结束两部分,每部分分别生成中间代码,根据循环条件的真假跳转到不同的语句块,若循环体结束,会无条件跳转到循环条件判断的位置。其中,对于函数声明,将之前声明的局部变量符号表压栈,借助于变量声明语句,将函数声明中的形参声明为局部变量,对于函数体,作为单独的语句块生成中间代码;当函数体翻译完毕,如果函数没有返回值,在函数体最后生成返回语句;最后将局部变量符号表从栈中弹出。其中,对于函数调用语句,根据取值语句,依次取出实参值,并将实参值传递给待调用的函数,并等待函数返回。本发明实现了一种线程调度机制,在MSVL程序执行的过程中,对创建的线程动态的组织成一棵线程树,其中线程树中的结点类型可以是LEAF,PAL,AND,ALW,PRJ。其中,结点PAL,AND,ALW和PRJ分别表示parallel语句,conjunction语句,always语句和projection语句。结点LEAF表示一个简单语句。对五种结点的执行规则如下:1.如果是LEAF结点:执行该结点对应的程序。2.如果是PAL结点或者AND结点:分别执行左右孩子节点对应的程序。3.如果是ALW结点:执行所有孩子结点(可能有多个)对应的程序。4.如果是PRJ结点:顺序执行除了最后一个孩子结点之外的所有孩子结点对应的程序,同时执行最后一个孩子结点对应的程序。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1