移植方法及源到源編譯器的制造方法
【專利摘要】本發(fā)明實(shí)施例公開(kāi)了移植方法及源到源編譯器,以解決現(xiàn)有技術(shù)應(yīng)用程序不能跨平臺(tái)移植的問(wèn)題。該方法包括:接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼;對(duì)通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)要求的目標(biāo)平臺(tái)算法源代碼;發(fā)送目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器。在本實(shí)施例中,將通用平臺(tái)算法源代碼作為中間代碼,通過(guò)對(duì)其通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,可得到符合目標(biāo)平臺(tái)要求的目標(biāo)平臺(tái)算法源代碼,而對(duì)通用運(yùn)算符及通用數(shù)據(jù)類型的轉(zhuǎn)換是對(duì)基本運(yùn)算的轉(zhuǎn)換,因此可實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換,解決了現(xiàn)有技術(shù)無(wú)法實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換的問(wèn)題。
【專利說(shuō)明】移植方法及源到源編譯器【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)【技術(shù)領(lǐng)域】,更具體地說(shuō),涉及移植方法及源到源編譯器。
【背景技術(shù)】
[0002]在DSP(Digital Signal Processing)平臺(tái)、CPU、GPU(Graphic Processing Unit)升級(jí)換代(將DSP平臺(tái)、CPU、GPU統(tǒng)稱為平臺(tái))時(shí),原平臺(tái)中的應(yīng)用程序經(jīng)常需要進(jìn)行對(duì)應(yīng)的移植,以令其可在升級(jí)換代后的平臺(tái)(可稱為目標(biāo)平臺(tái))上應(yīng)用。原平臺(tái)與目標(biāo)平臺(tái)可能為不同平臺(tái),也即程序移植存在跨平臺(tái)移植的需求。所謂的不同平臺(tái),是指芯片架構(gòu)(比如指令,數(shù)據(jù)類型定義等)有差異的平臺(tái)。
[0003]上述應(yīng)用程序是程序源代碼經(jīng)過(guò)編譯后得到的二進(jìn)制可執(zhí)行文件(exe文件)。為追求性能最優(yōu),應(yīng)用程序中的算法程序源代碼往往與平臺(tái)芯片架構(gòu)強(qiáng)相關(guān),因此,應(yīng)用程序的移植的核心是將適用于原平臺(tái)的算法源代碼轉(zhuǎn)換成適用于目標(biāo)平臺(tái)的算法源代碼,也即進(jìn)行源到源轉(zhuǎn)換。
[0004]現(xiàn)有的源到源編輯器,可實(shí)現(xiàn)單線程代碼到多線程代碼的轉(zhuǎn)換,以及不同語(yǔ)言源代碼間的轉(zhuǎn)換。但現(xiàn)有的源到源編輯器所進(jìn)行的源到源轉(zhuǎn)換,是業(yè)務(wù)邏輯上的轉(zhuǎn)換,并不涉及平臺(tái)相關(guān)的基本運(yùn)算的轉(zhuǎn)換,因此,其只適應(yīng)于同平臺(tái)的轉(zhuǎn)換,不能跨平臺(tái)運(yùn)用,也即,其不能實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換,進(jìn)而不能實(shí)現(xiàn)應(yīng)用程序跨平臺(tái)移植。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明實(shí)施例的目的在于提供移植方法及源到源編譯器,以解決現(xiàn)有技術(shù)不能實(shí)現(xiàn)應(yīng)用程序跨平臺(tái)移植的問(wèn)題。
[0006]為實(shí)現(xiàn)上述目的,本發(fā)明實(shí)施例提供如下技術(shù)方案:`[0007]根據(jù)本發(fā)明實(shí)施例的第一方面,提供一種應(yīng)用程序跨平臺(tái)移植方法,包括:
[0008]接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)所述應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼;
[0009]對(duì)所述通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼;
[0010]發(fā)送所述目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器,以便所述目標(biāo)平臺(tái)編譯器對(duì)所述目標(biāo)平臺(tái)算法源代碼進(jìn)行編譯,得到可運(yùn)行在目標(biāo)平臺(tái)上的應(yīng)用程序。
[0011]結(jié)合第一方面,在第一種可能的實(shí)現(xiàn)方式中,所述對(duì)通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼,具體包括:
[0012]解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù);其中,所述抽象語(yǔ)法樹(shù)包括通用運(yùn)算節(jié)點(diǎn);
[0013]對(duì)所述抽象語(yǔ)法樹(shù)中的通用運(yùn)算節(jié)點(diǎn)進(jìn)行替換處理和優(yōu)化處理,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù);[0014]反解析所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù),得到所述目標(biāo)平臺(tái)算法源代碼。
[0015]結(jié)合第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,所述解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù)包括:
[0016]對(duì)所述通用平臺(tái)算法源代碼進(jìn)行詞法分析,得到記號(hào)流;
[0017]對(duì)所述記號(hào)流進(jìn)行語(yǔ)法分析,構(gòu)成第一語(yǔ)法樹(shù);
[0018]對(duì)所述第一語(yǔ)法樹(shù)進(jìn)行語(yǔ)義分析,得到經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)。
[0019]結(jié)合第一方面的第一種或第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述替換處理包括:
[0020]令所述抽象語(yǔ)法樹(shù)中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配,當(dāng)滿足預(yù)設(shè)匹配條件時(shí),匹配成功;
[0021]利用匹配成功的通用運(yùn)算庫(kù)模板中的內(nèi)容,替換與之相匹配的通用運(yùn)算節(jié)點(diǎn)的內(nèi)容,得到第二語(yǔ)法樹(shù);
[0022]所述優(yōu)化處理包括:對(duì)所述第二語(yǔ)法樹(shù)進(jìn)行合并相同循環(huán)的節(jié)點(diǎn)、消除冗余節(jié)點(diǎn)和向量化中的至少一種,得到所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù)。
[0023]結(jié)合第一方面的第一種至第三種可能的實(shí)現(xiàn)方式中任一種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,所述通用運(yùn)算節(jié)點(diǎn)包括通用運(yùn)算符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn);
[0024]所述通用運(yùn)算庫(kù)模板包括通用運(yùn)算模板和通用數(shù)據(jù)類型模板;
[0025]所述通用運(yùn)算模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的運(yùn)算代碼;所述通用數(shù)據(jù)類型模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)、并與通用數(shù)據(jù)類型相對(duì)應(yīng)的數(shù)據(jù)類型的定義或解釋。
[0026]結(jié)合第一方面的第四種可能的實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與通用運(yùn)算模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與通用運(yùn)算模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;
[0027]當(dāng)令操作數(shù)節(jié)點(diǎn)與通用數(shù)據(jù)類型模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,操作數(shù)節(jié)點(diǎn)包含的通用數(shù)據(jù)類型,與通用數(shù)據(jù)類型模板對(duì)應(yīng)的通用數(shù)據(jù)類型相一致,并且,操作數(shù)節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;
[0028]所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
[0029]結(jié)合第一方面的第四種可能的實(shí)現(xiàn)方式,在第六種可能的實(shí)現(xiàn)方式中,所述通用運(yùn)算庫(kù)模板還包括專有指令模板,所述專有指令模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的指令;
[0030]當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與專有指令模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與專有指令模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;
[0031]所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
[0032]結(jié)合第一方面至第一方面第六種可能的實(shí)現(xiàn)方式中任一種,在第七種可能的實(shí)現(xiàn)方式中,所述接收到的算法源代碼具體為通用DSP算法C源代碼。
[0033]根據(jù)本發(fā)明實(shí)施例的第二方面,提供一種源到源編譯器,包括:[0034]接收單元,用于接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)所述應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼;
[0035]轉(zhuǎn)換單元,用于對(duì)所述通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼;
[0036]發(fā)送單元,用于發(fā)送所述目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器,以便所述目標(biāo)平臺(tái)編譯器對(duì)所述目標(biāo)平臺(tái)算法源代碼進(jìn)行編譯,得到可運(yùn)行在目標(biāo)平臺(tái)上的應(yīng)用程序。
[0037]結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,在對(duì)通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼方面,所述轉(zhuǎn)換單元具體用于:
[0038]解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù);其中,所述抽象語(yǔ)法樹(shù)包括通用運(yùn)算節(jié)點(diǎn);
[0039]對(duì)所述抽象語(yǔ)法樹(shù)中的通用運(yùn)算節(jié)點(diǎn)進(jìn)行替換處理和優(yōu)化處理,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù);
[0040]反解析所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù),得到所述目標(biāo)平臺(tái)算法源代碼。
[0041]結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,在解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù)方面,所述轉(zhuǎn)換單元具體用于:
[0042]對(duì)所述通用平臺(tái)算法源代碼進(jìn)行詞法分析,得到記號(hào)流;
[0043]對(duì)所述記號(hào)流進(jìn)行語(yǔ)法分析,構(gòu)成第一語(yǔ)法樹(shù);
[0044]對(duì)所述第一語(yǔ)法樹(shù)進(jìn)行語(yǔ)義分析,得到經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)。
[0045]結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,或第二方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,在替換處理方面,所述轉(zhuǎn)換單元具體用于:
[0046]令所述抽象語(yǔ)法樹(shù)中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配,當(dāng)滿足預(yù)設(shè)匹配條件時(shí),匹配成功;
[0047]利用匹配成功的通用運(yùn)算庫(kù)模板中的內(nèi)容,替換與之相匹配的通用運(yùn)算節(jié)點(diǎn)的內(nèi)容,得到第二語(yǔ)法樹(shù);
[0048]在優(yōu)化處理方面,所述轉(zhuǎn)換單元具體用于:對(duì)所述第二語(yǔ)法樹(shù)進(jìn)行合并相同循環(huán)的節(jié)點(diǎn)、消除冗余節(jié)點(diǎn)和向量化中的至少一種,得到所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù)。
[0049]結(jié)合第二方面的第一種可能的實(shí)現(xiàn)方式,或第二方面的第二種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,所述通用運(yùn)算節(jié)點(diǎn)包括通用運(yùn)算符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn);所述通用運(yùn)算庫(kù)模板包括通用運(yùn)算模板和通用數(shù)據(jù)類型模板;所述通用運(yùn)算模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的運(yùn)算代碼;所述通用數(shù)據(jù)類型模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)、并與通用數(shù)據(jù)類型相對(duì)應(yīng)的數(shù)據(jù)類型的定義或解釋。
[0050]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與通用運(yùn)算模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與通用運(yùn)算模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;當(dāng)令操作數(shù)節(jié)點(diǎn)與通用數(shù)據(jù)類型模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,操作數(shù)節(jié)點(diǎn)包含的通用數(shù)據(jù)類型,與通用數(shù)據(jù)類型模板對(duì)應(yīng)的通用數(shù)據(jù)類型相一致,并且,操作數(shù)節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
[0051]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,所述通用運(yùn)算庫(kù)模板還包括專有指令模板,所述專有指令模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的指令;當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與專有指令模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與專有指令模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
[0052]可見(jiàn),在本實(shí)施例中,將采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼作為中間代碼,通過(guò)對(duì)其通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,可得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼,而對(duì)通用運(yùn)算符及通用數(shù)據(jù)類型的轉(zhuǎn)換,是對(duì)基本運(yùn)算的轉(zhuǎn)換,因此,本發(fā)明實(shí)施例可實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換,解決了現(xiàn)有技術(shù)無(wú)法實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換的問(wèn)題。將得到的目標(biāo)平臺(tái)算法源代碼發(fā)送至目標(biāo)平臺(tái)編譯器后,目標(biāo)平臺(tái)編譯器可對(duì)其進(jìn)行編譯,最終得到可運(yùn)行于目標(biāo)平臺(tái)之上的應(yīng)用程序,進(jìn)而實(shí)現(xiàn)了原平臺(tái)中的應(yīng)用程序移植至目標(biāo)平臺(tái)。
【專利附圖】
【附圖說(shuō)明】
[0053]為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0054]圖1為本發(fā)明實(shí)施例提供的跨平臺(tái)移植示意圖;
[0055]圖2為本發(fā)明實(shí)施例提供的跨平臺(tái)移植另一示意圖;
[0056]圖3為本發(fā)明實(shí)施例提供的通用計(jì)算機(jī)結(jié)構(gòu)示意圖;
[0057]圖4為本發(fā)明實(shí)施例提供的移植方法流程圖;
[0058]圖5為本發(fā)明實(shí)施例提供的移植方法另一流程圖;
[0059]圖6為本發(fā)明實(shí)施例提供的移植方法又一流程圖;
[0060]圖7為本發(fā)明實(shí)施例提供的移植方法又一流程圖;
[0061]圖8為本發(fā)明實(shí)施例提供的語(yǔ)法樹(shù)示意圖;
[0062]圖9為本發(fā)明實(shí)施例提供的語(yǔ)法樹(shù)另一示意圖;
[0063]圖10為本發(fā)明實(shí)施例提供的語(yǔ)法樹(shù)又一示意圖;
[0064]圖11為本發(fā)明實(shí)施例提供的語(yǔ)法樹(shù)又一示意圖;
[0065]圖12為本發(fā)明實(shí)施例提供的矩陣容器數(shù)據(jù)類型的模板示意圖;
[0066]圖13為本發(fā)明實(shí)施例提供的專用指令模板示意圖;
[0067]圖14為本發(fā)明實(shí)施例提供的移植方法又一流程圖;
[0068]圖15為本發(fā)明實(shí)施例提供的向量求模運(yùn)算對(duì)應(yīng)的通用DSP算法C源代碼示意圖;
[0069]圖16為本發(fā)明實(shí)施例提供的語(yǔ)法樹(shù)又一示意圖;
[0070]圖17為本發(fā)明實(shí)施例提供的專用指令模板另一示意圖;
[0071]圖18為本發(fā)明實(shí)施例提供的目標(biāo)平臺(tái)算法源代碼示意圖;[0072]圖19為本發(fā)明實(shí)施例提供的通用卷積算法代碼轉(zhuǎn)化為用于TI平臺(tái)的算法代碼示意圖;
[0073]圖20為本發(fā)明實(shí)施例提供的與通用卷積算法代碼相對(duì)應(yīng)的、用于Tensilica平臺(tái)的算法源代碼示意圖;
[0074]圖21為本發(fā)明實(shí)施例提供的源到源編譯器結(jié)構(gòu)示意圖;
[0075]圖22為本發(fā)明實(shí)施例提供的源到源編譯器另一結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0076]為了引用和清楚起見(jiàn),下文中使用的技術(shù)名詞、簡(jiǎn)寫(xiě)或縮寫(xiě)總結(jié)解釋如下:
[0077]AST:abstract syntax tree,抽象語(yǔ)法樹(shù)。AST是源代碼的抽象語(yǔ)法結(jié)構(gòu)的樹(shù)狀表現(xiàn)形式,這里特指編程語(yǔ)言的源代碼。樹(shù)上的每個(gè)節(jié)點(diǎn)(語(yǔ)法單元)都表示源代碼中的一種結(jié)構(gòu)。之所以說(shuō)語(yǔ)法是“抽象”的,是因?yàn)檫@里的語(yǔ)法并不會(huì)表示出真實(shí)語(yǔ)法中出現(xiàn)的每個(gè)細(xì)節(jié)。比如,嵌套括號(hào)被隱含在AST的結(jié)構(gòu)中,并沒(méi)有以節(jié)點(diǎn)的形式呈現(xiàn);而類似于if-condition-then這樣的條件跳轉(zhuǎn)語(yǔ)句,可以使用帶有兩個(gè)分支的節(jié)點(diǎn)來(lái)表示。一旦AST被創(chuàng)建出來(lái),在后續(xù)的處理過(guò)程中,比如語(yǔ)義分析階段,會(huì)添加一些信息;AST是程序編譯階段的一種中間表示形式,含有源程序結(jié)果顯示所需要的全部靜態(tài)信息,具有較高的存儲(chǔ)效率。此外,在AST的基礎(chǔ)上可以進(jìn)行程序優(yōu)化,生成機(jī)器代碼,生成數(shù)據(jù)流,控制流,在程序分析領(lǐng)域有廣泛應(yīng)用;
[0078]定點(diǎn)數(shù):定點(diǎn)數(shù)指小數(shù)點(diǎn)在數(shù)中的位置是固定不變的,通常有定點(diǎn)整數(shù)和定點(diǎn)小數(shù)。在對(duì)小數(shù)點(diǎn)位置作出選擇之后,運(yùn)算中的所有數(shù)均應(yīng)統(tǒng)一為定點(diǎn)整數(shù)或定點(diǎn)小數(shù),在運(yùn)算中不再考慮小數(shù)問(wèn)題。定點(diǎn)數(shù)受字長(zhǎng)的限制,超出范圍會(huì)有溢出。
[0079]浮點(diǎn)數(shù):浮點(diǎn)數(shù)中小數(shù)點(diǎn)的位置是不固定的,用階碼和尾數(shù)來(lái)表示。通常尾數(shù)為純小數(shù),階碼為整數(shù),尾數(shù)和階碼均為帶符號(hào)數(shù)。尾數(shù)的符號(hào)表示數(shù)的正負(fù);階碼的符號(hào)則表明小數(shù)點(diǎn)的實(shí)際位置;
[0080]ISA:1nstruction Set Architecture, ISA是與程序設(shè)計(jì)有關(guān)的計(jì)算機(jī)架構(gòu)的一部分,包括本地?cái)?shù)據(jù)類型、指令、寄存器、地址模式、內(nèi)存架構(gòu)、中斷和意外處理和外部I/O。
[0081]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0082]在現(xiàn)有技術(shù)中有兩種方式可實(shí)現(xiàn)跨平臺(tái)移植(重用)。
[0083]一種方式是,請(qǐng)參見(jiàn)圖1,根據(jù)目標(biāo)平臺(tái)(B平臺(tái)、C平臺(tái))指令和架構(gòu)特點(diǎn),通過(guò)手工修改完成A平臺(tái)算法源代碼跨DSP平臺(tái)重用,其缺點(diǎn)是每次平臺(tái)升級(jí)時(shí)均需要對(duì)算法代碼的匯編代碼進(jìn)行修改,原A平臺(tái)算法源代碼不能重用,效率較低,增加了研發(fā)成本。并且,需要研發(fā)人員熟悉原平臺(tái)與目標(biāo)平臺(tái)的平臺(tái)指令和芯片架構(gòu),對(duì)研發(fā)人員的技術(shù)性依賴很高。如果目標(biāo)平臺(tái)有多個(gè),并且,各個(gè)芯片架構(gòu)不同,則需要研發(fā)人員針對(duì)每一目標(biāo)平臺(tái)進(jìn)行手工修改,其移植難度將非常大。
[0084]另一種方式是,請(qǐng)參見(jiàn)圖2,基于API接口的編程工具技術(shù)(比如OpenCL),通過(guò)不同平臺(tái)的編譯器(需要支持OpenCL特性)將源碼編譯成不同平臺(tái)的可執(zhí)行程序。其缺點(diǎn)是,需要對(duì)每一目標(biāo)平臺(tái)的編譯器進(jìn)行修改,平臺(tái)升級(jí)效率不高。
[0085]此外,還有一種源到源轉(zhuǎn)換以實(shí)現(xiàn)同平臺(tái)移植方式,采用此種方式對(duì)算法源代碼轉(zhuǎn)換后,可實(shí)現(xiàn)單線程代碼到多線程代碼的轉(zhuǎn)換,以及不同語(yǔ)言源代碼間的轉(zhuǎn)換。其缺點(diǎn)是,其只涉及業(yè)務(wù)邏輯上的轉(zhuǎn)換,并不涉及平臺(tái)相關(guān)的基本運(yùn)算的轉(zhuǎn)換,因此,其只適應(yīng)于同平臺(tái)的轉(zhuǎn)換,不能跨平臺(tái)運(yùn)用,也即,其不能實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換,進(jìn)而不能實(shí)現(xiàn)應(yīng)用程序跨平臺(tái)移植。
[0086]統(tǒng)觀上述多種現(xiàn)有技術(shù),要么需要手工修改,對(duì)研發(fā)人員技術(shù)依賴性高,要么需要修改目標(biāo)平臺(tái)的編譯器,要么不能跨平臺(tái)使用。
[0087]有鑒于此,本發(fā)明實(shí)施例提供應(yīng)用程序跨平臺(tái)移植方法,其用于將原平臺(tái)中的應(yīng)用程序移植至目標(biāo)平臺(tái),以解決上述問(wèn)題。
[0088]該方法的執(zhí)行主體為源到源編譯器,源到源編譯器100作為移植方法的執(zhí)行主體,其通用計(jì)算機(jī)結(jié)構(gòu)如圖3所示:包括至少一個(gè)處理器101,例如CPU,至少一個(gè)網(wǎng)絡(luò)接口104或者其他用戶接口 103,存儲(chǔ)器105,至少一個(gè)通信總線102。通信總線102用于實(shí)現(xiàn)這些組件之間的連接通信。該傳輸定時(shí)裝置100可選的包含鍵盤(pán)或者點(diǎn)擊設(shè)備,例如,鼠標(biāo)、軌跡球(trackball)等。在本發(fā)明實(shí)施例中,處理器101通過(guò)調(diào)用存儲(chǔ)器105存儲(chǔ)的應(yīng)用程序1051或指令,執(zhí)行移植方法中的各步驟。
[0089]參見(jiàn)圖4,上述移植方法至少可包括如下步驟:
[0090]S1、接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)該應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼;
[0091]在實(shí)際使用中,可將與該應(yīng)用程序?qū)?yīng)的、原平臺(tái)適用的算法源代碼,通過(guò)人工或自動(dòng)的方式轉(zhuǎn)換成通用平臺(tái)算法源代碼。當(dāng)然,也可在編寫(xiě)原平臺(tái)的算法源代碼時(shí),直接將其編寫(xiě)成通用平臺(tái)算法源代碼。
[0092]上述通用平臺(tái)算法源代碼符合通用語(yǔ)法規(guī)則,“通用語(yǔ)法規(guī)則”指的是與平臺(tái)芯片架構(gòu)無(wú)關(guān)的語(yǔ)法規(guī)則,其包括符合通用語(yǔ)法規(guī)則的數(shù)據(jù)類型(可簡(jiǎn)稱為通用數(shù)據(jù)類型或與平臺(tái)芯片架構(gòu)無(wú)關(guān)的通用數(shù)據(jù)類型)和符合通用語(yǔ)法規(guī)則的運(yùn)算符(可簡(jiǎn)稱為通用運(yùn)算符或與平臺(tái)芯片架構(gòu)無(wú)關(guān)的通用運(yùn)算符)。
[0093]在本實(shí)施例中,通用平臺(tái)算法源代碼的語(yǔ)法定義,可基于C語(yǔ)言進(jìn)行語(yǔ)法擴(kuò)展來(lái)加以實(shí)現(xiàn),也即通用平臺(tái)算法源代碼的語(yǔ)法=C語(yǔ)言語(yǔ)法+擴(kuò)展的語(yǔ)法。此外,通用平臺(tái)算法源代碼的語(yǔ)法定義也可基于C++、JAVA等進(jìn)行語(yǔ)法擴(kuò)展來(lái)實(shí)現(xiàn)。
[0094]更具體的,上述通用平臺(tái)算法源代碼可為通用DSP算法C源代碼,通用DSP算法C源代碼兼容matlab的語(yǔ)法定義規(guī)則,并具有如下特點(diǎn):
[0095](一),擴(kuò)展的數(shù)據(jù)類型定義:能夠表達(dá)C語(yǔ)言中的原始數(shù)據(jù)類型(primitive),例如,定點(diǎn)、浮點(diǎn)、向量、復(fù)數(shù)等,以及擴(kuò)展數(shù)據(jù)類型。擴(kuò)展數(shù)據(jù)類型可包括,與C語(yǔ)言中的原始數(shù)據(jù)類型不相同的數(shù)據(jù)類型,以及,C語(yǔ)言中未定義的數(shù)據(jù)類型(自定義數(shù)據(jù)類型)中的至少一種。
[0096]例如,擴(kuò)展數(shù)據(jù)類型可包括hash、range、矩陣等。其中,hash是數(shù)學(xué)里的哈希表,range是數(shù)據(jù)里的范圍,hash、range、矩陣常用在復(fù)雜的數(shù)據(jù)運(yùn)算中。
[0097]再例如,擴(kuò)展數(shù)據(jù)類型可包括fixl6.8、fl6.6等自定義數(shù)據(jù)類型。fixl6.8、fl6.6是自定義的數(shù)據(jù)類型的名稱。其中,fixl6.8表示定點(diǎn)類型,16是總比特位數(shù),8是小數(shù)占用的比特位;fl6.6則表示含6位小數(shù)10位整數(shù)的有符號(hào)定點(diǎn)數(shù)或浮點(diǎn)數(shù)。
[0098](二),擴(kuò)展的運(yùn)算定義:能夠表達(dá)C語(yǔ)言中的原始運(yùn)算操作,例如屬性、位操作、賦值操作、類型轉(zhuǎn)換、算術(shù)邏輯等,以及,擴(kuò)展運(yùn)算操作(例如矩陣運(yùn)算操作)。以要言之,擴(kuò)展運(yùn)算可包括,與C語(yǔ)言中的原始運(yùn)算不相同的運(yùn)算,以及,C語(yǔ)言中未定義的運(yùn)算中的至少一種。
[0099]需要說(shuō)明的是,運(yùn)算=運(yùn)算符+操作數(shù)。例如,在c=a+b這個(gè)運(yùn)算中,=、+為運(yùn)算符,a, b, c為操作數(shù)。操作數(shù)又可以細(xì)分為輸入操作數(shù)和輸出操作數(shù)。在c=a+b這個(gè)運(yùn)算中,a、b為輸入操作數(shù),c為輸出操作數(shù)。
[0100]在本發(fā)明實(shí)施例中,運(yùn)算定義是指運(yùn)算的意義(或者說(shuō)運(yùn)算符所表達(dá)的意義),例如運(yùn)算符“+”表示加法,運(yùn)算符表示減法等。
[0101]實(shí)際上,運(yùn)算可細(xì)分為多種類型,例如,算術(shù)運(yùn)算(對(duì)應(yīng)的運(yùn)算符號(hào)是+、-、*、/等),關(guān)系運(yùn)算(對(duì)應(yīng)的運(yùn)算符號(hào)是==、!=、〈、>、=〈、>=等),邏輯運(yùn)算(對(duì)應(yīng)的運(yùn)算符號(hào)是I |、&&、!
O
[0102](三),能適配DSP平臺(tái)的數(shù)據(jù)類型和運(yùn)算需求,即能夠完全用通用語(yǔ)言(符合擴(kuò)展的matlab規(guī)則)表達(dá)DSP平臺(tái)里的數(shù)據(jù)類型及運(yùn)算。之所以要符合matlab規(guī)則,是因?yàn)閙atlab的基本數(shù)據(jù)單位是矩陣,其指令表達(dá)式與數(shù)學(xué)、工程中常用的形式十分相似。用MATLAB來(lái)解算問(wèn)題要比 用C、FORTRAN等語(yǔ)言完成簡(jiǎn)捷得多。
[0103]S2、對(duì)上述通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼;
[0104]S3、發(fā)送上述目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器,以便目標(biāo)平臺(tái)編譯器對(duì)其進(jìn)行編譯,得到可運(yùn)行在目標(biāo)平臺(tái)上的應(yīng)用程序。
[0105]需要說(shuō)明的是,由于通用平臺(tái)算法源代碼只關(guān)注算法本身的算術(shù)表達(dá)(主要表達(dá)做哪些運(yùn)算),不涉及到平臺(tái)相關(guān)的內(nèi)容,所以通用平臺(tái)算法源代碼與平臺(tái)無(wú)關(guān),從而稱其為通用平臺(tái)算法源代碼。
[0106]舉例來(lái)講,對(duì)于c=a+b這個(gè)運(yùn)算,不同的平臺(tái)因其自身的芯片架構(gòu),可能會(huì)采用不同的算法源代碼來(lái)實(shí)現(xiàn)上述運(yùn)算。
[0107]例如,受自身芯片架構(gòu)限制,某平臺(tái)可采用下述算法源代碼來(lái)實(shí)現(xiàn)c=a+b:
[0108]#inc I ude<iostream>
#include<>
using namespace std;
int iTiain()
{int a,b,c;
cout?”Enter two numbers: "?endl;
cin?a?b;
c=a+b;
cout?"The sum of two numbers is: "<<c?endl;
}
[0109]無(wú)論用什么算法源代碼,其本質(zhì)依然對(duì)應(yīng)c=a+b這個(gè)運(yùn)算,或者說(shuō)實(shí)現(xiàn)c=a+b這個(gè)運(yùn)算。通用平臺(tái)算法源代碼則好比上述的c=a+`b,其與平臺(tái)的芯片架構(gòu)無(wú)關(guān)。
[0110]再舉一例,可將原平臺(tái)算法源代碼視為用中文撰寫(xiě)的專利申請(qǐng),與其相對(duì)應(yīng)的通用平臺(tái)算法源代碼可視為對(duì)應(yīng)的英文版本(英語(yǔ)是很多國(guó)家的官方語(yǔ)言,這里僅為說(shuō)明方案做此比喻),如想在法國(guó)、意大利等國(guó)家申請(qǐng)專利,可將上述專利申請(qǐng)的英文版本翻譯成法語(yǔ)版本、意大利語(yǔ)版本(相當(dāng)于移植于目標(biāo)平臺(tái)上的算法源代碼)。
[0111]可見(jiàn),在本實(shí)施例中,將采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼作為中間代碼,通過(guò)對(duì)其通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,可得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼,而對(duì)通用運(yùn)算符及通用數(shù)據(jù)類型的轉(zhuǎn)換,是對(duì)基本運(yùn)算的轉(zhuǎn)換,因此,本發(fā)明實(shí)`施例可實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換,解決了現(xiàn)有技術(shù)無(wú)法實(shí)現(xiàn)跨平臺(tái)源到源轉(zhuǎn)換的問(wèn)題。將得到的目標(biāo)平臺(tái)算法源代碼發(fā)送至目標(biāo)平臺(tái)編譯器后,目標(biāo)平臺(tái)編譯器可對(duì)其進(jìn)行編譯,最終得到可運(yùn)行于目標(biāo)平臺(tái)之上的應(yīng)用程序,進(jìn)而實(shí)現(xiàn)了原平臺(tái)中的應(yīng)用程序移植至目標(biāo)平臺(tái)。
[0112]與此同時(shí),由于通用平臺(tái)算法源代碼與平臺(tái)芯片架構(gòu)無(wú)關(guān),因此,利用其作為中間代碼,生成符合各目標(biāo)平臺(tái)要求的算法源代碼。與實(shí)現(xiàn)跨平臺(tái)移植的現(xiàn)有技術(shù)相比,在通用性方面以及效率方面有較大的優(yōu)勢(shì),體現(xiàn)在:
[0113]以本發(fā)明實(shí)施例所提供的技術(shù)方案需人工將應(yīng)用程序?qū)?yīng)的原平臺(tái)算法源代碼轉(zhuǎn)換成通用平臺(tái)算法源代碼為例,其與手工修改相比,研發(fā)人員不需要熟悉各目標(biāo)平臺(tái)的平臺(tái)指令和芯片架構(gòu),對(duì)研發(fā)人員的技術(shù)依賴性相對(duì)較低。尤其在目標(biāo)平臺(tái)有多個(gè)時(shí),本實(shí)施例所提供的技術(shù)方案,只需要轉(zhuǎn)換一次(將原平臺(tái)算法源代碼轉(zhuǎn)換成通用平臺(tái)算法源代碼),而現(xiàn)有技術(shù)則需要針對(duì)每一目標(biāo)平臺(tái)進(jìn)行手工修改。而如以自動(dòng)轉(zhuǎn)換或直接編寫(xiě)成通用平臺(tái)算法源代碼為例,則相對(duì)于手工修改,效率更高。
[0114]并且,該方案不需要修改目標(biāo)平臺(tái)的編譯器,其通用性與需要修改目標(biāo)平臺(tái)編譯器的現(xiàn)有技術(shù)相比,其升級(jí)效率要高很多。
[0115]在本發(fā)明其他實(shí)施例中,請(qǐng)參見(jiàn)圖5,上述步驟S2可具體包括:
[0116]S201、解析上述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù)(語(yǔ)法樹(shù)A );
[0117]S202、對(duì)語(yǔ)法樹(shù)A中的通用運(yùn)算節(jié)點(diǎn)進(jìn)行替換處理和優(yōu)化處理,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù)C。
[0118]S203、反解析上述語(yǔ)法樹(shù)C,生成上述目標(biāo)平臺(tái)算法源代碼。
[0119]也可做如下理解:假定對(duì)于某應(yīng)用程序而言,已經(jīng)存在目標(biāo)平臺(tái)算法源代碼Y,并假定解析目標(biāo)平臺(tái)算法源代碼后所得到的語(yǔ)法樹(shù)為語(yǔ)法樹(shù)C (通過(guò)語(yǔ)法樹(shù)C,可逆向還原出符合目標(biāo)平臺(tái)要求的算法源代碼Y)。同時(shí)假定該應(yīng)用程序?qū)?yīng)的通用平臺(tái)算法源代碼X,經(jīng)過(guò)解析后得到的語(yǔ)法樹(shù)為語(yǔ)法樹(shù)A。則本發(fā)明實(shí)施例的關(guān)鍵點(diǎn)之一在于,將語(yǔ)法樹(shù)A轉(zhuǎn)換成語(yǔ)法樹(shù)C。
[0120]更具體的,上述語(yǔ)法樹(shù)A的通用運(yùn)算節(jié)點(diǎn)可包含通用運(yùn)算符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn)。其中,通用運(yùn)算符節(jié)點(diǎn)的內(nèi)容包括通用運(yùn)算符,而操作數(shù)節(jié)點(diǎn)的內(nèi)容則包括操作數(shù)對(duì)應(yīng)的通用數(shù)據(jù)類型。
[0121]在本發(fā)明其他實(shí)施例中,上述所有實(shí)施例中的源到源編譯器可包括詞法分析器、語(yǔ)法分析器和語(yǔ)義分析器。請(qǐng)參見(jiàn)圖6和圖7,以通用平臺(tái)算法源代碼position=initial+rate*60為例,步驟S201可包括如下子步驟:
[0122]S2011、對(duì)通用平臺(tái)算法源代碼進(jìn)行詞法分析,得到記號(hào)流。
[0123]該步驟可由詞法分析器執(zhí)行。詞法分析器根據(jù)詞法規(guī)則識(shí)別出通用平臺(tái)算法源代碼中的各個(gè)記號(hào)(token),每個(gè)記號(hào)代表一類單詞(lexeme)。詞法分析器的輸入是通用平臺(tái)算法源代碼,輸出是識(shí)別的記號(hào)流。詞法分析器的任務(wù)是把通用平臺(tái)算法源代碼中的字符流轉(zhuǎn)換成記號(hào)流。
[0124]S2012、對(duì)記號(hào)流進(jìn)行語(yǔ)法分析,構(gòu)成第一語(yǔ)法樹(shù)。
[0125]該步驟可由語(yǔ)法分析器執(zhí)行。語(yǔ)法分析器根據(jù)語(yǔ)法規(guī)則識(shí)別出記號(hào)流中的結(jié)構(gòu)(短語(yǔ)、句子),并構(gòu)造一棵能夠正確反映該結(jié)構(gòu)的語(yǔ)法樹(shù)。語(yǔ)法樹(shù)包括多個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)的類型可為通用運(yùn)算符節(jié)點(diǎn)(=、+、*即是)、操作數(shù)節(jié)點(diǎn)(60即是)。
[0126]S2013、對(duì)第一語(yǔ)法樹(shù)進(jìn)行語(yǔ)義分析,得到經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)(AST)。
[0127]該步驟可由語(yǔ)義分析器執(zhí)行。語(yǔ)義分析器根據(jù)語(yǔ)義規(guī)則對(duì)AST中的語(yǔ)法單元進(jìn)行靜態(tài)語(yǔ)義檢查,其目的在于保證語(yǔ)法正確的結(jié)構(gòu)在語(yǔ)義上也是合法的。在本實(shí)施例中,上述步驟S201中的抽象語(yǔ)法樹(shù)A具體為經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)。
[0128]詞法分析、語(yǔ)法分析和詞義分析是現(xiàn)有技術(shù),在本發(fā)明中不多作贅述。
[0129]需要說(shuō)明的是,在圖7中,“inttofloat”節(jié)點(diǎn)是通用運(yùn)算符節(jié)點(diǎn),表示int數(shù)據(jù)類型到float類型的轉(zhuǎn)換操作,60則是操作數(shù)節(jié)點(diǎn)。之所以要將60的數(shù)據(jù)類型由“int”轉(zhuǎn)換為“float”,是因?yàn)槠渌僮鲾?shù)節(jié)點(diǎn)的數(shù)據(jù)類型是float,如其他操作數(shù)節(jié)點(diǎn)的數(shù)據(jù)類型也為“int”,則不需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,語(yǔ)法樹(shù)中也就不需要包括“inttofloat”這個(gè)通用運(yùn)算符節(jié)點(diǎn)了。
[0130]在本發(fā)明其他實(shí)施例中,上述所有實(shí)施例中的步驟S202中的替換處理可具體包括:
[0131]令抽象語(yǔ)法樹(shù)A中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配,當(dāng)滿足預(yù)設(shè)匹配條件時(shí),匹配成功;
[0132]利用匹配成功的通用運(yùn)算庫(kù)模板中的內(nèi)容,替換與之相匹配的通用運(yùn)算節(jié)點(diǎn)的內(nèi)容,得到第二語(yǔ)法樹(shù)。
[0133]更具體的,可遍歷或按某種順序(例如深度優(yōu)先),令抽象語(yǔ)法樹(shù)A中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配。具體的遍歷方式以及深度優(yōu)先順序可沿用現(xiàn)有的方式,在此不作贅述。
[0134]下面將介紹通用運(yùn)算庫(kù)模板。
[0135]通用運(yùn)算庫(kù)模板可由用戶配置,并可存于平臺(tái)數(shù)據(jù)庫(kù)中。上述通用運(yùn)算庫(kù)模板至少可包括通用運(yùn)算模板(比如矩陣相乘模板)和通用數(shù)據(jù)類型模板。其中:
[0136]每一通用運(yùn)算模板的內(nèi)容包含了,與某一通用運(yùn)算相對(duì)應(yīng)、并且符合目標(biāo)平臺(tái)運(yùn)算定義的運(yùn)算代碼,或者說(shuō),包含了適用于目標(biāo)平臺(tái)并可實(shí)現(xiàn)該通用運(yùn)算的運(yùn)算代碼。為了提高移植的廣泛性,一個(gè)通用運(yùn)算模板中可記載對(duì)應(yīng)同一通用運(yùn)算的多種運(yùn)算代碼,每一種運(yùn)算代碼對(duì)應(yīng)一個(gè)目標(biāo)平臺(tái)。
[0137]而每一通用數(shù)據(jù)類型模板的內(nèi)容,則包含了與某一通用數(shù)據(jù)類型相對(duì)應(yīng)、并且符合目標(biāo)平臺(tái)數(shù)據(jù)類型要求的數(shù)據(jù)類型的定義或解釋。比如定義了數(shù)據(jù)類型的長(zhǎng)度(總比特位數(shù)),小數(shù)占用的比特位等等。或者說(shuō),其包含了適用于目標(biāo)平臺(tái)、并與通用數(shù)據(jù)類型相對(duì)應(yīng)的數(shù)據(jù)類型的定義或解釋。
[0138]前已述及,運(yùn)算=運(yùn)算符+操作數(shù),因此,通用運(yùn)算模板里用到的操作數(shù)的數(shù)據(jù)類型必須是在通用數(shù)據(jù)類型模板里已定義的。在通用運(yùn)算模板中引用了數(shù)據(jù)類型模板中數(shù)據(jù)類型的標(biāo)識(shí)(數(shù)據(jù)類型名稱),通用數(shù)據(jù)類型模板中則有該數(shù)據(jù)類型詳細(xì)的定義或解釋。
[0139]需要說(shuō)明的是,上述AST中節(jié)點(diǎn)的顆粒度是與通用運(yùn)算模板相關(guān)的。舉例來(lái)講,C=a*a+b*b,如果通用運(yùn)算模板中有一通用運(yùn)算與a*a+b*b相對(duì)應(yīng),則可將C=a*a+b*b解析為三個(gè)節(jié)點(diǎn):“C”節(jié)點(diǎn),“=”節(jié)點(diǎn)和(a*a+b*b)節(jié)點(diǎn)。對(duì)于“=”這一通用運(yùn)算符節(jié)點(diǎn)而言,“C”節(jié)點(diǎn)為其左節(jié)點(diǎn),(a*a+b*b)節(jié)點(diǎn)為其右節(jié)點(diǎn)。而如果通用運(yùn)算模板中沒(méi)有與C=a*a+b*b相對(duì)應(yīng)的通用運(yùn)算,則C=a*a+b*b可能會(huì)被解析為五個(gè)節(jié)點(diǎn):“C”節(jié)點(diǎn)”節(jié)點(diǎn)、(a*a)節(jié)點(diǎn)、“ + ”節(jié)點(diǎn),以及,(b*b)節(jié)點(diǎn)。其中,(a*a)節(jié)點(diǎn)和(b*b)節(jié)點(diǎn)是操作數(shù)節(jié)點(diǎn)。并且,(a*a)這個(gè)操作數(shù)節(jié)點(diǎn)又包括a、*、a三個(gè)子節(jié)點(diǎn),同理,(b*b)這個(gè)操作數(shù)節(jié)點(diǎn)又包括b、*、b三個(gè)子節(jié)點(diǎn)。
[0140]在本發(fā)明其他實(shí)施例中,在令通用運(yùn)算符節(jié)點(diǎn)與通用運(yùn)算模板進(jìn)行匹配時(shí),上述預(yù)設(shè)匹配條件可包括:通用運(yùn)算符節(jié)點(diǎn)的運(yùn)算定義符合通用運(yùn)算模板的運(yùn)算定義(或者稱,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符與通用運(yùn)算模板可實(shí)現(xiàn)的通用運(yùn)算相一致),并且它的左右節(jié)點(diǎn)之間符合依賴關(guān)系,也即,左右節(jié)點(diǎn)的類型匹配。
[0141]以圖7中“ + ”這一通用運(yùn)算符節(jié)點(diǎn)為例,在判斷其與某通用運(yùn)算模板是否匹配過(guò)程中,在對(duì)依賴關(guān)系進(jìn)行判斷時(shí),需要判斷“ + ”的運(yùn)算定義是否符合該通用運(yùn)算模板的運(yùn)算定義,還需要判斷“ + ”的左節(jié)點(diǎn)<id,2>和右節(jié)點(diǎn)(<id,3>*inttofloat60)的數(shù)據(jù)類型是否與該通用運(yùn)算模板中操作數(shù)的數(shù)據(jù)類型相匹配,以及“ + ”所涉及的操作數(shù)個(gè)數(shù)是否與該通用運(yùn)算模板中的操作數(shù)個(gè)數(shù)相匹配。
[0142]當(dāng)令操作數(shù)節(jié)點(diǎn)與通用數(shù)據(jù)類型模板進(jìn)行匹配時(shí),上述預(yù)設(shè)匹配條件可包括:操作數(shù)節(jié)點(diǎn)包含的通用數(shù)據(jù)類型,與通用數(shù)據(jù)類型模板對(duì)應(yīng)的通用數(shù)據(jù)類型相一致,并且,操作數(shù)節(jié)點(diǎn)的左右節(jié)點(diǎn)之間符合依賴關(guān)系。依賴關(guān)系可參見(jiàn)前述記載。
[0143]更具體的,在使用通用運(yùn)算庫(kù)模板中的內(nèi)容替換通用運(yùn)算節(jié)點(diǎn)的內(nèi)容時(shí),如通用運(yùn)算節(jié)點(diǎn)為操作數(shù)節(jié)點(diǎn),直接用匹配成功的通用數(shù)據(jù)類型模板中適用于目標(biāo)平臺(tái)的數(shù)據(jù)類型,替換通用運(yùn)算節(jié)點(diǎn)中的通用數(shù)據(jù)類型即可(如數(shù)據(jù)類型相同,還可不替換,直接保留)。
[0144]而如通用運(yùn)算節(jié)點(diǎn)為通用運(yùn)算符節(jié)點(diǎn),則需要將通用運(yùn)算符節(jié)點(diǎn)對(duì)應(yīng)的節(jié)點(diǎn)信息作為參數(shù)輸入匹配成功的通用運(yùn)算模板,使用匹配成功的通用運(yùn)算模板的返回值(一般是字符或字符串)替換通用運(yùn)算節(jié)點(diǎn)的內(nèi)容。
[0145]上述節(jié)點(diǎn)信息可至少包括通用運(yùn)算所涉及的操作數(shù)。通用運(yùn)算模板可視為函數(shù),將參數(shù)輸入函數(shù),得到包含參數(shù)的函數(shù)作為返回值。
[0146]舉例來(lái)講,對(duì)于c=a+b,其對(duì)應(yīng)的語(yǔ)法樹(shù)A如圖8所示。假定“ + ”在目標(biāo)平臺(tái)中對(duì)應(yīng)的操作符為“add”,則將“ + ”所涉及的操作數(shù)a、b作為參數(shù)輸入相匹配的通用運(yùn)算模板(該模板中包括“add”),則返回值為add (a,b),利用add (a,b)替換“ + ”后,得到的語(yǔ)法樹(shù)如圖9所示。
[0147]此外,還需要說(shuō)明的是,在利用通用運(yùn)算模板的返回值對(duì)通用運(yùn)算符節(jié)點(diǎn)的內(nèi)容進(jìn)行替換后,可能會(huì)出現(xiàn)節(jié)點(diǎn)增加的情況。例如,對(duì)于通用運(yùn)算c=2+2,“2+2”在目標(biāo)平臺(tái)上可能需要用“ 1+1+1+1 ”來(lái)實(shí)現(xiàn)。因此,c=2+2對(duì)應(yīng)的語(yǔ)法樹(shù)A如圖10所不,而利用通用運(yùn)算模板的返回值替換后的語(yǔ)法樹(shù)可能如圖11所示。
[0148]需要說(shuō)明的是,由于利用通用運(yùn)算模板的返回值(包含操作符)替換了通用運(yùn)算符,因此,第二語(yǔ)法樹(shù)中的節(jié)點(diǎn)包括操作符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn)。其中,操作符節(jié)點(diǎn)的內(nèi)容包括操作符,而操作數(shù)節(jié)點(diǎn)的內(nèi)容則包括操作數(shù)對(duì)應(yīng)的適應(yīng)于目標(biāo)平臺(tái)的數(shù)據(jù)類型。
[0149]需要說(shuō)明的是,在匹配過(guò)程中,可能會(huì)分層展開(kāi)一個(gè)通用運(yùn)算。例如,
[0150]對(duì)于矩陣相乘這一通用運(yùn)算,假定矩陣
【權(quán)利要求】
1.一種應(yīng)用程序跨平臺(tái)移植方法,其特征在于,包括: 接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)所述應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼; 對(duì)所述通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼; 發(fā)送所述目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器,以便所述目標(biāo)平臺(tái)編譯器對(duì)所述目標(biāo)平臺(tái)算法源代碼進(jìn)行編譯,得到可運(yùn)行在目標(biāo)平臺(tái)上的應(yīng)用程序。
2.如權(quán)利要求1所述的方法,其特征在于,所述對(duì)通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼,具體包括: 解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù);其中,所述抽象語(yǔ)法樹(shù)包括通用運(yùn)算節(jié)點(diǎn); 對(duì)所述抽象語(yǔ)法樹(shù)中的通用運(yùn)算節(jié)點(diǎn)進(jìn)行替換處理和優(yōu)化處理,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù); 反解析所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù),得到所述目標(biāo)平臺(tái)算法源代碼。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù)包括: 對(duì)所述通用平臺(tái)算法源代碼進(jìn)行詞法分析,得到記號(hào)流;` 對(duì)所述記號(hào)流進(jìn)行語(yǔ)法分析,構(gòu)成第一語(yǔ)法樹(shù); 對(duì)所述第一語(yǔ)法樹(shù)進(jìn)行語(yǔ)義分析,得到經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)。
4.如權(quán)利要求2或3所述的方法,其特征在于, 所述替換處理包括: 令所述抽象語(yǔ)法樹(shù)中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配,當(dāng)滿足預(yù)設(shè)匹配條件時(shí),匹配成功; 利用匹配成功的通用運(yùn)算庫(kù)模板中的內(nèi)容,替換與之相匹配的通用運(yùn)算節(jié)點(diǎn)的內(nèi)容,得到第二語(yǔ)法樹(shù); 所述優(yōu)化處理包括:對(duì)所述第二語(yǔ)法樹(shù)進(jìn)行合并相同循環(huán)的節(jié)點(diǎn)、消除冗余節(jié)點(diǎn)和向量化中的至少一種,得到所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù)。
5.根據(jù)權(quán)利要求2-4任一項(xiàng)所述的方法,其特征在于, 所述通用運(yùn)算節(jié)點(diǎn)包括通用運(yùn)算符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn); 所述通用運(yùn)算庫(kù)模板包括通用運(yùn)算模板和通用數(shù)據(jù)類型模板; 所述通用運(yùn)算模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的運(yùn)算代碼;所述通用數(shù)據(jù)類型模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)、并與通用數(shù)據(jù)類型相對(duì)應(yīng)的數(shù)據(jù)類型的定義或解釋。
6.如權(quán)利要求5所述的方法,其特征在于, 當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與通用運(yùn)算模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與通用運(yùn)算模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系;當(dāng)令操作數(shù)節(jié)點(diǎn)與通用數(shù)據(jù)類型模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,操作數(shù)節(jié)點(diǎn)包含的通用數(shù)據(jù)類型,與通用數(shù)據(jù)類型模板對(duì)應(yīng)的通用數(shù)據(jù)類型相一致,并且,操作數(shù)節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系; 所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
7.如權(quán)利要求5所述的方法,其特征在于,所述通用運(yùn)算庫(kù)模板還包括專有指令模板,所述專有指令模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的指令; 當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與專有指令模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與專有指令模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系; 所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
8.如權(quán)利要求1-7任一項(xiàng)所述的方法,其特征在于,所述接收到的算法源代碼具體為通用DSP算法C源代碼。
9.一種源到源編譯器,其特征在于,包括: 接收單元,用于接收與平臺(tái)芯片架構(gòu)無(wú)關(guān)、針對(duì)所述應(yīng)用程序編寫(xiě)的、采用通用運(yùn)算符和通用數(shù)據(jù)類型的通用平臺(tái)算法源代碼; 轉(zhuǎn)換單元,用于對(duì)所述通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼; 發(fā)送單元,用于發(fā)送所述目標(biāo)平臺(tái)算法源代碼至目標(biāo)平臺(tái)編譯器,以便所述目標(biāo)平臺(tái)編譯器對(duì)所述目標(biāo)平臺(tái)算法源代碼進(jìn)行編譯,得到可運(yùn)行在目標(biāo)平臺(tái)上的應(yīng)用程序。
10.如權(quán)利要求9所述的源到源編譯器,其特征在于,在對(duì)通用平臺(tái)算法源代碼中的通用運(yùn)算符及通用數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的目標(biāo)平臺(tái)算法源代碼方面,所述轉(zhuǎn)換單元具體用于: 解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù);其中,所述抽象語(yǔ)法樹(shù)包括通用運(yùn)算節(jié)點(diǎn); 對(duì)所述抽象語(yǔ)法樹(shù)中的通用運(yùn)算節(jié)點(diǎn)進(jìn)行替換處理和優(yōu)化處理,得到符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù); 反解析所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù),得到所述目標(biāo)平臺(tái)算法源代碼。
11.根據(jù)權(quán)利要求10所述的源到源編譯器,其特征在于,在解析所述通用平臺(tái)算法源代碼,得到抽象語(yǔ)法樹(shù)方面,所述轉(zhuǎn)換單元具體用于: 對(duì)所述通用平臺(tái)算法源代碼進(jìn)行詞法分析,得到記號(hào)流; 對(duì)所述記號(hào)流進(jìn)行語(yǔ)法分析,構(gòu)成第一語(yǔ)法樹(shù); 對(duì)所述第一語(yǔ)法樹(shù)進(jìn)行語(yǔ)義分析, 得到經(jīng)語(yǔ)義分析處理后的抽象語(yǔ)法樹(shù)。
12.如權(quán)利要求10或11所述的源到源編譯器,其特征在于,在替換處理方面,所述轉(zhuǎn)換單元具體用于: 令所述抽象語(yǔ)法樹(shù)中的每一通用運(yùn)算節(jié)點(diǎn)和通用運(yùn)算庫(kù)模板進(jìn)行匹配,當(dāng)滿足預(yù)設(shè)匹配條件時(shí),匹配成功; 利用匹配成功的通用運(yùn)算庫(kù)模板中的內(nèi)容,替換與之相匹配的通用運(yùn)算節(jié)點(diǎn)的內(nèi)容,得到第二語(yǔ)法樹(shù);在優(yōu)化處理方面,所述轉(zhuǎn)換單元具體用于:對(duì)所述第二語(yǔ)法樹(shù)進(jìn)行合并相同循環(huán)的節(jié)點(diǎn)、消除冗余節(jié)點(diǎn)和向量化中的至少一種,得到所述符合目標(biāo)平臺(tái)運(yùn)算要求及數(shù)據(jù)類型要求的語(yǔ)法樹(shù)。
13.根據(jù)權(quán)利要求10-12任一項(xiàng)所述的源到源編譯器,其特征在于, 所述通用運(yùn)算節(jié)點(diǎn)包括通用運(yùn)算符節(jié)點(diǎn)和操作數(shù)節(jié)點(diǎn); 所述通用運(yùn)算庫(kù)模板包括通用運(yùn)算模板和通用數(shù)據(jù)類型模板; 所述通用運(yùn)算模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算的運(yùn)算代碼;所述通用數(shù)據(jù)類型模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)、并與通用數(shù)據(jù)類型相對(duì)應(yīng)的數(shù)據(jù)類型的定義或解釋。
14.如權(quán)利要求13所述的源到源編譯器,其特征在于, 當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與通用運(yùn)算模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與通用運(yùn)算模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系; 當(dāng)令操作數(shù)節(jié)點(diǎn)與通用數(shù)據(jù)類型模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,操作數(shù)節(jié)點(diǎn)包含的通用數(shù)據(jù)類型,與通用數(shù)據(jù)類型模板對(duì)應(yīng)的通用數(shù)據(jù)類型相一致,并且,操作數(shù)節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系; 所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
15.如權(quán)利要求13所述的源到源編譯器,其特征在于, 所述通用運(yùn)算庫(kù)模板還包括專有指令模板,所述專有指令模板的內(nèi)容包含,適用于所述目標(biāo)平臺(tái)并可實(shí)現(xiàn)通用運(yùn)算`的指令; 當(dāng)令通用運(yùn)算符節(jié)點(diǎn)與專有指令模板進(jìn)行匹配時(shí),所述預(yù)設(shè)匹配條件包括,通用運(yùn)算符節(jié)點(diǎn)包含的通用運(yùn)算符,與專有指令模板所實(shí)現(xiàn)的通用運(yùn)算相一致,并且,通用運(yùn)算符節(jié)點(diǎn)的關(guān)聯(lián)節(jié)點(diǎn)之間符合依賴關(guān)系; 所述關(guān)聯(lián)節(jié)點(diǎn)包括左節(jié)點(diǎn)和右節(jié)點(diǎn)中的至少一種。
【文檔編號(hào)】G06F9/45GK103631632SQ201310632199
【公開(kāi)日】2014年3月12日 申請(qǐng)日期:2013年11月29日 優(yōu)先權(quán)日:2013年11月29日
【發(fā)明者】曾建江, 卓玉樟, 胡海亮 申請(qǐng)人:華為技術(shù)有限公司