java - 内联领域特定语言以生成 Java 代码

标签 java code-generation dsl-tools dsl

我正在开发一个用 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 作为他的示例之一,包括展示如何在语法树中分布常量乘法。例如Simplification of a vector DSL.  Page 141 of Language Implementation Patterns by Terence Parr

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

我同意其他一些发帖者的观点,即对于您的目的而言,这可能有点重。你确定你不能像@Alessandro Vermeulen 在他的 gist comment 中展示的那样实现更流畅的界面吗? ?速度差异看起来可以忽略不计。

关于java - 内联领域特定语言以生成 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5819367/

相关文章:

java - 在运行时 : works in some cases, 获取泛型类型,但在其他运行时获取泛型类型 - 为什么?

java - REST API 在带有 H2 数据库的 Spring Boot Maven 多模块项目中总是抛出 404 错误

msbuild - 在 MsBuild 中转换 TT 文件

java - 哪种语言(在 JVM 上运行)最适合创建 DSL?

api - 为什么 DSL 需要解析工具?

java - 从数组中减去不起作用

java - 不同步共享变量

ruby-on-rails - Rails 生成器传递参数数组

objective-c - 查看@synthesize为getter/setter生成的代码

Prolog:代码生成