Я оцениваю использование генерации кода для моего проекта симуляции полета. Более конкретно, существует требование, чтобы «средний инженер» (без обид я сам) определял дифференциальные уравнения, которые описывают динамическую систему в более естественном синтаксисе, чем 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, поэтому язык дескрипторов предназначен только для определения определенных частей определения и реализации класса модели. Таким образом, один инженер предоставляет модель на языке дескриптора, как показано выше, а инженер по техническому обслуживанию добавит весь код для чтения параметров из файлов, запускает / останавливает / приостанавливает выполнение симуляции и способ создания конкретного объекта. 1006 *
Сначала я должен сгенерировать два файла из файла дескриптора: один файл .h, содержащий объявления, и один файл .cpp, содержащий реализацию определенных функций. Затем они должны быть # включены в соответствующих местах
[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-компилятор для генерации C-кода из моделей MATLAB / Simulink, но мы хотели бы избежать связанных с этим лицензионных сборов.
Рефакторинг всего этого для использования общего языка сценариев, вероятно, выходит за рамки с точки зрения рабочей силы. Кроме того, для этого, насколько я могу понять сейчас и на лету, инженеры также должны изучить язык сценариев. Я еще не уверен, что это будет проще, чем приведенный выше синтаксис.
РЕДАКТИРОВАТЬ 2: Принятый ответ
Я принимаю ответ Ричарда Харрисона из-за того, что он поделился своим опытом с пользовательскими генераторами кода. Я также рассмотрю подсказки, касающиеся скриптовых интерфейсов, хотя я не могу найти время, чтобы реализовать все это как часть моей диссертации. Тем не менее, эти указатели могут помочь убедить моих коллег рассмотреть более последовательную классовую иерархию. Большое спасибо!