我正在评估为我的飞行模拟项目使用代码生成。更具体地说,要求允许“平均工程师”(我自己不是犯罪)来定义描述动态系统的微分方程,而不是C++提供的更自然的语法。这个想法是设计一个抽象描述语言,可以很容易地理解和编辑,从而生成C++代码。这个描述符由建模工程师提供,供实现和维护模拟环境的代码使用。如何最好地集成生成的代码
我有一点是这样的:
model Aircraft has
state x1, x2;
state x3;
input double : u;
input bool : flag1, flag2;
algebraic double : x1x2;
model Engine : tw1, tw2;
model Gear : gear;
model ISA : isa;
trim routine HorizontalFight;
trim routine OnGround, General;
constant double : c1, c2;
constant int : ci1;
begin differential equations
x1' = x1 + 2.*x2;
x2' = x2 + x1x2;
begin algebraic equations
x1x2 = x1*x2 + x1';
end model
它保留从而描述语言是指C语言的灵活性只定义定义的某些部分是重要的,实现的模型类。这样一位工程师就可以从上述示例描述语言中提供模型,维护工程师将添加所有代码以从文件中读取参数,启动/停止/暂停仿真的执行以及具体对象如何实例化。
我的第一个任务是从描述符文件中生成两个文件:一个包含声明的.h文件和一个包含某些函数的实现的.cpp文件。然后这些需要在适当的地方#include
[File Aircarft.h]
class Aircraft
{
public:
void Aircraft(..); // hand-written constructor
void ReadParameters(string &file_name); // hand-written
private:
/* more hand wirtten boiler-plate code */
/* generate declarations follow */
#include "Aircraft.generated.decl"
};
[File Aircraft.cpp]
Aircraft::Aircraft(..) { /* hand-written constructor implementation */ }
/* more hand-written implementation code */
/* generated implementation code follows */
#include "Aircraft.generated.impl"
任何想法或建议?
EDIT1:
我想澄清存在一个框架,以表达该微分方程和动态系统正的(实时)仿真。问题在于大多数具有领域知识的工程师对使用C++非常犹豫。事实上,我们希望为他们提供一个更为经济的方式来贡献自己的一部分(数学公式),同时保留C++的灵活性。
当然有可能使用MEX编译器从MATLAB/Simulink模型生成C代码,但我们希望避免相关的许可证费用。
重构整个事物以使用通用脚本语言可能超出了可用的劳动力范围。而且,就我现在和即时掌握它而言,这要求工程师学习脚本语言。我还不确定这会比上述语法更简单。
EDIT2:接受的答案
我接受理查德·哈里森由于与自定义代码发电机分享他exeprience给出了答案。我也会考虑有关脚本界面的提示,尽管我不想把时间作为我论文的一部分来实现。尽管如此,这些指标可能有助于说服我的同事们考虑更为连贯一致的阶级政体。非常感谢!
表达式解析器肯定会使这个可行。但它有多慢?你难道不会通过这些方程数百万次? – 2010-06-06 12:40:17
使用Modelica定义它,如果您在便宜的滑板公司使用免费编译器,并且如果您有现有的库,则使用它的外部函数接口。 – 2010-06-06 13:46:24
@Hans:好的,我想通过它精确地一次性:先前编译生成的代码。 – Arne 2010-06-07 07:09:14