專利名稱:自動(dòng)擴(kuò)展tcl語(yǔ)言的預(yù)處理方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種腳本編程語(yǔ)言,尤其涉及自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法和裝置。
背景技術(shù):
TCL(Tool Command Language,工具命令語(yǔ)言)語(yǔ)言是一種腳本語(yǔ)言,由于其語(yǔ)法簡(jiǎn)單、功能強(qiáng)大、跨平臺(tái)支持等優(yōu)點(diǎn),其被廣泛用于快速原型開發(fā)、腳本編程、 ⑶I (Graphical User Interface,圖形用戶界面)和測(cè)試等方面。TCL語(yǔ)言只支持一種數(shù)據(jù)結(jié)構(gòu)字符串(string)。它將所有的命令,命令的所有的參數(shù),命令的結(jié)果,所有的變量數(shù)據(jù)類型都可以看作字符串。
TCL的特性包括任何東西都是一條命令,包括語(yǔ)法結(jié)構(gòu)(for,if等);任何事物都可以重新定義和重載;所有的數(shù)據(jù)類型都可以看作字符串,且語(yǔ)法規(guī)則相當(dāng)簡(jiǎn)單;不僅提供事件驅(qū)動(dòng)給套接字(Socket)和文件(File),而且支持基于時(shí)間或者用戶定義的事件; 以及動(dòng)態(tài)的域定義,提供C、C++,或者Java擴(kuò)展接口,解釋語(yǔ)言,代碼能夠動(dòng)態(tài)的改變,完全的Unicode支持,且與運(yùn)行平臺(tái)無(wú)關(guān),在Win32,UNIX,Mac上都可以運(yùn)行,并支持和⑶I緊密集成。
然而,任何一種腳本語(yǔ)言,由于提供的內(nèi)建功能非常有限,于是提供C、C++等編程語(yǔ)言的擴(kuò)展接口是非常重要的特性,TCL也不例外,提供了 C、C++、JAVA的擴(kuò)展接口。但由于其TCL自身結(jié)構(gòu)需要,編程人員并不能實(shí)現(xiàn)TCL與C、C++、JAVA等語(yǔ)言的無(wú)縫對(duì)接,擴(kuò)展模塊代碼必須符合TCL定義的結(jié)構(gòu)要求,于是為了正確的擴(kuò)展TCL,編程人員必須學(xué)習(xí)TCL 擴(kuò)展機(jī)制、TCL低層應(yīng)用程序編程接口(API,Application ProgrammingInterface)等,然后修改或增加相應(yīng)的編程代碼,以便實(shí)現(xiàn)和TCL的集成,這一繁鎖的過程,嚴(yán)重影響TCL語(yǔ)言的使用成本及便捷性。
如圖I所示,是目前使用的TCL擴(kuò)展方法的流程圖,其通過編寫功能實(shí)現(xiàn)代碼,調(diào)試功能實(shí)現(xiàn)代碼,TCL適配層開發(fā),代碼模塊與TCL集成,以及生成支持?jǐn)U展功能的TCL來(lái)完成TCL的擴(kuò)展,然這種擴(kuò)展方法不僅要完成編寫功能實(shí)現(xiàn)的代碼,而且要完成TCL適配層的開發(fā),因此導(dǎo)致TCL的擴(kuò)展難度增加,且擴(kuò)展成本較高。發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法和裝置,其能夠?qū)崿F(xiàn) TCL語(yǔ)言與C、C++、JAVA等語(yǔ)言的無(wú)縫對(duì)接,編程人員只需開發(fā)功能實(shí)現(xiàn)代碼,無(wú)需關(guān)注TCL 適配代碼及TCL的生成過程,以降低TCL的擴(kuò)展難度及成本。
為實(shí)現(xiàn)上述目的,本發(fā)明提出如下技術(shù)方案一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法,包括如下步驟
掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及對(duì)外提供的可讀寫變量的名稱及類型;3
掃描TCL功能實(shí)現(xiàn)代碼中對(duì)外提供的API接口;
對(duì)掃描過的API接口進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口及TCL語(yǔ)言的適配層代碼;
對(duì)掃描得到的TCL中的全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口 ;以及
對(duì)所述適配層代碼和功能實(shí)現(xiàn)代碼進(jìn)行集成編譯,生成對(duì)應(yīng)的TCL模塊,并完成對(duì)TCL語(yǔ)言的擴(kuò)展。
更進(jìn)一步地,所述TCL功能實(shí)現(xiàn)代碼是TCL語(yǔ)言提供功能的具體執(zhí)行代碼。
所述SI中掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)包括讀取所有的實(shí)現(xiàn)功能代碼的源文件,提取其中的全局變量及常量類型定義及名稱,掃描所有的頭文件,文件中的函數(shù)參數(shù)類型定義,提取所有的函數(shù)所涉參數(shù)的類型定義,把得到的所有數(shù)據(jù)分類型處理。
所述步驟S4中對(duì)TCL中的全局變量進(jìn)行自動(dòng)處理的過程包括
把步驟SI中得到的需要處理的變量,用相同的定義復(fù)制一份到生成的.h文件中;
生成變量讀寫的TCL指令函數(shù)體定義到.h文件中;
生成變量讀寫的TCL指令函數(shù)實(shí)現(xiàn)代碼到.c文件中。
所述步驟S5包括
編譯原有的功能實(shí)現(xiàn)代碼,提供動(dòng)態(tài)鏈接庫(kù);
為預(yù)處理自動(dòng)產(chǎn)生的代碼文件增加接口格式化代碼,以及
將預(yù)處理自動(dòng)產(chǎn)生的代碼與原功能實(shí)現(xiàn)代碼編出的動(dòng)態(tài)鏈接庫(kù)進(jìn)行編譯,生產(chǎn)新的供TCL使用的動(dòng)態(tài)鏈接庫(kù)。
本發(fā)明還提出一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理裝置,包括
數(shù)據(jù)類型映射模塊,用于掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及對(duì)外提供的可讀寫變量的名稱及類型;
編程語(yǔ)言功能的API掃描模塊,用于掃描TCL功能實(shí)現(xiàn)代碼中對(duì)外提供的API接 Π ;
編程語(yǔ)言TCL適配API產(chǎn)生模塊,用于對(duì)掃描過的API接口進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口及TCL語(yǔ)言的適配層代碼;
編程語(yǔ)言全局?jǐn)?shù)據(jù)讀寫驅(qū)動(dòng)模塊,用于對(duì)掃描得到的TCL中的全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口 ;以及
編程語(yǔ)言TCL擴(kuò)展生成模塊,用于對(duì)所述適配層代碼和功能實(shí)現(xiàn)代碼進(jìn)行集成編譯,生成對(duì)應(yīng)的TCL模塊,并完成對(duì)TCL語(yǔ)言的擴(kuò)展。
更進(jìn)一步地,所述編程語(yǔ)目包括C, C++和JAVA語(yǔ)目。
與現(xiàn)有技術(shù)相比,本發(fā)明提出的自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法和裝置,實(shí)現(xiàn)了 TCL語(yǔ)言與C、C++、JAVA等編程語(yǔ)言間的無(wú)縫對(duì)接,降低了 TCL語(yǔ)言的擴(kuò)展難度及擴(kuò)展成本。
圖I是現(xiàn)有的TCL擴(kuò)展的流程圖2是采用本發(fā)明進(jìn)行擴(kuò)展TCL語(yǔ)言的流程圖3是本發(fā)明自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法的流程圖4是本發(fā)明自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理裝置的模塊圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明的附圖,對(duì)本發(fā)明實(shí)施例的技術(shù)方案進(jìn)行清楚、完整的描述。
如圖2,圖3所示,本發(fā)明提出的自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法,是通過編寫功能實(shí)現(xiàn)代碼,調(diào)試過程實(shí)現(xiàn)代碼后,采用本發(fā)明的自動(dòng)擴(kuò)展預(yù)處理裝置來(lái)完成TCL語(yǔ)言的預(yù)處理,也是就說(shuō),編程人員只需完成功能模塊代碼的編寫,即可采用本發(fā)明提供的預(yù)處理方法和裝置完成對(duì)TCL語(yǔ)言的擴(kuò)展。
具體來(lái)說(shuō),TCL的預(yù)處理過程是通過在TCL語(yǔ)言預(yù)處理裝置中的數(shù)據(jù)類型映射模塊中通過數(shù)據(jù)類型映射,將不同種類的編程語(yǔ)言語(yǔ)如C、C++、JAVA等(以下以C語(yǔ)言為例進(jìn)行說(shuō)明),進(jìn)行不同的處理過程,具體包括如下步驟
SI,掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及變量,主要包括讀取功能模塊所有的實(shí)現(xiàn)功能代碼的源文件,提取其中的全局變量及常量類型定義及名稱,掃描所有的頭文件(.h),文件中的函數(shù)參數(shù)類型定義,提取所有的函數(shù)所涉參數(shù)的類型定義;把得到的所有數(shù)據(jù)類型分為下面幾類進(jìn)行相應(yīng)的處理
1)C語(yǔ)言或其他語(yǔ)言所定義基本類型,基本類型是指可以直接識(shí)別的定義的類型, 如整型(int)、字符(char)等,表示為類型名_@Β_@變量值;
2)用戶自定義復(fù)合類型,如結(jié)構(gòu)體(Struct);表示為_@P_@類型名變量?jī)?nèi)存指針值,并為每一個(gè)成員生成讀寫接口,生成的TCL指令格式為寫指令變量名set成員名讀指令變量名get成員名。
3)指針類型數(shù)據(jù),指針類型數(shù)據(jù)是指所有指針類型的定義;表示為_@P_內(nèi)存指針值。
4)通過Typedef用戶重定義的類型,取決于源類型,直接使用源類型的處理方式處理。
S2,掃描功能實(shí)現(xiàn)代碼中對(duì)外提供的API接口,其中所述功能實(shí)現(xiàn)代碼即TCL語(yǔ)言提供的功能的具體執(zhí)行代碼。通過掃描用戶指定的文件,首先進(jìn)行合法性檢查,該合法性檢查包括
函數(shù)的參數(shù)是否已經(jīng)在所述的步驟SI中定義,如果沒有定義,則提示用戶掃描失敗,如果步驟Si中已經(jīng)定義,則進(jìn)行下一步處理;
函數(shù)的返回值是否已經(jīng)在步驟SI中定義,如果步驟SI沒有定義,則提示用戶掃描失敗,如果已經(jīng)定義,則合法性檢查通過。根據(jù)步驟Si中所定義的表示方法與函數(shù)進(jìn)行綁定,并輸出臨時(shí)文件供下一步驟S3中使用。
S3,對(duì)掃描過的API接口進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口,并生成TCL語(yǔ)言的適配層代碼。本步驟主要針對(duì)步驟S2中取得的信息進(jìn)行智能化處理,生成一個(gè)標(biāo)準(zhǔn)的 C文件,對(duì)步驟S2中所得到的API逐個(gè)進(jìn)行下面的流程
S31,生成TCL所定義的標(biāo)準(zhǔn)C函數(shù)結(jié)構(gòu),舉例如下
5int前綴_原函數(shù)名(ClicntData clientData,Tcl」nterp *interp, int objc,Tel—Obj 氣ONS丁 objv[])
其中前綴可以用戶定義,默認(rèn)前綴為TCL_ADAPT。
S32,在所述C函數(shù)體內(nèi)定義原函數(shù)參數(shù)類型的局部變量,及返回值類型的局部變量。變量名自動(dòng)采用用戶可以定義生成規(guī)則,默認(rèn)采用自動(dòng)編號(hào)方式,即第一個(gè)參數(shù)為VI, 第二個(gè)為V2,依次編號(hào),返回值為RESULT。
S33,根據(jù)步驟S2中掃描所得確定objc及objv這兩個(gè)參數(shù)的具體大小。
S34,根據(jù)步驟SI對(duì)每個(gè)類型的表示方式進(jìn)行類型的轉(zhuǎn)換處理,其中主要包括生成輸入值的合法性檢查邏輯代碼,如int類型,得到objv相應(yīng)的值必須為JiintJgBJg變量值;完成objv中取出的字符型值進(jìn)行解析,得到實(shí)際值與類型;完成從objv取出的實(shí)際值與局部變量的賦值,如上述int型局部變量定義為int VI,則把Vl賦值為Vl =變量值;調(diào)用原函數(shù)局部變量作為函數(shù)參數(shù),局部變量RESULT作為函數(shù)的返回值,如果調(diào)用函數(shù)無(wú)返回值,則RESULT直接賦為O。
S35,處理返回值RESULT。根據(jù)步驟SI中的對(duì)數(shù)據(jù)類型的表示方法,組成相應(yīng)的字符類型,調(diào)用 TCL 標(biāo)準(zhǔn)接口 Tcl_SetResult(interp,RESULT, TCL_STATIC)。
S36,生成TCL標(biāo)準(zhǔn)的訪問指令。使用函數(shù)名作為函數(shù)功能的TCL訪問指令,自動(dòng)生成TCL標(biāo)準(zhǔn)接口函數(shù)
Tcl_CreateOb j Command (interp,"函數(shù)名",
步驟S31中生成的對(duì)應(yīng)標(biāo)準(zhǔn)TCL接口的函數(shù)名為
(ClientData)NULL, (Tcl_CmdDeIeteProc*)NULL);
具體的函數(shù)轉(zhuǎn)換舉例如下,其中原C代碼函數(shù)為int add (int a, int b),預(yù)處理后生成代碼
Int TCLADAPTadd (ClientData clientData,Tcl_ Tnterp * interp, int objc,TcLObj *CONSTobjv[]) {Int; V1,V2;Int RESULT;Int ret;ret=paser_check(objv[ 1],&VI ,int); //合法性檢查并賦值 If ( ret) {Printf(“The input args is invalid!\n’’); return -I;}INI作上述同樣處理,略。RESULT=add(Vl,V2);Tcl_SetResuJt(interp, RESULT, TCL STATIC); return 0;}Tcl_CreateObjCommand(interp," TCL—ADAPT add ",T CL_AD APT_add,(ClientData)NULL, (Tcl CmdDeleteProc *)NULL);
S4,對(duì)掃描得到的TCL中的全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口。本模塊對(duì)步驟SI掃描得到結(jié)果進(jìn)生智能化處理,生成編程語(yǔ)言頭文件,在C語(yǔ)言里面為.h文件, 及變量的讀寫指令代碼(.C)。對(duì)步驟SI掃描得到每一個(gè)變量作如下處理
S41,把步驟SI中得到的需要處理的變量,用相同的定義復(fù)制一份到生成的.h文件中,也可以直接include原來(lái)的.h文件。
S42,生成變量讀寫的TCL指令函數(shù)體定義到.h文件中指令格式如下var+變量名set和var+變量名get。
S43,生成變量讀寫的TCL指令函數(shù)實(shí)現(xiàn)代碼到.c文件中,函數(shù)的生成形式同S3。
S44,對(duì)于結(jié)構(gòu)體類型數(shù)據(jù)作特殊處理,其讀寫指令為var+變量名get成員名和 var+變量名set成員名。其他處理同S42及S43。
具體轉(zhuǎn)換舉例
原C代碼有全局變量char name [100];
預(yù)處理后生成代碼
. h文件中
權(quán)利要求
1.一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法,其特征在于包括如下步驟 SI,掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及對(duì)外提供的可讀寫變量的名稱和類型; S2,掃描TCL功能實(shí)現(xiàn)代碼中對(duì)外提供的API接口; S3,對(duì)掃描過的API接口進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口及TCL語(yǔ)言的適配層代碼; S4,對(duì)掃描得到的TCL中的全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口 ;以及S5,對(duì)所述適配層代碼和功能實(shí)現(xiàn)代碼進(jìn)行集成編譯,生成對(duì)應(yīng)的TCL模塊,并完成對(duì)TCL語(yǔ)言的擴(kuò)展。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于所述SI中TCL功能實(shí)現(xiàn)代碼是TCL語(yǔ)言提供功能的具體執(zhí)行代碼。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于所述SI中掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)包括讀取所有的實(shí)現(xiàn)功能代碼的源文件,提取其中的全局變量及常量類型定義及名稱,掃描所有的頭文件,文件中的函數(shù)參數(shù)類型定義,提取所有的函數(shù)所涉參數(shù)的類型定義,把得到的所有數(shù)據(jù)分類型處理。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于所述步驟S4中對(duì)TCL中的全局變量進(jìn)行自動(dòng)處理的過程包括 把步驟SI中得到的需要處理的變量,用相同的定義復(fù)制一份到生成的.h文件中; 生成變量讀寫的TCL指令函數(shù)體定義到.h文件中; 生成變量讀寫的TCL指令函數(shù)實(shí)現(xiàn)代碼到.c文件中。
5.根據(jù)權(quán)利要求I所述的方法,其特征在于所述步驟S5包括 編譯原有的功能實(shí)現(xiàn)代碼,提供動(dòng)態(tài)鏈接庫(kù); 為預(yù)處理自動(dòng)產(chǎn)生的代碼文件增加接口格式化代碼,以及 將預(yù)處理自動(dòng)產(chǎn)生的代碼與原功能實(shí)現(xiàn)代碼編出的動(dòng)態(tài)鏈接庫(kù)進(jìn)行編譯,生產(chǎn)新的供TCL使用的動(dòng)態(tài)鏈接庫(kù)。
6.一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理裝置,其特征在于包括 數(shù)據(jù)類型映射模塊,用于掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及對(duì)外提供的可讀寫變量的名稱及類型; 編程語(yǔ)言功能的API掃描模塊,用于掃描TCL功能實(shí)現(xiàn)代碼中對(duì)外提供的API接口;編程語(yǔ)言TCL適配API產(chǎn)生模塊,用于對(duì)掃描過的API接口進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口及TCL語(yǔ)言的適配層代碼; 編程語(yǔ)言全局?jǐn)?shù)據(jù)讀寫驅(qū)動(dòng)模塊,用于對(duì)掃描得到的TCL中的全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口 ;以及 編程語(yǔ)言TCL擴(kuò)展生成模塊,用于對(duì)所述適配層代碼和功能實(shí)現(xiàn)代碼進(jìn)行集成編譯,生成對(duì)應(yīng)的TCL模塊,并完成對(duì)TCL語(yǔ)言的擴(kuò)展。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于所述編程語(yǔ)言包括C,C++和JAVA語(yǔ)言。
全文摘要
本發(fā)明揭示了一種自動(dòng)擴(kuò)展TCL語(yǔ)言的預(yù)處理方法和裝置,其通過數(shù)據(jù)類型映射模塊掃描TCL功能實(shí)現(xiàn)代碼中的全局?jǐn)?shù)據(jù)結(jié)構(gòu)及可讀寫變量的名稱及類型,編程語(yǔ)言的API掃描模塊及適配API產(chǎn)生模塊掃描TCL功能實(shí)現(xiàn)代碼中對(duì)外提供的API接口并進(jìn)行處理,自動(dòng)生成相應(yīng)的TCL訪問接口及TCL語(yǔ)言的適配層代碼;編程語(yǔ)言的全局?jǐn)?shù)據(jù)讀寫驅(qū)動(dòng)模塊對(duì)所述全局變量進(jìn)行自動(dòng)處理,生成TCL的讀寫接口;以及編程語(yǔ)言的TCL擴(kuò)展生成模塊對(duì)所述適配層代碼和功能實(shí)現(xiàn)代碼進(jìn)行集成編譯,生成對(duì)應(yīng)的TCL模塊,從而完成對(duì)TCL語(yǔ)言的擴(kuò)展,實(shí)現(xiàn)TCL語(yǔ)言與C、C++、JAVA等編程語(yǔ)言的無(wú)縫對(duì)接,降低了TCL的擴(kuò)展難度及擴(kuò)展成本。
文檔編號(hào)G06F9/45GK102929682SQ20121051767
公開日2013年2月13日 申請(qǐng)日期2012年12月6日 優(yōu)先權(quán)日2012年12月6日
發(fā)明者楊曙軍 申請(qǐng)人:盛科網(wǎng)絡(luò)(蘇州)有限公司