用于生成Java代码的内联域特定语言

时间:2011-04-28 13:27:26

标签: java code-generation dsl-tools dsl

我在一个用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是Ned Batchelder的代码生成工具)

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 个答案:

答案 0 :(得分:1)

如果您对代码生成感兴趣,我强烈推荐本书Language Implementation Patterns by Terence Parr.他将展示如何基于DSL创建抽象语法树(AST),然后使用重写规则生成代码。

此外,他使用矢量DSL作为他的一个例子,包括展示如何在语法树中分配常数乘法。 e.g。Simplification of a vector DSL.  Page 141 of Language Implementation Patterns by Terence Parr

您的相关部分将是第15章,树模式匹配器。

我同意其他一些海报,这可能对你的目的有点重要。您确定无法实现更流畅的界面,因为@Alessandro Vermeulen在gist comment中展示了这个界面吗?速度差异看起来很微不足道。