字节码优化数据库及其建立方法以及字节码优化方法 【技术领域】
本发明涉及智能卡领域,尤其涉及字节码优化数据库及其建立方法以及JAVA卡字节码的优化方法。
背景技术
JAVA卡是JAVA虚拟机技术与传统智能卡技术相结合的产物,是一种能运行JAVA程序的智能卡。
一个能运行在智能卡上的JAVA程序的执行过程如下。首先,由开发人员编写该JAVA程序的JAVA源代码(.java程序文件),源代码经过编译器编译后生成由符合JAVA虚拟机规范的字节码组成的类文件(.class)。当该JAVA程序在智能卡上运行时,类装载器装入来自类文件的字节码,经过检验器安全验证后,由JAVA虚拟机读取字节码,转换为JAVA卡的本地代码,在智能卡的CPU中运行。
通常,由字节码组成的类文件中存在大量重复的字节码序列,而且不同的安装在JAVA卡上的程序中也存在大量重复的字节码序列,将这无疑会导致存储空间的大量消耗,也势必降低字节码的执行效率。
为了降低存储空间的消耗并提高字节码执行效率,目前已经提出一种优化技术来优化大量重复的字节码序列。该技术考虑到JAVA虚拟机规范中保留有一些未定义的字节码,于是,利用这些未定义的字节码作为宏定义来代替大量重复的字节码序列。举例而言,JAVA卡上某个应用程序的指令sload 4经常被使用,该指令表示从堆栈中读取第四个参数的值,被编译后的字节码序列为0x16和0x04,将占用两个字节,并在运行时需要扫描两个字节码。按照上述方法,可以用JAVA虚拟机规范中未定义的字节码0xEF作为宏定义来代替0x16和0x04,这样,原来用两个字节码表示的指令现在只需要用一个字节码就可以表示,在执行时也只需要扫描一个字节码,因此可以节省存储空间并提高字节码的执行效率。
虽然现有的方法可以降低存储消耗并提高效率,但是该方法仍然存在许多问题。首先,由于使用了保留的未定义字节码,因此如果JAVA虚拟机规范升级时使用这些保留的字节码,那么将导致整个JAVA卡系统不兼容。其次,未定义的字节码很有限,这使得现有的方法只能在很有限的程度上降低存储消耗和提高效率。最后,按照上述优化方法优化后的字节码,只能装载到特定的JAVA卡上,由特定的JAVA虚拟机执行,否则将会产生歧义,导致程序无法正常执行。
【发明内容】
本发明的目的在于提供字节码优化数据库及其建立方法以及JAVA卡字节码的优化方法,利用本发明能显著优化重复的字节码,缩减存储消耗,提高效率并实现兼容。
为实现上述发明目的,本发明提出一种用于建立JAVA卡字节码优化数据库的方法,包括步骤:
扫描能安装在所述JAVA卡上的应用程序的字节码序列,以获得所扫描的字节码序列中特定的字节码段,其中,特定的字节码段包括一个或多个重复使用达到预定次数的字节码段;
构造静态函数来分别对应所获得的特定的字节码段;和
存储特定的字节码段与对应的静态函数的关联关系,以建立JAVA卡字节码优化数据库。
本发明还提供一种JAVA卡字节码优化数据库,包括:
扫描模块,用于扫描能安装在所述JAVA卡上的应用程序的字节码序列,以获得所扫描的字节码序列中特定的字节码段,其中,特定的字节码段包括一个或多个重复使用达到预定次数的字节码段;
静态函数构造模块,用于构造与所获得的特定的字节码段相对应的静态函数;和
存储模块,用于存储特定地字节码段与对应的静态函数的关联关系。
本发明也提供一种JAVA卡字节码的优化方法,包括步骤:
将字节码优化数据库设置成应用程序的引用模块,其中,该字节码优化数据库包括特定的字节码段及其对应的静态函数,特定的字节码段包括一个或多个重复使用达到预定次数的字节码段;
将所述字节码优化数据库中所包括的静态函数置于所述应用程序的常量池中;
将所述应用程序所包括的特定的字节码段替换为对应的静态函数;和
更新所述应用程序的字节码序列中的例外处理范围和参考位置。
【附图说明】
本发明的其他特征、目的和益处通过以下结合附图的详细描述将变得更加显而易见。其中:
图1是用于建立JAVA卡字节码优化数据库的方法流程图;
图2是用于存储特定的字节码段及其对应的静态函数的示例性关系列表;
图3是JAVA卡字节码的优化方法的流程图。
【具体实施方式】
下面,将结合附图详细描述本发明的各个实施例。
图1是用于建立JAVA卡字节码优化数据库的方法流程图。该方法在JAVA卡出厂之前执行,并且利用该方法建立的JAVA卡字节码优化数据库置于JAVA卡上。
在执行该方法之前,首先收集能在JAVA卡上安装的应用程序,包括JAVA卡系统自身所固有的程序库中的应用程序、当前主流应用的JAVA应用程序以及JAVA卡所应用的领域的JAVA应用程序等。这些应用程序的源代码经过编译生成字节码序列。
如图1所示,对收集到的应用程序经编译所生成的字节码序列进行扫描,以获得这些字节码序列中特定的字节码段,其中,特定的字节码段包括重复使用达到预定次数的字节码段(步骤S100)。
对每个特定的字节码段都构造一个与之相对应的静态函数(步骤S110)。
存储每个特定的字节码段与对应的静态函数的关联关系,以建立JAVA卡字节码优化数据库(步骤S120)。
一个简单的JAVA卡字节码优化数据库如图2所示,其用于存储每个特定的字节码段及其对应的静态函数,以表示二者之间的关联关系,便于在后续使用时,用静态函数代替相应的特定的字节码段。如图2所示,关系列表中存储有两个特定的字节码段及其对应的静态函数,特定的字节码段A对应于静态函数a,特定的字节码段B对应于静态函数b。于是,在安装应用程序时,可以将程序文件中所有的字节码段A都替换成静态函数a,将所有的字节码段B都替换成静态函数b。通常,特定的字节码段所占的存储空间远远大于静态函数所占的存储空间,这样,经过替换,应用程序就不会占用那么大的空间,而且在程序运行时,也仅扫描少得多的代码,于是,可以缩减存储消耗,提高效率。
下面,参见图3描述具有按照图1所示的方法建立的JAVA卡字节码优化数据库的JAVA卡实现字节码优化的过程。图3示出了JAVA卡字节码的优化方法的流程图。该优化方法在向JAVA卡安装新的应用程序时执行,例如,新的应用程序Y将安装在JAVA卡上,该应用程序的安装文件被编译所生成的字节码序列中存在特定的字节码段,这些特定的字节码段在JAVA卡字节码优化数据库中存在对应的静态函数。
如图3所示,首先,将置于该JAVA卡上的字节码优化数据库设置成应用程序Y的引用模块,以便在安装应用程序Y的过程中可以使用该字节码优化数据库(步骤S300)。
然后,将字节码优化数据库中所包括的静态函数置于应用程序Y的常量池中(步骤S310);
在该应用程序Y安装的过程中,将安装文件中所包括的特定的字节码段都替换为字节码优化数据库中对应的静态函数(步骤S320);
考虑到JAVA语言程序的例外处理范围和参考位置,由于将特定的字节码段替换成了对应的静态函数,所以安装文件中的例外处理范围和参考位置将有所变化,于是,更新整个字节码序列的例外处理范围和参考位置(步骤S330)。
进一步地,特定的字节码段也可以包括那些占用存储资源较多的字节码段。这样,凡是包括该字节码段的应用程序都可以在安装时用静态函数代替该特定的字节码段,从而大大缩减存储消耗。
此外,如果在已知特定的JAVA卡上设置字节码优化数据库,那么还可以预先将静态函数用该特定的JAVA卡的本地代码实现,这样,安装在该JAVA卡上的应用程序在运行时,直接执行本地代码,这将显著提高整个虚拟机和运行环境的效率。
本领域技术人员应当理解,上面各个实施例公开的方法可以利用软件、硬件或者软硬件结合的方式来实现。
本领域技术人员应当理解,在本发明上述实施例的启示下,可以得到本发明实施例的各种变形,并且在不偏离本发明的精神或范围的情况下,本文中所定义的一般原理也可以应用到其他实施例中。因此本发明并不局限于本文中所示的实施例,而且要求与本文中所公开的原理和新颖特征相一致的最广的范围。