CN113946338A - 基于rinsim仿真平台的c语言编译方法及装置 - Google Patents
基于rinsim仿真平台的c语言编译方法及装置 Download PDFInfo
- Publication number
- CN113946338A CN113946338A CN202111036453.6A CN202111036453A CN113946338A CN 113946338 A CN113946338 A CN 113946338A CN 202111036453 A CN202111036453 A CN 202111036453A CN 113946338 A CN113946338 A CN 113946338A
- Authority
- CN
- China
- Prior art keywords
- list
- variable
- module
- function
- source program
- 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
Images
Classifications
-
- 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
-
- 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
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
- G06F8/434—Pointers; Aliasing
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开属于核电技术领域,具体涉及一种基于RINSIM仿真平台的C语言编译方法及装置。本公开通过针对待编译的源程序动态生成变量数据库和模块数据库,RINSIM仿真平台能够将包含多态功能的C语言仿真程序生成的目标代码,链接成可执行程序。增强了RINSIM平台的功能性、友好性。有效减小一般工程项目仿真程序开发工作量,缩短了开发周期,减少人因错误,提高仿真精度,降低后续程序更新的工作复杂度。
Description
技术领域
本发明属于核电技术领域,具体涉及一种基于RINSIM仿真平台的C语言编译方法及装置。
背景技术
RINSIM仿真平台是面向核电站的一体化仿真平台,是用于核电站和核动力仿真系统开发的全寿期支撑平台。原RINSIM仿真平台的图形化建模工具生成的是FORTRAN代码,用到的仿真工程软件NAFET、REALP等也是FORTRAN代码,因此只针对FORTRAN代码实现了编译功能。
多态是c++语言的一种特性,允许方法重名,参数类型不同。随着DCS在核电厂中的应用,核电模拟机需要实现DCS仿真。DCS厂家的控制程序广泛使用c\c++语言开发。多态函数不可避免地被应用。然而,RINSIM仿真平台链接流程不支持链接多态函数,造成多态需求的函数不能被RINSIM仿真平台调用,导致RINSIM仿真平台无法实现DCS仿真效果。
发明内容
为克服相关技术中存在的问题,提供一种基于RINSIM仿真平台的C语言编译方法及装置。
根据本公开实施例的另一方面,提供一种基于RINSIM仿真平台的C语言编译方法,所述方法包括:
在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库;
在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库;
根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能;
对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式;
根据所述头文件,对所述源程序进行编译,生成目标程序。
在一种可能的实现方式中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,包括:
在检测到所述源程序中的语句包含全局变量区及变量的情况下,在该段语句前标注第一类标识;
对所述源程序进行逐行扫描,若检测到所述源程序的语句包含第一类标识,则截取该语句对应的变量名,并根据所述变量数据库,确定该变量的变量信息;
根据该变量的变量信息,确定该变量的实际位置信息;
根据每个变量的实际位置信息,在头文件中定义每个变量的实际位置。
在一种可能的实现方式中,根据该变量的变量信息,确定该变量的实际位置信息,包括:
在截取到的变量为数组变量的情况下,根据该变量的下标及起始位置,确定该变量的实际位置信息;
在截取到的变量为复杂变量的情况下,根据该变量的字段偏移及父节点位置信息,确定该变量的实际位置信息。
在一种可能的实现方式中,根据每个变量的实际位置信息,在头文件中定义每个变量的实际位置,包括:
根据每个变量的实际位置信息,生成内存列表和第一符号链表,所述内存列表包括所述源程序的各变量对应的实际位置信息,所述第一符号链表包括所述源程序的各变量名;
遍历所述内存列表,在头文件中按C语言格式生成每个被引用内存的用externchar修饰的定义,并定义静态指针变量指向该被引用内存区;
遍历所述第一符号链表,在检测到全局变量时,在头文件中生成用#define修饰的C语言宏定义,将该全局变量与该全局变量的实际位置信息绑定。
在一种可能的实现方式中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,还包括:
在检测到所述源程序中的语句包含主函数的情况下,在该段语句前标注第二类标识,在检测到所述源程序中的语句包含多态函数的情况下,在该段语句前标注第三类标识;
对所述源程序进行逐行扫描,进行以下操作:
若检测到所述源程序的语句包含第二类标识,则截取该语句的主函数名,在所述模块数据库中包含截取到的主函数名时,将该主函数名添加到第二符号链表中;
若检测到所述源程序的语句包含第三类标识,则截取该语句的多态子函数名,在所述模块数据库中包含截取到的多态子函数名时,将该多态子函数名添加到第二符号链表和多态列表中;
结束对所述源程序的逐行扫描,生成第二符号链表和多态列表,所述第二符号链表包括所述源程序的各函数,所述多态列表包括所述源程序的各多态子函数;
遍历所述第二符号链表,在检测到子函数时,判断该子函数是否存在于所述多态列表,若该该子函数存在于所述多态列表中,则在头文件中定义忽略该子函数,若该子函数不存在于所述多态列表中,则在头文件的宏定义中将该子函数名修改为符合所述编译规则的格式。
在一种可能的实现方式中,所述方法还包括:
根据所述源程序的配置文件生成可执行程序名、引用内存列表、模块列表和调度列表,所述模块列表包括所述配置文件中的主调函数的信息和被主调函数调用的子调函数的信息,所述调度列表包括所述配置文件中主调函数和被主调函数调用的子调函数之间的调度关系;
根据所述引用内存列表生成第一中间列表,根据所述模块列表生成第二中间列表,根据所述调度列表生成第三中间列表;
根据所述配置文件、所述第一中间列表、所述第二中间列表以及所述第三中间列表生成C文件,所述C文件包括第一中间列表对应的GLOBTAB数组,第二中间列表对应的MODTAB数组,以及第三中间列表对应的CNTRTAB数组;
对所述C文件进行编译生成可执行文件,所述可执行文件被RINSIM仿真平台周期性调度执行,其中,RINSIM仿真平台在首次调度执行所述可执行文件时,根据GLOBTAB数组关联实时数据库,接着遍历CNTRTAB数组,执行CNTRTAB数组包含的各主调函数,若检测到主调函数包含一个或多个子调函数时,则根据子调函数和MODTAB数组确定该一个或多个子调函数的符号信息,并根据确定的该一个或多个子调函数的符号信息调用该一个或多个子调函数。
在一种可能的实现方式中,根据所述源程序的配置文件生成可执行程序名、引用内存列表、模块列表和调度列表,包括:
在检测到所述源程序的配置文件包含exec时,识别所述配置文件最终链接生成的可执行程序名;
在检测到所述配置文件包含share时,识别share对应的共享内存名,并将识别得到的共享内存名添加到引用内存列表;
在检测到所述配置文件包含load时,识别load对应的调度模块,若判断识别得到的调度模块的目标程序已存在,则将该调度模块添加到模块列表和调度列表中,若判断调度模块引用子模块,则将该调度模块引用的子模块也添加到模块列表和调度列表中;
在检测到所述配置文件包含exit时,所述配置文件处理完毕,生成最终的引用内存列表、模块列表和调度列表。
在一种可能的实现方式中,根据所述引用内存列表生成第一中间列表,根据所述模块列表生成第二中间列表,根据所述调度列表生成第三中间列表,包括:
遍历所述模块列表,生成ar命令脚本,通过系统调用执行所述ar命令脚本,将所述模块列表中的模块的目标文件合并生成库文件;
针对所述库文件通过系统调用执行nm命令,导出所述库文件的符号表,所述符号表包括函数名与参数之间的对应关系;
针对所述模块列表中的每个模块,若该模块的函数名存在于所述符号表中,且该函数名对应多个参数,则该模块为多态实现函数,将该模块添加至多态实现列表,所述多态实现列表包括模块对应的多个函数的符号信息;
遍历所述模块列表,在所述模块列表中的模块不属于多态实现列表时,确定该模块对应的符号信息,在所述模块列表中的模块属于多态实现列表时,确定该模块对应的每个函数的符号信息,根据确定的模块的符号信息,生成最终的第一中间列表;
遍历调度列表,确定所述调度列表包含的主调函数,根据确定的主调函数生成第二中间列表;
遍历引用内存列表,确定所述引用内存列表包含的共享内存,根据确定的共享内存生成第三中间列表。
根据本公开实施例的另一方面,提供一种基于RINSIM仿真平台的C语言编译装置,所述装置包括:
第一添加模块,用于在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库;
第二添加模块,用于在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库;
第三添加模块,用于根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能;
第一生成模块,用于对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式;
第二生成模块,用于根据所述头文件,对所述源程序进行编译,生成目标程序。
根据本公开实施例的另一方面,提供一种基于RINSIM仿真平台的C语言编译装置,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行上述的方法。
根据本公开实施例的另一方面,提供一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。
本公开的有益效果在于:本公开通过针对待编译的源程序动态生成变量数据库和模块数据库,RINSIM仿真平台能够将包含多态功能的C语言仿真程序生成的目标代码,链接成可执行程序。增强了RINSIM平台的功能性、友好性。有效减小一般工程项目仿真程序开发工作量,缩短了开发周期,减少人因错误,提高仿真精度,降低后续程序更新的工作复杂度。
附图说明
图1是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译方法的流程图。
图2是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译装置的框图。
图3是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译装置的框图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步详细说明。
图1是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译方法的流程图。该方法可以由终端设备执行,其中,终端设备可以为计算机,例如终端设备可以为服务器、台式电脑、笔记本电脑、平板电脑等,终端设备也可以例如为用户设备、车载设备或可穿戴设备等,本公开实施例对终端设备的类型不做限定。如图1所示,该方法可以包括:
步骤100,在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库。
例如,变量信息可以包括符合RINSIM仿真平台编译规则的变量名、变量类型、共享内存区、所占空间长度等属性信息。变量数据库可以包括该源程序各变量与变量信息的对应关系。
步骤101,在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库。
步骤102,根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能。
例如,可以获取源程序中的各多态子函数,确定具有相同名称特征的多态子函数,将相同名称特征的多态子函数C程序源码放在该多个具有相同名称特征的多态子函数中的一个多态子函数的C程序源码中,形成模糊多态函数,该模糊多态函数可以实现该多个具有相同名称特征的多态子函数的全部功能。
步骤103,对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式。
作为本实施例的一个示例,步骤103可以包括:
步骤1031,在检测到所述源程序中的语句包含全局变量区及变量的情况下,在该段语句前标注第一类标识;例如,第一类标识可以为/*global……*/,由于C语言在预处理时/**/修饰的部分在C语法中属于注释部分,会被忽略。因此该类标识既可以有效标识变量,又不影响预处理。
步骤1032,对所述源程序进行逐行扫描,若检测到所述源程序的语句包含第一类标识,则截取该语句对应的变量名,并根据所述变量数据库,确定该变量的变量信息;
步骤1033,根据该变量的变量信息,确定该变量的实际位置信息;
举例来讲,在截取到的变量为数组变量的情况下,可以根据该变量的下标及起始位置,确定该变量的实际位置信息;在截取到的变量为复杂变量的情况下,根据该变量的字段偏移及父节点位置信息,确定该变量的实际位置信息。
步骤1034,根据每个变量的实际位置信息,在头文件中定义每个变量的实际位置。
作为本实施例的一个示例,步骤1034可以包括:根据每个变量的实际位置信息,生成内存列表和第一符号链表,所述内存列表包括所述源程序的各变量对应的实际位置信息,所述第一符号链表包括所述源程序的各变量名;遍历所述内存列表,在头文件中按C语言格式生成每个被引用内存的用extern char修饰的定义,并定义静态指针变量指向该被引用内存区;遍历所述第一符号链表,在检测到全局变量时,在头文件中生成用#define修饰的C语言宏定义,将该全局变量与该全局变量的实际位置信息绑定。
作为本实施例的一个示例,步骤103还可以包括:
步骤1031,在检测到所述源程序中的语句包含主函数的情况下,在该段语句前标注第二类标识,例如,第二类标识可以为/*program……*/,在检测到所述源程序中的语句包含多态函数的情况下,在该段语句前标注第三类标识/*module……*/;
步骤1032,对所述源程序进行逐行扫描,进行以下操作:
若检测到所述源程序的语句包含第二类标识,则截取该语句的主函数名,在所述模块数据库中包含截取到的主函数名时,将该主函数名添加到第二符号链表中;
若检测到所述源程序的语句包含第三类标识,则截取该语句的多态子函数名,在所述模块数据库中包含截取到的多态子函数名时,将该多态子函数名添加到第二符号链表和多态列表中;
结束对所述源程序的逐行扫描,生成第二符号链表和多态列表,所述第二符号链表包括所述源程序的各函数名,所述多态列表包括所述源程序的各多态子函数;
遍历所述第二符号链表,在检测到子函数时,判断该子函数是否存在于所述多态列表,若该该子函数存在于所述多态列表中,则在头文件中定义忽略该子函数,这样,可以避免编译器无法编译连接多态子函数的现象发生,若该子函数不存在于所述多态列表中,则在头文件的宏定义中将该子函数名修改为符合所述编译规则的格式。这样,可以确保其他子函数可以被有效编译连接。
步骤104,根据所述头文件,对所述源程序进行编译,生成目标程序。
在一种可能的实现方式中,所述方法还可以包括:
步骤200,根据所述源程序的配置文件生成可执行程序名、引用内存列表、模块列表和调度列表,所述模块列表包括所述配置文件中的主调函数的信息和被主调函数调用的子调函数的信息,所述调度列表包括所述配置文件中主调函数和被主调函数调用的子调函数之间的调度关系。
例如,在检测到所述源程序的配置文件包含exec时,识别所述配置文件最终链接生成的可执行程序名;
在检测到所述配置文件包含share时,识别share对应的共享内存名,并将识别得到的共享内存名添加到引用内存列表;
在检测到所述配置文件包含load时,识别load对应的调度模块,若判断识别得到的调度模块的目标程序已存在,则将该调度模块添加到模块列表和调度列表中,若判断调度模块引用子模块,则将该调度模块引用的子模块也添加到模块列表和调度列表中;
在检测到所述配置文件包含exit时,所述配置文件处理完毕,生成最终的引用内存列表、模块列表和调度列表。
步骤201,根据所述引用内存列表生成第一中间列表,根据所述模块列表生成第二中间列表,根据所述调度列表生成第三中间列表;
举例来讲,可以遍历所述模块列表,生成ar命令脚本,通过系统调用执行所述ar命令脚本,将所述模块列表中的模块的目标文件合并生成库文件;
针对所述库文件通过系统调用执行nm命令,导出所述库文件的符号表,所述符号表包括函数名与参数之间的对应关系;
针对所述模块列表中的每个模块,若该模块的函数名存在于所述符号表中,且该函数名对应多个参数,则该模块为多态实现函数,将该模块添加至多态实现列表,所述多态实现列表包括模块对应的多个函数的符号信息;
遍历所述模块列表,在所述模块列表中的模块不属于多态实现列表时,确定该模块对应的符号信息,在所述模块列表中的模块属于多态实现列表时,确定该模块对应的每个函数的符号信息,根据确定的模块的符号信息,生成最终的第一中间列表;
遍历调度列表,确定所述调度列表包含的主调函数,根据确定的主调函数生成第二中间列表;
遍历引用内存列表,确定所述引用内存列表包含的共享内存,根据确定的共享内存生成第三中间列表。
步骤202,根据所述配置文件、所述第一中间列表、所述第二中间列表以及所述第三中间列表生成C文件,所述C文件包括第一中间列表对应的GLOBTAB数组,第二中间列表对应的MODTAB数组,以及第三中间列表对应的CNTRTAB数组。
步骤203,对所述C文件进行编译生成可执行文件,所述可执行文件被RINSIM仿真平台周期性调度执行,其中,RINSIM仿真平台在首次调度执行所述可执行文件时,根据GLOBTAB数组关联实时数据库,接着遍历CNTRTAB数组,执行CNTRTAB数组包含的各主调函数,若检测到主调函数包含一个或多个子调函数时,则根据子调函数和MODTAB数组确定该一个或多个子调函数的符号信息,并根据确定的该一个或多个子调函数的符号信息调用该一个或多个子调函数。
图2是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译装置的框图。如图2所示,所述装置可以包括:
第一添加模块20,用于在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库;
第二添加模块21,用于在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库;
第三添加模块22,用于根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能;
第一生成模块23,用于对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式;
第二生成模块24,用于根据所述头文件,对所述源程序进行编译,生成目标程序。
针对上述基于RINSIM仿真平台的C语言编译装置的说明可以参考上文中针对基于RINSIM仿真平台的C语言编译方法的阐述,在此不再赘述。
图3是根据一示例性实施例示出的一种基于RINSIM仿真平台的C语言编译装置的框图。例如,装置1900可以被提供为一服务器。参照图3,装置1900包括处理组件1922,其进一步包括一个或多个处理器,以及由存储器1932所代表的存储器资源,用于存储可由处理组件1922的执行的指令,例如应用程序。存储器1932中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1922被配置为执行指令,以执行上述方法。
装置1900还可以包括一个电源组件1926被配置为执行装置1900的电源管理,一个有线或无线网络接口1950被配置为将装置1900连接到网络,和一个输入输出(I/O)接口1958。装置1900可以操作基于存储在存储器1932的操作系统,例如Windows ServerTM,MacOS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
在示例性实施例中,还提供了一种非易失性计算机可读存储介质,例如包括计算机程序指令的存储器1932,上述计算机程序指令可由装置1900的处理组件1922执行以完成上述方法。
本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (11)
1.一种基于RINSIM仿真平台的C语言编译方法,其特征在于,所述方法包括:
在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库;
在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库;
根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能;
对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式;
根据所述头文件,对所述源程序进行编译,生成目标程序。
2.根据权利要求1所述的方法,其特征在于,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,包括:
在检测到所述源程序中的语句包含全局变量区及变量的情况下,在该段语句前标注第一类标识;
对所述源程序进行逐行扫描,若检测到所述源程序的语句包含第一类标识,则截取该语句对应的变量名,并根据所述变量数据库,确定该变量的变量信息;
根据该变量的变量信息,确定该变量的实际位置信息;
根据每个变量的实际位置信息,在头文件中定义每个变量的实际位置。
3.根据权利要求2所述的方法,其特征在于,根据该变量的变量信息,确定该变量的实际位置信息,包括:
在截取到的变量为数组变量的情况下,根据该变量的下标及起始位置,确定该变量的实际位置信息;
在截取到的变量为复杂变量的情况下,根据该变量的字段偏移及父节点位置信息,确定该变量的实际位置信息。
4.根据权利要求2所述的方法,其特征在于,根据每个变量的实际位置信息,在头文件中定义每个变量的实际位置,包括:
根据每个变量的实际位置信息,生成内存列表和第一符号链表,所述内存列表包括所述源程序的各变量对应的实际位置信息,所述第一符号链表包括所述源程序的各变量名;
遍历所述内存列表,在头文件中按C语言格式生成每个被引用内存的用extern char修饰的定义,并定义静态指针变量指向该被引用内存区;
遍历所述第一符号链表,在检测到全局变量时,在头文件中生成用#define修饰的C语言宏定义,将该全局变量与该全局变量的实际位置信息绑定。
5.根据权利要求1所述的方法,其特征在于,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,还包括:
在检测到所述源程序中的语句包含主函数的情况下,在该段语句前标注第二类标识,在检测到所述源程序中的语句包含多态函数的情况下,在该段语句前标注第三类标识;
对所述源程序进行逐行扫描,进行以下操作:
若检测到所述源程序的语句包含第二类标识,则截取该语句的主函数名,在所述模块数据库中包含截取到的主函数名时,将该主函数名添加到第二符号链表中;
若检测到所述源程序的语句包含第三类标识,则截取该语句的多态子函数名,在所述模块数据库中包含截取到的多态子函数名时,将该多态子函数名添加到第二符号链表和多态列表中;
结束对所述源程序的逐行扫描,生成第二符号链表和多态列表,所述第二符号链表包括所述源程序的各函数,所述多态列表包括所述源程序的各多态子函数;
遍历所述第二符号链表,在检测到子函数时,判断该子函数是否存在于所述多态列表,若该该子函数存在于所述多态列表中,则在头文件中定义忽略该子函数,若该子函数不存在于所述多态列表中,则在头文件的宏定义中将该子函数名修改为符合所述编译规则的格式。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据所述源程序的配置文件生成可执行程序名、引用内存列表、模块列表和调度列表,所述模块列表包括所述配置文件中的主调函数的信息和被主调函数调用的子调函数的信息,所述调度列表包括所述配置文件中主调函数和被主调函数调用的子调函数之间的调度关系;
根据所述引用内存列表生成第一中间列表,根据所述模块列表生成第二中间列表,根据所述调度列表生成第三中间列表;
根据所述配置文件、所述第一中间列表、所述第二中间列表以及所述第三中间列表生成C文件,所述C文件包括第一中间列表对应的GLOBTAB数组,第二中间列表对应的MODTAB数组,以及第三中间列表对应的CNTRTAB数组;
对所述C文件进行编译生成可执行文件,所述可执行文件被RINSIM仿真平台周期性调度执行,其中,RINSIM仿真平台在首次调度执行所述可执行文件时,根据GLOBTAB数组关联实时数据库,接着遍历CNTRTAB数组,执行CNTRTAB数组包含的各主调函数,若检测到主调函数包含一个或多个子调函数时,则根据子调函数和MODTAB数组确定该一个或多个子调函数的符号信息,并根据确定的该一个或多个子调函数的符号信息调用该一个或多个子调函数。
7.根据权利要求6所述的方法,其特征在于,根据所述源程序的配置文件生成可执行程序名、引用内存列表、模块列表和调度列表,包括:
在检测到所述源程序的配置文件包含exec时,识别所述配置文件最终链接生成的可执行程序名;
在检测到所述配置文件包含share时,识别share对应的共享内存名,并将识别得到的共享内存名添加到引用内存列表;
在检测到所述配置文件包含load时,识别load对应的调度模块,若判断识别得到的调度模块的目标程序已存在,则将该调度模块添加到模块列表和调度列表中,若判断调度模块引用子模块,则将该调度模块引用的子模块也添加到模块列表和调度列表中;
在检测到所述配置文件包含exit时,所述配置文件处理完毕,生成最终的引用内存列表、模块列表和调度列表。
8.根据权利要求6所述的方法,其特征在于,根据所述引用内存列表生成第一中间列表,根据所述模块列表生成第二中间列表,根据所述调度列表生成第三中间列表,包括:
遍历所述模块列表,生成ar命令脚本,通过系统调用执行所述ar命令脚本,将所述模块列表中的模块的目标文件合并生成库文件;
针对所述库文件通过系统调用执行nm命令,导出所述库文件的符号表,所述符号表包括函数名与参数之间的对应关系;
针对所述模块列表中的每个模块,若该模块的函数名存在于所述符号表中,且该函数名对应多个参数,则该模块为多态实现函数,将该模块添加至多态实现列表,所述多态实现列表包括模块对应的多个函数的符号信息;
遍历所述模块列表,在所述模块列表中的模块不属于多态实现列表时,确定该模块对应的符号信息,在所述模块列表中的模块属于多态实现列表时,确定该模块对应的每个函数的符号信息,根据确定的模块的符号信息,生成最终的第一中间列表;
遍历调度列表,确定所述调度列表包含的主调函数,根据确定的主调函数生成第二中间列表;
遍历引用内存列表,确定所述引用内存列表包含的共享内存,根据确定的共享内存生成第三中间列表。
9.一种基于RINSIM仿真平台的C语言编译装置,其特征在于,所述装置包括:
第一添加模块,用于在检测到待编译的源程序包括变量时,根据该变量生成符合所述RINSIM仿真平台的编译规则的变量信息,并将该变量信息添加至变量数据库;
第二添加模块,用于在检测所述源程序包括符合所述编译规则的函数时,将该函数的函数信息添加至模块数据库;
第三添加模块,用于根据检测到的多个具有相同名称特征的多态子函数,生成符合所述编译规则的模糊多态函数,将该多个具有相同名称特征的多态子函数中的一个多态子函数替换为该模糊多态函数,并将该模块多态函数的函数信息添加至模块数据库,该模糊多态函数能够实现该多个具有相同名称特征的多态子函数的全部功能;
第一生成模块,用于对所述源程序进行编译预处理的过程中,针对所述源程序,根据所述变量数据库和所述模块数据库生成头文件,所述头文件定义了所述源程序中各变量符合所述编译规则的实际位置信息,忽略所述源程序中的多态子函数,并定义了函数符合所述编译规则的格式;
第二生成模块,用于根据所述头文件,对所述源程序进行编译,生成目标程序。
10.一种基于RINSIM仿真平台的C语言编译装置,其特征在于,所述装置包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行权利要求1至8中任意一项所述的方法。
11.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1至8中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111036453.6A CN113946338A (zh) | 2021-09-06 | 2021-09-06 | 基于rinsim仿真平台的c语言编译方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111036453.6A CN113946338A (zh) | 2021-09-06 | 2021-09-06 | 基于rinsim仿真平台的c语言编译方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113946338A true CN113946338A (zh) | 2022-01-18 |
Family
ID=79328043
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111036453.6A Pending CN113946338A (zh) | 2021-09-06 | 2021-09-06 | 基于rinsim仿真平台的c语言编译方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113946338A (zh) |
-
2021
- 2021-09-06 CN CN202111036453.6A patent/CN113946338A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108845940B (zh) | 一种企业级信息系统自动化功能测试方法和系统 | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
CN111736840A (zh) | 小程序应用的编译方法、运行方法、存储介质及电子设备 | |
CN113805882A (zh) | 应用程序开发的方法、装置、电子设备及存储介质 | |
CN111061489B (zh) | 一种多平台编译检测方法、装置、设备及介质 | |
CN111427583A (zh) | 组件的编译方法、装置和电子设备及计算机可读存储介质 | |
CN110109671B (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
US9886251B2 (en) | Optimized compiling of a template function | |
CN112269566B (zh) | 脚本生成处理方法、装置、设备及系统 | |
CN110018831B (zh) | 程序处理方法、装置及计算机可读存储介质 | |
CN103631585A (zh) | 一种用于开发应用程序的方法及系统 | |
CN111158667A (zh) | 代码注入方法和装置、电子设备及存储介质 | |
US10289392B2 (en) | Reducing call overhead through function splitting | |
CN113946338A (zh) | 基于rinsim仿真平台的c语言编译方法及装置 | |
CN115098158A (zh) | Sdk打包方法和装置、计算机设备及存储介质 | |
US11429358B2 (en) | Representing asynchronous state machine in intermediate code | |
CN114449063A (zh) | 一种报文处理方法、装置及设备 | |
CN113032004B (zh) | 在开发环境中管理开发作业的方法、设备和程序产品 | |
CN114047923A (zh) | 错误代码定位方法、装置、存储介质以及电子设备 | |
CN113821195A (zh) | 目标语言的可执行程序的生成方法、装置及设备 | |
US20110321009A1 (en) | Implementing encryption via aspect oriented programming | |
CN114253595A (zh) | 代码仓库管理方法、装置、计算机设备及存储介质 | |
CN114174983A (zh) | 使用测试向量自动验证高级构造的优化 | |
CN112882698A (zh) | 开发环境的生成方法及装置、计算机存储介质及电子设备 | |
CN113448619A (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 |