CN109976760A - 一种图形语言的交叉编译方法及交叉编译器 - Google Patents
一种图形语言的交叉编译方法及交叉编译器 Download PDFInfo
- Publication number
- CN109976760A CN109976760A CN201711449384.5A CN201711449384A CN109976760A CN 109976760 A CN109976760 A CN 109976760A CN 201711449384 A CN201711449384 A CN 201711449384A CN 109976760 A CN109976760 A CN 109976760A
- Authority
- CN
- China
- Prior art keywords
- cross
- compiler
- pou
- language
- ast
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 230000006870 function Effects 0.000 claims abstract description 87
- 238000010586 diagram Methods 0.000 claims abstract description 51
- 230000008520 organization Effects 0.000 claims abstract description 8
- 238000004590 computer program Methods 0.000 claims description 10
- 238000003860 storage Methods 0.000 claims description 6
- 238000010276 construction Methods 0.000 claims description 3
- 239000000203 mixture Substances 0.000 claims description 3
- 230000008569 process Effects 0.000 description 18
- 238000006243 chemical reaction Methods 0.000 description 10
- 230000015654 memory Effects 0.000 description 9
- 230000018109 developmental process Effects 0.000 description 7
- 238000012545 processing Methods 0.000 description 7
- 238000012937 correction Methods 0.000 description 6
- 238000011161 development Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- 238000004458 analytical method Methods 0.000 description 5
- 101100082037 Danio rerio pou3f3b gene Proteins 0.000 description 4
- 101100352866 Dugesia japonica POU1 gene Proteins 0.000 description 4
- 101100082032 Xenopus laevis pou3f1-a gene Proteins 0.000 description 4
- 101100082034 Xenopus laevis pou3f2-a gene Proteins 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 230000001052 transient effect Effects 0.000 description 3
- 101100137154 Danio rerio pou5f1 gene Proteins 0.000 description 2
- 101100464679 Gallus gallus POU5F3 gene Proteins 0.000 description 2
- 101100082038 Xenopus laevis pou3f4-a gene Proteins 0.000 description 2
- 230000003542 behavioural effect Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 230000000877 morphologic effect Effects 0.000 description 2
- 239000011295 pitch Substances 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- FGUUSXIOTUKUDN-IBGZPJMESA-N C1(=CC=CC=C1)N1C2=C(NC([C@H](C1)NC=1OC(=NN=1)C1=CC=CC=C1)=O)C=CC=C2 Chemical compound C1(=CC=CC=C1)N1C2=C(NC([C@H](C1)NC=1OC(=NN=1)C1=CC=CC=C1)=O)C=CC=C2 FGUUSXIOTUKUDN-IBGZPJMESA-N 0.000 description 1
- 238000012369 In process control Methods 0.000 description 1
- 238000004587 chromatography analysis Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000000151 deposition Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 238000010965 in-process control Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000007257 malfunction Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种图形语言的交叉编译方法及交叉编译器,该方法包括:交叉编译器前端接收用户输入的工程文件,并解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;所述交叉编译器前端将所述POU集合中的各个POU转换为抽象语法树AST,根据转换得到的AST,生成所述工程文件对应的AST,并将所述AST发送至交叉编译器后端,以使所述交叉编译器后端编译出目标机器在目标计算机环境下的可执行机器代码,且该交叉编译器是在通用编译器的源代码中加入跨平台支持库以实现交叉编译的功能,该方法用以解决现有技术不能快速有效地编译图形语言的问题。
Description
技术领域
本发明涉及自动化控制技术领域,尤其涉及一种图形语言的交叉编译方法及交叉编译器。
背景技术
IEC61131-3标准已纳入国家标准,很多国产PLC(programmable logiccontroller,可编程逻辑控制器)厂家已经基于不同硬件和操作系统平台研发出自己的可编程控制器产品,此标准定义了5种工业控制领域的编程语言:IL(指令清单语言);ST(结构化文本语言);FBD(功能块图语言);LD(梯形图语言);SFC(顺序功能块图语言)。这一标准规范了可编程控制器的编程语言及其基本元素,为可编程控制器软件技术的发展,乃至整个工业控制软件技术的发展,起到了举足轻重的推动作用。
目前传统的通用编译器,例如开源的GCC、微软出品的Visual Studio.net、苹果公司推出的Clang等,都支持通用编程语言,所谓通用编程语言主要是C语言、C++语言、C#语言、Object C语言、Java语言等编程语言。但对于工业控制领域的标准编程语言(例如IEC61131-3中定义的五种语言)并不支持。
为了编译图形语言,有些PLC厂家先把图形语言转换为一种通用编程语言(例如C语言、C++语言、JAVA语言等),再调用支持这种通用编程语言的通用编译器,例如开源的GCC(GNU Compiler Collection,GNU编译器套件),进行编译,虽然这种方法最终能实现的编译图形语言的目的,但存在的问题是在编译过程中多引入了另一种语言的词法和语法操作,降低了编译速度,而且对未来实现调试器(例如断点调试的追踪)提高了难度,最终导致编译结果的报错需要经过更多信息转换才能定位追踪到图形语言代码中,显然这样做降低了调试的效率。
发明内容
本发明实施例提供一种图形语言的交叉编译方法及交叉编译器,用以解决现有技术不能快速有效地编译图形语言的问题。
第一方面,本发明实施例包括一种图形语言的交叉编译方法,该方法包括:首先交叉编译器前端接收用户输入的工程文件,并解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;然后所述交叉编译器前端将所述POU集合中的各个POU转换为抽象语法树AST,最终根据转换得到的AST,生成所述工程文件对应的AST,并将所述AST发送至交叉编译器后端,以使所述交叉编译器后端编译出目标机器的可执行机器代码。
第二方面,基于同样的发明构思,本发明实施例还提供一种交叉编译器,包括:
接收单元,用于接收用户输入的工程文件;
解析单元,用于解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;
转换单元,用于将所述POU集合中的各个POU转换为抽象语法树AST;
机器代码生成单元,用于将所述AST编译为目标机器在目标计算机环境下的可执行机器代码。
第三方面,本发明实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行上述任一项所述的图形语言的编译方法。
第四方面,本发明实施例提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行上述任一项所述的图形语言的编译方法。
本发明实施例提供一种交叉编译器,该交叉编译器由交叉编译器前端和交叉编译器后端组成,向该交叉编译器前端输入工程文件,因为工程文件中包含由FBD语言构成的POU,经过交叉编译器前端的转换就可以将该POU对应的FBD语言转换为交叉编译器后端可以识别的抽象语法树,经由本发明实施例编译完成后,生成的抽象语法树被传给交叉编译器后端,由交叉编译器后端编译出目标机器的可执行机器码,一般而言,交叉编译器后端即为通用编译器,相对于现有技术,本发明实施例所提供的方法,因为编译过程中是将各个图形元素转换为各个AST节点,最终将功能块图转换成抽象语法树,并没有引入第三种语言,因为在转换时每个图形元素与AST存在对应关系,也就是,在转换时,每个图形元素的位置信息在AST中有对应的代码位置标记节点,位置信息被编译器后端处理,保留到最终生成的可执行机器码文件中,调试器可依据位置信息直接定位报错节点,方便用户定位自己的源代码逻辑缺陷。所以说交叉编译器可以根据AST与功能块图节点的对应关系,直接定位报错节点,便于纠错。另外,本发明实施例所提供的可编译图形语言的编译器为交叉编译器,可以达到在一种计算机环境中编译出能在另外一种计算机环境下运行的指令,与现有技术本地编译相比,一方面提高了编译速度,另一方面,由于不需要对目标平台部署编译器和执行编译工作,节约了对目标计算机环境的内存和磁盘空间,适用目标计算机计算资源极为苛刻的应用场所,例如适用于工业控制嵌入式系统。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种FBD语言构造的POU示意图一;
图2为本发明实施例提供的一种转换POU得到的抽象语法树;
图3为本发明实施例提供的一种图形语言的交叉编译方法流程示意图;
图4为本发明实施例提供的一种工程文件内部结构示意图;
图5为本发明实施例提供的一种工程文件编译过程示意图;
图6为本发明实施例提供的一种FBD语言构造的POU示意图二;
图7为本发明实施例提供的一种交叉编译器结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
为了解决背景技术中所提及的问题,本发明实施例提供一种交叉编译器,向该交叉编译器前端输入工程文件,因为工程文件中包含FBD语言生成POU,经过交叉编译器前端的转换就可以将该POU对应的FBD语言转换为交叉编译器后端可以识别的抽象语法树,经由本发明实施例编译完成后,生成的抽象语法树被传给交叉编译器后端,由交叉编译器后端编译出目标机器的可执行机器码。一般而言,交叉编译器后端为通用编译器。例如,交叉编译器前端将图1的FBD语言制成的工程矢量图转为抽象语法树(AST),其中,转换后的抽象语法树如图2所示。因为本发明实施例是直接将FBD语言转换为抽象语法树,并未引入另一种开发语言,提高编译效率且编译结果易于用户调试纠错。也就是说,本发明实施例所提供的图形语言的编译方法,可以解决现有技术中图形语言不可以快速有效地得到编译的问题和不方便用户调试的问题。
一般地,编写POU的语言种类在IEC61131-3标准中推荐了五种语言来构造POU,分别是:IL、FBD、LD、SFC,ST。程序组织单元POU是IEC61131-3标准中重要的、被广泛使用的基本IEC编程单位。
其中,FBD是一种图形化的编程语言,用来描述功能(FU)、功能块(FB)和程序(Program)的行为特征,还可以在顺序功能流程图中描述步、动作和转变的行为特征。FBD与电子线路图中的信号流图非常相似,在程序中,它可看作两个过程元素之间的信息流。FBD普遍地应用在过程控制领域。功能块常写在块内,但功能块实例的名称通常写在块的上部,功能块的输入输出名称写在块内的输入输出点的相应地方。在功能块网路中,信号通常是从一个功能或功能块的输出传递到另一个功能或功能块的输入。其中,信号经由功能块左端流入,并求值更新,在功能块右端流出。如图1所示,图1所要实现的运算用ST语言表示为i:=3*k+7;从图1可见,FBD就像一个个的逻辑门电路,串联起了所有的逻辑,简单直观形象。其中,FBD图中的功能块的左侧为逻辑运算的输入变量,右侧为输出变量;信号流向也是由左向右,各个功能块之间可以串联,也可以插入中间信号。
另外,POU类型包括:功能、功能块和程序,其中,三种类型的POU的区别在于:FU类型的POU可以指定参数,但没有静态变量也就是没有存储空间,在用相同的输入参数调用函数时总是返回相同的结果;FB类型的POU可以指定参数,也有静态变量,在用相同的参数调用功能块时,返回值取决于内部变量和外部变量,并能将内部变量保持到下一个执行周期;程序类型的POU,整个程序的所有变量(包括指定的物理地址)都应该在此POU(或资源、配置)中声明,其他方面与FB类型的POU类似。
需要说明的是,编译器就是将一种语言(通常为高级语言)翻译为另一种语言(通常为低级语言)的程序,主要工作流程是将源程序作为输入,翻译输出目标语言。源程序一般为高级计算机语言,例如Pascal、C、C++、C#、Java等,而目标语言则是低级机器语言,例如汇编语言或目标机器的目标代码等,有时也称作机器代码。高级计算机语言便于人编写,阅读,维护;低级机器语言是计算机能直接解读、运行的。
再者,抽象语法树是程序编译阶段的一种中间表示形式。作为一种良好的中间表示,抽象语法树比较直观地表示出源程序的语法结构,含有源程序结构显示所需的全部静态信息,并具有较高的存储效率。抽象语法树的结构不依赖于源语言的文法,也就是语法分析阶段所采用的上下文无关文法。因此,抽象语法树被许多编译器选作程序的中间表示形式,用于编译的语义分析阶段。在抽象语法树的基础上,还可以进行程序优化,生成机器代码,也可以生成控制流、数据流图,而且在程序分析等其它领域也具有广泛的应用。
具体来说,针对背景技术中提到的问题,本发明实施例提供了一种图形语言的交叉编译方法流程示意图,如图3所示,包括:
步骤301、交叉编译器前端接收用户输入的工程文件,并解析所述工程文件得到由功能块图语言FBD生成的程序组织单元POU集合。
步骤302、所述交叉编译器前端将所述POU集合中的各个POU转换为AST。
步骤303、根据转换得到的AST,生成所述工程文件对应的AST,并将所述AST发送至交叉编译器后端,以使所述交叉编译器交叉编译出目标机器的在目标工作环境下的可执行机器代码,其中,所述交叉编译器由交叉编译器前端和交叉编译器后端组成。
在步骤301中,一般用户制作的工程文件中会定义多个POU,每个POU可能由不同的图形语言来构造,且不同的POU也可能对应不同的类型。例如图4中一个工程文件中包含4个POU,POU1、POU3、POU4是用FBD图形语言编程的,而POU2是使用ST语言编程的。POU1是FB类型,POU2是FB类型,POU3是FU类型,POU4是程序类型。考虑到本发明实施例所提供的交叉编译器用于编译FBD语言,其他语言编写的代码交给其他交叉编译器执行,暂时不在本专利描述范围,所以在步骤301中,交叉编译器前端接收了工程文件之后,对其进行解析,得到由FBD语言构造的POU。例如,针对图4,解析得到POU1、POU3、POU4所组成的POU集合。
进一步地,交叉编译器前端对解析得到的POU集合按照一定的顺序进行编译。
针对确定出来的POU集合中的任意一个POU,则需要遍历该POU的图形元素,对各个图形元素进行编译,得到各个AST节点。在IEC61131-3标准中定义了FBD基础的图形元素包括:变量实例、功能、功能块实例、输入连线、输出连线、跳转条件、跳转目标、连线起始标识和连线结束标识、注释等。例如,在图1中,i、k为变量实例,乘法块和加法块为FU类型功能实例、功能块左侧为输入连线、功能块右侧为输出连线。
图形语言的编译不同于文本语言,文本语言的前端编译一般包括词法分析、语法分析步骤,但FBD图形的不同之处在于:图形符号已经明确了标识符、功能(对应通用语言中的符号和简单函数名)、功能块(对应面向对象语言中的对象实例),所以不需要词法分析步骤。而语法分析过程是一个对图中连线分析的过程,下文结合图4和图5,对本发明实施例所提供的图形语言的编译方法进行系统性的阐述。
步骤501,交叉编译器前端分析IDE(Integrated Development Environment,集成开发环境)工程文件,确定IDE工程文件中所有POU的类型,为每个POU编号(每个POU编号是唯一的),根据构造POU的FBD图形语言,得到POU集合,其中,POU集合由POU1、POU3、POU4组成,POU集合中的POU都是由FBD语言构造的。
步骤502,交叉编译器前端遍历POU集合中的全部POU,将各个POU转换成AST。
步骤503a,其中,对POU集合中每个POU编译过程如下,首先交叉编译器前端为该POU中用到的所有变量在POU对应的AST中添加变量声明节点(VAR_DECL),也就是说,在遍历POU内部的图形元素之前,用户在编辑每个FBD图时,会同时编辑一个实例定义表格,表格内容是FBD图中用到的所有变量和功能块的实例,变量包括当前FBD源代码使用的内部变量和引用的外部变量(例如整个工程的全局变量)。
步骤503b,交叉编译器前端删除图中所有注释信息图形元素;交叉编译器前端合并每个连线的起始标识和结束标识,使得每一对起始标识和结束标识被看成一条连线实例。因为当工程文件较为复杂时,FBD构成的POU中的连线实施通常利用一对标识替代,一对标识中一般包括起始标识和终止标识。为了遍历到POU中的所有的图形元素,以便后续将各个图形元素转换为AST节点,所以需要将FBD构造的POU中的每对连线标识转换为连线实例。
步骤503c,交叉编译器前端检查所有连线中的每个连线实例都只有一个数据源。因为FBD构图的特点是每个连线实例都仅有一个数据源,例如图1中,所有的连线都仅有一个数据源,比如说,乘法功能块的IN1的数据源是INT#3,IN2是K,加法功能块的IN1的数据源是乘法功能块的输出,IN2的数据源是INT#7。但是一个连线的输出可以是多个连线的输入,例如图4中,功能DIV(除法功能)的OUT(输出)作为功能SwtichTo(电流转电压功能)的参数k,同时又作为功能SIN(三角函数功能)的参数IN。
步骤503d,交叉编译器前端对一个POU的FBD图中全部图形元素进行排序,按图像元素的坐标位置从左到右、从上到下的顺序排序,生成第一排序结果,并保存在内存中。
步骤503e,进一步遍历第一排序结果,遍历第一排序结果中的所有FB类型功能块、FU类型功能,依据所有FB类型功能块、FU类型功能输入输出逻辑在第一排序结果的基础上进行第二次排序,也就是说如果FU类型功能的输入为后面FB类型功能块的输出,则将后面的FB类型功能块移动至FU类型功能之前,生成第二排序结果,并保存在内存中。
需要说明的是,之所以进行第二次排序,是因为按照第一次排序有可能存在调用逻辑不正确的问题,例如如图6所示的POU,按照第一次排序从上到下的原则,就会将图6中的加法功能排在乘法功能块之前,因为加法功能块的输入IN2依赖于乘法功能块的输出OUT,所以这样的排序结果显然逻辑有误,按照输入输出的逻辑顺序,经过第二次排序之后,就可以将乘法功能块调整至加法功能块之前。
步骤503f,交叉编译器前端检查并确保没有递归调用(标准不支持)、没有自反馈路径(即某个功能或功能块的输出经过N步连线后又回到自己的输入)。
步骤503g,交叉编译器前端将该POU集合中的各个图形元素转换为AST节点,各个AST节点组成该POU对应的抽象语法树。一般,各个图形元素转换得到的AST节点包括五大类节点,其中五大类的节点类型和对应的例子如表一所示。
表一
需要说明的是,交叉编译器前端在将一个POU集合的FBD图的各个图形元素转换为AST节点的过程中还需要注意处理临时变量,一般当连线处于如下情况会产生临时变量:输入是一个FU的输出,输出是一个分叉的线输出给多个其他图形元素。对于一条分叉的连线来说,当输入是FB或变量时,不用产生临时变量,因为FB的成员和变量本身都是有存储空间的。但当输入是FU时,由于FU没有存储空间,所以需要一个临时过渡的空间(临时变量所在空间)才能赋值给多个其他输出。例如POU4里DIV的输出,这里会产生一个临时变量,也需要加入到POU_AST,因为图形语言和普通文本语言的不同在于一个输出可能对应多个不同FU、FB的输入,所以必须引入临时变量来处理。需要注意不能遗漏的节点包括:中间生成的临时变量需要加入POU-AST,这类节点属于操作数节点。“包含POU定义时所在的文件号”、“FB/FU类型的图形元素序号”也应该加入POU-AST,以便在编译时能生成对应的GDB调试信息。这类节点属于辅助用户断点调试用,GCC中使用的节点类型是“EXPR_WITH_FILE_LOCATION”。
步骤504,最终本发明实施例提供的叉编译器前端编译完成后,生成的工程文件对应的抽象语法树被传给GCC(一种通用编译器,也就是交叉编译器后端),通过GCC编译出目标机器的可执行机器码。
背景技术中提到的先把图形语言转换为一种通用编程语言,再调用支持这种通用编程语言的通用编译器进行编译的方法,由于通用编译器编译出的结果中保存的只能是选择的通用语言的行号、文件号信息,假设选择C语言作为中间语言,导致编译结果的报错需要经过C语言行号转换到图形元素位置,才能定位追踪到图形语言的报错位置。相对于这一方法本发明实施例所提供的方法,因为编译过程中功能块图对应的是抽象语法树,并没有引入第三种语言,所以可以根据抽象语法树与功能块图节点的对应关系,直接定位报错节点,便于纠错。
进一步来说,本发明实施例交叉编译器软件可在Windows操作系统中执行,最终编译成为PLC特定的操作系统和特定硬件平台的共享库文件,(含代码段和数据段等信息),并封装为GCC支持的标准elf格式。该交叉编译器的实现主要是借助开源通用编译器GCC作为编译后端的实现、同时GCC也实现了交叉编译功能,在Windows中编译出能在其他操作系统和其他CPU上运行的指令。
需要说明的是,所谓交叉编译器是指在一种计算机环境中运行的编译程序,能编译出在另外一种计算机环境下运行的代码,我们就称这种交叉编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序.比如,我们在x86平台上,编写程序并编译成能运行在ARM平台的程序,编译得到的程序在x86平台上是不能运行的,必须放到ARM平台上才能运行。
与交叉编译相对的是本地编译,本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译。比如,我们在x86平台上,编写程序并编译成可执行程序。这种方式下,我们使用x86平台上的工具,开发针对x86平台本身的可执行程序,这个编译过程称为本地编译。
之所以要有交叉编译,主要原因是:1、目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能;2、整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间;3、即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得;4、一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上。
其中,GCC编译器也是一种交叉编译器,是美国自由软件基金会开发的编译器,它能够支持C、C++语言、Object C语言、Fortran、Java和Ada等程序设计语言,同时能够运行在x86、x86-64、IA-64、PowerPC、SPARC和Alpha等目前所有的硬件平台上。由于GCC开放源代码的特点,对最新的C++标准的良好支持,以及GCC编译代码的高效性,使其受到广大程序员的认可,GCC编译器被称为Linux、Unix和Windows操作系统平台上C/C++标准的编译器。
在实际应用中,考虑GCC是开源软件,本发明实施例可以基于GCC,在GCC上扩展增加对功能块图语言编译支持的代码,进而生成本发明实施例所提供的交叉C语言编译器,具体地做法可以是:
步骤a、开发人员在网上下载获取完整GCC源码。
步骤b,开发人员在Windows下通过mingw32等工具准备好编译工具链,并加入跨平台支持库。
步骤c,开发人员编译源码并生成一个交叉编译C语言编译器,确保做到Windows下能把C语言代码编译为指定操作系统(非windows)和CPU型号的目标二进制文件(elf格式)。
步骤d,开发人员在GCC代码中加入对功能块图的支持代码,即修改源码路径,加入对FBD语言的支持。例如在GCC代码中“GCC”文件目录下加入FBD目录,并加入对FBD语言支持的基础文件,然后在FBD目录下加入对上述“编译过程描述”的C语言实现代码。
步骤e,开发人员重新配置makefile(编译脚本),设置配置命令行的参数,包括交叉编译需要的参数,同时加入:--enable-languages=c,FBD,生成新的Makefile。
步骤f,开发人员使用makefile(编译脚本)重新编译出GCC即可得到一个支持FBD的交叉编译器。
综上可见,本发明实施例所提供的交叉编译器的主要原理是先获取GCC源码,然后在GCC源码增加自定义代码,这部分自定义代码主要是用C语言描述了功能块图的编译过程,也就是交叉编译器前端,然后重新配置GCC的makefile(编译脚本),使得配置后makefile(编译脚本)可以编译到自定义代码部分,这样就可以生成一个支持FBD的交叉编译器。当交叉编译器生成之后,向该交叉编译器导入功能块图文件,就可以将功能块图描述成抽象语法树,生成编译结果,因为编译过程中功能块图对应的是抽象语法树,并没有引入第三种语言,所以可以根据抽象语法树与功能块图节点的对应关系,直接定位报错节点,便于纠错。相比于背景技术中现有技术,现有技术是交叉编译器对C语言文件进行编译,在交叉编译器中生成C语言和功能块图节点的对应关系,而不是抽象语法树与功能节点的对应关系,所以采用现有技术编译图形语言,如果编译报错,开发人员只能选确定发生报错的C语言代码位置,再利用C语言代码中各个函数与功能块图各个图形元素的对应关系,确定真正出错的图形元素。而本申请是将各个图形元素转换为各个AST节点,最终将功能块图转换成抽象语法树,并没有引入第三种语言,因为在转换时每个图形元素与AST存在对应关系,所以可以AST与功能块图节点的对应关系,直接定位报错节点,便于纠错,所以开发效率与本申请实施例相比,本申请实施例开发效率更高。
基于同样的发明构思,本发明实施例还提供一种交叉编译器,如图7所示,该装置包括:接收单元601、解析单元602、转换单元603、机器代码生成单元604,其中:
接收单元601,用于接收用户输入的工程文件;
解析单元602,用于解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;
转换单元603,用于将所述POU集合中的各个POU转换为AST;
机器代码生成单元604,用于将所述AST编译为目标机器在目标计算机环境下的可执行机器代码。
其中,机器代码生成单元604可以由GCC实现,主要执行的步骤可以包括中间码生成、优化、汇编码生成、机器码生成等过程。
进一步地,所述转换单元603还用于:针对所述POU集合中的任意一个POU,根据所述POU中各个图形元素的坐标位置,依据从左到右、从上到下的顺序对所述POU中的各个图形元素进行排序,生成第一排序结果;
根据所述第一排序结果中的FB类型功能块、FU类型功能中的输入输出逻辑,在所述第一排序结果基础上进行第二次排序,生成第二排序结果;
根据所述第二排序结果的排序顺序,将所述第二排序结果中的各个图形元素转换为各个AST节点。
进一步地,所述交叉编译器还包括:预处理单元605,用于删除所述功能块图中含有注释信息的图形元素,并将任意一个连线的起始标识和结束标识转换为一个连线实例;对处理过的所述功能块图进行语法检查,所述语法检查包括确定任意一个连线实例都仅有一个数据源。
其中,所述交叉编译器是通过在通用编译器的源代码中加入跨平台支持库实现的交叉编译功能。
另外,所述交叉编译器的功能实现为C语言代码实现,所述C语言代码被集成在所述通用编译器的源代码中,且所述C语言代码能够被所述通用交叉编译器配置后的编译脚本编译到。
综上所述,本发明实施例提供一种交叉编译器,向该交叉编译器前端输入工程文件,因为工程文件中包含FBD语言生成POU,经过交叉编译器前端的转换就可以将该POU对应的FBD语言转换为交叉编译器后端可以识别的抽象语法树。一般,交叉编译器后端为通用编译器,经由本发明实施例交叉编译器前端编译完成后,生成的抽象语法树被传给通用编译器,由通用编译器编译出目标机器的可执行机器码,相对于现有技术本发明实施例所提供的方法,因为编译过程中功能块图对应的是抽象语法树,并没有引入第三种语言,所以可以根据抽象语法树与功能块图节点的对应关系,直接定位报错节点,便于纠错。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (14)
1.一种图形语言的交叉编译方法,其特征在于,该方法包括:
交叉编译器前端接收用户输入的工程文件,并解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;
所述交叉编译器前端将所述POU集合中的各个POU转换为抽象语法树AST;
将所述AST发送至交叉编译器后端,以使所述交叉编译器交叉编译出目标机器在目标计算机环境下的可执行机器代码,其中,所述交叉编译器由所述交叉编译器前端和所述交叉编译器后端组成。
2.如权利要求1所述的方法,其特征在于,所述交叉编译器前端将所述POU集合中的各个POU转换为AST,还包括:
针对所述POU集合中的任意一个POU,所述交叉编译器前端根据所述POU中各个图形元素的坐标位置,依据从左到右、从上到下的顺序对所述POU中的各个图形元素进行排序,生成第一排序结果;
所述交叉编译器前端根据所述第一排序结果中的FB类型功能块、FU类型功能中的输入输出逻辑,在所述第一排序结果基础上进行第二次排序,生成第二排序结果;
所述交叉编译器前端根据所述第二排序结果的排序顺序,将所述第二排序结果中的各个图形元素转换为各个AST节点。
3.如权利要求1所述的方法,其特征在于,所述交叉编译器前端解析所述功能块图得到程序逻辑单元POU集合之前,还包括:
所述交叉编译器前端删除所述功能块图中表示注释信息的图形元素,并将任意一个连线的起始标识和结束标识转换为一个连线实例;
所述交叉编译器前端对处理过的所述功能块图进行语法检查,所述语法检查包括确定任意一个连线实例都仅有一个数据源。
4.如权利要求1所述的方法,其特征在于,所述交叉编译器前端解析所述功能块图得到程序逻辑单元POU集合之前,还包括:
所述交叉编译器前端对处理过的所述功能块图进行语义检查,所述语义检查包括检查并确保没有递归调用、没有自反馈路径,所述自反馈路径指一个功能或功能块的输出经过N步连线后作为自身的输入。
5.如权利要求1所述的方法,其特征在于,所述交叉编译器是通过在通用编译器的源代码中加入跨平台支持库实现的交叉编译功能。
6.如权利要求1所述的方法,其特征在于,所述交叉编译器前端的功能实现为C语言代码实现,所述C语言代码被集成在所述通用编译器的源代码中,且所述C语言代码能够被所述通用编译器配置后的编译脚本编译到。
7.一种交叉编译器,其特征在于,包括:
接收单元,用于接收用户输入的工程文件;
解析单元,用于解析所述工程文件得到由功能块图语言FBD构造的程序组织单元POU集合;
转换单元,用于将所述POU集合中的各个POU转换为抽象语法树AST;
机器代码生成单元,用于将所述AST编译为目标机器在目标计算机环境下的可执行机器代码。
8.如权利要求7所述的交叉编译器,其特征在于,所述转换单元还用于:
针对所述POU集合中的任意一个POU,根据所述POU中各个图形元素的坐标位置,依据从左到右、从上到下的顺序对所述POU中的各个图形元素进行排序,生成第一排序结果;
根据所述第一排序结果中的FB类型功能块、FU类型功能中的输入输出逻辑,在所述第一排序结果基础上进行第二次排序,生成第二排序结果;
根据所述第二排序结果的排序顺序,将所述第二排序结果中的各个图形元素转换为各个AST节点。
9.如权利要求7所述的交叉编译器,其特征在于,所述转换单元还用于:
对处理过的所述功能块图进行语义检查,所述语义检查包括检查并确保没有递归调用、没有自反馈路径,所述自反馈路径指一个功能或功能块的输出经过N步连线后作为自身的输入。
10.如权利要求7所述的交叉编译器,其特征在于,还包括:
预处理单元,用于删除所述功能块图中表示注释信息的图形元素,并将任意一个连线的起始标识和结束标识转换为一个连线实例;对处理过的所述功能块图进行语法检查,所述语法检查包括确定任意一个连线实例都仅有一个数据源。
11.如权利要求7所述的交叉编译器,其特征在于,所述交叉编译器是通过在通用编译器的源代码中加入跨平台支持库实现的交叉编译功能。
12.如权利要求7所述的交叉编译器,其特征在于,所述交叉编译器前端的功能实现为C语言代码实现,所述C语言代码被集成在所述通用编译器的源代码中,且所述C语言代码能够被所述通用编译器配置后的编译脚本编译到。
13.一种计算机存储介质,其特征在于,所述计算机存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如权利要求1至6任一项所述的方法。
14.一种计算机程序产品,其特征在于,当所述计算机程序产品被计算机执行时,使所述计算机执如行权利要求1至6任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711449384.5A CN109976760A (zh) | 2017-12-27 | 2017-12-27 | 一种图形语言的交叉编译方法及交叉编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711449384.5A CN109976760A (zh) | 2017-12-27 | 2017-12-27 | 一种图形语言的交叉编译方法及交叉编译器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109976760A true CN109976760A (zh) | 2019-07-05 |
Family
ID=67071264
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711449384.5A Pending CN109976760A (zh) | 2017-12-27 | 2017-12-27 | 一种图形语言的交叉编译方法及交叉编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109976760A (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110442520A (zh) * | 2019-07-24 | 2019-11-12 | 中电智能科技有限公司 | 一种基于plc编程语言的交叉调试系统及方法 |
CN110928602A (zh) * | 2019-12-06 | 2020-03-27 | 浙江中控技术股份有限公司 | Fbd程序的运行方法及装置 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111722849A (zh) * | 2020-07-17 | 2020-09-29 | 思客云(北京)软件技术有限公司 | Java语言虚拟编译实现方法、系统及装置 |
CN112506129A (zh) * | 2020-12-15 | 2021-03-16 | 北京东土科技股份有限公司 | 一种梯形图的转换方法、装置、设备及存储介质 |
CN112558541A (zh) * | 2019-09-25 | 2021-03-26 | 北京东土科技股份有限公司 | 一种plc编程扩展系统、方法及电子设备 |
CN112835323A (zh) * | 2020-12-31 | 2021-05-25 | 深圳市雷赛控制技术有限公司 | 可编程逻辑控制语言编译方法及装置 |
CN113253992A (zh) * | 2020-02-11 | 2021-08-13 | Ls电气株式会社 | 用于支持多种编程语言的plc控制方法 |
CN114706590A (zh) * | 2022-05-05 | 2022-07-05 | 北京万昇智能科技有限公司 | Plc应用包生成方法、plc应用执行方法及相关装置和系统 |
CN115220727A (zh) * | 2022-06-07 | 2022-10-21 | 清华大学 | 面向利用Python语言编写的不规则张量程序的优化方法及装置 |
CN115291853A (zh) * | 2022-10-09 | 2022-11-04 | 浙江中控研究院有限公司 | 一种ld语言在plc编程软件中导出导入的方法及装置 |
CN115658079A (zh) * | 2022-10-24 | 2023-01-31 | 上海繁易信息科技股份有限公司 | 一种功能块图转换为结构化文本的方法及相关设备 |
CN116431142A (zh) * | 2023-04-13 | 2023-07-14 | 四川法瑞检测设备有限公司 | 一种可快速构建且不易出错的高效率编程方法 |
CN115220727B (zh) * | 2022-06-07 | 2024-05-28 | 清华大学 | 面向利用Python语言编写的不规则张量程序的优化方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006048266A2 (en) * | 2004-11-04 | 2006-05-11 | Roche Diagnostics Gmbh | Gene expression profiling of leukemias with mll gene rearrangements |
CN103164249A (zh) * | 2011-12-15 | 2013-06-19 | Sap股份公司 | 用于脚本语言编译器的扩展机制 |
CN106648681A (zh) * | 2016-12-29 | 2017-05-10 | 南京科远自动化集团股份有限公司 | 一种可编程语言编译装载系统及方法 |
CN107133027A (zh) * | 2017-03-30 | 2017-09-05 | 南京南瑞继保电气有限公司 | 一种语法树层次化表示方法 |
CN107291521A (zh) * | 2016-03-31 | 2017-10-24 | 阿里巴巴集团控股有限公司 | 编译计算机语言的方法和装置 |
-
2017
- 2017-12-27 CN CN201711449384.5A patent/CN109976760A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2006048266A2 (en) * | 2004-11-04 | 2006-05-11 | Roche Diagnostics Gmbh | Gene expression profiling of leukemias with mll gene rearrangements |
CN103164249A (zh) * | 2011-12-15 | 2013-06-19 | Sap股份公司 | 用于脚本语言编译器的扩展机制 |
CN107291521A (zh) * | 2016-03-31 | 2017-10-24 | 阿里巴巴集团控股有限公司 | 编译计算机语言的方法和装置 |
CN106648681A (zh) * | 2016-12-29 | 2017-05-10 | 南京科远自动化集团股份有限公司 | 一种可编程语言编译装载系统及方法 |
CN107133027A (zh) * | 2017-03-30 | 2017-09-05 | 南京南瑞继保电气有限公司 | 一种语法树层次化表示方法 |
Non-Patent Citations (1)
Title |
---|
侯恺: "工业组态软件中CFC语言的设计实现及语言转换的研究", 《中国优秀博硕士学位论文全文数据库 信息科技辑》 * |
Cited By (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110442520B (zh) * | 2019-07-24 | 2023-07-28 | 中电智能科技有限公司 | 一种基于plc编程语言的交叉调试系统及方法 |
CN110442520A (zh) * | 2019-07-24 | 2019-11-12 | 中电智能科技有限公司 | 一种基于plc编程语言的交叉调试系统及方法 |
CN112558541A (zh) * | 2019-09-25 | 2021-03-26 | 北京东土科技股份有限公司 | 一种plc编程扩展系统、方法及电子设备 |
CN112558541B (zh) * | 2019-09-25 | 2022-04-15 | 北京东土科技股份有限公司 | 一种plc编程扩展系统、方法及电子设备 |
CN110928602A (zh) * | 2019-12-06 | 2020-03-27 | 浙江中控技术股份有限公司 | Fbd程序的运行方法及装置 |
CN110928602B (zh) * | 2019-12-06 | 2022-09-20 | 浙江中控技术股份有限公司 | Fbd程序的运行方法及装置 |
CN113253992B (zh) * | 2020-02-11 | 2024-05-10 | Ls电气株式会社 | 用于支持多种编程语言的plc控制方法 |
CN113253992A (zh) * | 2020-02-11 | 2021-08-13 | Ls电气株式会社 | 用于支持多种编程语言的plc控制方法 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111488154B (zh) * | 2020-04-23 | 2024-01-12 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111722849A (zh) * | 2020-07-17 | 2020-09-29 | 思客云(北京)软件技术有限公司 | Java语言虚拟编译实现方法、系统及装置 |
CN112506129A (zh) * | 2020-12-15 | 2021-03-16 | 北京东土科技股份有限公司 | 一种梯形图的转换方法、装置、设备及存储介质 |
CN112835323A (zh) * | 2020-12-31 | 2021-05-25 | 深圳市雷赛控制技术有限公司 | 可编程逻辑控制语言编译方法及装置 |
CN112835323B (zh) * | 2020-12-31 | 2022-05-17 | 深圳市雷赛控制技术有限公司 | 可编程逻辑控制语言编译方法及装置 |
CN114706590A (zh) * | 2022-05-05 | 2022-07-05 | 北京万昇智能科技有限公司 | Plc应用包生成方法、plc应用执行方法及相关装置和系统 |
CN115220727A (zh) * | 2022-06-07 | 2022-10-21 | 清华大学 | 面向利用Python语言编写的不规则张量程序的优化方法及装置 |
CN115220727B (zh) * | 2022-06-07 | 2024-05-28 | 清华大学 | 面向利用Python语言编写的不规则张量程序的优化方法及装置 |
CN115291853A (zh) * | 2022-10-09 | 2022-11-04 | 浙江中控研究院有限公司 | 一种ld语言在plc编程软件中导出导入的方法及装置 |
CN115658079A (zh) * | 2022-10-24 | 2023-01-31 | 上海繁易信息科技股份有限公司 | 一种功能块图转换为结构化文本的方法及相关设备 |
CN115658079B (zh) * | 2022-10-24 | 2023-10-13 | 上海繁易信息科技股份有限公司 | 一种功能块图转换为结构化文本的方法及相关设备 |
CN116431142A (zh) * | 2023-04-13 | 2023-07-14 | 四川法瑞检测设备有限公司 | 一种可快速构建且不易出错的高效率编程方法 |
CN116431142B (zh) * | 2023-04-13 | 2024-02-13 | 四川法瑞检测设备有限公司 | 一种可快速构建且不易出错的高效率编程方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109976760A (zh) | 一种图形语言的交叉编译方法及交叉编译器 | |
CN111488154B (zh) | St语言源代码编译方法、装置、计算机设备及介质 | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
US7707386B2 (en) | Program segment searching for extension instruction determination to design a processor that meets performance goal | |
CN102830981B (zh) | 一种用于嵌入式系统软件开发工具的实现方法 | |
CN102541521B (zh) | 基于结构化查询语言的操作指令自动生成装置及方法 | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
US5713010A (en) | Source line tracking in optimized code | |
US20050204344A1 (en) | Program analysis device, analysis method and program of same | |
US20070044066A1 (en) | Embedded multi-language programming | |
US20080104096A1 (en) | Software development system | |
CN107608677A (zh) | 一种编译处理方法、装置及电子设备 | |
CN102063324A (zh) | 一种实现自动化编程的方法及系统 | |
CN109918081A (zh) | 一种编译方法及编译器 | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
CN104267654A (zh) | 梯形图程序转换成指令表程序及其编译的方法与系统 | |
CN101859244A (zh) | 多工具链工程构建方法及系统 | |
CN102364433B (zh) | 在ARM处理器上实现Wine构建工具移植的方法 | |
CN110825386A (zh) | 代码的编译方法和装置、存储介质 | |
CN116540986A (zh) | 一种基于Web端的文本类编程语言代码编辑器构建方法 | |
CN100507843C (zh) | 一种动态编程方法 | |
CN110442520B (zh) | 一种基于plc编程语言的交叉调试系统及方法 | |
CN116501330A (zh) | 一种基于解耦架构的文本类编程语言编译方法 | |
CN116301836A (zh) | 一种基于国产自主可控环境的嵌入式开发系统 | |
CN112988570B (zh) | 一种调试程序的方法、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20190705 Assignee: Beijing Shuili Intelligent Building Technology Co.,Ltd. Assignor: KYLAND TECHNOLOGY Co.,Ltd. Contract record no.: X2022990000047 Denomination of invention: A cross compiling method of graphic language and cross compiler License type: Common License Record date: 20220121 |
|
EE01 | Entry into force of recordation of patent licensing contract | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190705 |
|
RJ01 | Rejection of invention patent application after publication |