本技術(shù)涉及編譯,尤其涉及一種字節(jié)碼文件的優(yōu)化方法、執(zhí)行方法、裝置及智能卡。
背景技術(shù):
1、字節(jié)碼文件中的字節(jié)碼指令是一種基于堆棧的虛擬機(jī)的二進(jìn)制指令格式。它是一種低級的類匯編語言,具有緊湊的二進(jìn)制格式,可以接近原生的性能運(yùn)行,并為諸如c/c++等語言提供一個編譯目標(biāo)。
2、但是在存儲空間資源有限的嵌入式設(shè)備中,現(xiàn)有的字節(jié)碼文件占用空間大,被執(zhí)行的效率較低。
技術(shù)實(shí)現(xiàn)思路
1、有鑒于此,本技術(shù)實(shí)施例提供一種字節(jié)碼文件的優(yōu)化方法、執(zhí)行方法、裝置及智能卡,可以有效解決現(xiàn)有的智能卡應(yīng)用對應(yīng)的可執(zhí)行的字節(jié)碼文件占用空間大的問題等。
2、第一方面,本技術(shù)實(shí)施例提供一種字節(jié)碼文件的優(yōu)化方法,包括:
3、獲取待優(yōu)化的字節(jié)碼文件;
4、依次遍歷所述字節(jié)碼文件中的字節(jié)碼指令,基于目標(biāo)字節(jié)碼指令的指令操作碼獲取所述目標(biāo)字節(jié)碼指令,根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型,獲取各所述目標(biāo)字節(jié)碼指令中攜帶的目標(biāo)操作數(shù)信息,以及確定所述指令類型對應(yīng)的操作數(shù)存儲區(qū);
5、確定各所述目標(biāo)操作數(shù)信息在對應(yīng)的所述操作數(shù)存儲區(qū)內(nèi)的索引,得到對應(yīng)的各目標(biāo)索引值;
6、根據(jù)各所述目標(biāo)索引值以及預(yù)設(shè)索引值長度,將對應(yīng)的目標(biāo)字節(jié)碼指令進(jìn)行重新封裝,得到優(yōu)化后的字節(jié)碼文件。
7、在一些實(shí)施例中,所述根據(jù)各所述目標(biāo)索引值以及預(yù)設(shè)索引值長度,將對應(yīng)的目標(biāo)字節(jié)碼指令進(jìn)行重新封裝包括:
8、根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型將所述目標(biāo)索引值的長度設(shè)置為預(yù)設(shè)字節(jié)長度;
9、使用所述預(yù)設(shè)字節(jié)長度的所述目標(biāo)索引值替換所述目標(biāo)字節(jié)碼指令中的目標(biāo)操作數(shù)信息。
10、在一些實(shí)施例中,所述依次遍歷所述字節(jié)碼文件中的字節(jié)碼指令,基于目標(biāo)字節(jié)碼指令的指令操作碼獲取所述目標(biāo)字節(jié)碼指令,根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型,獲取各所述目標(biāo)字節(jié)碼指令攜帶中的目標(biāo)操作數(shù)信息,以及確定所述指令類型對應(yīng)的操作數(shù)存儲區(qū),包括:
11、依次遍歷所述字節(jié)碼文件中的各字節(jié)碼指令,根據(jù)當(dāng)前遍歷到的字節(jié)碼指令中的指令操作碼確定當(dāng)前遍歷到的字節(jié)碼指令的指令類型,若根據(jù)所述指令類型確定當(dāng)前遍歷到的字節(jié)碼指令為常量裝載指令,則根據(jù)所述常量裝載指令的指令操作碼,確定預(yù)設(shè)的操作數(shù)存儲區(qū)為常量字段,確定所述目標(biāo)操作數(shù)信息為所述常量裝載指令的指令操作數(shù);
12、所述確定各所述目標(biāo)操作數(shù)信息在對應(yīng)的所述操作數(shù)存儲區(qū)內(nèi)的索引,得到對應(yīng)的各目標(biāo)索引值,包括:
13、獲取各所述常量裝載指令中的指令操作數(shù),并確定各所述指令操作數(shù)在所述常量字段內(nèi)的索引,得到對應(yīng)的第一目標(biāo)索引值;
14、所述使用所述預(yù)設(shè)字節(jié)長度的所述目標(biāo)索引值替換所述目標(biāo)字節(jié)碼指令中的目標(biāo)操作數(shù)信息,包括:
15、使用設(shè)定的第一預(yù)設(shè)字節(jié)長度的所述第一目標(biāo)索引值替換對應(yīng)的所述常量裝載指令中的指令操作數(shù)。
16、在一些實(shí)施例中,所述依次遍歷所述字節(jié)碼文件中的字節(jié)碼指令,基于目標(biāo)字節(jié)碼指令的指令操作碼獲取所述目標(biāo)字節(jié)碼指令,根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型,獲取各所述目標(biāo)字節(jié)碼指令中攜帶的目標(biāo)操作數(shù)信息,以及確定所述指令類型對應(yīng)的操作數(shù)存儲區(qū),包括:
17、依次遍歷所述字節(jié)碼文件中的各字節(jié)碼指令,根據(jù)當(dāng)前遍歷到的字節(jié)碼指令中的指令操作碼確定當(dāng)前遍歷到的字節(jié)碼指令的指令類型,若根據(jù)所述指令類型確定當(dāng)前遍歷到的字節(jié)碼指令為棧操作指令,則根據(jù)所述棧操作指令的指令操作碼,確定預(yù)設(shè)的操作數(shù)存儲區(qū)為操作數(shù)棧,確定所述目標(biāo)操作數(shù)信息為操作數(shù)地址;
18、所述確定各所述目標(biāo)操作數(shù)信息在對應(yīng)的所述操作數(shù)存儲區(qū)內(nèi)的索引,得到對應(yīng)的各目標(biāo)索引值包括:
19、獲取各所述棧操作指令中的操作數(shù)地址,并確定各所述操作數(shù)地址在所述操作數(shù)棧內(nèi)的索引,得到對應(yīng)的第二目標(biāo)索引值;
20、所述使用所述預(yù)設(shè)字節(jié)長度的所述目標(biāo)索引值替換所述目標(biāo)字節(jié)碼指令中的目標(biāo)操作數(shù)信息,包括:
21、使用設(shè)定的第二預(yù)設(shè)字節(jié)長度的所述目標(biāo)索引值替換對應(yīng)的所述棧操作指令中的操作數(shù)地址。
22、在一些實(shí)施例中,所述方法還包括:在所述確定各所述目標(biāo)操作數(shù)信息在操作數(shù)存儲區(qū)內(nèi)的索引之前,還需判斷所述目標(biāo)操作數(shù)信息是否在所述操作數(shù)存儲區(qū)內(nèi);
23、若所述目標(biāo)操作數(shù)信息未在所述操作數(shù)存儲區(qū)內(nèi),則將所述目標(biāo)操作數(shù)信息添加至所述操作數(shù)存儲區(qū)內(nèi)。
24、第二方面,本技術(shù)實(shí)施例提供一種字節(jié)碼文件的優(yōu)化裝置,包括:
25、字節(jié)碼文件獲取模塊,用于獲取待優(yōu)化的字節(jié)碼文件;
26、目標(biāo)信息獲取模塊,用于依次遍歷所述字節(jié)碼文件中的字節(jié)碼指令,基于目標(biāo)字節(jié)碼指令的指令操作碼獲取所述目標(biāo)字節(jié)碼指令,根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型,獲取各所述目標(biāo)字節(jié)碼指令中攜帶的目標(biāo)操作數(shù)信息,以及確定所述指令類型對應(yīng)的操作數(shù)存儲區(qū);
27、目標(biāo)索引值確定模塊,用于確定各所述目標(biāo)操作數(shù)信息在對應(yīng)的所述操作數(shù)存儲區(qū)內(nèi)的索引,得到對應(yīng)的各目標(biāo)索引值;
28、封裝模塊,用于根據(jù)各所述目標(biāo)索引值以及預(yù)設(shè)索引值長度,將對應(yīng)的目標(biāo)字節(jié)碼指令進(jìn)行重新封裝,得到優(yōu)化后的字節(jié)碼文件。
29、第三方面,本技術(shù)實(shí)施例提供一種字節(jié)碼的執(zhí)行方法,包括:
30、加載基于本技術(shù)第一方面提供的一種字節(jié)碼文件的優(yōu)化方法得到的優(yōu)化后的字節(jié)碼文件,得到各目標(biāo)字節(jié)碼指令;
31、根據(jù)目標(biāo)字節(jié)碼指令中目標(biāo)索引值,確定目標(biāo)操作數(shù)存儲區(qū),并根據(jù)所述目標(biāo)索引值在確定的所述目標(biāo)操作數(shù)存儲區(qū)內(nèi)獲取目標(biāo)操作數(shù)信息;
32、根據(jù)所述目標(biāo)操作數(shù)信息執(zhí)行所述目標(biāo)字節(jié)碼指令。
33、在一些實(shí)施例中,所述根據(jù)目標(biāo)字節(jié)碼指令中目標(biāo)索引值,確定目標(biāo)操作數(shù)存儲區(qū),并根據(jù)所述目標(biāo)索引值在確定的所述目標(biāo)操作數(shù)存儲區(qū)內(nèi)獲取目標(biāo)操作數(shù)信息,包括:
34、若所述目標(biāo)索引值的預(yù)設(shè)位的數(shù)值為第一預(yù)設(shè)值,則所述目標(biāo)操作數(shù)存儲區(qū)為常量字段,所述目標(biāo)字節(jié)碼指令為常量裝載指令;
35、根據(jù)所述目標(biāo)索引值在所述常量字段內(nèi)獲取對應(yīng)的目標(biāo)操作數(shù)信息;其中,所述目標(biāo)操作數(shù)信息為指令操作數(shù)。
36、在一些實(shí)施例中,所述根據(jù)目標(biāo)字節(jié)碼指令對應(yīng)的目標(biāo)索引值,確定目標(biāo)操作數(shù)存儲區(qū),并根據(jù)所述目標(biāo)索引值在所述目標(biāo)操作數(shù)存儲區(qū)內(nèi)獲取目標(biāo)操作數(shù)信息,包括:
37、若所述目標(biāo)索引值的預(yù)設(shè)位的數(shù)值為第二預(yù)設(shè)值,則所述目標(biāo)操作數(shù)存儲區(qū)為操作數(shù)棧,所述目標(biāo)字節(jié)碼指令為棧操作指令;
38、根據(jù)所述目標(biāo)索引值在所述操作數(shù)棧內(nèi)獲取對應(yīng)的目標(biāo)操作數(shù)信息;其中,所述目標(biāo)操作數(shù)信息為操作數(shù)地址。
39、第四方面,本技術(shù)實(shí)施例提供一種智能卡,包括:所述智能卡用于實(shí)施根據(jù)本技術(shù)第三方面提供的一種字節(jié)碼的執(zhí)行方法。
40、本技術(shù)的實(shí)施例具有如下有益效果:
41、本技術(shù)中,依次遍歷所述字節(jié)碼文件中的字節(jié)碼指令,基于目標(biāo)字節(jié)碼指令的指令操作碼獲取所述目標(biāo)字節(jié)碼指令,根據(jù)所述目標(biāo)字節(jié)碼指令的指令類型,獲取各所述目標(biāo)字節(jié)碼指令中攜帶的目標(biāo)操作數(shù)信息,以及確定所述指令類型對應(yīng)的操作數(shù)存儲區(qū);確定各所述目標(biāo)操作數(shù)信息在對應(yīng)的所述操作數(shù)存儲區(qū)內(nèi)的索引,得到對應(yīng)的各目標(biāo)索引值;根據(jù)各所述目標(biāo)索引值以及預(yù)設(shè)索引值長度,將對應(yīng)的目標(biāo)字節(jié)碼指令進(jìn)行重新封裝,得到優(yōu)化后的字節(jié)碼文件。本技術(shù)根據(jù)所述目標(biāo)操作數(shù)信息確定對應(yīng)的目標(biāo)索引值,根據(jù)所述目標(biāo)索引值重新封裝字節(jié)碼文件。由此,可以有效解決現(xiàn)有的智能卡應(yīng)用對應(yīng)的可執(zhí)行的字節(jié)碼文件占用空間大的問題等。