在D中编译时间码生成

时间:2010-09-10 06:25:06

标签: reflection compiler-construction code-generation d

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

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

如果你不喜欢那个场景,因为它很弱和/或不切实际,另一个可能更现实的是优化对象序列化。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

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