一种选择语句优化编译方法转让专利

申请号 : CN201710356936.1

文献号 : CN107168761B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张磊陈宏君周磊谭良良刘克金文继锋徐卫峰吴波

申请人 : 南京南瑞继保电气有限公司南京南瑞继保工程技术有限公司

摘要 :

本发明公开一种选择语句优化编译方法。在语义分析阶段,针对IEC61131‑3的ST(结构化文本)语言的CASE(选择)语句进行优化编译,当判定CASE语句的各个分支求值表达式为单个常量模式时,采用直接跳转表的方式形成指令序列;当CASE分支求值表达式为多个常量或常量区间时,采用表达式短路求值和跳转表相结合的方式形成指令序列。本发明方法提高了ST语言中选择语句的翻译后指令执行的效率。

权利要求 :

1.一种选择语句优化编译方法,其特征在于,对于基于IEC61131-3标准的ST结构化文本语言的CASE选择语句进行编译,根据CASE选择语句的各个分支的求值表达式类型,采用如下对应的优化翻译模式:当各个分支求值表达式都是单个常量时,采用直接跳转表翻译模式;

当至少存在1个分支求值表达式是多个常量或常量区间时,采用短路求值和跳转表混合的翻译模式;

当存在1个分支求值表达式是多个常量或常量区间时,将该分支的求值表达式进行短路求值计算,在跳转表中插入短路求值指令,包括:a)对于基于逗号并列的分支求值表达式,形成或序列的短路求值跳转指令;

b)对于基于区间的分支求值表达式,形成与序列的短路求值跳转指令;

c)对于存在多个逗号的分支求值表达式,以逗号为间隔,间隔之间形成或序列的短路求值跳转指令。

2.如权利要求1所述的一种选择语句优化编译方法,其特征在于,当选择语句的各个分支求值表达式都是单个常量值时,直接跳转表翻译模式的步骤为:a) 在翻译每个分支前,记录当前分支的指令的行号;

b) 记录当前分支与分支标号的对应关系;

c) 在一遍扫描过程中,形成各个分支的执行指令;

d) 扫描完毕后,将b)步骤中得到的分支与分支标号的对应关系生成包含有跳转指令的跳转表,并将跳转指令插入到执行指令前面。

3.如权利要求1所述的一种选择语句优化编译方法,其特征在于,读取ST代码文本,进行词法、语法、语义分析,针对“CASE expression OF … END_CASE;”的文法,提取各CASE选择语句序列,获取CASE选择语句的各个分支的求值表达式,判断各个分支求值表达式类型。

4.如权利要求1所述的一种选择语句优化编译方法,其特征在于,CASE选择语句翻译后的指令包括跳转表和执行指令。

5.如权利要求1所述的一种选择语句优化编译方法,其特征在于,跳转表中的标号和某个分支的执行指令标号对应;按照CASE选择语句分支的顺序,进行逐个求值表达式计算和判断,当条件满足时跳转到指定的执行指令处执行。

说明书 :

一种选择语句优化编译方法

技术领域

[0001] 本发明属于编译器处理领域,具体涉及一种IEC61131-3结构化文本编程语言选择语句编译优化的方法。

背景技术

[0002] 在工业控制领域中,IEC61131-3是通用的国际标准,该标准定义了结构化文本ST的语法和文法,通常将ST语言翻译为二进制中间指令,然后解释执行。在ST语言中,CASE选择语句是使用频率较高的语句,ST语言定义的CASE语句文法为:
[0003] CASE expression OF
[0004]       case_value1: statement list1
[0005]       case_value2: statement list2
[0006]       ...
[0007]       case_valueN: statement list2
[0008]       ELSE statement listN+1
[0009] END CASE;
[0010] 例如:
[0011] CASE Var OF
[0012]    1: statement list1;         (* Var=1执行语句1, *)
[0013]    2,3: statement list2;       (* Var=2或3执行语句2 *)
[0014]    10..20: statement list3;    (* 10<=Var<=20执行语句3*)[0015] 25,30..40: statement list4;  (*Var=25或30<=Var<=40执行语句5 *)[0016]    ELSE statement listN+1;     (* 上述分支条件不满足,执行该语句 *)[0017] END CASE;
[0018] 每个case分支的求值表达式可以是单个常量,可以是通过逗号,并列的多个常量,或通过..表示的范围。这种文法定义和PASCAL、C语言的定义存在较大不同,不能直接使用基于跳转表、查找表的翻译方法。通常的方法是转换为IF-ELSEIF-ELSE的等价语句,然后进行翻译。由于工业实时控制领域,对指令的运行效率要求极高,需要对CASE语句进行优化翻译。在实际使用过程中,选择语句的分支求值表达式在极大多数的情况下是常量,故在语义阶段,可对求值表达式进行类型分析,当所有分支的求值表达式都是单个常量时,可使用跳转表的翻译方法;当存在1个分支的求值表达式是多个常量或常量区间时,根据连接符号(,和..)的功能定义,可在跳转表中插入短路求值指令,提高执行效率。本案由此产生。

发明内容

[0019] 本发明的目的是克服现有技术的不足,提高IEC61131-3标准的CASE(选择)语句执行效率,提供一种选择语句优化翻译方法。
[0020] 为了实现该目的,本发明采用如下技术方案,其特征在于,对于基于IEC61131-3标准的ST结构化文本语言的CASE选择语句进行编译,根据CASE(选择)语句的各个分支求值表达式类型,采用对应的优化翻译模式,具体包括如下内容:
[0021] 当各个分支求值表达式都是单个常量时,采用直接跳转表翻译模式;
[0022] 当至少存在1个分支求值表达式是多个常量或常量区间时,采用短路求值和跳转表混合的翻译模式。
[0023] 进一步地,当CASE(选择)语句的各个分支求值表达式都是单个常量值时, 基于直接跳转表翻译模式的实现步骤为:
[0024] a) 在翻译每个分支前,记录当前分支的指令的行号;
[0025] b) 记录当前分支与分支标号的对应关系;
[0026] c) 在一遍扫描过程中,形成各个分支的执行指令;
[0027] d) 扫描完毕后,将b步骤中得到的分支与分支标号的对应关系生成跳转表(跳转表由跳转指令及其他指令组成),并将跳转指令插入到执行指令前面。
[0028] 进一步地,当存在1个分支求值表达式是多个变量时(即分支表达式存在逗号,或连续2个点号..),将该分支的求值表达式进行短路求值计算,在跳转表中插入短路求值指令,包括:
[0029] a)对于形如“CASE Var OF a,b:”基于逗号并列的求值表达式,形成或序列的短路求值跳转指令;
[0030] b)对于形如“CASE Var OF a..b:”基于区间的求值表达式,形成与序列的短路求值跳转指令;
[0031] c) 对于形如“CASE Var OF a,b,c..d”存在多个逗号的求值表达式,以逗号为间隔,间隔之间形成或序列的短路求值跳转指令。
[0032] 读取ST代码文本,进行词法、语法、语义分析,针对“CASE expression OF … END_CASE;”的文法,提取各CASE选择语句序列,获取CASE选择语句的各个分支的求值表达式,判断各个分支求值表达式类型。
[0033] CASE选择语句翻译后的指令包括跳转表和执行指令。
[0034] 跳转表中的标号和某个分支的执行指令标号对应;按照CASE选择语句分支的顺序,进行逐个求值表达式计算和判断,当条件满足时跳转到指定的执行指令处执行。
[0035] 采用上述方案后,本发明具有如下有益效果:在语义分析阶段,判断CASE分支的表达式类型,当所有分支为单个常量时,采用直接跳转表的高效翻译方法,当存在复合表达式时,转换为逻辑表达式进行短路求值,在跳转表中插入短路求值指令,显著提高了ST语言中CASE语句翻译后指令序列的执行效率,适用于对实时性要求高的工业控制领域。

附图说明

[0036] 图1是本发明中CASE(选择)语句优化编译原理图;
[0037] 图2是本发明中CASE(选择)语句的跳转表原理图;
[0038] 图3是本发明中CASE分支基于短路求值的表达式跳转表指令示例图。

具体实施方式

[0039] 以下将结合附图,对本发明的技术方案进行详细说明。
[0040] 先定义一套中间指令集,优选地,采用三地址码方式。例如je为相等跳转指令,使用示例为je Var a,LableX,Var表示源变量地址,a为比较变量地址,LabelX为跳转标号值。ge为大于比较指令,le为小于比较指令,and为逻辑与运算指令,or为逻辑或运算指令。
[0041] 具体实现方式如图1所示,读取ST代码文本,进行词法、语法、语义分析,[0042] 针对“CASE expression OF … END_CASE;”的文法,提取各CASE语句序列,获取CASE分支的求值表达式,判断各个分支求值表达式类型,当各个分支求值表达式都是单个常量时,采用直接跳转表翻译模式;当存在1个分支求值表达式是多个常量或常量区间时,采用短路求值和跳转表混合的翻译模式。
[0043] CASE(选择)语句的跳转表原理如图2所示,CASE语句翻译后的指令包括跳转表和执行指令。跳转表中的标号和某个分支的执行指令标号对应。按照CASE分支的顺序,进行逐个求值表达式计算和判断,当条件满足时跳转到指定的执行语句指令处执行。
[0044] 在语义分析阶段,分析出选择语句(CASE)的各个分支都是单个常量值时, 可采用高效率的基于直接跳转表翻译模式,其实现步骤为:
[0045] a) 在翻译每个分支前,记录当前分支的指令的行号;
[0046] b) 记录当前分支与分支标号的对应关系;
[0047] c) 在一遍扫描过程中,形成各个分支的执行指令;
[0048] d) 扫描完毕后,将b)步骤中得到的分支与分支标号的对应关系生成跳转表(跳转表由跳转指令及其他指令组成),并将跳转指令插入到执行指令前面。
[0049] 优选地,单个变量求值的跳转表指令范式为:(je, Var, a, LabelX),其中je为相等跳转指令,即当变量Var的值为a时跳转到标号为LabelX的指令处执行。
[0050] 在语义分析阶段,分析出存在至少1个分支求值表达式是多个常量或常量区间时(即分支表达式存在逗号,或连续2个点号..),将该分支的求值表达式进行短路求值计算,在跳转表中插入短路求值指令,包括:
[0051] a)对于形如“CASE Var OF a,b:”基于逗号并列的求值表达式,形成或序列的短路求值跳转指令。优选地,2个序列并列的求值的跳转表指令范式为:
[0052] (je, Var, a, LabelX)
[0053] (je, Var, b, LabelX)
[0054] 只要有1个条件满足,就短路求值,直接跳转。
[0055] b)对于形如“CASE Var OF a..b:”基于区间的求值表达式,形成与序列的[0056] 短路求值跳转指令。优选地,基于区间的求值表达式的跳转表指令范式为:
[0057] (ge, Temp1, Var, a)
[0058] (le, Temp2, Var, b)
[0059] (and, Temp3, Temp1, Temp2)
[0060] (jz, Temp3, LabelX)
[0061] 其中ge为大于指令,le为小于指令,and为逻辑与指令,jz为非0跳转指令,Temp1、Temp2、Temp3为临时变量,通过临时变量缓存中间计算结果。
[0062] c)对于形如“CASE Var OF a,b,c..d”存在多个逗号的求值表达式,以逗号为间隔,间隔之间形成或序列的短路求值跳转指令。优选地,“CASE a,b,c..d: ”模式的等价表达式中间指令输出算法:
[0063] 1)根据逗号,进行拆分, 获取匹配判断子序列seq[N]:a b c..d
[0064] 2)基于短路求值形成计算子序列的指令
[0065]          int num = 0;           //临时变量个数
[0066]          int seqLab[N];         //各个子序列语句执行入口标签[0067]          initLab(&seqLab, N);   //给各个分支分配标签号
[0068]          for(i=0; i
[0069] 2.1)如果seq[i]是单变量,则输出形如
[0070]                (je, Var, a, SeqLabel[i]);
[0071]                num+=1;
[0072] 2.2)如果seq[i]是区间表达式,则输出形如
[0073]                (ge, Temp[num], Var, c)
[0074]                (le, Temp[num+1], Var, d)
[0075]                (and, Temp[num+2], Temp[num], Temp[num+1])[0076]                (jz, Temp[num+2], SeqLabel[i]);
[0077]                 num +=3; }
[0078] 以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。