【问题标题】:Compile Time Code Generation in DD中的编译时间代码生成
【发布时间】:2011-04-10 14:29:30
【问题描述】:

我目前正在学习 D,我想知道的一件事是 D 是否有办法复制 JVM 语言的代码生成功能。

这是一个场景: 我有一个对象,我想根据该对象生成一个字符串,该对象给出它的名称及其所有字段。在 Java/Scala 中,我可以只使用反射,但假设速度是个问题。我可以使用字节码生成库来动态生成和编译一个无需反射的类。该实现将分解为遍历对象的字段并通过递归获取其名称,并使用该信息动态生成直接访问字段的 Java(或字节码)。

如果您不喜欢这种情况,因为它很弱和/或不切实际,另一种可能更现实的情况是优化对象序列化。

我见过一些例子,其中 D 的编译时评估和/或模板元编程用于在编译时预先计算斐波那契序列和其他递归算法之类的事情,但是有没有办法只用语言和一个编译器,还是需要开发一个单独的代码生成器并在编译器之前运行它才能获得这种功能?

【问题讨论】:

    标签: reflection compiler-construction code-generation d


    【解决方案1】:

    这不仅可以完成,而且在 D2 中实际上已经为您完成了。您所需要的只是一个小型 mixin 将这些从编译时功能转变为运行时功能。

    • 对于类名,您需要做的就是在类的范围内评估typeof(this).stringof

    • 对于所有字段的列表,请尝试__traits(allMembers, typeof(this)),然后过滤掉不是字段的内容(std.traits 将在此处有用)。

    【讨论】:

    • 拜托,你能考虑这个post 吗?
    【解决方案2】:

    字符串混合可以访问它们混合到的命名空间。其中包括this.tupleof,可用于迭代类的字段。序列化模板可能会利用这一点,或者强制用户手动指定要序列化的字段; IE。 class Class : ISerializable { int foo; Forble bar; mixin(genSerialize("foo, bar")); ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多