国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于XML的代碼自動(dòng)生成工具

2015-12-20 01:09:20瓊,黃
電子科技 2015年2期
關(guān)鍵詞:代碼生成編譯器代碼

張 瓊,黃 翩

(西安電子科技大學(xué)電子信息攻防對(duì)抗與仿真重點(diǎn)實(shí)驗(yàn)室,陜西西安 710071)

1 技術(shù)背景和優(yōu)勢(shì)

1.1 代碼生成器的技術(shù)發(fā)展

自動(dòng)代碼生成技術(shù)[1]作為一種出現(xiàn)在上世紀(jì)的軟件開(kāi)發(fā)技術(shù),首先出現(xiàn)在編譯器的開(kāi)發(fā)和設(shè)計(jì)之中,并在此領(lǐng)域獲得了廣泛應(yīng)用。在編譯器模型中,編譯器前段將輸入的源程序翻譯成一種中間表示,后端以源程序的中間表示為輸入,并產(chǎn)生等價(jià)的目標(biāo)程序作為輸出。在此編譯器的后端就是編譯器的代碼生成部分。

在這里,自動(dòng)代碼生成并不是指作為編譯器后端的代碼生成,而是指通過(guò)生成器,讀取相關(guān)的代碼或文檔中的定義,生成如 C、C++ 、Java、Perl、Ruby、Python及HTML等高級(jí)語(yǔ)言代碼。

自動(dòng)代碼生成技術(shù)從上世紀(jì)起步發(fā)展以來(lái),取得了長(zhǎng)足進(jìn)步。但隨著計(jì)算機(jī)科學(xué)與技術(shù)的不斷發(fā)展,自動(dòng)代碼生成技術(shù)也越來(lái)越成熟并被廣泛應(yīng)用[2]。

1.2 采用代碼生成器的好處

對(duì)于軟件工程師而言,代碼生成技術(shù)有如下優(yōu)點(diǎn)[3]:

(1)保證代碼的質(zhì)量。一個(gè)項(xiàng)目周期中大量的手寫代碼通常會(huì)由于軟件工程師在編碼時(shí)不斷采用新的或更好的方法而良莠不齊。代碼生成技術(shù)從編碼的初始階段創(chuàng)建通用模板,而通過(guò)修改模板和再次運(yùn)行代碼生成器來(lái)對(duì)所有已生成的基本代碼修正缺陷或優(yōu)化。

(2)保證代碼的一致性。由代碼生成器生成的代碼在API和變量名上的寫法完全一致,這就為使用者提供了易懂易用的接口,更利于分層思想的實(shí)現(xiàn)。

(3)產(chǎn)生代碼的高效性。一旦模板等設(shè)計(jì)好后,只需簡(jiǎn)單的運(yùn)行代碼生成器便可高效地生成用戶需求的代碼。

(4)利于維護(hù)。接口和變量的一致性有利于后續(xù)的維護(hù)工作。

2 代碼生成工具的框架

一般而言代碼生成器有著必不可少的3要素:(1)模板。即生成代碼的格式和結(jié)構(gòu)模板。(2)元數(shù)據(jù)。即在代碼中需建模的結(jié)構(gòu)相關(guān)資源。(3)業(yè)務(wù)規(guī)則。用于指定元數(shù)據(jù)和行為的規(guī)則,這一部分通常封裝在代碼生成器中[4]。

常見(jiàn)的典型代碼生成方式有3種:(1)CORBA中間件所采用的IDL(接口定義語(yǔ)言)的代碼生成方式。(2).NET提供的CodeDOM機(jī)制。(3)基于XML的生成方式。表1列出了3種方式采用的模板、元數(shù)據(jù)、業(yè)務(wù)規(guī)則[5]。

表1 3種典型的代碼生成方式

由表1可看出,這3種代碼生成方式各有不同,但就實(shí)現(xiàn)的簡(jiǎn)易程度而言,基于XML的代碼生成技術(shù)明顯更具優(yōu)勢(shì)。其以XML技術(shù)和XLST文檔轉(zhuǎn)換技術(shù)作為支持,而XSLT語(yǔ)言則直接定義文檔轉(zhuǎn)換規(guī)則,與生成代碼采用的語(yǔ)言無(wú)關(guān),故可更方便快捷地實(shí)現(xiàn)代碼的自動(dòng)生成;而其他兩種代碼生成方式由于其業(yè)務(wù)規(guī)則與要生成的代碼語(yǔ)言相關(guān),而生成某種特定語(yǔ)言,其映射關(guān)系的建立一般不由程序員確立[6]。

另外,從發(fā)展前景來(lái)看,XML具有良好的可讀性,方便的可擴(kuò)展性,數(shù)據(jù)內(nèi)容與其形式的分離,可輕松地跨平臺(tái)應(yīng)用,適合面向?qū)ο蟮某绦蜷_(kāi)發(fā)等多方面優(yōu)勢(shì)。人們可通過(guò)DOM或SAX等技術(shù)對(duì)XML數(shù)據(jù)進(jìn)行訪問(wèn);更可通過(guò)XPath和XSLT對(duì)其進(jìn)行文檔轉(zhuǎn)換,將其轉(zhuǎn)換為其他格式的文檔。

基于以上的自動(dòng)代碼生成方式的對(duì)比及XML的應(yīng)用優(yōu)勢(shì),文中選擇基于XML的代碼生成方式來(lái)實(shí)現(xiàn)代碼生成。

基于XML的代碼生成方式是一種常見(jiàn)的典型代碼生成方式。其模板語(yǔ)言一般為XSLT;其元數(shù)據(jù)一般用XML文件記錄;其業(yè)務(wù)規(guī)則一般通過(guò)XSLT轉(zhuǎn)換語(yǔ)言定義,通過(guò)XSLT引擎自動(dòng)產(chǎn)生代碼[7]?;赬ML的代碼生成工具的整體框架,如圖1所示。

圖1是具體的代碼生成工具的框架。其中,數(shù)據(jù)文件即三要素中的元數(shù)據(jù);模板文件即模板;而業(yè)務(wù)規(guī)則被封裝在代碼生成工具中?;赬Ml的代碼生成工具中的數(shù)據(jù)文件和模板文件均為XML表,代碼生成工具則依賴于XML解析器的實(shí)現(xiàn)[8]。

3 代碼生成工具的實(shí)現(xiàn)

圖1 代碼自動(dòng)生成工具框架圖

由于在雷達(dá)系統(tǒng)建模與仿真中存在眾多的代碼重復(fù)編寫的問(wèn)題,為避免人為編寫帶來(lái)不必要的麻煩和錯(cuò)誤,文中使用基于XML的代碼生成工具來(lái)自動(dòng)幫助生成底層仿真模型代碼。為對(duì)XML數(shù)據(jù)進(jìn)行訪問(wèn),設(shè)計(jì)了一個(gè)適合于C/C++的基于DOM解析規(guī)則的XML解析器。在現(xiàn)有開(kāi)源軟件CMarkUp的基礎(chǔ)上,為適應(yīng)遍歷普通樹(shù)的各個(gè)節(jié)點(diǎn)的需求,文中對(duì)CMarkUp進(jìn)行了二次封裝,重新設(shè)計(jì)了數(shù)據(jù)結(jié)構(gòu),其結(jié)構(gòu)如下:

Typedef struct xmlElem_tag

{

//節(jié)點(diǎn)操作

struct xmlElem_tag*parent;//父節(jié)點(diǎn)

struct xmlElem_tag*current;//當(dāng)前節(jié)點(diǎn)

struct xmlElem_tag*childHead;//子節(jié)點(diǎn)的頭結(jié)點(diǎn)

struct xmlElem_tag*forward;//前向指針

struct xmlElem_tag*next;//后向指針數(shù)組

//數(shù)據(jù)操作

char* attribHead;//屬性指針頭結(jié)點(diǎn)

int nAttrib;//屬性數(shù)目

//節(jié)點(diǎn)內(nèi)容

char elemName[MAXLENGTH+1];//節(jié)點(diǎn)名稱,MAXLENGTH為一個(gè)宏

int nDepthElem;//當(dāng)前節(jié)點(diǎn)的在樹(shù)形結(jié)構(gòu)中的深度

}xmlElem,*pxmlElem;

重新設(shè)計(jì)后的XML解析器可更容易的進(jìn)行遞歸遍歷,方便解析XML數(shù)據(jù)。

對(duì)于代碼自動(dòng)生成工具中重要的模板設(shè)計(jì),為適應(yīng)雷達(dá)系統(tǒng)建模與仿真的需求,將模板信息分為5大類:(1)系統(tǒng)信息。代碼生成后的存放路徑、代碼生成后的文件名、生成C++代碼的類名、成員函數(shù)名等。(2)參數(shù)信息。時(shí)寬、采樣頻率、發(fā)射功率、帶寬、脈沖重復(fù)周期等。(3)模型的輸入信息。發(fā)射信號(hào)脈沖重復(fù)周期類型、發(fā)射信號(hào)載頻類型、發(fā)射信號(hào)調(diào)制類型、發(fā)射信號(hào)中心載頻等。(4)模型的輸出信息。輸出數(shù)據(jù)結(jié)構(gòu)體、輸出信號(hào)類型。(5)模型之間的連接信息。兩個(gè)模型之間的連接關(guān)系,兩個(gè)模型之間的數(shù)據(jù)傳輸。

同時(shí)為生成C++代碼,必須為頭文件(.h)和源文件(.cpp),分別設(shè)置模板。為方便管理,將其放在同一XML表中以”template_h”和”template_cpp”節(jié)點(diǎn)區(qū)別,如圖2所示。

圖2 XML模板的設(shè)計(jì)與實(shí)現(xiàn)

圖3 數(shù)據(jù)文件交互式界面

為更人性化、交互性更好,給該數(shù)據(jù)文件配備了可視化的界面,如圖3所示。在用戶填入需要一些數(shù)據(jù)后就可點(diǎn)擊“選項(xiàng)”頁(yè)面的“生成C++代碼”按鈕即可生成所需要代碼。假設(shè)文件名填入“subTransmitter”其他為默認(rèn)值,生成代碼:

//參數(shù)定義模塊,主要完成對(duì)參數(shù)的定義

typedef struct para_subTransmitter_tag

{

double tau;//脈沖寬度

double fs;//采樣頻率

double band;//帶寬

double pt;//發(fā)射機(jī)瞬時(shí)功率

}para_subTransmitter;//參數(shù)定義部分

//接口定義模塊,主要完成對(duì)接口的定義

typedef struct io_subTransmitter_tag

{

//輸入接口定義

int in_prtType;//發(fā)射信號(hào)脈沖重復(fù)周期類型

int in_fcType;//發(fā)射信號(hào)載頻類型

int in_modType;//發(fā)射信號(hào)調(diào)制類型

int in_modPhaseType;//發(fā)射相位信號(hào)調(diào)制類型

//輸出接口定義

struct signal out_struct;//發(fā)射信號(hào)結(jié)構(gòu)體

struct pmatMatrix pout_msignal;//發(fā)射信號(hào)

}io_subTransmitter;//接口定義部分

typedef struct subTransmitter_tag

{

para_subTransmitter paraData;//參數(shù)結(jié)構(gòu)體

io_subTransmitter ioData;//輸入輸出結(jié)構(gòu)體

struct subTransmitter_tag*pm_data;//指向自己的指針

}subTransmitter,*psubTransmitter;//用 戶 模 型定義

4 結(jié)束語(yǔ)

基于XML的代碼生成工具可減少重復(fù)代碼的編寫,降低因手工編寫所帶來(lái)的編碼錯(cuò)誤,提高代碼的質(zhì)量和編寫效率,從而使大規(guī)模軟件開(kāi)發(fā)和維護(hù)更便捷。

[1]管太陽(yáng).基于模板的自動(dòng)代碼生成技術(shù)研究[D].成都:電子科技大學(xué),2007.

[2]田宇.基于XML的構(gòu)件組裝描述及其代碼生成技術(shù)研究[D].長(zhǎng)沙:中南大學(xué),2006.

[3]范小剛.代碼生成技術(shù)的探討與實(shí)現(xiàn)[D].廣州:中山大學(xué),2004.

[4]苗維杰,李天輝.基于 XML代碼生成技術(shù)的應(yīng)用研究[J].電子元器件應(yīng)用,2009(10):75 -78.

[5]徐愛(ài)春,章堅(jiān)民.基于XML/XSLT代碼自動(dòng)生成技術(shù)研究[J].杭州電子工業(yè)學(xué)院學(xué)報(bào),2004,24(4):64 -68.

[6]范秋生.XML的代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)[J].長(zhǎng)江大學(xué)學(xué)報(bào):自然科學(xué)版,2008,5(1):211 -212.

[7]趙軍.基于模板的代碼生成器的研究與實(shí)現(xiàn)[J].長(zhǎng)春師范學(xué)院學(xué)報(bào):自然科學(xué)版,2011,30(6):28 -34.

[8]楊皓,楊忠,吳愚.基于XML腳本的代碼生成技術(shù)及其應(yīng)用[J].多媒體技術(shù)與應(yīng)用,2009(3):1712-1713.

猜你喜歡
代碼生成編譯器代碼
Lustre語(yǔ)言可信代碼生成器研究進(jìn)展
基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
代碼生成技術(shù)在軟件開(kāi)發(fā)中的應(yīng)用
電子世界(2016年15期)2016-08-29 02:14:28
通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
基于關(guān)系數(shù)據(jù)模型代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)
編譯器無(wú)關(guān)性編碼在微控制器中的優(yōu)勢(shì)
绍兴县| 上饶市| 长岛县| 嘉鱼县| 咸宁市| 衢州市| 喀喇沁旗| 嵊泗县| 将乐县| 广平县| 宜昌市| 册亨县| 韩城市| 来宾市| 刚察县| 蓬莱市| 文昌市| 巴中市| 南投县| 平乡县| 新绛县| 克山县| 黎城县| 民丰县| 区。| 繁昌县| 黔东| 腾冲县| 金秀| 昭平县| 黑龙江省| 定兴县| 孟州市| 汤阴县| 崇礼县| 淄博市| 康马县| 敖汉旗| 普定县| 榆林市| 乾安县|