специфичный для встроенного домена язык для генерации кода Java - PullRequest
4 голосов
/ 28 апреля 2011

Я работаю над программой, которая выполняет матричные и векторные операции на Java. Многократный вызов функции и создание объекта, которое происходит в моей текущей реализации, делает его вялым и трудным для понимания.

Например, я хочу обновить положение механической точки путем интеграции скорости:

void update(Vector3 position, Vector3 speed, float dt){
   Vector3 displacement = new Vector3(speed);
   displacement.assignMul(dt);
   position.assignAdd(displacement);
}

Здесь API не является естественным, и, кроме того, мне нужно выделить для сборки новую ссылку на Vector3. Очевидно, я измерил значительное улучшение производительности в реальном случае использования при вставке вычислений следующим образом:

void update(Vector3 position, Vector3 speed, float dt){
   position.x += speed.x * dt;
   position.y += speed.y * dt;
   position.z += speed.z * dt;
}

Существует ли какой-либо инструмент, который может генерировать этот код из языка, специфичного для домена, по требованию? Cog-подобный синтаксис был бы хорош. (Cog - это инструмент генерации кода от Неда Батчелдера)

void update(Vector3 position, Vector3 speed, float dt){
   // [[[DSL position += speed * dt ]]] 
   position.x += speed.x * dt;//Generated Code
   position.y += speed.y * dt;//Generated Code
   position.z += speed.z * dt;//Generated Code
   // [[[END]]]
}

1 Ответ

1 голос
/ 01 мая 2011

Если вы в восторге от генерации кода, я очень рекомендую книгу Шаблоны языковой реализации от Terence Parr. Он показывает, как вы создадите абстрактное синтаксическое дерево (AST) на основе вашего DSL и затем используйте правила перезаписи для генерации кода.

Кроме того, он использует векторный DSL в качестве одного из своих примеров, включая показ того, как вы можете распределять постоянные умножения в синтаксическом дереве. например Simplification of a vector DSL.  Page 141 of Language Implementation Patterns by Terence Parr

Соответствующим разделом для вас будет Глава 15, Сопоставление древовидных шаблонов.

Я согласен с некоторыми другими постерами, что это может быть немного тяжелым для ваших целей. Вы уверены, что не можете реализовать более гибкий интерфейс, как @Alessandro Vermeulen показал в своем комментарии ? Разница в скорости выглядит довольно незначительной.

...