我正在评估代码生成在我的飞行模拟项目中的使用。更具体地说,要求允许“普通工程师”(我本人无意冒犯)以比 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 语言的灵 active 很重要,因此描述符语言旨在仅定义模型类定义和实现的某些部分。通过这种方式,一名工程师使用上述描述符语言提供模型,维护工程师将添加所有代码以从文件中读取参数、开始/停止/暂停模拟的执行以及如何实例化具体对象。
我的第一个想法是从描述 rune 件生成两个文件:一个包含声明的 .h 文件和一个包含某些函数的实现的 .cpp 文件。这些然后需要在适当的地方#included
[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"
有什么想法或建议吗?
编辑1:
我想澄清一下,存在一个框架来表达微分方程和动态系统的(实时)模拟。问题在于,大多数具有领域知识的工程师对使用 C++ 非常犹豫。事实上,我们希望为他们提供一种更简单的方式来贡献自己的部分(数学公式),同时保留 C++ 的灵 active 。
当然可以使用 MEX 编译器从 MATLAB/Simulink 模型生成 C 代码,但我们希望避免相关的许可费用。
重构整个事情以使用通用脚本语言可能超出可用劳动力的范围。此外,就我现在掌握的情况而言,这还需要工程师学习一种脚本语言。我还不相信这会比上面举例说明的语法更容易。
EDIT2:接受的答案
我接受 Richard Harrison 给出的答案,因为他与自定义代码生成器分享了他的经验。我还将考虑有关脚本接口(interface)的提示,尽管我恐怕没有时间将所有这些作为我论文的一部分来实现。尽管如此,这些指示可能有助于说服我的同事考虑更连贯的类层次结构。非常感谢!
最佳答案
这种方法的问题在于,只有当代码由 C++ 编译器实际编译时,才会检测到数学语法中的任何错误。在这一点上,很难给出与规范语言中特定错误行相关的良好错误消息。因此,除非您的规范语言处理器也对规范执行语法和语义检查(即它至少是规范语言的部分编译器),否则我不会采用这种方法。
关于c++ - 如何最好地集成生成的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983672/