一种软件代码编译方法及系统转让专利

申请号 : CN202010815520.3

文献号 : CN112052006B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 董逢华江俊胡瑞璟何涛

申请人 : 武汉天喻信息产业股份有限公司武汉天喻聚联科技有限公司

摘要 :

本申请涉及一种软件代码编译方法及系统,涉及计算机技术领域,该方法包括以下步骤:接收输入代码,提取输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,输入代码包括应用包代码和引用包代码,目标代码包括应用包目标代码和引用包目标代码;根据应用包目标代码中实现应用功能的数据,生成应用包字节码文件;根据引用包目标代码中实现接口调用的数据,生成引用包字节码文件;根据应用包字节码文件以及引用包字节码文件生成下载文件。本申请对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入式开发中的性能需求提供保障,满足下载文件可以跨平台执行的需求。

权利要求 :

1.一种软件代码编译方法,其特征在于,所述方法包括以下步骤:接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,所述输入代码包括应用包代码和引用包代码,所述目标代码包括由所述应用包代码生成的应用包目标代码和由所述引用包代码生成的引用包目标代码,所述应用包代码以及所述应用包目标代码均包括运行时环境接口对应的代码;

根据所述应用包目标代码中实现应用功能的数据,生成应用包字节码文件;

根据所述引用包目标代码中实现接口调用的数据,生成引用包字节码文件;

根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件;

在接收所述输入代码之前,所述方法还包括以下步骤:创建一常量池;

所述常量池用于分别以词条为单位存储所述方法支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;

所述常量池还用于当提取所述输入代码对应的所述单词流时,依次以词条为单位存储所述输入代码引用的头文件中声明的变量和方法、所述输入代码中的自定义变量、自定义方法分别以词条为单位存入所述常量池中;

当所述单词流对应的任一所述词条已事先存在于所述常量池内时则不存入所述常量池,所述词条包含所述单词流内各单词对应的字符串名称、字符串属性以及字符串类别;其中,

所述应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件;

所述应用包字节码文件的方法组件子文件包括所述应用包中的所有方法的字节码,按照每个方法在所述应用包的源码中的声明顺序依次排列,各所述方法在应用包中的存储位置和方法名称均一一对应记录在所述常量池中;所述内存组件子文件记录对应的所述应用包中全局非易失空间的大小和初始值以及全局易失空间的大小值;

所述运行时方法组件子文件包括对应的所述应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;

所述共享接口组件子文件包括对应的所述应用包声明的共享接口的个数以及每个接口方法的偏移值。

2.如权利要求1所述的软件代码编译方法,其特征在于,所述接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码中,具体包括如下步骤:

接收所述输入代码,并解析获得对应的单词流;

根据预设的语法规则,识别所述单词流的语言范畴,并进行对应的语法检查,生成对应的语法树;

对所述语法树中的数据进行语义分析,并进行分类记录;

根据分类记录后的数据生成目标代码。

3.如权利要求1所述的软件代码编译方法,其特征在于:所述引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,所述二进制输出映射文件包括所述引用包字节码文件对应的版本信息、应用标识数据以及所包含的方法的描述信息。

4.如权利要求1所述的软件代码编译方法,其特征在于,所述根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件,具体包括以下步骤:根据所述应用包字节码文件以及所述引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,并结合预设的数据包以及应用标识数据,按照预设格式生成下载文件。

5.一种软件代码编译系统,其特征在于,所述系统包括:软件代码编译单元,其用于接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,所述输入代码包括应用包代码和引用包代码,所述目标代码包括由所述应用包代码生成的应用包目标代码和由所述引用包代码生成的引用包目标代码,所述应用包代码以及所述应用包目标代码均包括运行时环境接口对应的代码;

应用包生成单元,其用于根据所述应用包目标代码中实现应用功能的数据,生成应用包字节码文件;

引用包生成单元,其用于根据所述引用包目标代码中实现接口调用的数据,生成引用包字节码文件;

下载文件生成单元,其用于根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件;

所述系统配置有一常量池;

所述常量池用于分别以词条为单位存储所述系统支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;

所述常量池还用于当所述软件代码编译单元提取所述输入代码对应的所述单词流时,依次以词条为单位存储所述输入代码引用的头文件中声明的变量和方法、所述输入代码中的自定义变量、自定义方法分别以词条为单位存入所述常量池中;

当所述单词流对应的任一所述词条已事先存在于所述常量池内时则不存入所述常量池,所述词条包含所述单词流内各单词对应的字符串名称、字符串属性以及字符串类别;其中,

所述应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件;

所述应用包字节码文件的方法组件子文件包括所述应用包中的所有方法的字节码,按照每个方法在所述应用包的源码中的声明顺序依次排列,各所述方法在应用包中的存储位置和方法名称均一一对应记录在所述常量池中;

所述内存组件子文件记录对应的所述应用包中全局非易失性存储空间的大小和初始值以及全局易失性存储空间的大小值;

所述运行时方法组件子文件包括对应的所述应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;

所述共享接口组件子文件包括对应的所述应用包声明的共享接口的个数以及每个接口方法的偏移值。

6.如权利要求5所述的软件代码编译系统,其特征在于,所述软件代码编译单元具体用于:

接收所述输入代码,并解析获得对应的单词流;

根据预设的语法规则,识别所述单词流的语言范畴,并进行对应的语法检查,生成对应的语法树;

对所述语法树中的数据进行语义分析,并进行分类记录;

根据分类记录后的数据生成目标代码。

7.如权利要求5所述的软件代码编译系统,其特征在于:所述引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,所述二进制输出映射文件包括所述引用包字节码文件对应的版本信息、应用标识数据以及所包含的方法的描述信息。

8.如权利要求5所述的软件代码编译系统,其特征在于:所述下载文件生成单元,其具体用于根据所述应用包字节码文件以及所述引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,并结合预设的数据包以及应用标识数据,按照预设格式生成下载文件。

说明书 :

一种软件代码编译方法及系统

技术领域

[0001] 本发明涉及计算机技术领域,具体涉及一种软件代码编译方法及系统。

背景技术

[0002] 在嵌入式开发中,安全模块具有资源有限且对性能要求较高的特点,但是传统上的语言系统无法满足嵌入式模块多变的用户使用场景,无法在资源有限的情况下满足较高
的性能要求,同时无法满足同一个软件代码在不同嵌入式模块上都能运行的要求。
[0003] 故而,为解决现有的技术问题,需要一种代码编译技术,满足当前嵌入式开发的技术需求。

发明内容

[0004] 本申请实施例提供一种软件代码编译方法及系统,对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入式开发中的性能需求
提供保障,同时可以满足下载文件可以跨平台执行的需求。
[0005] 第一方面,提供了一种软件代码编译方法,所述方法包括以下步骤:
[0006] 接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,所述输入代码包括应用包代码和引用包代码,所述目
标代码包括由所述应用包代码生成的应用包目标代码和由所述引用包代码生成的引用包
目标代码,所述应用包代码以及所述应用包目标代码均包括运行时环境接口对应的代码;
[0007] 根据所述应用包目标代码中实现应用功能的数据,生成应用包字节码文件;
[0008] 根据所述引用包目标代码中实现接口调用的数据,生成引用包字节码文件;
[0009] 根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件;
[0010] 在接收所述输入代码之前,所述方法还包括以下步骤:
[0011] 创建一常量池;
[0012] 所述常量池用于分别以词条为单位存储所述方法支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;
[0013] 所述常量池还用于当提取所述输入代码对应的所述单词流时,依次以词条为单位存储所述输入代码引用的头文件中声明的变量和方法、所述输入代码中的自定义变量、自
定义方法分别以词条为单位存入所述常量池中;
[0014] 当所述单词流对应的任一所述词条已事先存在于所述常量池内时则不存入所述常量池,所述词条包含所述单词流内各单词对应的字符串名称、字符串属性以及字符串类
别;其中,
[0015] 所述应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件;
[0016] 所述应用包字节码文件的方法组件子文件包括所述应用包中的所有方法的字节码,按照每个方法在所述应用包的源码中的声明顺序依次排列,各所述方法在应用包中的
存储位置和方法名称均一一对应记录在所述常量池中;所述内存组件子文件记录对应的所
述应用包中全局非易失空间的大小和初始值以及全局易失空间的大小值;
[0017] 所述运行时方法组件子文件包括对应的所述应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;
[0018] 所述共享接口组件子文件包括对应的所述应用包声明的共享接口的个数以及每个接口方法的偏移值。
[0019] 具体的,所述接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码中,具体包括如下步骤:
[0020] 接收所述输入代码,并解析获得对应的单词流;
[0021] 根据预设的语法规则,识别所述单词流的语言范畴,并进行对应的语法检查,生成对应的语法树;
[0022] 对所述语法树中的数据进行语义分析,并进行分类记录;
[0023] 根据分类记录后的数据生成目标代码。
[0024] 具体的,所述引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,所述二进制输出映射文件包括所述引用包字节码文件对应的版本信息、应用标
识数据以及所包含的方法的描述信息。
[0025] 具体的,所述根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件,具体包括以下步骤:
[0026] 根据所述应用包字节码文件以及所述引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,并结合预设的数据包以及应用标识数据,按照
预设格式生成下载文件。
[0027] 第二方面,提供了一种软件代码编译系统,所述系统包括:
[0028] 软件代码编译单元,其用于接收输入代码,提取所述输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,所述输入代码包括应用包代
码和引用包代码,所述目标代码包括由所述应用包代码生成的应用包目标代码和由所述引
用包代码生成的引用包目标代码,所述应用包代码以及所述应用包目标代码均包括运行时
环境接口对应的代码;
[0029] 应用包生成单元,其用于根据所述应用包目标代码中实现应用功能的数据,生成应用包字节码文件;
[0030] 引用包生成单元,其用于根据所述引用包目标代码中实现接口调用的数据,生成引用包字节码文件;
[0031] 下载文件生成单元,其用于根据所述应用包字节码文件以及所述引用包字节码文件生成下载文件;
[0032] 所述系统配置有一常量池;
[0033] 所述常量池用于分别以词条为单位存储所述系统支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;
[0034] 所述常量池还用于当所述软件代码编译单元提取所述输入代码对应的所述单词流时,依次以词条为单位存储所述输入代码引用的头文件中声明的变量和方法、所述输入
代码中的自定义变量、自定义方法分别以词条为单位存入所述常量池中;
[0035] 当所述单词流对应的任一所述词条已事先存在于所述常量池内时则不存入所述常量池,所述词条包含所述单词流内各单词对应的字符串名称、字符串属性以及字符串类
别;其中,
[0036] 所述应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件;
[0037] 所述应用包字节码文件的方法组件子文件包括所述应用包中的所有方法的字节码,按照每个方法在所述应用包的源码中的声明顺序依次排列,各所述方法在应用包中的
存储位置和方法名称均一一对应记录在所述常量池中;
[0038] 所述内存组件子文件记录对应的所述应用包中全局非易失性存储空间的大小和初始值以及全局易失性存储空间的大小值;
[0039] 所述运行时方法组件子文件包括对应的所述应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;
[0040] 所述共享接口组件子文件包括对应的所述应用包声明的共享接口的个数以及每个接口方法的偏移值。
[0041] 具体的,所述软件代码编译单元具体用于:
[0042] 接收所述输入代码,并解析获得对应的单词流;
[0043] 根据预设的语法规则,识别所述单词流的语言范畴,并进行对应的语法检查,生成对应的语法树;
[0044] 对所述语法树中的数据进行语义分析,并进行分类记录;
[0045] 根据分类记录后的数据生成目标代码。
[0046] 具体的,所述引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,所述二进制输出映射文件包括所述引用包字节码文件对应的版本信息、应用标
识数据以及所包含的方法的描述信息。
[0047] 具体的,所述下载文件生成单元,其具体用于根据所述应用包字节码文件以及所述引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,
并结合预设的数据包以及应用标识数据,按照预设格式生成下载文件。
[0048] 本申请提供的技术方案带来的有益效果包括:
[0049] 本申请提供了一种软件代码编译方法及系统,按照预设的语法规则对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入式开
发中的性能需求提供保障,满足下载文件可以跨平台执行的需求。

附图说明

[0050] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于
本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他
的附图。
[0051] 图1为本申请实施例一提供的软件代码编译方法的步骤流程图;
[0052] 图2为本申请实施例一提供的软件代码编译系统在进行代码编译时的流程框图;
[0053] 图3为本申请实施例一提供的软件代码编译系统在生成下载文件时的流程框图;
[0054] 图4为本申请实施例一提供的软件代码编译系统中虚拟机运行时的原理框图;
[0055] 图5为本申请实施例二提供的软件代码编译系统的结构框图;
[0056] 附图标记:
[0057] 1、软件代码编译单元;2、应用包生成单元;3、引用包生成单元;4、下载文件生成单元。

具体实施方式

[0058] 为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人
员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0059] 以下结合附图对本发明的实施例作进一步详细说明。
[0060] 本发明实施例提供一种软件代码编译方法及系统,按照预设的语法规则对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入
式开发中的性能需求提供保障,满足下载文件可以跨平台执行的需求。
[0061] 为达到上述技术效果,本申请的总体思路如下:
[0062] 一种软件代码编译方法,该方法包括以下步骤:
[0063] S1、接收输入代码,提取输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,输入代码包括应用包代码和引用包代码,目标代码包
括由应用包代码生成的应用包目标代码和由引用包代码生成的引用包目标代码,应用包代
码以及应用包目标代码均包括运行时环境接口对应的代码;
[0064] S2、根据应用包目标代码中实现应用功能的数据,生成应用包字节码文件;
[0065] S3、根据引用包目标代码中实现接口调用的数据,生成引用包字节码文件;
[0066] S4、根据应用包字节码文件以及引用包字节码文件生成下载文件。
[0067] 以下结合附图对本发明的实施例作进一步详细说明。
[0068] 实施例一
[0069] 参见图1~4所示,本发明实施例提供一种软件代码编译方法,该方法包括以下步骤:
[0070] S1、接收输入代码,提取输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,输入代码包括应用包代码和引用包代码,目标代码包
括由应用包代码生成的应用包目标代码和由引用包代码生成的引用包目标代码,应用包代
码以及应用包目标代码均包括运行时环境接口对应的代码;
[0071] S2、根据应用包目标代码中实现应用功能的数据,生成应用包字节码文件;
[0072] S3、根据引用包目标代码中实现接口调用的数据,生成引用包字节码文件;
[0073] S4、根据应用包字节码文件以及引用包字节码文件生成下载文件。
[0074] 本申请实施例中,首先接收输入代码,进行具体的工作流程:
[0075] 1)对输入代码进行词法分析,即对输入代码进行解析,获得其对应的单词流,
[0076] 2)对单词流进行语法分析,即按照预设的语法规则,从单词流中识别出对应的语法范畴,进行语法检查,并进行对应的语法检查,生成对应的语法树,
[0077] 3)对语法分析的结果进行语义分析,生成相应的中间代码,将各种声明记录至符号表,记录声明类型,记录表达式类型等,
[0078] 4)根据语义分析的结果进行代码生成,最终获得目标代码,
[0079] 其中,输入代码包括应用包代码和引用包代码,目标代码包括由应用包代码生成的应用包目标代码和由引用包代码生成的引用包目标代码,应用包代码以及应用包目标代
码均包括运行时环境接口对应的代码,
[0080] 实际情况下,在进行语法分析时,按照编码顺序对输入代码进行扫描,将获取到的单词按照一定的规则添加到预设的常量池,常量池中的每个词条都包含了单词对应的字符
串名称、属性、类别等信息,
[0081] 在进行语法分析时,是对全局声明层面的分析,包括全局变量、枚举类型、函数等的解析,
[0082] 在进行语义分析时,是对语句层面的分析,分析函数中除了声明之外的其他部分代码的语法和语义,
[0083] 进行目标代码的生成过程,是对表达式层面的分析,对程序中各种表达式进行解析,生成对应的字节码表达式。
[0084] 其中,源文件,即输入代码的编译的输出,即目标代码为应用包字节码文件和引用包字节码文件,其中实现了运行时环境接口(process、select、deselect、install、
uninstall、getSccLibInterface)的应用会生成对应的应用包字节码文件,而纯方法包(无
运行时环境接口)和具有共享接口的应用会生成引用包字节码文件,每一个源文件都对应
生成一个字节码文件。
[0085] 本申请实施例中,按照预设的语法规则对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入式开发中的性能需求提供保障,
满足下载文件可以跨平台执行的需求。
[0086] 将对输入代码进行编译时,具体可以进行多级处理,即
[0087] (1)通用的单个字符(ASCII码);
[0088] (2)代码编码语言支持的关键字;
[0089] (3)嵌入式模块支持的API关键字;
[0090] (4)应用自定义变量和方法;
[0091] (5)常用表达式;
[0092] 在具体操作时,预编译过程中,先(1)~(3)中的字符按照顺序添加到常量池,当支持的关键字和API一定时该部分的常量池数据是固定的,然后在代码编译过程中将(4)中的
字符按照顺序添加到常量池中。
[0093] 常量池中每个成员对应的字符串都是唯一的,成员结构体中标记了该字符串的顺序ID、完整字符串信息及校验压缩值,用于后续编码时对读取的字符串进行比较和校验。
[0094] 其中,API关键字可以进行升级,升级时在常量池中将新增的API关键字添加到原有API关键字后面,按照升级的先后顺序依次排列,高版本的API可以兼容低版本的API,保
证升级前后的编译结果的向下兼容性。
[0095] 需要说明的是,输入代码和目标代码中实现了运行时环境接口的文件是应用包,嵌入式模块可以调用应用包的运行时环境接口来选择激活、运行应用包功能,由于防火墙
安全要求应用包中的常用方法和变量只能在当前包中访问,不同应用包之间可以访问对方
的共享接口方法;
[0096] 输入代码和目标代码中未实现运行时环境接口的文件是引用包,引用包对外提供了一个映射,使它的方法可以被不同的应用包来调用。
[0097] 本申请实施例获得的下载文件,在实际应用时,需要依靠虚拟机系统和运行时环境系统,
[0098] 虚拟机系统用于处理下载文件,解析下载文件中的字节码,执行对应的应用包代码功能。运行时环境系统用于管理应用的生命周期、访问应用的运行时环境接口、进行应用
运行时的防火墙管理。
[0099] 在运行时环境系统中,将每个实现了运行时环境接口的源文件都做为一个包,其实例化为应用applet,运行时环境接口的主要作用为:
[0100] 根据选择指令激活,去激活指定应用;
[0101] 将收到的指令分发给当前应用,即调用应用的入口函数;
[0102] 防火墙管理,防止不同包下面的应用互相访问。
[0103] 虚拟机系统,其核心是虚拟机字节码,虚拟机系统的基本原理是字节码、堆栈、解释器共同作用,字节码负责程序的语法操作符实现,堆栈负责参数,变量和临时操作数等数
据的存放,解释器针对程序指针中获取的字节码进行解析,三者一起实现了编程语言的表
达式。
[0104] 生成下载文件时,具体可以借助一个下载文件转换工具,其作用是将应用包字节码文件转换成GP下载脚本,
[0105] 首先生成一个十六进制的GP文件,然后从应用包字节码文件中提取特征8中的各个组件数据,按照组件标识、长度和数据的TLV格式依次将各组件添加到GP文件中,另外根
据上述第2点描述,运行时环境系统引入了包和应用的概念,所以在下载文件转换工具中开
发者可以根据要求输入当前源文件的包和应用的AID,在每个嵌入式模块系统中,包和应用
的AID都是唯一的,运行时环境系统可以根据该AID查找到对应的应用。
[0106] 需要说明的是,一个应用包代码含有运行时环境接口对应的代码,同样,一个应用包目标代码含有运行时环境接口对应的代码;
[0107] 输入代码中包括至少一个应用包代码,另外可能含有一个、多个或者没有引用包代码,同样,目标代码中包括至少一个应用包目标代码,另外可能含有一个、多个或者没有
引用包目标代码;
[0108] 一个应用包代码在实际应用时,可能需要运用多个引用包代码,同样,一个应用包目标代码在实际应用时,可能需要运用多个引用包目标代码。
[0109] 具体的,在接收输入代码之前,方法还包括以下步骤:
[0110] 创建一常量池;
[0111] 常量池用于分别以词条为单位存储方法支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;
[0112] 常量池还用于当提取输入代码对应的单词流时,依次以词条为单位存储输入代码引用的头文件中声明的变量和方法、输入代码中的自定义变量、自定义方法分别以词条为
单位存入常量池中;
[0113] 当单词流对应的任一词条已事先存在于常量池内时则不存入常量池,词条包含单词流内各单词对应的字符串名称、字符串属性以及字符串类别。
[0114] 需要说明的是,在进行软件代码编译时,会创建常量池,常量池是词法分析的基础,常量池中每一项ID表示单词流中的一个单词,其基本结构体由单词标识、压缩编码、单
词名称、单词长度、单词类型、已使用标识、方法偏移标识组成,其中,单词标识表示该单词
在常量池中的位置,压缩编码是表示单词字符串的压缩编码,单词名称是单词的原始字符
串描述,单词长度是单词的字符串长度,单词类型表示单词的函数类型,已使用标识表示该
单词是否在源程序中被调用,方法偏移标识表示单词为函数时该函数在字节码方法组件中
的偏移值;
[0115] 偏移值具体是指数据存储位置。
[0116] 具体的,在实际操作时,常量池的组成:
[0117] 1、编译器所支持的编程语言通用关键字;
[0118] 2、嵌入式模块应用的运行时环境接口;
[0119] 3、嵌入式模块应用的常用API接口;
[0120] 4、外部引用包中输入的共享方法接口;
[0121] 5、解析源文件和头文件时搜索到的新声明的单词,具体包括新的宏定义、头文件函数声明、变量声明等,由于c语言中所有单词都是先声明后调用的规则,所以在搜索到一
个声明时先检查该声明是否在常量池中,如果不在则将该单词添加到常量池中,其中单词
标识是固定值,表示是该常量池成员是字符串;
[0122] 6、对于上述2和3点描述的常量池成员,其单词标识是固定值,表示该成员是字符串;
[0123] 7、对于上述第1点描述的常量池成员,其单词标识是在通用关键字枚举中的顺序位置;
[0124] 8、通用关键字枚举按照类型、编程语言关键字、操作符的顺序排列,其单词标识起始数值为128;
[0125] 9、上述第8点中的类型包括数字、函数、系统函数、共享函数、全局变量、局部变量等,标明每个常量池成员的类型含义;
[0126] 10、对于单个字符的声明使用其对应的ASCII码作为单词标识值,其范围是0~127,对于多个字符的声明按照上述1~8的描述来定义其单词标识值;
[0127] 11、常量池成员的压缩编码是该单词字符串名称的压缩编码,对于单词标识小于128的成员其压缩编码为0,其他成员的压缩编码是该单词所有字符的ASCII码的一种哈希
值运算;
[0128] 12、常量池成员的单词名称和单词长度是其单词的完整字符串描述;
[0129] 13、常量池成员的单词类型是该单词代表的类型,如上述9所示;特别的当单词为引用包字节码文件输入的函数时,其类型为共享函数;
[0130] 14、常量池成员的已使用标识属性表示该单词是否被源文件使用,如果没有使用则在最终链接时不做考虑,这样可以加快链接速度,优化使用空间;
[0131] 15、常量池成员的方法偏移标识属性表示该单词为函数方法时,函数对应的字节码在字节码区间中的偏移值,即偏移位置,即存储位置,当函数被调用时通过常量池查找到
对应的成员后用方法偏移值进行跳转。
[0132] 由于存在多种API接口,故而存在一API接口集合,其内部顺序存储多种API接口。
[0133] 在实际操作过程中,常量池的作用是标记当前编译环境支持的关键字,以及源文件和头文件的变量、宏定义、函数声明,用于在解析源文件代码时读取单词后进行相应的语
义分析。
[0134] 另外,常量池中每个成员对应的单词字符串是唯一的,但是由于单词的字符串组成和长度不可控,单纯的使用字符串比较会存在性能和空间上的浪费,因此本申请实施例
提供了一种性能和内存开销都有较大提升的匹配方法,具体分为3级步骤,其操作流程具体
如下:
[0135] 第1级是单词标识比较,可以搜索出所有的单个字符单词和编程语言关键字单词,这些单词的单词标识是唯一的;
[0136] 第2级是压缩编码比较,可以搜索出常量池中所有唯一的单词标识对应的单词;
[0137] 第3级是单词名称比较,可以完整匹配常量池中的单词;
[0138] 其中,匹配的基本顺序是1、2、3,只有当单词标识不唯一时才进行第3级的全字符串比较。
[0139] 本申请实施例中,代码编译按照实际编码顺序来进行解析具体情况如下:
[0140] 1、建立常量池表,将编程语言关键字、运行时环境系统函数、系统常用API等添加到常量池中;
[0141] 2、按照从上到下,从左到右的顺序读取输入的源文件;
[0142] 3、当源文件中读取的单词为头文件时,先从源文件所在的目录中查找该头文件,如果不存在则从编译器的安装目录下查找该头文件;在头文件中从上到下获取相关单词,
搜索获取的单词是否在常量池中,如果不存在则将该单词添加到常量池;
[0143] 4、当源文件中读取的单词为函数时,搜索该单词是否在常量池中,如果不存在则将该单词添加到常量池;
[0144] 5、记录源文件中函数中第一行代码的行号,按顺序解析函数中各条语句,根据虚拟机系统中定义的虚拟机字节码生成函数语句相应的字节码,每个函数的字节码都按源文
件中声明的顺序排列,形成字节码区间;
[0145] 6、每个函数在字节码区间中的偏移值记录到该单词对应常量池成员的方法偏移标识属性中;
[0146] 7、当解析到函数调用时先搜索该单词在常量池中的索引,如果其单词类型为系统函数,则字节码设置为系统函数调用;如果是共享函数,则搜索共享函数列表,查找该函数
在共享包中的方法偏移值;如果是普通函数则直接使用常量池中方法偏移标识参数做为方
法偏移值。
[0147] 具体的,编程代码中存在4种类型的基本函数:
[0148] 1)运行时环境接口,用于运行时环境选择和切换,其他函数不能调用运行时环境接口;
[0149] 2)API接口,即通用的嵌入式模块API接口函数,其实现方法声明和顺序在API接口集合中固定,应用中可以进行调用;
[0150] 3)引用包共享函数,即外部自定义的函数包,该函数包有自己的AID和方法列表,源文件引用后可以调用该包中的共享函数;
[0151] 4)源文件自定义的函数,应用可以自由调用。
[0152] 其中,运行时环境接口和API接口的常量池单词类型类型为系统函数,其每个函数对应的单词标识值是固定且唯一的;引用包函数的类型为共享函数,源文件自定义函数的
单词类型类型为普通函数,其单词标识值都是字符串类型;
[0153] API接口按照在API接口集合中声明的顺序,每个函数对应一个ID,用于虚拟机系统中系统函数调用字节码的输入;
[0154] 以上步骤就实现了嵌入式模块应用的基本编译过程,输出为应用包字节码文件。
[0155] 具体的,引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,二进制输出映射文件包括引用包字节码文件对应的版本信息、应用标识数据以及所
包含的方法的描述信息。
[0156] 具体的,应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件。
[0157] 需要说明的是,此处的子文件,并非代表上下级的关系,而是应用包字节码文件中存在多个部分,分别是方法组件部分、内存组件部分、运行时方法组件部分以及共享接口组
件部分,此处为了描述方面,称呼为子文件。
[0158] 其中,应用包字节码文件的方法组件子文件包括应用包中的所有方法的字节码,按照每个方法在应用包的源码中的声明顺序依次排列,各方法在应用包中的存储位置和方
法名称均一一对应记录在常量池中;
[0159] 内存组件子文件记录对应的应用包中全局非易失空间(NVM,Non‑volatile Memory)的大小和初始值以及全局易失空间(RAM,Random Access Memory)的大小值;
[0160] 运行时方法组件子文件包括对应的应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;
[0161] 共享接口组件子文件包括对应的应用包声明的共享接口的个数以及每个接口方法的偏移值。
[0162] 具体的,根据应用包字节码文件以及引用包字节码文件生成下载文件,具体包括以下步骤:
[0163] 根据应用包字节码文件以及引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,并结合预设的数据包以及应用标识数据,按照预设格式
生成下载文件。
[0164] 在此,对实际应用时的虚拟机系统进行说明:
[0165] 虚拟机系统为在嵌入式模块上实现,能够下载虚拟机对应的字节码文件,在卡内执行对应的字节码流程;
[0166] 虚拟机运行时的堆栈、RAM(易失性存储空间)、NVM(非易失性存储空间)资源都是统一寻址,虚拟机系统的地址结构分布图对资源的定义如下:
[0167] 虚拟机堆栈:包括模拟寄存器、操作栈和程序栈;
[0168] RAM:应用中申请的RAM空间;
[0169] NVM资源:
[0170] 静态NVM:应用包字节码文件下载到卡内占用的空间,应用定义的给定大小的全局NVM资源以及其他个人化资源;
[0171] 动态NVM:应用运行过程中动态申请的NVM资源;
[0172] 不同的虚拟机系统实现可以根据实际情况进行各资源比重的分配。
[0173] 在此,对实际应用时的运行时环境系统进行说明:
[0174] 运行时管理系统负责管理卡片和应用的生命周期,应用选定和防火墙保护等,其中:
[0175] 应用的生命周期由5个运行时环境结构对应的方法构成,install方法负责应用安装时的私有实例化,select方法负责应用激活,process方法是应用处理命令的入口,负责
接收和处理APDU命令,deselect方法负责应用去激活,uninstall方法负责应用删除时的私
有去实例化操作,每个函数对应应用的一个生命周期阶段;
[0176] 由于嵌入式模块上是多应用场景,所以在执行指令前必须先选定要求的应用,应用选定通过逻辑通道管理和选择文件命令来执行,这2条指令被运行时环境系统用来指明
一个逻辑通道的会话中的被激活的应用实例,一旦某个实例被选定,这个应用实例将接收
所有后续的分发给那个逻辑通道的私有命令,直到这个应用实例变为非选定状态。
[0177] 运行时环境系统的防火墙提供的保护避免了最频繁的可预见的安全隐患:导致敏感数据被泄露给其它的应用的开发者的失误和设计遗漏。一个应用能够从一个可以公开访
问的接口中获得对其他源文件的访问。防火墙也提供了抵抗不正确的代码的保护。如果不
正确的代码被加载到卡上,防火墙仍然能够保护那些已有数据不被这个恶意代码访问。
[0178] 在防火墙的基础上,运行时环境系统也提供了允许不同应用进行交互的机制,即共享接口机制,共享接口定义了该应用中所有可以被共享的接口方法的集合,这些方法可
以在不同的上下文(包和应用)环境中进行调用。
[0179] 在此,对实际应用时的下载文件转换工具进行说明:
[0180] 下载文件转换工具的输入包括源文件的包AID和输入的应用包字节码文件路径;
[0181] 下载文件转换工具的输出包括固定格式的下载脚本文件;
[0182] 其基本原理是提取应用包字节码文件中的方法组件、内存组件、运行时方法组件、共享接口方法组件的数据,连同输入的包AID一起组织成固定格式的下载文件。
[0183] 基于同一发明构思,本申请提供了实施例一对应的系统的实施例,详见实施例二
[0184] 实施例二
[0185] 参见图5所示,本发明实施例提供一种软件代码编译系统,该系统包括:
[0186] 软件代码编译单元1,其用于接收输入代码,提取输入代码对应的单词流,根据预设的语法规则生成语法树,并进行语义分析,获得目标代码,输入代码包括应用包代码和引
用包代码,目标代码包括由应用包代码生成的应用包目标代码和由引用包代码生成的引用
包目标代码,应用包代码以及应用包目标代码均包括运行时环境接口对应的代码;
[0187] 应用包生成单元2,其用于根据应用包目标代码中实现应用功能的数据,生成应用包字节码文件;
[0188] 引用包生成单元3,其用于根据引用包目标代码中实现接口调用的数据,生成引用包字节码文件;
[0189] 下载文件生成单元4,其用于根据应用包字节码文件以及引用包字节码文件生成下载文件。
[0190] 本申请实施例中,首先软件代码编译单元1接收输入代码,进行具体的工作流程:
[0191] 1)对输入代码进行词法分析,即对输入代码进行解析,获得其对应的单词流,
[0192] 2)对单词流进行语法分析,即按照预设的语法规则,从单词流中识别出对应的语法范畴,进行语法检查,并进行对应的语法检查,生成对应的语法树,
[0193] 3)对语法分析的结果进行语义分析,生成相应的中间代码,将各种声明记录至符号表,记录声明类型,记录表达式类型等,
[0194] 4)根据语义分析的结果进行代码生成,最终获得目标代码,
[0195] 其中,输入代码包括应用包代码和引用包代码,目标代码包括由应用包代码生成的应用包目标代码和由引用包代码生成的引用包目标代码,应用包代码以及应用包目标代
码均包括运行时环境接口对应的代码,
[0196] 实际情况下,在进行语法分析时,按照编码顺序对输入代码进行扫描,将获取到的单词按照一定的规则添加到预设的常量池,常量池中的每个词条都包含了单词对应的字符
串名称、属性、类别等信息,
[0197] 在进行语法分析时,是对全局声明层面的分析,包括全局变量、枚举类型、函数等的解析,
[0198] 在进行语义分析时,是对语句层面的分析,分析函数中除了声明之外的其他部分代码的语法和语义,
[0199] 进行目标代码的生成过程,是对表达式层面的分析,对程序中各种表达式进行解析,生成对应的字节码表达式。
[0200] 其中,源文件,即输入代码的编译的输出,即目标代码为应用包字节码文件和引用包字节码文件,其中实现了运行时环境接口(process、select、deselect、install、
uninstall、getSccLibInterface)的应用会生成对应的应用包字节码文件,而引用包(无运
行时环境接口)和具有共享接口的应用会生成引用包字节码文件,每一个源文件都对应生
成一个二进制字节码文件(应用包字节码文件或者引用包字节码文件)。
[0201] 本申请实施例中,按照预设的语法规则对代码进行预先编译,生成便于进行解析的下载文件,在嵌入式开发中,减少对资源的需求,为嵌入式开发中的性能需求提供保障,
满足下载文件可以跨平台执行的需求。
[0202] 将对输入代码进行编译时,具体可以进行多级处理,即
[0203] (1)通用的单个字符(ASCII码);
[0204] (2)代码编码语言支持的关键字;
[0205] (3)嵌入式模块支持的API(Application Programming Interface,应用程序接口)关键字;
[0206] (4)应用自定义变量和方法;
[0207] (5)常用表达式;
[0208] 在具体操作时,预编译过程中,先(1)~(3)中的字符按照顺序添加到常量池,当支持的关键字和API一定时该部分的常量池数据是固定的,然后在代码编译过程中将(4)中的
字符按照顺序添加到常量池中。
[0209] 常量池中每个成员对应的字符串都是唯一的,成员结构体中标记了该字符串的顺序ID、完整字符串信息及校验压缩值,用于后续编码时对读取的字符串进行比较和校验。
[0210] 其中,API关键字可以进行升级,升级时在常量池中将新增的API关键字添加到原有API关键字后面,按照升级的先后顺序依次排列,高版本的API可以兼容低版本的API,保
证升级前后的编译结果的向下兼容性。
[0211] 需要说明的是,输入代码和目标代码中实现了运行时环境接口的文件是应用包,嵌入式模块可以调用应用包的运行时环境接口来选择激活、运行应用包功能,由于防火墙
安全要求应用包中的常用方法和变量只能在当前包中访问,不同应用包之间可以访问对方
的共享接口方法;
[0212] 输入代码和目标代码中未实现运行时环境接口的文件是引用包,引用包对外提供了一个映射,使它的方法可以被不同的应用包来调用。
[0213] 本申请实施例获得的下载文件,在实际应用时,需要依靠虚拟机系统和运行时环境系统,
[0214] 虚拟机系统用于处理下载文件,解析下载文件中的字节码,执行对应的应用包代码功能。运行时环境系统用于管理应用的生命周期、访问应用的运行时环境接口、进行应用
运行时的防火墙管理。
[0215] 在运行时环境系统中,将每个实现了运行时环境接口的源文件都做为一个包,其实例化为应用applet,运行时环境系统的主要作用为:
[0216] 根据选择指令激活,去激活指定应用;
[0217] 将收到的指令分发给当前应用,即调用应用的入口函数;
[0218] 防火墙管理,防止不同包下面的应用互相访问。
[0219] 虚拟机系统,其核心是虚拟机字节码,虚拟机系统的基本原理是字节码、堆栈、解释器共同作用,字节码负责程序的语法操作符实现,堆栈负责参数,变量和临时操作数等数
据的存放,解释器针对程序指针中获取的字节码进行解析,三者一起实现了编程语言的表
达式。
[0220] 生成下载文件时,具体可以借助一个下载文件转换工具,其作用是将应用包字节码文件和引用包字节码文件转换成标准GP(GP,GlobalPlatform,全球平台国际标准组织)
下载脚本。
[0221] 需要说明的是,一个应用包代码含有运行时环境接口对应的代码,同样,一个应用包目标代码含有运行时环境接口对应的代码;
[0222] 输入代码中包括至少一个应用包代码,另外可能含有一个、多个或者没有引用包代码,同样,目标代码中包括至少一个应用包目标代码,另外可能含有一个、多个或者没有
引用包目标代码;
[0223] 一个应用包代码在实际应用时,可能需要运用多个引用包代码,同样,一个应用包目标代码在实际应用时,可能需要运用多个引用包目标代码。
[0224] 具体的,系统配置有一常量池;
[0225] 常量池用于分别以词条为单位存储系统支持的编程通用字符、编程语言关键字、通用应用程序接口关键字以及运行时环境接口关键字;
[0226] 常量池还用于当软件代码编译单元提取输入代码对应的单词流时,依次以词条为单位存储输入代码引用的头文件中声明的变量和方法、输入代码中的自定义变量、自定义
方法分别以词条为单位存入常量池中;
[0227] 当单词流对应的任一词条已事先存在于常量池内时则不存入常量池,词条包含单词流内各单词对应的字符串名称、字符串属性以及字符串类别。
[0228] 需要说明的是,在进行软件代码编译时,会创建常量池,常量池是词法分析的基础,常量池中每一项ID表示单词流中的一个单词,其基本结构体由单词标识、压缩编码、单
词名称、单词长度、单词类型、已使用标识、方法偏移标识组成,其中,单词标识表示该单词
在常量池中的位置,压缩编码是表示单词字符串的压缩编码,单词名称是单词的原始字符
串描述,单词长度是单词的字符串长度,单词类型表示单词的函数类型,已使用标识表示该
单词是否在源程序中被调用,方法偏移标识表示单词为函数时该函数在字节码方法组件中
的偏移值;
[0229] 偏移值具体是指数据存储位置。
[0230] 在实际操作过程中,常量池的作用是标记当前编译环境支持的关键字,以及源文件和头文件的变量、宏定义、函数声明,用于在解析源文件代码时读取单词后进行相应的语
义分析。
[0231] 另外,常量池中每个成员对应的单词字符串是唯一的,但是由于单词的字符串组成和长度不可控,单纯的使用字符串比较会存在性能和空间上的浪费,因此本申请实施例
提供了一种性能和内存开销都有较大提升的匹配方法,具体分为3级步骤,其操作流程具体
如下:
[0232] 第1级是单词标识比较,可以搜索出所有的单个字符单词和编程语言关键字单词,这些单词的单词标识是唯一的;
[0233] 第2级是压缩编码比较,可以搜索出常量池中所有唯一的单词标识对应的单词;
[0234] 第3级是单词名称比较,可以完整匹配常量池中的单词;
[0235] 其中,匹配的基本顺序是1、2、3,只有当单词标识不唯一时才进行第3级的全字符串比较。
[0236] 具体的,引用包字节码文件包括一个二进制字节码文件以及一个二进制输出映射文件,二进制输出映射文件包括引用包字节码文件对应的版本信息、应用标识数据以及所
包含的方法的描述信息。
[0237] 具体的,应用包字节码文件包括方法组件子文件、内存组件子文件、运行时方法组件子文件以及共享接口组件子文件。
[0238] 需要说明的是,此处的子文件,并非代表上下级的关系,而是应用包字节码文件中存在多个部分,分别是方法组件部分、内存组件部分、运行时方法组件部分以及共享接口组
件部分,此处为了描述方面,称呼为子文件。
[0239] 其中,应用包字节码文件的方法组件子文件包括应用包中的所有方法的字节码,按照每个方法在应用包的源码中的声明顺序依次排列,各方法在应用包中的存储位置和方
法名称均一一对应记录在常量池中;
[0240] 内存组件子文件记录对应的应用包中全局非易失空间(NVM,Non‑volatile Memory)的大小和初始值以及全局易失空间(RAM,Random Access Memory)的大小值;
[0241] 运行时方法组件子文件包括对应的应用包的运行时环境接口的偏移值,用于对应的应用包在安装、删除、激活、去激活时进行调用;
[0242] 共享接口组件子文件包括对应的应用包声明的共享接口的个数以及每个接口方法的偏移值。
[0243] 具体的,下载文件生成单元4,其具体用于根据应用包字节码文件以及引用包字节码文件,解析获得方法组件、内存组件、运行时方法组件以及共享接口组件,并结合预设的
数据包以及应用标识数据,按照预设格式生成下载文件。
[0244] 以上所述仅是本申请的具体实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的
一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请
将不会被限制于本文所示的这些实施例,而是要符合与本文所申请的原理和新颖特点相一
致的最宽的范围。