c++ - 如何最好地集成生成的代码

标签 c++ code-generation

我正在评估代码生成在我的飞行模拟项目中的使用。更具体地说,要求允许“普通工程师”(我本人无意冒犯)以比 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/

相关文章:

c++ - D3D12 不可避免的泄漏报告

c++ - 为什么这个例子会给出一个段错误?

c++ - unordered_map 中的排序 cmp 函数

java - 我如何测试注释处理器生成的无 .java 源?

java - 有Java语言的Java解析器吗?

msbuild - 如何在 MSBuild 中编译 TypeLite T4 模板

c++ - 将非成员非友元函数优先于成员函数

c++ - 在 `.rodata' 节中引用

c# - 使用 T4 模板生成代码时引用第三方 DLL

c - 在 C 中,将结构作为参数传递给 printf 的预期行为是什么?