新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 一種基于模板元編程的量綱檢測(cè)方法

一種基于模板元編程的量綱檢測(cè)方法

作者: 時(shí)間:2009-07-14 來(lái)源:網(wǎng)絡(luò) 收藏
0 引 言
量綱誤用在科學(xué)計(jì)算程序中是一種常見的錯(cuò)誤,然而程序設(shè)計(jì)語(yǔ)言的標(biāo)準(zhǔn)類型系統(tǒng)卻對(duì)此無(wú)能為力。物理方程中的量綱錯(cuò)誤可以手工分析出來(lái),然而求解物理方程的計(jì)算機(jī)程序中的量綱錯(cuò)誤卻難以被發(fā)現(xiàn),因?yàn)橛?jì)算程序往往很復(fù)雜。例如,一些研究者認(rèn)為火星氣候探測(cè)衛(wèi)星的丟失,是因?yàn)槌绦蛑邪岩粋€(gè)英制單位的變量傳遞給了使用公制單位的模塊。因而,量綱的正確性對(duì)計(jì)算結(jié)果的正確性非常重要。
近年來(lái),研究者們提出了一些量綱,典型的如Osprey量綱。Osprey方法包含5個(gè)主要步驟:
(1)對(duì)待檢測(cè)源程序進(jìn)行單位標(biāo)注,使得檢測(cè)器能夠知道每個(gè)變量的單位;
(2)C語(yǔ)言解析和語(yǔ)法檢查;
(3)生成包含單位信息的抽象語(yǔ)法樹;
(4)生成約束CY程);
(5)方程的化簡(jiǎn)及高斯消去求解(GE)。
可以看出,Osprey方法步驟較多,每步都需要語(yǔ)言外的其他工具,并需要對(duì)其進(jìn)行修改、擴(kuò)充,而且最后的高斯消去(GE)計(jì)算量非常大,是Osprey方法的性能瓶頸。使用Osprey方法還有一個(gè)問題,就是需要同時(shí)維護(hù)2份源代碼:一份正常代碼用于編譯測(cè)試;另一份包含量綱信息的檢測(cè)代碼,修改正常代碼后必須及時(shí)對(duì)檢測(cè)代碼進(jìn)行更新,維護(hù)起來(lái)也比較繁瑣。此外,由于C++語(yǔ)言的解析非常困難,Osprey方法目前沒有實(shí)現(xiàn)對(duì)C++程序的量綱檢測(cè)。
針對(duì)這些問題,提出一種基于的量綱TADA(TMP-bAsed Dimensional AnalysisMethod),其基本思路是利用程序設(shè)計(jì)語(yǔ)言自身的(Template Meta Programming,TMP)功能,讓編譯器在編譯時(shí)對(duì)程序中的量綱進(jìn)行準(zhǔn)確性檢測(cè),從而可以避免Osprey方法的計(jì)算量大等諸多問題。TADA方法具有下列優(yōu)點(diǎn):
(1)TADA方法可使得應(yīng)用開發(fā)人員不需要維護(hù)2份代碼,因?yàn)槭褂肨ADA方法的檢測(cè)程序也完全是一個(gè)合法的可編譯的程序。
(2)TADA方法的量綱檢測(cè)完全在編譯期間進(jìn)行,對(duì)程序不會(huì)引入任何運(yùn)行時(shí)開銷。
(3)TADA方法無(wú)需進(jìn)行方程組求解工作,可以適用于任何規(guī)模的程序。與Osprey等方法類似,TADA方法也需要手工對(duì)程序添加量綱信息,其標(biāo)注的工作量與Osprey等方法相當(dāng)。但TADA方法中編譯器在進(jìn)行檢測(cè)的時(shí)候無(wú)需進(jìn)行Osprey方法中的方程組求解工作,因而不再有Osprey方法的計(jì)算瓶頸。
(4)TADA方法采用模塊化設(shè)計(jì),使得單位的表示與匹配檢測(cè)之間實(shí)現(xiàn)了松耦合,支持用戶可以以一致的方式增加新的單位。

1 (TMP)技術(shù)
在C++程序設(shè)計(jì)語(yǔ)言中,模板元編程是實(shí)現(xiàn)代碼重用的一種重要機(jī)制。下面首先對(duì)模板元編程技術(shù)進(jìn)行介紹,然后給出TADA方法中需要使用的幾個(gè)基本的模板元程序。
1.1 模板元編程簡(jiǎn)介
模板可以將類型定義為參數(shù),以提高代碼的可重用性。模板包括類模板和函數(shù)模板等。函數(shù)模板與模板函數(shù)的區(qū)別可以類比于類與對(duì)象的區(qū)別:函數(shù)模板是模板的定義;而模板函數(shù)是函數(shù)模板的實(shí)例,具有程序代碼,占用內(nèi)存空間。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)了函數(shù)模板一個(gè)對(duì)應(yīng)的函數(shù)調(diào)用后,根據(jù)實(shí)參的類型來(lái)確認(rèn)是否匹配函數(shù)模板中對(duì)應(yīng)的形參,然后生成一個(gè)重載函數(shù),稱該重載函數(shù)為模板函數(shù)。類似地,在聲明了一個(gè)類模板后,也可以創(chuàng)建類模板的實(shí)例一模板類。
類模板的一般形式如下:
template
class類名{
//類定義…

本文引用地址:http://butianyuan.cn/article/195807.htm

};
C++模板系統(tǒng)能夠通過模板的特化、偏特化實(shí)現(xiàn)邏輯判斷,并能通過模板遞歸實(shí)現(xiàn)循環(huán),構(gòu)成了一個(gè)圖靈完全的二級(jí)語(yǔ)言。使用這種二級(jí)語(yǔ)言進(jìn)行編程叫作C++模板元編程(Template Meta Programming,TMP)。模板元編程的驅(qū)動(dòng)力是模板的遞歸實(shí)例化。
下面給出C++模板元編程的一個(gè)示例。
首先定義一個(gè)類模板,通過該類模板可實(shí)現(xiàn)在編譯期間計(jì)算4的任意次方。如下所示:

通過下面的程序來(lái)使用該模板。


程序Test.cpp執(zhí)行完后,會(huì)正確輸出4的7次方的值,該數(shù)值是C++編譯器在編譯模板元程序時(shí)遞歸計(jì)算得到。由于模板元程序完全在編譯期間執(zhí)行,相當(dāng)于對(duì)編譯器功能進(jìn)行擴(kuò)充,因而利用這種程序進(jìn)行量綱檢測(cè)具有良好的可行性。
1.2 基本模板元程序
下面給出TADA方法中需要使用的幾個(gè)基本的模板元程序。
(1)靜態(tài)判斷


語(yǔ)法:StaticlFcond,T1,T2>::ResultType
語(yǔ)義:當(dāng)cond為真時(shí),ResuhType為T1,否則ResuhType為T2。
(2)靜態(tài)斷言


語(yǔ)義:當(dāng)cond為真時(shí)什么也不做,否則產(chǎn)生一個(gè)編譯期錯(cuò)誤(UnitError沒有定義,或void函數(shù)不應(yīng)該有返回值)。
(3)靜態(tài)絕對(duì)值


語(yǔ)義:遞歸的使用輾轉(zhuǎn)相除法在編譯期間求出a與b的最大公約數(shù),其中a與b為int類型。

2 TADA量綱檢測(cè)方法
TADA量綱檢測(cè)方法需要涉及到單位和量綱的表示、計(jì)算、標(biāo)注以及數(shù)學(xué)運(yùn)算函數(shù)的量綱包裝等各個(gè)組成步驟,下面將依次對(duì)其進(jìn)行介紹。
2.1 單位和量綱的表示
在Osprey方法中,量綱是用一個(gè)長(zhǎng)度為7的向量表示的,每個(gè)分量對(duì)應(yīng)一個(gè)SI標(biāo)準(zhǔn)量綱。TADA方法中也采用了這種方式。為了簡(jiǎn)化闡述,本文只討論長(zhǎng)度、重量、時(shí)間這三種量綱,其SI單位分別為米、千克和秒(TADA方法可直接推廣到其他各種量綱)。由于TMP程序的特殊性,它并沒有數(shù)組或向量的支持,也不能使用浮點(diǎn)數(shù)據(jù)(使用浮點(diǎn)數(shù)表示量綱也會(huì)帶來(lái)不精確性),量綱在TMP程序中的表示形式有所不同:用u11,u12,u21,u22,u31,u32之類的整型量分別表示,并輔以ratio表示同量綱、不同單位之間的比值,如分鐘和秒的比值為60。
TADA方法可靜態(tài)地建立如下常用單位:


模板元程序在計(jì)算公式的時(shí)候需要推導(dǎo)出新的量綱,例如在計(jì)算的時(shí)候,編譯器應(yīng)該能根據(jù)等號(hào)右邊的公式計(jì)算出它的量綱,并與e的量綱進(jìn)行比較判別。TADA方法的量綱是用分?jǐn)?shù)形式表示的,在每次量綱計(jì)算之后都需要進(jìn)行分?jǐn)?shù)的約分處理,才能進(jìn)行相等性判斷,因而TADA方法可用如下的方式處理新生成單位,如下所示。



上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: 模板元編程 檢測(cè)方法

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉