本發(fā)明涉及軟件工程,尤其涉及的是一種編譯方法、編譯器、終端及存儲(chǔ)介質(zhì)。
背景技術(shù):
1、在源程序編譯領(lǐng)域,錯(cuò)誤處理機(jī)制是不可或缺的一環(huán)。不同編程語(yǔ)言設(shè)計(jì)有不同的錯(cuò)誤處理機(jī)制。而當(dāng)將原始編程語(yǔ)言的源程序編譯至目標(biāo)編程語(yǔ)言的程序時(shí),面臨的挑戰(zhàn)之一便是如何有效地轉(zhuǎn)換原有的錯(cuò)誤處理機(jī)制。目標(biāo)編程語(yǔ)言所擁有的特性將會(huì)決定如何將原編程語(yǔ)言中的錯(cuò)誤處理機(jī)制進(jìn)行編譯。
2、現(xiàn)有技術(shù)中,針對(duì)將源程序中的錯(cuò)誤處理機(jī)制編譯為目標(biāo)編程語(yǔ)言中的錯(cuò)誤處理機(jī)制時(shí),通常采用兩種方式:一是,需要目標(biāo)編程語(yǔ)言支持異??刂屏鳈C(jī)制,并利用目標(biāo)編程語(yǔ)言的異常控制流機(jī)制來進(jìn)行編譯,這使得此種方式可適用的目標(biāo)編程語(yǔ)言范圍較小;二是,將錯(cuò)誤處理編譯為目標(biāo)編程語(yǔ)言中的普通數(shù)據(jù)加普通控制流時(shí),錯(cuò)誤生成時(shí)可能會(huì)產(chǎn)生額外的內(nèi)存分配開銷。
3、因此,現(xiàn)有技術(shù)存在缺陷,有待改進(jìn)與發(fā)展。
技術(shù)實(shí)現(xiàn)思路
1、本發(fā)明要解決的技術(shù)問題在于,針對(duì)現(xiàn)有技術(shù)的上述缺陷,提供一種編譯方法、編譯器、終端及存儲(chǔ)介質(zhì),旨在解決現(xiàn)有技術(shù)中將錯(cuò)誤處理編譯為目標(biāo)編程語(yǔ)言時(shí)適用范圍較小或產(chǎn)生額外內(nèi)存分配開銷的問題。
2、本發(fā)明解決技術(shù)問題所采用的技術(shù)方案如下:
3、第一方面,本發(fā)明實(shí)施例提供一種編譯方法,所述方法包括:
4、對(duì)原始編程語(yǔ)言形式的源程序進(jìn)行靜態(tài)分析,以識(shí)別出第一錯(cuò)誤處理機(jī)制代碼,所述第一錯(cuò)誤處理機(jī)制代碼為預(yù)設(shè)的編譯器定義的潛在錯(cuò)誤定義、拋出錯(cuò)誤聲明和錯(cuò)誤捕獲代碼塊;
5、基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言的特性,利用所述編譯器對(duì)所述源程序進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)編程語(yǔ)言形式的目標(biāo)程序,所述目標(biāo)程序中包含第二錯(cuò)誤處理機(jī)制代碼;
6、其中,所述目標(biāo)編程語(yǔ)言的控制流圖具備可歸約性。
7、可選的,所述對(duì)原始編程語(yǔ)言形式的源程序進(jìn)行靜態(tài)分析,包括:
8、對(duì)所述第一錯(cuò)誤處理機(jī)制代碼進(jìn)行語(yǔ)法解析;
9、在語(yǔ)法解析的過程中,識(shí)別代碼中潛在引發(fā)錯(cuò)誤的條件或狀態(tài)并標(biāo)記為潛在錯(cuò)誤定義,識(shí)別代碼中用于拋出錯(cuò)誤的語(yǔ)句并標(biāo)記為拋出錯(cuò)誤聲明,識(shí)別代碼中用于錯(cuò)誤捕獲的代碼塊并標(biāo)記為錯(cuò)誤捕獲代碼塊。
10、可選的,所述基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,包括:
11、根據(jù)所述拋出錯(cuò)誤聲明來識(shí)別所述源程序中直接拋出錯(cuò)誤的函數(shù);
12、將直接拋出錯(cuò)誤的函數(shù)作為當(dāng)前函數(shù);
13、對(duì)所述當(dāng)前函數(shù)進(jìn)行靜態(tài)分析,根據(jù)靜態(tài)分析結(jié)論確定錯(cuò)誤傳播路徑的同時(shí);
14、根據(jù)所述靜態(tài)分析結(jié)論確定所述拋出錯(cuò)誤聲明的類別。
15、可選的,所述基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑還包括:
16、以調(diào)用所述當(dāng)前函數(shù)的函數(shù)為調(diào)用函數(shù);
17、對(duì)所述調(diào)用函數(shù)遞歸地進(jìn)行靜態(tài)分析,根據(jù)靜態(tài)分析結(jié)論確定拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑。
18、可選的,所述對(duì)所述調(diào)用函數(shù)遞歸地進(jìn)行靜態(tài)分析,包括:
19、以所述調(diào)用函數(shù)作為新的當(dāng)前函數(shù)進(jìn)行靜態(tài)分析,以確定錯(cuò)誤傳播路徑和所述拋出錯(cuò)誤聲明的類別的同時(shí);
20、對(duì)所述當(dāng)前函數(shù)實(shí)施利用所述編譯器對(duì)所述源程序進(jìn)行轉(zhuǎn)換的步驟。
21、可選的,所述基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言的特性,利用所述編譯器對(duì)所述源程序進(jìn)行轉(zhuǎn)換,得到目標(biāo)編程語(yǔ)言形式的目標(biāo)程序,包括:
22、若所述拋出錯(cuò)誤聲明的類別為本地錯(cuò)誤,則利用所述編譯器基于所述目標(biāo)編程語(yǔ)言的控制流圖的可歸約性,結(jié)合所述錯(cuò)誤傳播路徑,將所述源程序中的所述錯(cuò)誤捕獲代碼塊進(jìn)行轉(zhuǎn)換,得到第二錯(cuò)誤處理機(jī)制代碼;
23、對(duì)所述源程序中所述錯(cuò)誤捕獲代碼塊之外的代碼,根據(jù)目標(biāo)編程語(yǔ)言的語(yǔ)法規(guī)則進(jìn)行轉(zhuǎn)換,得到正常流程處理邏輯代碼;
24、將所述正常流程處理邏輯代碼和所述第二錯(cuò)誤處理機(jī)制代碼整合為目標(biāo)程序;
25、其中,所述第二錯(cuò)誤處理機(jī)制代碼包括預(yù)期錯(cuò)誤類型、針對(duì)所述預(yù)期錯(cuò)誤類型的處理代碼和跳轉(zhuǎn)指令,所述跳轉(zhuǎn)指令用于當(dāng)檢測(cè)到與所述預(yù)期錯(cuò)誤類型相匹配的錯(cuò)誤時(shí),執(zhí)行流程跳轉(zhuǎn)到針對(duì)所述預(yù)期錯(cuò)誤類型的處理代碼處。
26、可選的,所述基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言的特性,利用所述編譯器對(duì)所述源程序進(jìn)行轉(zhuǎn)換,得到目標(biāo)編程語(yǔ)言形式的目標(biāo)程序還包括:
27、若所述拋出錯(cuò)誤聲明的類別為非本地錯(cuò)誤,則基于所述錯(cuò)誤傳播路徑對(duì)所述當(dāng)前函數(shù)進(jìn)行轉(zhuǎn)換的同時(shí),對(duì)所述調(diào)用函數(shù)逐層進(jìn)行靜態(tài)分析,并根據(jù)分析結(jié)果逐層轉(zhuǎn)換;
28、在每個(gè)函數(shù)轉(zhuǎn)換的過程中,基于所述目標(biāo)編程語(yǔ)言對(duì)于多返回值的支持情況對(duì)所述源程序進(jìn)行轉(zhuǎn)換;
29、若所述支持情況為所述目標(biāo)編程語(yǔ)言支持多返回值,則基于所述源程序中所述當(dāng)前函數(shù)的返回結(jié)果類型,確定所述當(dāng)前函數(shù)的返回結(jié)果為多返回值格式,所述多返回值格式的返回結(jié)果中包含一個(gè)用于指示執(zhí)行狀態(tài)的第一標(biāo)志位,一個(gè)用于存儲(chǔ)正確執(zhí)行返回結(jié)果或正確執(zhí)行返回結(jié)果默認(rèn)值的字段,以及一個(gè)用于存儲(chǔ)錯(cuò)誤執(zhí)行返回結(jié)果或錯(cuò)誤執(zhí)行返回結(jié)果默認(rèn)值的字段;
30、基于所述當(dāng)前函數(shù)和所述調(diào)用函數(shù)的邏輯代碼,得到第一當(dāng)前函數(shù)和第一調(diào)用函數(shù),所述第一當(dāng)前函數(shù)和所述第一調(diào)用函數(shù)均支持接收和處理多返回值格式的返回結(jié)果;
31、在所述第一當(dāng)前函數(shù)和所述第一調(diào)用函數(shù)中添加第一邏輯代碼,所述第一邏輯代碼用于根據(jù)所述第一標(biāo)志位的狀態(tài)決定執(zhí)行正常流程或跳轉(zhuǎn)到錯(cuò)誤處理代碼;
32、將所述第一邏輯代碼、所述第一當(dāng)前函數(shù)、所述第一調(diào)用函數(shù)、所述拋出錯(cuò)誤聲明和所述錯(cuò)誤捕獲代碼塊進(jìn)行轉(zhuǎn)換,形成目標(biāo)程序;
33、其中,所述目標(biāo)程序中包含由所述邏輯代碼、所述拋出錯(cuò)誤聲明和所述錯(cuò)誤捕獲代碼塊進(jìn)行轉(zhuǎn)換而形成的第二錯(cuò)誤處理機(jī)制代碼。
34、可選的,所述基于所述目標(biāo)編程語(yǔ)言對(duì)于多返回值的支持情況對(duì)所述源程序進(jìn)行轉(zhuǎn)換,還包括:
35、若所述支持情況為所述目標(biāo)編程語(yǔ)言不支持多返回值,則修改所述源程序中所述當(dāng)前函數(shù)的返回結(jié)果類型為預(yù)設(shè)格式,所述預(yù)設(shè)格式為目標(biāo)編程語(yǔ)言所支持的格式,所述預(yù)設(shè)格式的返回結(jié)果中包括用于標(biāo)識(shí)執(zhí)行狀態(tài)的第二標(biāo)志位,以及表示執(zhí)行結(jié)果的字段;
36、基于所述源程序中所述當(dāng)前函數(shù)和所述調(diào)用函數(shù)的邏輯代碼,得到第二當(dāng)前函數(shù)和第二調(diào)用函數(shù),所述第二當(dāng)前函數(shù)和所述第二調(diào)用函數(shù)均支持接收和處理所述預(yù)設(shè)格式的返回結(jié)果;
37、在所述第二當(dāng)前函數(shù)和所述第二調(diào)用函數(shù)中添加第二邏輯代碼,所述第二邏輯代碼用于根據(jù)所述第二標(biāo)志位的狀態(tài)決定執(zhí)行正常流程或跳轉(zhuǎn)到錯(cuò)誤處理代碼;
38、將所述第二邏輯代碼、所述第二當(dāng)前函數(shù)、所述第二調(diào)用函數(shù)、所述拋出錯(cuò)誤聲明和所述錯(cuò)誤捕獲代碼塊進(jìn)行轉(zhuǎn)換,形成目標(biāo)程序;
39、其中,所述目標(biāo)程序中包含由所述第二邏輯代碼、所述拋出錯(cuò)誤聲明和所述錯(cuò)誤捕獲代碼塊進(jìn)行轉(zhuǎn)換而形成的第二錯(cuò)誤處理機(jī)制代碼。
40、第二方面,本發(fā)明實(shí)施例還提供一種編譯器,包括:
41、靜態(tài)解析模塊,用于對(duì)原始編程語(yǔ)言形式的源程序進(jìn)行靜態(tài)分析,以識(shí)別出第一錯(cuò)誤處理機(jī)制代碼,所述第一錯(cuò)誤處理機(jī)制代碼為預(yù)設(shè)的編譯器定義的潛在錯(cuò)誤定義、拋出錯(cuò)誤聲明和錯(cuò)誤捕獲代碼塊;
42、程序轉(zhuǎn)換模塊,用于基于所述靜態(tài)分析確定的拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言的特性,利用所述編譯器對(duì)所述源程序進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)編程語(yǔ)言形式的目標(biāo)程序,所述目標(biāo)程序中包含第二錯(cuò)誤處理機(jī)制代碼;其中,所述目標(biāo)編程語(yǔ)言的控制流圖具備可歸約性。
43、第三方面,本發(fā)明實(shí)施例還提供一種終端,所述終端包括:存儲(chǔ)器、處理器及存儲(chǔ)在所述存儲(chǔ)器上并可在所述處理器上運(yùn)行的編譯程序,所述編譯程序被所述處理器執(zhí)行時(shí)實(shí)現(xiàn)如上所述的編譯方法的步驟。
44、第四方面,本發(fā)明實(shí)施例還提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)存儲(chǔ)有編譯程序,所述編譯程序能夠被執(zhí)行以用于實(shí)現(xiàn)如上所述的編譯方法的步驟。
45、本發(fā)明的有益效果:本發(fā)明實(shí)施例通過對(duì)原始編程語(yǔ)言形式的源程序進(jìn)行靜態(tài)分析,以識(shí)別出第一錯(cuò)誤處理機(jī)制代碼,第一錯(cuò)誤處理機(jī)制代碼為潛在錯(cuò)誤定義、拋出錯(cuò)誤聲明和錯(cuò)誤捕獲代碼塊;基于拋出錯(cuò)誤聲明的類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言的特性,利用編譯器對(duì)源程序進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)編程語(yǔ)言形式的目標(biāo)程序,目標(biāo)程序中包含第二錯(cuò)誤處理機(jī)制代碼;目標(biāo)編程語(yǔ)言的控制流圖具備可歸約性。本發(fā)明通過確定并利用拋出錯(cuò)誤聲明類別和錯(cuò)誤傳播路徑,結(jié)合目標(biāo)編程語(yǔ)言中控制流圖的可歸約性,對(duì)源程序進(jìn)行轉(zhuǎn)換,顯著擴(kuò)大了可使用的目標(biāo)編程語(yǔ)言的范圍,減少額外的內(nèi)存分配開銷。