《電子技術應用》
您所在的位置:首頁 > 測試測量 > 設計應用 > 一種基于模板元編程的量綱檢測方法
一種基于模板元編程的量綱檢測方法
摘要: 量綱誤用在科學計算程序中是一種常見的錯誤,然而程序設計語言的標準類型系統卻對此無能為力。物理方程中的量綱錯誤可以手工分析出來,然而求解物理方程的計算機程序中的量綱錯誤卻難以被發現,因為計算程序往往很復雜。例如,一些研究者認為火星氣候探測衛星的丟失,是因為程序中把一個英制單位的變量傳遞給了使用公制單位的模塊。因而,量綱的正確性對計算結果的正確性非常重要。
Abstract:
Key words :
0 引 言
    量綱誤用在科學計算程序中是一種常見的錯誤,然而程序設計語言的標準類型系統卻對此無能為力。物理方程中的量綱錯誤可以手工分析出來,然而求解物理方程的計算機程序中的量綱錯誤卻難以被發現,因為計算程序往往很復雜。例如,一些研究者認為火星氣候探測衛星的丟失,是因為程序中把一個英制單位的變量傳遞給了使用公制單位的模塊。因而,量綱的正確性對計算結果的正確性非常重要。
    近年來,研究者們提出了一些量綱檢測方法,典型的如Osprey量綱檢測方法。Osprey方法包含5個主要步驟:
    (1)對待檢測源程序進行單位標注,使得檢測器能夠知道每個變量的單位;
    (2)C語言解析和語法檢查;
    (3)生成包含單位信息的抽象語法樹;
    (4)生成約束CY程);
    (5)方程的化簡及高斯消去求解(GE)。
    可以看出,Osprey方法步驟較多,每步都需要語言外的其他工具,并需要對其進行修改、擴充,而且最后的高斯消去(GE)計算量非常大,是Osprey方法的性能瓶頸。使用Osprey方法還有一個問題,就是需要同時維護2份源代碼:一份正常代碼用于編譯測試;另一份包含量綱信息的檢測代碼,修改正常代碼后必須及時對檢測代碼進行更新,維護起來也比較繁瑣。此外,由于C++語言的解析非常困難,Osprey方法目前沒有實現對C++程序的量綱檢測。
    針對這些問題,提出一種基于模板元編程的量綱檢測方法TADA(TMP-bAsed Dimensional AnalysisMethod),其基本思路是利用程序設計語言自身的模板元編程(Template Meta Programming,TMP)功能,讓編譯器在編譯時對程序中的量綱進行準確性檢測,從而可以避免Osprey方法的計算量大等諸多問題。TADA方法具有下列優點:
    (1)TADA方法可使得應用開發人員不需要維護2份代碼,因為使用TADA方法的檢測程序也完全是一個合法的可編譯的程序。
    (2)TADA方法的量綱檢測完全在編譯期間進行,對程序不會引入任何運行時開銷。
    (3)TADA方法無需進行方程組求解工作,可以適用于任何規模的程序。與Osprey等方法類似,TADA方法也需要手工對程序添加量綱信息,其標注的工作量與Osprey等方法相當。但TADA方法中編譯器在進行檢測的時候無需進行Osprey方法中的方程組求解工作,因而不再有Osprey方法的計算瓶頸。
    (4)TADA方法采用模塊化設計,使得單位的表示與匹配檢測之間實現了松耦合,支持用戶可以以一致的方式增加新的單位。

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

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

   

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

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

   
    語法:StaticlF::ResultType
    語義:當cond為真時,ResuhType為T1,否則ResuhType為T2。
    (2)靜態斷言


    語義:當cond為真時什么也不做,否則產生一個編譯期錯誤(UnitError沒有定義,或void函數不應該有返回值)。
    (3)靜態絕對值


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

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


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

 

2.2 單位和量綱的計算
   
由于量綱都是用分數表示的,因而其計算會稍有麻煩。下面定義TADA方法中量綱分數的加、減、乘、除和等價測試運算。
    (1)分數的加法運算,如下所示。

 


    (2)分數的減法運算。TADA方法通過加法實現減法計算,如下所示。


    語義:分數相減并約分,即:

   
    (3)單位相乘。分別將3個量綱分數相加,然后使用BuildUnit生成新單位。


    語義:單位Ua與單位Ub相乘后的新單位。
    (4)單位相除。與乘法處理方式相似。


    語義:若單位ua與單位Ub等價則不產生任何效果,否則產生編譯期錯誤。
2.3 單位和量綱標注的原理和語法
   
與Osprey等方法類似,TADA方法也在待檢測源程序進行單位標注,以使得檢測器能夠知道每個變量的單位。由于經過單位標注的待檢測程序仍然是合法的可編譯的程序,所以標注信息必須由語言自身已有的語法要素構成;標注信息還不能影響被標注變量的任何計算特性及使用方式,只有滿足這兩點要求的標注方式才能使標注工作量最小化。此外,已標注變量應該禁止從未標注變量進行各種隱含的類型轉換,這樣嚴格的限制才能有效進行單位量綱的匹配檢測。對于C++語言來說,可以采用模板類的方式實現。
    標注實質上是把語言原始的數據類型替換成TADA方法預定義的模板類,而模板類實現了各種運算符號的重載,同時禁止了任何隱含的類型轉換,使得量綱標注既滿足語法要素的要求,又滿足計算兼容性的要求和禁止隱含轉換的要求。TADA方法中標注的實現如下所示。

 

2.4 定義單位量綱
    量綱檢測系統應該預定義常用單位量綱,以方便應用開發人員使用。TADA方法采用如下方式定義單位量綱:

 



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


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


    可以得到這樣的輸出結果:0.2米/秒2
2.7 分析和評估
   
在TADA方法的基礎上,實現了面向C/C++程序的量綱檢測系統(TADA系統),并對TADA系統的檢測能力進行了分析和評估。
    首先采用TADA系統來檢測下面的樣例程序。


    在TADA系統中,Visual Studio 2003編譯該程序會出現類似如下的錯誤信息,錯誤信息的第3行就表明了unit.epp的第9行有錯誤。


    在檢測能力方面,采用文獻的樣例程序對TA-DA系統和Osprey系統的量綱檢測能力進行了對比評估。在文獻中,Osprey共找到了3個錯誤,其中前2個是單位誤用錯誤,第3個是單位轉換比例因子錯誤。TADA系統也完全找到了前2個錯誤,而第3個錯誤在標注時被避免掉了,因為該單位系統包含了量綱之間的比例因子,能夠進行自動的單位轉換。
    在性能和可擴展性方面,TADA系統能夠更有效地實現對c/c++程序的量綱檢測。Osprey系統引入了具有較高計算復雜度的線性方程組求解步驟,需要很大的計算和時間開銷來解線性解方程組。TADA系統基于模板元編程技術,只需要利用語言自身的語法能力,靠編譯器進行單位量綱檢查,沒有帶來太多額外的復雜計算。并且TADA系統不會帶來任何程序的運行時開銷。因此TADA系統可適用于各種規模的C/C++程序,具有更好的性能和可擴展性。
    在易用性方面,TADA系統的標注負擔與Osprey系統相當。由于TADA系統利用C++編譯器的功能進行錯誤檢測,而C++編譯器遇到模板錯誤時的錯誤信息卻不很直觀,錯誤報告的可讀性較弱,但仍可以快速定位到錯誤點。

3 結 語
   
這里提出一種新穎的基于模板元編程的單位量綱檢測方法TADA,并基于該方法實現了一個單位量綱檢測系統。
    TADA方法采用模板元編程技術,使得經過單位量綱標注的受測程序仍然是一個完整、合法、可編譯的C/C++程序,無需維護多套程序代碼,也無需進行復雜的解方程組運算,就能夠在程序代碼中發現量綱錯誤,具有良好的實用性和可擴展性,可以有效適用于多種規模程序的量綱檢測。

 

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产成人av| 久久成人综合视频| 亚洲一区二区精品| 日韩视频在线一区二区三区| 在线观看成人网| 经典三级久久| 激情小说另类小说亚洲欧美| 国产一区二区三区四区| 国产午夜精品全部视频在线播放| 国产精品嫩草影院一区二区| 国产精品xxx在线观看www| 欧美色视频在线| 欧美色视频在线| 国产精品久久久久久久久借妻| 欧美日韩亚洲视频| 国产精品av免费在线观看 | 国产精品日本一区二区| 国产精品久久| 国产精品视频专区| 国产美女在线精品免费观看| 国产欧美日韩伦理| 国产无遮挡一区二区三区毛片日本| 国产日韩一区欧美| 黄色在线成人| 亚洲精品国产品国语在线app| 日韩一级免费观看| 亚洲视频免费在线观看| 亚洲欧美第一页| 欧美一级视频免费在线观看| 久久国产天堂福利天堂| 亚洲精品乱码久久久久久日本蜜臀| 亚洲精品中文字幕女同| 中国日韩欧美久久久久久久久| 亚洲一区网站| 久久久久久久一区二区| 麻豆精品视频在线观看视频| 欧美不卡在线| 欧美三区美女| 国产日韩一区| 亚洲激情在线激情| 中文高清一区| 欧美制服第一页| 亚洲人成人77777线观看| 亚洲视频欧美视频| 欧美在线视频导航| 乱中年女人伦av一区二区| 欧美电影免费观看高清| 欧美午夜欧美| 国产一区二区三区丝袜| 亚洲日本在线观看| 亚洲免费影视| 亚洲人成77777在线观看网| 亚洲午夜久久久久久久久电影网| 欧美影院久久久| 母乳一区在线观看| 国产精品国产三级国产aⅴ入口| 国产亚洲精品v| 亚洲精品久久在线| 香港久久久电影| 一本久久综合亚洲鲁鲁五月天| 午夜日韩视频| 欧美大片免费观看在线观看网站推荐| 国产精品s色| 一区福利视频| 亚洲专区一区| 亚洲美女91| 久久精品欧美日韩精品| 欧美激情一区在线观看| 国产欧美一区二区精品仙草咪| 亚洲第一中文字幕在线观看| 亚洲视频网在线直播| 亚洲国产精品一区二区第一页 | 欧美一级在线视频| 一本色道88久久加勒比精品 | 久久在线精品| 国产精品成人免费| 亚洲大片精品永久免费| 亚洲欧美日韩成人| 在线亚洲国产精品网站| 久久亚洲国产成人| 国产精品美女诱惑| 亚洲人成毛片在线播放| 久久国产精品一区二区三区| 亚洲一区国产| 欧美激情视频在线播放| 国产日韩一区二区三区在线| 一本一本久久| 日韩一级视频免费观看在线| 久久―日本道色综合久久| 国产精品捆绑调教| 亚洲精品日韩在线| 亚洲人成欧美中文字幕| 久久精品视频亚洲| 国产精品porn| 日韩视频专区| 日韩西西人体444www| 麻豆成人综合网| 国产一区二区剧情av在线| 国产精品99久久不卡二区| 99精品视频免费观看| 免费观看成人| 在线成人激情| 欧美专区亚洲专区| 久久成人精品电影| 国产乱理伦片在线观看夜一区| 一区二区动漫| 亚洲一区二区精品视频| 欧美日韩99| 91久久精品日日躁夜夜躁国产| 亚洲国产成人精品视频| 久久久久久久97| 国产日韩专区| 性做久久久久久久免费看| 午夜欧美大片免费观看| 国产精品日韩欧美大师| 亚洲午夜精品网| 亚洲欧美视频一区| 国产精品美女午夜av| 亚洲私人影吧| 性亚洲最疯狂xxxx高清| 国产欧美欧美| 欧美一级黄色录像| 久久久免费精品| 狠狠综合久久av一区二区小说| 欧美一级播放| 久久中文精品| 在线看片成人| 亚洲精品中文字幕有码专区| 欧美经典一区二区三区| 亚洲精一区二区三区| 中文av一区二区| 欧美午夜激情在线| 亚洲视频播放| 久久国产一区二区三区| 国色天香一区二区| 亚洲精品一二三区| 欧美日韩一区二区三区免费| 一区二区三区四区精品| 欧美一区二区视频免费观看 | 久久精品国产77777蜜臀| 久久综合影音| 最近中文字幕日韩精品| 一本一本a久久| 国产精品毛片一区二区三区 | 久久黄金**| 欧美国产日韩一区二区| 99精品热视频只有精品10| 午夜精品久久久久久久久久久久久| 国产精品视频一区二区高潮| 久久99在线观看| 欧美大片在线看免费观看| 夜夜爽夜夜爽精品视频| 欧美一区三区二区在线观看| 黄色成人av网| 一区二区三区色| 国产精品日韩欧美一区二区| 欧美在线三区| 欧美精品v国产精品v日韩精品| 一级成人国产| 久久人体大胆视频| 亚洲精品视频免费| 亚欧成人在线| 亚洲国产一区二区三区青草影视| 亚洲午夜女主播在线直播| 国产麻豆成人精品| 亚洲人成毛片在线播放| 国产精品久久久久久久久久直播 | 亚洲美女在线视频| 国产精品videosex极品| 久久丁香综合五月国产三级网站| 欧美国产第二页| 亚洲免费综合| 欧美激情综合五月色丁香| 亚洲一区二区动漫| 欧美成人一区二免费视频软件| 亚洲桃花岛网站| 开心色5月久久精品| 中日韩高清电影网| 欧美成人蜜桃| 亚洲欧美综合国产精品一区| 欧美xart系列高清| 午夜精品久久久久久久99黑人| 欧美高清在线精品一区| 亚洲欧美久久| 欧美日韩精品免费观看视频| 欧美一级艳片视频免费观看| 欧美日韩一区二区在线观看| 久久激情视频免费观看| 国产精品极品美女粉嫩高清在线 | 亚洲国产精品成人一区二区| 午夜亚洲福利在线老司机| 亚洲国产一区二区三区高清| 久久黄色网页| 在线视频欧美一区| 欧美成人免费网| 欧美亚洲综合网| 欧美体内she精视频| 亚洲欧洲日本专区| 国产亚洲成年网址在线观看| 亚洲一区影音先锋|