一种基于ST语言的抽象语法树优化方法与流程

专利2025-06-18  14


本发明涉及编译器前端,尤其涉及一种基于st语言的抽象语法树优化方法。


背景技术:

1、编译器前端技术是编译器的重要组成部分,它主要负责将源代码进行词法分析、语法分析、语义分析、生成抽象语法树、符号检查、生成中间代码等工作,在当前的编译器前端领域,能够实现将程序语言转化为对应的机器指令,但是会存在可执行文件较大、执行效率较低等问题,如何提升编译器生成指令的执行效率对编译器的设计显得至关重要。

2、目前编译器大多采用编译器后端优化技术,对抽象语法树生成的中间代码进行进一步优化,这部分主要由gcc或llvm完成,会存在二次开发不可控,以及优化不全的问题。在编译器前端直接进行语法树级别的优化,才是最高效,最完全的优化。

3、现有的抽象语法树优化方法,较为前沿的是使用自然语言处理中的词向量等算法来完成,将抽象语法树中的节点提取出来,形成一段由节点单词组成的文本,再用自然语言处理中的单词特征提取等方法,获取所有节点的特征向量标识。存在问题使用深度优先遍历节点,会存在兄弟节点被排除在上下文中,而使用广度优先遍历,子节点又有被排除的可能性,这造成上下文节点联系不够紧密。

4、st语言是iec61131-3中定义的高级程序语言,国内针对st语言的编译器积累较少,大多数是采用将st语言转为c语言后,调用gcc或clang进行编译,编译速度慢,可控性低,少部分采用了自研st语言编译器,根据st语言生成的plc执行的对应的机器指令,生成机器的指令的大小、执行效率直接影响plc的规模以及性能。


技术实现思路

1、发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种基于st语言的抽象语法树优化方法。可以实现编译器编译流程的前端优化,将能处理的优化尽量前置,省去了在编译器后端通过复杂的算法进行优化,这依赖于计算机的算力,计算机性能越低,编译速度越慢。相较于后端优化,前端优化更直接、更高效、更便捷、更可控,且能大幅度提升编译速度。

2、本发明方法具体包括如下步骤:

3、步骤1,利用antlr工具作为st语言的解析器,解析st语言文件,自动构建antlr的解析树;

4、步骤2,遍历antlr的解析树构建自定义抽象语法树,自定义抽象语法树树节点;

5、步骤3,遍历抽象语法树的变量定义树节点,构建变量符号表;

6、步骤4,遍历抽象语法树的执行体节点,对各子节点的符号名称进行常量类型解析、常量值解析、数据类型判断,并对节点的是否是常量、常量值、数据类型属性进行赋值。

7、进一步的,步骤2中,使用antlr提供的解析树遍历方法,自上而下的遍历,根据antlr的解析树节点类型、内容构建抽象语法树,抽象语法树树节点,根据节点类型构建特定的节点类,所有节点类都继承于同一基类,基类拥有如下属性:节点类型、符号名、是否是常量、常量值、数据类型;节点创建后加入父节点成员列表。本发明中使用antlr作为st语言的解析器,解析st语言文件,st程序是将变量统一定义在头部的,这里统称变量定义树节点,紧跟着头部之后是st程序的执行体,这里统称执行体树节点。

8、进一步的,步骤3中,所述变量符号表拥有如下属性:符号名、数据类型、初值、变量类型、是否保持。

9、进一步的,步骤4包括:根据子节点是否是常量,将常量值、常量类型向父节点进行传播,再根据节点与节点之间的符号类型或者运算符,进行常量合并的计算,被计算的节点从父节点移除,根据计算后的常量值创建常量树节点类型,将常量值赋值到节点对应的属性,并添加到对应父节点,以达到节点合并、常量合并的目的,降低树的复杂度,减少编译器后端的指令生成。

10、进一步的,步骤4还包括:遍历抽象语法树的执行体节点的特定子成员条件语句节点和循环语句节点的执行控制条件对应的树节点,判断是否是常量,且常量值是否是零,如果为零,则判定条件语句或循环语句无效,条件语句或循环语句永远无法执行,将条件语句节点或循环语句节点的整体从父节点移除,完成死代码消除,实现语法树的优化,从源头上减少编译器后端的指令生成。

11、进一步的,步骤4还包括:遍历优化后的语法树,在遍历优化后的语法树的过程中针对赋值语句(符号名:=表达式;)中的表达式进行特征值计算,特征值的计算公式为:

12、

13、其中,n为节点序号,w为参数矩阵,tn为第n个节点类型信息,sn为第n个节点符号信息,cn为第n个节点使用机制得到的上下文信息,符号:为向量拼接操作,f(x)为计算得到的赋值语句对应的特定值,该特征值计算方法消除了符号名大小写关系、符号名前后关系、运算符前后关系等。

14、进一步的,步骤4中,所述建立哈希表进行管理包括:特征值计算完成后以特征值计算结果为键,以赋值语句左侧的符号名为值,如果键在哈希表内已存在,则进行键值替换。

15、进一步的,步骤4中,在遍历语法树的过程中针对所有表达式的子节点进行排列组合特征值计算,使用计算结果去哈希表内索引对应键,如果存在对应键,则将被计算的子节点从父节点中移除,取对应键值,创建符号节点,添加到对应父节点,进行节点替换。

16、进一步的,本发明还提供了一种电子设备,包括处理器和存储器,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述的方法的步骤。

17、进一步的,本发明还提供了一种存储介质,存储有计算机程序或指令,当所述计算机程序或指令在计算机上运行时,执行所述的方法的步骤。

18、有益效果:

19、经本发明优化的抽象语法树,具备了完善的符号信息,语法树更精简,将原本编译器后端的优化处理流程提前的编译器前端进行处理,相较后端处理,前段处理更高效、更直接,所需要的计算机算力更低,能较大的提升编译速度。经处理后的语法树,生成的可执行程序指令更少,执行效率更高,能较大的提升编译后的执行文件的执行性能。



技术特征:

1.一种基于st语言的抽象语法树优化方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的方法,其特征在于,步骤2中,使用antlr提供的解析树遍历方法,自上而下的遍历,根据antlr的解析树节点类型、内容构建抽象语法树,抽象语法树树节点,根据节点类型构建特定的节点类,所有节点类都继承于同一基类,基类拥有如下属性:节点类型、符号名、是否是常量、常量值、数据类型;节点创建后加入父节点成员列表。

3.根据权利要求2所述的方法,其特征在于,步骤3中,所述变量符号表拥有如下属性:符号名、数据类型、初值、变量类型、是否保持。

4.根据权利要求3所述的方法,其特征在于,步骤4包括:根据子节点是否是常量,将常量值、常量类型向父节点进行传播,再根据节点与节点之间的符号类型或者运算符,进行常量合并的计算,被计算的节点从父节点移除,根据计算后的常量值创建常量树节点类型,将常量值赋值到节点对应的属性,并添加到对应父节点,以达到节点合并、常量合并的目的。

5.根据权利要求4所述的方法,其特征在于,步骤4还包括:遍历抽象语法树的执行体节点的特定子成员条件语句节点和循环语句节点的执行控制条件对应的树节点,判断是否是常量,且常量值是否是零,如果为零,则判定条件语句或循环语句无效,条件语句或循环语句永远无法执行,将条件语句节点或循环语句节点的整体从父节点移除,完成死代码消除,实现语法树的优化。

6.根据权利要求5所述的方法,其特征在于,步骤4还包括:遍历优化后的语法树,在遍历优化后的语法树的过程中针对赋值语句(符号名:=表达式;)中的表达式进行特征值计算,特征值的计算公式为:

7.根据权利要求6所述的方法,其特征在于,步骤4中,所述建立哈希表进行管理包括:特征值计算完成后以特征值计算结果为键,以赋值语句左侧的符号名为值,如果键在哈希表内已存在,则进行键值替换。

8.根据权利要求7所述的方法,其特征在于,步骤4中,在遍历语法树的过程中针对所有表达式的子节点进行排列组合特征值计算,使用计算结果去哈希表内索引对应键,如果存在对应键,则将被计算的子节点从父节点中移除,取对应键值,创建符号节点,添加到对应父节点,进行节点替换。

9.一种电子设备,其特征在于,包括处理器和存储器,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行如权利要求1至8中任一项所述的方法的步骤。

10.一种存储介质,其特征在于,存储有计算机程序或指令,当所述计算机程序或指令在计算机上运行时,执行如权利要求1至8中任一项所述的方法的步骤。


技术总结
本发明提供了一种基于ST语言的抽象语法树优化方法,通过编译器前端技术对ST编程语言进行优化,从源头上优化代码结构,提升编译效率,提升最终生成指令的执行效率。一种基于ST语言的抽象语法树优化方法,该优化方法包括:(1)使用antlr工具进行ST语言的词法分析、语法分析,创建完整的抽象语法树;(2)遍历抽象语法树进行常量合并,对常量树节点进行提前计算、合并为一个树节点;(3)遍历抽象语法树进行死代码消除,删除无用树节点;(4)遍历抽象语法树进行树节点的特征值计算,根据树节点的相似性,进行子表达式消除,从而减少冗余计算,提高执行效率。

技术研发人员:彭震,刘铠源,于金生
受保护的技术使用者:南京科远智慧科技集团股份有限公司
技术研发日:
技术公布日:2024/12/17
转载请注明原文地址:https://xbbs.6miu.com/read-25486.html