您的位置 首页 电源

根据模板元编程的量纲检测办法

量纲误用在科学计算程序中是一种常见的错误,然而程序设计语言的标准类型系统却对此无能为力。物理方程中的量纲错误可以手工分析出来,然而求解物理方程的计算机程序中的量纲错误却难以被发现,因为

量纲误用在科学核算程序中是一种常见的过错,但是程序规划言语的规范类型体系却对此力不从心。物理方程中的量纲过错能够手艺剖析出来,但是求解物理方程的核算机程序中的量纲过错却难以被发现,因为核算程序往往很杂乱。例如,一些研究者以为火星气候勘探卫星的丢掉,是因为程序中把一个英制单位的变量传递给了运用公制单位的模块。因而,量纲的正确性对核算成果的正确性十分重要。

  近年来,研究者们提出了一些量纲检测办法,典型的如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++程序,无需保护多套程序代码,也无需进行杂乱的解方程组运算,就能够在程序代码中发现量纲过错,具有杰出的实用性和可扩展性,能够有用适用于多种规划程序的量纲检测。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/197308.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部