我正在开发一个用 Java 执行矩阵和 vector 运算的程序。在我当前的实现中发生的多个函数调用和对象创建使其缓慢且难以理解。
例如我想通过速度积分更新机械点的位置:
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]]]
}
最佳答案
如果您热衷于代码生成,我强烈推荐这本书 Language Implementation Patterns by Terence Parr.他展示了如何基于 DSL 创建抽象语法树 (AST),然后使用重写规则生成代码。
此外,他还使用 vector DSL 作为他的示例之一,包括展示如何在语法树中分布常量乘法。例如
与您相关的部分是第 15 章,树模式匹配器。
我同意其他一些发帖者的观点,即对于您的目的而言,这可能有点重。你确定你不能像@Alessandro Vermeulen 在他的 gist comment 中展示的那样实现更流畅的界面吗? ?速度差异看起来可以忽略不计。
关于java - 内联领域特定语言以生成 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5819367/