基于模板元编程的量纲检测方法

基于模板元编程的量纲检测方法,第1张

 

  量纲误用在科学计算程序中是一种常见的错误,然而程序设计语言的标准类型系统却对此无能为力。物理方程中的量纲错误可以手工分析出来,然而求解物理方程的计算机程序中的量纲错误却难以被发现,因为计算程序往往很复杂。例如,一些研究者认为火星气候探测卫星的丢失,是因为程序中把一个英制单位的变量传递给了使用公制单位的模块。因而,量纲的正确性对计算结果的正确性非常重要。

  近年来,研究者们提出了一些量纲检测方法,典型的如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的任意次方。如下所示:

  

基于模板元编程的量纲检测方法,第2张

 

  通过下面的程序来使用该模板。

  

基于模板元编程的量纲检测方法,第3张

 

  程序Test.cpp执行完后,会正确输出4的7次方的值,该数值是C++编译器在编译模板元程序时递归计算得到。由于模板元程序完全在编译期间执行,相当于对编译器功能进行扩充,因而利用这种程序进行量纲检测具有良好的可行性。

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2557593.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-06
下一篇 2022-08-06

发表评论

登录后才能评论

评论列表(0条)

保存