加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:25:13 所属栏目:Java 来源:网络整理
导读:我正在研究一个用 Java执行矩阵和向量运算的程序.在我当前的实现中发生的多函数调用和对象创建使其变得迟缓且难以理解. 例如,我想通过速度积分更新机械点的位置: void update(Vector3 position,Vector3 speed,float dt){ Vector3 displacement = new Vector
我正在研究一个用 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,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,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),然后使用重写规则来生成代码.

此外,他使用矢量DSL作为他的一个例子,包括展示如何在语法树中分配常数乘法.例如

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读