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

?

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

2009-03-02 09:33:12羅京麗杜建革
現(xiàn)代電子技術(shù) 2009年4期
關(guān)鍵詞:量綱

羅京麗 杜建革

摘 要:量綱誤用是科學(xué)計(jì)算應(yīng)用程序中一種常見的錯(cuò)誤,對計(jì)算結(jié)果的正確性影響很大。在此提出一種基于模板元編程的量綱檢測方法TADA,能夠有效完成C和C++程序代碼的量綱檢測工作。該方法利用程序設(shè)計(jì)語言自身的模板元編程功能,通過定義相關(guān)的量綱模板及其計(jì)算和標(biāo)注方法,依靠編譯器在編譯期間完成量綱分析和檢測,無需任何運(yùn)行開銷,有效解決了傳統(tǒng)量綱檢測系統(tǒng)中解方程組的計(jì)算量瓶頸等問題。

關(guān)鍵詞:模板元編程;TADA;量綱;計(jì)算量瓶頸

中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1004-373X(2009)04-080-06

Dimensional Unit Analysis Method Based on Template Meta-programming

LUO Jingli1,DU Jiange2

(1.Jiangxi Light Industry College,Yichun,336000,China;2.Nanjing University of Technology,Nanjing,210094,China)

Abstract:Misuse of measurement units is a common mistake in many scientific computing applications.It greatly influences the correctness of the application results.TADA,a tool that effectively detects errors of this kind for C/C++ programs is proposed.Making use of the function of template meta-programming in the language itself,TADA analyses the dimensional units and detects mismatches only by a standard C++ compiler in compile time without any runtime overhead.It avoids the computational bottleneck of solving linear equations introduced by traditional methods.

Keywords:template meta-programming;TADA;measurement unit;computational bottleneck

0 引 言

量綱誤用在科學(xué)計(jì)算程序中是一種常見的錯(cuò)誤,然而程序設(shè)計(jì)語言的標(biāo)準(zhǔn)類型系統(tǒng)卻對此無

能為力。物理方程中的量綱錯(cuò)誤可以手工分析出來,然而求解物理方程的計(jì)算機(jī)程序中的量綱錯(cuò)誤卻難以被發(fā)現(xiàn),因?yàn)橛?jì)算程序往往很復(fù)雜。例如,一些研究者認(rèn)為火星氣候探測衛(wèi)星的丟失,是因?yàn)槌绦蛑邪岩粋€(gè)英制單位的變量傳遞給了使用公制單位的模塊[1]。因而,量綱的正確性對計(jì)算結(jié)果的正確性非常重要。

近年來,研究者們提出了一些量綱檢測方法[2-5],典型的如Osprey量綱檢測方法[2]。Osprey方法包含5個(gè)主要步驟:

(1) 對待檢測源程序進(jìn)行單位標(biāo)注,使得檢測器能夠知道每個(gè)變量的單位;

(2) C語言解析和語法檢查;

(3) 生成包含單位信息的抽象語法樹;

(4) 生成約束(方程);

(5) 方程的化簡及高斯消去求解(GE)。

可以看出,Osprey方法步驟較多,每步都需要語言外的其他工具,并需要對其進(jìn)行修改、擴(kuò)充,而且最后的高斯消去(GE)計(jì)算量非常大,是Osprey方法的性能瓶頸。使用Osprey方法還有一個(gè)問題,就是需要同時(shí)維護(hù)2份源代碼:一份正常代碼用于編譯測試;另一份包含量綱信息的檢測代碼,修改正常代碼后必須及時(shí)對檢測代碼進(jìn)行更新,維護(hù)起來也比較繁瑣。此外,由于C++語言的解析非常困難,Osprey方法目前沒有實(shí)現(xiàn)對C++程序的量綱檢測。

針對這些問題,提出一種基于模板元編程的量綱檢測方法TADA(TMP-bAsed Dimensional Analysis Method),其基本思路是利用程序設(shè)計(jì)語言自身的模板元編程(Template Meta Programming,TMP)功能,讓編譯器在編譯時(shí)對程序中的量綱進(jìn)行準(zhǔn)確性檢測,從而可以避免Osprey方法的計(jì)算量大等諸多問題。TADA方法具有下列優(yōu)點(diǎn):

(1) TADA方法可使得應(yīng)用開發(fā)人員不需要維護(hù)2份代碼,因?yàn)槭褂肨ADA方法的檢測程序也完全是一個(gè)合法的可編譯的程序。

(2) TADA方法的量綱檢測完全在編譯期間進(jìn)行,對程序不會(huì)引入任何運(yùn)行時(shí)開銷。

(3) TADA方法無需進(jìn)行方程組求解工作,可以適用于任何規(guī)模的程序。與Osprey等方法類似,TADA方法也需要手工對程序添加量綱信息,其標(biāo)注的工作量與Osprey等方法相當(dāng)。但TADA方法中編譯器在進(jìn)行檢測的時(shí)候無需進(jìn)行Osprey方法中的方程組求解工作,因而不再有Osprey方法的計(jì)算瓶頸。

(4) TADA方法采用模塊化設(shè)計(jì),使得單位的表示與匹配檢測之間實(shí)現(xiàn)了松耦合,支持用戶可以以一致的方式增加新的單位。

1 模板元編程(TMP)技術(shù)

在C++程序設(shè)計(jì)語言中,模板元編程[6-8]是實(shí)現(xiàn)代碼重用的一種重要機(jī)制。下面首先對模板元編程技術(shù)進(jìn)行介紹,然后給出TADA方法中需要使用的幾個(gè)基本的模板元程序。

1.1 模板元編程簡介

模板可以將類型定義為參數(shù),以提高代碼的可重用性。模板包括類模板和函數(shù)模板等。函數(shù)模板與模板函數(shù)的區(qū)別可以類比于類與對象的區(qū)別:函數(shù)模板是模板的定義;而模板函數(shù)是函數(shù)模板的實(shí)例,具有程序代碼,占用內(nèi)存空間。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)了函數(shù)模板一個(gè)對應(yīng)的函數(shù)調(diào)用后,根據(jù)實(shí)參的類型來確認(rèn)是否匹配函數(shù)模板中對應(yīng)的形參,然后生成一個(gè)重載函數(shù),稱該重載函數(shù)為模板函數(shù)。類似地,在聲明了一個(gè)類模板后,也可以創(chuàng)建類模板的實(shí)例—模板類。

類模板的一般形式如下:

template

class 類名{

//類定義…

};

C++的模板系統(tǒng)能夠通過模板的特化、偏特化實(shí)現(xiàn)邏輯判斷,并能通過模板遞歸實(shí)現(xiàn)循環(huán),構(gòu)成了一個(gè)圖靈完全的二級(jí)語言[6]。使用這種二級(jí)語言進(jìn)行編程叫作C++模板元編程(Template Meta Programming,TMP)。模板元編程的驅(qū)動(dòng)力是模板的遞歸實(shí)例化。下面給出C++模板元編程的一個(gè)示例。

首先定義一個(gè)類模板,通過該類模板可實(shí)現(xiàn)在編譯期間計(jì)算4的任意次方。如下所示:

pow4.hpp

#ifndef POW4_HPP

#define POW4_HPP

//primary template to compute;

template

class Pow4 {

public:

enum { result = 4 * Pow4::result };

};

//full specialization to end the recursion

template<>

class Pow4<0> {

public:

enum { result = 1 };

};

通過下面的程序來使用該模板。

Test.cpp

#endif // POW4_HPP

#include

#include "pow4.hpp"

int main()

{

std::cout << "Pow4<7>::result = "

<< Pow4<7>::result << '\n';

}

程序Test.cpp執(zhí)行完后,會(huì)正確輸出4的7次方的值,該數(shù)值是C++編譯器在編譯模板元程序時(shí)遞歸計(jì)算得到。由于模板元程序完全在編譯期間執(zhí)行,相當(dāng)于對編譯器功能進(jìn)行擴(kuò)充,因而利用這種程序進(jìn)行量綱檢測具有良好的可行性。

1.2 基本模板元程序

下面給出TADA方法中需要使用的幾個(gè)基本的模板元程序。

(1) 靜態(tài)判斷

template

struct StaticIF

{

typedef T2 ResultType;

};

template

struct StaticIF

{

typedef T1 ResultType;

};

語法:StaticIF::ResultType

語義:當(dāng)cond為真時(shí),ResultType為T1,否則ResultType為T2。

(2) 靜態(tài)斷言

template void StaticAssert(){return UnitError;};

template<> void StaticAssert(){};

語法:StaticAssert();

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

(3) 靜態(tài)絕對值

template

struct StaticABS

{

static const int value = n>=0 ? n :-n;

};

語法:StaticABS::value

語義:n的絕對值,其中n為int類型。

(4) 靜態(tài)最大公約數(shù)

template

struct StaticGCD

{ //b!=0

static const int result = StaticIF<(a,StaticGCD >::ResultType::result;

};

template

struct StaticGCD

{

static const int result=a;

};

語法:StaticGCD::result

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

2 TADA量綱檢測方法

TADA量綱檢測方法需要涉及到單位和量綱的表示、計(jì)算、標(biāo)注以及數(shù)學(xué)運(yùn)算函數(shù)的量綱包裝等各個(gè)組成步驟,下面將依次對其進(jìn)行介紹。

2.1 單位和量綱的表示

在Osprey方法中,量綱是用一個(gè)長度為7的向量表示的,每個(gè)分量對應(yīng)一個(gè)SI標(biāo)準(zhǔn)量綱。TADA方法中也采用了這種方式。為了簡化闡述,本文只討論長度、重量、時(shí)間這三種量綱,其SI單位分別為米、千克和秒(TADA方法可直接推廣到其他各種量綱)。由于TMP程序的特殊性,它并沒有數(shù)組或向量的支持,也不能使用浮點(diǎn)數(shù)據(jù)(使用浮點(diǎn)數(shù)表示量綱也會(huì)帶來不精確性),量綱在TMP程序中的表示形式有所不同:用u11,u12,u21,u22,u31,u32之類的整型量分別表示米u(yù)11u12,千克u11u12,秒u11u12,并輔以ratio表示同量綱、不同單位之間的比值,如分鐘和秒的比值為60。

TADA方法可靜態(tài)地建立如下常用單位:

Struct UnitRoot//無量綱

{

static const int u11 = 0;

static const int u12 = 1;

static const int u21 = 0;

static const int u22 = 1;

static const int u31 = 0;

static const int u32 = 1;

static const double ratio;

};

const double UnitRoot::ratio=1;

struct ULength: UnitRoot {}; //長度量綱

struct UWeight: UnitRoot {}; //重量量綱

struct UTime:UnitRoot {}; //時(shí)間量綱

struct UAngle:UnitRoot {}; //角的大?。o量綱)

struct UnitLess :UnitRoot {}; //無量綱

struct UMeter:ULength{static const int u11=1;}; //米

struct UKG:UWeight{static const int u21=1;}; //千克

struct USecond:UTime{static const int u31=1;}; //秒

struct UAcceleration:UnitRoot {static const int u11=1;//加速度:米/秒^2

static const int u31=-2;};

struct URadian: UAngle{}; //角度

struct UAngleDegree:UAngle{static const double ratio;}; //弧度

const double UAngleDegree::ratio=180/3.141592653589793;

//弧度與角度的比例

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

template

struct BuildUnit :public UnitRoot

{

static const int gcd1 = StaticGCD::result;

static const int gcd2 = StaticGCD::result;

static const int gcd3 = StaticGCD::result;

static const int u11 = U11/gcd1;

static const int u12 = U12/gcd1;

static const int u21 = U21/gcd2;

static const int u22 = U22/gcd2;

static const int u31 = U31/gcd3;

static const int u32 = U32/gcd3;

};

2.2 單位和量綱的計(jì)算

由于量綱都是用分?jǐn)?shù)表示的,因而其計(jì)算會(huì)稍有麻煩。下面定義TADA方法中量綱分?jǐn)?shù)的加、減、乘、除和等價(jià)測試運(yùn)算。

(1) 分?jǐn)?shù)的加法運(yùn)算,如下所示。

template

struct FractionAdd

{

static const int U1=u11*u22+u21*u12;

static const int U2=u12*u22;

};

語法:FractionAdd ::U1、FractionAdd::U2

語義:分?jǐn)?shù)相加并約分,即:

U1U2=u11*u22+u21*u12u12*u22,且GCD(U1,U2)=1。

(2) 分?jǐn)?shù)的減法運(yùn)算。

TADA方法通過加法實(shí)現(xiàn)減法計(jì)算,如下所示。

template

struct FractionSub

{

static const int U1=FractionAdd::U1;

static const int U2=FractionAdd::U2;

};

語法:FractionSub::U1、FractionSub::U2

語義:分?jǐn)?shù)相減并約分,即:

U1U2=u11*u22-u21*u12u12*u22,且GCD(U1,U2)=1。

(3) 單位相乘。

分別將3個(gè)量綱分?jǐn)?shù)相加,然后使用BuildUnit生成新單位。

template

struct UnitMultiply

{

typedef FractionAdd

b::u12> FM1;

typedef FractionAdd

b::u22> FM2;

typedef FractionAdd

b::u32> FM3;

typedef BuildUnit<

FM1::U1,FM1::U2,

FM2::U1,FM2::U2,

FM3::U1,FM3::U2> ResultType;

};

語法:UnitMultiply::ResultType

語義:單位Ua與單位Ub相乘后的新單位。

(4) 單位相除。

與乘法處理方式相似。

template

struct UnitDivide

{

typedef FractionSub

b::u12> FM1;

typedef FractionSub

b::u22> FM2;

typedef FractionSub

b::u32> FM3;

typedef BuildUnit<

FM1::U1,FM1::U2,

FM2::U1,FM2::U2,

FM3::U1,FM3::U2> ResultType;

};

語法:UnitDivide ::ResultType

語義:單位Ua除以單位Ub后的新單位。

(5) 單位的等價(jià)測試函數(shù)(宏)

#define UNIT_CHECK(a,b) StaticAssert<

(a::u11==b::u11) && (a::u12==b::u12) &&

(a::u21==b::u21) &&

(a::u22==b::u22) &&

(a::u31==b::u31) && (a::u32==b::u32)>()

語法:UNIT_CHECK(Ua,Ub);

語義:若單位Ua與單位Ub等價(jià)則不產(chǎn)生任何效果,否則產(chǎn)生編譯期錯(cuò)誤。

2.3 單位和量綱標(biāo)注的原理和語法

與Osprey等方法類似,TADA方法也在待檢測源程序進(jìn)行單位標(biāo)注,以使得檢測器能夠知道每個(gè)變量的單位。由于經(jīng)過單位標(biāo)注的待檢測程序仍然是合法的可編譯的程序,所以標(biāo)注信息必須由語言自身已有的語法要素構(gòu)成;標(biāo)注信息還不能影響被標(biāo)注變量的任何計(jì)算特性及使用方式,只有滿足這兩點(diǎn)要求的標(biāo)注方式才能使標(biāo)注工作量最小化。此外,已標(biāo)注變量應(yīng)該禁止從未標(biāo)注變量進(jìn)行各種隱含的類型轉(zhuǎn)換,這樣嚴(yán)格的限制才能有效進(jìn)行單位量綱的匹配檢測。對于C++語言來說,可以采用模板類的方式實(shí)現(xiàn)。

標(biāo)注實(shí)質(zhì)上是把語言原始的數(shù)據(jù)類型替換成TADA方法預(yù)定義的模板類,而模板類實(shí)現(xiàn)了各種運(yùn)算符號(hào)的重載,同時(shí)禁止了任何隱含的類型轉(zhuǎn)換,使得量綱標(biāo)注既滿足語法要素的要求,又滿足計(jì)算兼容性的要求和禁止隱含轉(zhuǎn)換的要求。TADA方法中標(biāo)注的實(shí)現(xiàn)如下所示。

template

//T為基礎(chǔ)變量類型(int、double...)

struct UnitBase//U為單位量綱信息

{

typedef UnitBase ThisType;//自身類型

T value; //實(shí)際的數(shù)值

UnitBase(){}

explicit //禁止從基礎(chǔ)類型進(jìn)行隱含構(gòu)造轉(zhuǎn)換

UnitBase(T init_value):value(init_value){}

operator T (){return value;}

//允許向基礎(chǔ)類型隱含轉(zhuǎn)換

//以下定義各種運(yùn)算符,使得標(biāo)注類可以模擬原始變量進(jìn)行各種運(yùn)算

#define TEMPLATE template

TEMPLATE UnitBase(const UnitBase& rhs)

{

UNIT_CHECK(U,U2);//單位等價(jià)性檢測

value=rhs.value;

}

TEMPLATE ThisType& operator = (UnitBase rhs)

{

UNIT_CHECK(U,U2);

value=rhs.value;

return *this;

}

TEMPLATE bool operator == (UnitBase rhs)

{

UNIT_CHECK(U,U2);

return value==rhs.value;

}

TEMPLATE ThisType& operator += (UnitBase rhs)

{

UNIT_CHECK(U,U2);

value+=rhs.value;

return *this

}

TEMPLATE ThisType& operator -= (UnitBase rhs)

{

UNIT_CHECK(U,U2);

value-=rhs.value;

return *this

}

TEMPLATE ThisType operator + (UnitBase rhs)

{

UNIT_CHECK(U,U2);

return ThisType(value+rhs.value);

}

TEMPLATE ThisType operator - (UnitBase rhs)

{

UNIT_CHECK(U,U2);

return ThisType(value-rhs.value);

}

TEMPLATE UnitBase::ResultType>

operator * (UnitBase rhs)

{

typedef UnitMultiply::ResultType TT;

return UnitBase(value*rhs.value);

}

TEMPLATE ThisType& operator *= (UnitBase rhs)

{

UNIT_CHECK(U2,UnitRoot);

value*=rhs.value;

return *this;

}

TEMPLATE UnitBase::ResultType>

operator / (UnitBase rhs)

{

typedef UnitDivide::ResultType TT;

return UnitBase(value/rhs.value);

}

#undef TEMPLATE

//以下定義可以顯式禁止其他一切引起隱含類型轉(zhuǎn)換的運(yùn)算

template ThisType operator + (T2 rhs){return UnitError;}

template ThisType operator - (T2 rhs){return UnitError;}

template ThisType operator * (T2 rhs){return UnitError;}

template ThisType operator / (T2 rhs){return UnitError;}

template ThisType& operator += (T2 rhs){return UnitError;}

template ThisType& operator -= (T2 rhs){return UnitError;}

template ThisType& operator *=

(T2 rhs){return UnitError;}

template ThisType& operator /= (T2 rhs){return UnitError;}

};

2.4 定義單位量綱

量綱檢測系統(tǒng)應(yīng)該預(yù)定義常用單位量綱,以方便應(yīng)用開發(fā)人員使用。TADA方法采用如下方式定義單位量綱:

{//米

typedef UnitBase Double;

typedef UnitBase Float;

typedef UnitBaseInt;

typedef UnitBaseLong;

}

namespace KG //千克

{

typedef UnitBaseDouble;

typedef UnitBaseFloat;

typedef UnitBase Int;

typedef UnitBaseLong;

}

namespace Second//秒

{

typedef UnitBase Double;

typedef UnitBase Float;

typedef UnitBaseInt;

typedef UnitBase Long;

}

namespace Acceleration //加速度:米/秒^2

{

typedef UnitBase Double;

typedef UnitBaseFloat;

typedef UnitBaseInt;

typedef UnitBaseLong;

}

namespace Radian//弧度

{

typedef UnitBase Double;

typedef UnitBase Float;

typedef UnitBaseInt;

typedef UnitBase Long;

}

namespace AngleDegree //角度

{

typedef UnitBase Double;

typedef UnitBase Float;

typedef UnitBase Int;

typedef UnitBase Long;

}

……

2.5 數(shù)學(xué)運(yùn)算函數(shù)的量綱包裝

對于指數(shù)、對數(shù)、三角函數(shù)等已有的數(shù)學(xué)運(yùn)算函數(shù),其參數(shù)與返回值都是沒有單位量綱的,不能直接用于有量綱的公式計(jì)算。針對這個(gè)問題,TADA方法提供了這些函數(shù)的量綱包裝,以sqrt和sin為例如下:

#define HALF_UNIT(U) BuildUnit

template

UnitBase Sqrt(UnitBase

U> n)

{//開方函數(shù)應(yīng)使單位的所有量綱減半

return UnitBase(::sqrt(n.value));

}

#undef HALF_UNIT

template

UnitBase Sin(UnitBase n)

{//正弦函數(shù)的參數(shù)應(yīng)為弧度,返回值為無量綱

UNIT_CHECK(U,URadian);

return UnitBase(::sin(n.value));

}

2.6 輔助工具

TADA方法還提供了一些輔助工具,用于將量綱變量以適合閱讀的方式顯示出來,例如:

Unit::Second::Double n(10);

Unit::Meter::Double m(20);

cout<

可以得到這樣的輸出結(jié)果:

0.2米/秒^2

2.7 分析和評(píng)估

在TADA方法的基礎(chǔ)上,實(shí)現(xiàn)了面向C/C++程序的量綱檢測系統(tǒng)(TADA系統(tǒng)),并對TADA系統(tǒng)的檢測能力進(jìn)行了分析和評(píng)估。

首先采用TADA系統(tǒng)來檢測下面的樣例程序。

unit.cpp

#include "unit.h"

using namespace std;

int main(int argc,char* argv[])

{

Unit::Second::Double n(10);

Unit::Meter::Double m(20);

Unit::KG::Double c; //示量綱不匹配

c=m/n/n;

return 0;

}

在TADA系統(tǒng)中,Visual Studio 2003編譯該程序會(huì)出現(xiàn)類似如下的錯(cuò)誤信息,錯(cuò)誤信息的第3行就表明了unit.cpp的第9行有錯(cuò)誤。

meta_prog_basic.h(15) :error C2065:"UnitError":未聲明的標(biāo)識(shí)符

d:\My Documents\Visual Studio Projects\unit\unit_core.h(70) :參見…的引用

d:\My Documents\Visual Studio Projects\unit\unit.cpp(9) :參見…的引用

在檢測能力方面,采用文獻(xiàn)[2]的樣例程序?qū)ADA系統(tǒng)和Osprey系統(tǒng)的量綱檢測能力進(jìn)行了對比評(píng)估。在文獻(xiàn)[2]中,Osprey共找到了3個(gè)錯(cuò)誤,其中前2個(gè)是單位誤用錯(cuò)誤,第3個(gè)是單位轉(zhuǎn)換比例因子錯(cuò)誤。TADA系統(tǒng)也完全找到了前2個(gè)錯(cuò)誤,而第3個(gè)錯(cuò)誤在標(biāo)注時(shí)被避免掉了,因?yàn)樵搯挝幌到y(tǒng)包含了量綱之間的比例因子,能夠進(jìn)行自動(dòng)的單位轉(zhuǎn)換。

在性能和可擴(kuò)展性方面,TADA系統(tǒng)能夠更有效地實(shí)現(xiàn)對C/C++程序的量綱檢測。Osprey系統(tǒng)引入了具有較高計(jì)算復(fù)雜度的線性方程組求解步驟,需要很大的計(jì)算和時(shí)間開銷來解線性解方程組。TADA系統(tǒng)基于模板元編程技術(shù),只需要利用語言自身的語法能力,靠編譯器進(jìn)行單位量綱檢查,沒有帶來太多額外的復(fù)雜計(jì)算。并且TADA系統(tǒng)不會(huì)帶來任何程序的運(yùn)行時(shí)開銷。因此TADA系統(tǒng)可適用于各種規(guī)模的C/C++程序,具有更好的性能和可擴(kuò)展性。

在易用性方面,TADA系統(tǒng)的標(biāo)注負(fù)擔(dān)與Osprey系統(tǒng)相當(dāng)。由于TADA系統(tǒng)利用C++編譯器的功能進(jìn)行錯(cuò)誤檢測,而C++編譯器遇到模板錯(cuò)誤時(shí)的錯(cuò)誤信息卻不很直觀,錯(cuò)誤報(bào)告的可讀性較弱,但仍可以快速定位到錯(cuò)誤點(diǎn)。

3 結(jié) 語

這里提出一種新穎的基于模板元編程的單位量綱檢測方法TADA,并基于該方法實(shí)現(xiàn)了一個(gè)單位量綱檢測系統(tǒng)。

TADA方法采用模板元編程技術(shù),使得經(jīng)過單位量綱標(biāo)注的受測程序仍然是一個(gè)完整、合法、可編譯的C/C++程序,無需維護(hù)多套程序代碼,也無需進(jìn)行復(fù)雜的解方程組運(yùn)算,就能夠在程序代碼中發(fā)現(xiàn)量綱錯(cuò)誤,具有良好的實(shí)用性和可擴(kuò)展性,可以有效適用于多種規(guī)模程序的量綱檢測。

參 考 文 獻(xiàn)

[1]Mars Climate Orbiter Mishap Investigation.ftp://ftp.hq.nasa.gov/pub/pao/reports/1999/MCO_report.pdf.

[2]Jiang Lingxiao,Su Zhendong.Osprey:A Practical Type System for Validating Dimensional Unit Correctness of C Programs.Proc.of ICSE′06.Shanghai,2006.

[3]Allen E E,Hase D,V.Luchangco,et al.Object-oriented Units of Measurement.Proc.of OOPSLA′04.Canada,2004:384-403.

[4]Brown W E.Applied Template Meta-programming in SIUNITS:The Library of Unit-based Computation.http://www.oonumerics.org/tmpwol/brown.pdf,2001.

[5]Foster J S,Ahndrich M F,Aiken A.A Theory of Type Qualifiers.Proc.of PLDI′99.Ottawa,1999,34(5):192-203.

[6]Todd L Veldhuizen.C++ Templates are Turing-complete.http://osl.iu.edu/~tveldhui/papers/2003/turing.pdf.

[7]Micolai Josuttis,David Vandevoorde.C++ Templates:The Complete Guide.Pearson Education,2003.

[8]The Boost:MPL Library.http://www.boost.org.

[9]Anderson E,Bai Z,Bischof C,et al.LAPACK Users′ Guide.Third Edition.Society for Industrial and Applied Mathematics,1999.

[10]Das M,Lerner S,Seigle M.ESP:Path-sensitive Program Verification in Polynomial Time.Proc.of PLDI′02.Ottawa,2002:57-68.

[11]Antoniu T,Steckler R A,Krishnamurthi S,et al.Validating the UnitCorrectness of Spread Sheet Programs.Proc.of ICSE′04.Edinburg,2004:439-448.

作者簡介 羅京麗 女,1977年出生,江西安福人,江西省輕工高級(jí)技校講師,學(xué)士。主要研究方向?yàn)橛?jì)算機(jī)軟件和計(jì)算機(jī)應(yīng)用。

杜建革 男,1973年出生,重慶人,南京理工大學(xué)碩士。主要研究領(lǐng)域?yàn)橛?jì)算機(jī)軟件和計(jì)算機(jī)應(yīng)用。

注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。

猜你喜歡
量綱
量綱分析在熱力學(xué)統(tǒng)計(jì)物理中的教學(xué)應(yīng)用*
關(guān)于電學(xué)基礎(chǔ)課程物理量的量綱與單位的討論
“量綱”在小學(xué)數(shù)學(xué)深度教學(xué)中的應(yīng)用
淺談量綱法推導(dǎo)物理公式的優(yōu)勢
——以勻加速直線運(yùn)動(dòng)公式為例
中學(xué)物理思維的培養(yǎng)在大學(xué)物理教學(xué)中的重要性
科技論文編輯加工中的量綱問題
量綱淺析
基于量綱分析的測試計(jì)量儀器創(chuàng)新設(shè)計(jì)
化學(xué)平衡常數(shù)真的只與溫度有關(guān)么
量綱分析及其應(yīng)用
物理與工程(2012年6期)2012-07-05 05:31:48
思南县| 从化市| 临汾市| 唐河县| 亳州市| 东乡族自治县| 中山市| 上犹县| 博客| 揭东县| 青海省| 北辰区| 栖霞市| 荔波县| 铁岭市| 镇平县| 襄城县| 梁平县| 元阳县| 壤塘县| 青川县| 普安县| 建宁县| 嵊泗县| 临西县| 三穗县| 孟津县| 来安县| 台江县| 彰化县| 沂南县| 伽师县| 祁东县| 寻甸| 寿光市| 青海省| 阿拉尔市| 庆安县| 于田县| 金川县| 漳州市|