为什么许多编译语言不包含编译时反射?

Why don't many compiled languages include compile time Reflection?

我正在为将来可能的数据序列化程序研究这个主题。我很困惑为什么许多流行的语言(主要是 C++,但也有 Rust)不认为编译时反射是需要支持的东西。

这在数据序列化中经常出现。给定一个 class,循环访问其数据成员、获取其方法名称、检索 class 名称并将所有这些推送到 $DATA_FILE_TYPE 的能力将是不可思议的。

我是站在科学家的角度问的。我经常处理许多不同的硬件。存储数据很便宜,而实验则不然。能够干净地保存结构和 classes,并为数据格式编写一次序列化器和反序列化器,然后不用担心更改 classes 将是惊人的。

ROOT 是编译时反射好处的一个很好的例子。虽然它使用元编译器程序在第一遍读取源代码,但理想情况下它不必这样做。现在是 2015 年,对于许多人来说,无法为他们选择的数据格式(HDF5、JSON、TXT、..)编写类似 ROOT 的库感到沮丧。

我所描述的内容是否可以用任何流行的编译语言实现?

C 以及 C++ 是建立在基本前提 "you don't pay for what you don't use" 之上的。

反思需要大量的簿记工作。对科学家有用的东西对于试图只装几兆字节 RAM 的嵌入式系统人员来说可能是谋杀。

这很痛苦,但是可以在库中实现反射。我在我自己的代码中使用了这样的东西,但只用于需要它的少数子系统,因为我 运行ning 在甚至异常和普通旧 RTTI 都太昂贵的系统上。

至于解决方法:你可以看看QT。它是 C++ 的框架。它提供 运行 时间元数据以及许多其他内容。

编辑:纯编译时解决方案: LEX 和 YACC/FLEX。向量无论如何都没有错,但没有理由不让你的解析器像许多 Java 生成器那样直接转储序列化函数。