“数学函数动态编译器TCompile类”的bug跟踪、新版源代码下载 HouSisong@GMail.com 2007.06.17
tag: 函数动态编译,TCompile,胜天财务进销存
2002年的时候在网上共享了“数学函数动态编译器TCompile类”,它可以在程序运行过程中动态完成数学函数表达式字符串的编译执行(动态生成机器码执行,不是解释执行);从那以后代码就很少更新了;而最近来邮件询问这个库的人越来越多起来; 网上查询了一下,发现“TCompile类”被《...Delphi优秀免费资源》文章收录;网上有名的开放源代码的《胜天财务进销存》收录(其中的Compile_Calc.pas单元); ... 很多人已经把它使用到了一些关键的计算领域,所以就有了这篇文章;
"数学函数动态编译器TCompile类"是我在学习Delphi的过程中写的,命名、代码风格和框架设计都不是很好,当时写它的首要需求是快速的计算;建议现在在使用这个类的用户下载最新版本的TCompile类的源代码;(由于源代码有7千多行,就不贴在该文章里了 见文章后面的下载链接)(新版本默认使用Double数据类型,如果需要兼容以前的Extended类型,需要把 //{$DEFINE FloatType_Single} {$DEFINE FloatType_Double} //{$DEFINE FloatType_Extended} 这几行改写为: //{$DEFINE FloatType_Single} //{$DEFINE FloatType_Double} {$DEFINE FloatType_Extended} )对于用于关键性计算领域的用户建议关闭TCompile的优化(属性EnabledOptimizeDiv/EnabledOptimizeStack/EnabledOptimizeConst都设置为false)
用户如果遇到TCompile类的bug请给个回帖或发邮件给我,我会把bug和修正情况在该文章中更新;
附:“数学函数动态编译器TCompile类”的使用Demo: var Compilation : TCompile; // 声明Compilation为数学函数动态编译器TCompile类的实例 str : string; xValue : TCmxFloat; begin Compilation:=TCompile.Create; //创建类 try str:='x+sin(y*PI/2)*3'; Compilation.SetText(str); //str为要求值的数学表达式字符串 ...... //如果有参数,可以获得参数地址,并赋值 (默认值为0) //如: PTCmxFloatX:=Compilation.GetParameterAddress('x'); //如: PTCmxFloatY:=Compilation.GetParameterAddress('y'); // PTCmxFloatX^:=1.5; // PTCmxFloatY^:=0.5; //也可以一次获得所有的参数列表:Compilation.GetParameterList(PList); ...... xValue:=Compilation.Value; //获得表达式的值, //可以多次改变参数值并多次调用(如放在循环中),这样才能显示出效率:) ...... finally Compilation.Free; //释放类 end; end;
最新的“数学函数动态编译器TCompile类”源代码下载:
http://download.csdn.net/source/202002
(TCompile类在"Compile/SDK/Delphi/Compile_Hss.pas"文件)
bug和修正列表:
2005.08.05更新
-- 已知使用最早发布的TCompile的代码Power函数(指数函数)的实现有一个优化错误,该错误发生在Power(B,N),当B是一个带参数的表达式,而N属于[0,1,2],并且EnabledOptimizeConst属性为打开状态的情况下;