Специфичный для встроенного домена язык для генерации кода Java
Я работаю над программой, которая выполняет матричные и векторные операции на 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 ответ
Если вам не терпится сгенерировать код, я очень рекомендую книгу " Языковые реализации" от Terence Parr. Он показывает, как вы должны создать абстрактное синтаксическое дерево (AST) на основе вашего DSL, а затем использовать правила перезаписи для генерации кода.
Кроме того, он использует векторный DSL в качестве одного из своих примеров, включая показ того, как вы можете распределять постоянные умножения в синтаксическом дереве. например
Соответствующим разделом для вас будет Глава 15, Tree Pattern Matcher.
Я согласен с некоторыми другими постерами, что это может быть немного тяжелым для ваших целей. Вы уверены, что не можете реализовать более гибкий интерфейс, как показал @Alessandro Vermeulen в своем комментарии? Разница в скорости выглядит довольно незначительной.