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

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

本文关键字:编译 反射 包含 许多 语言 为什么      更新时间:2023-10-16

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

这经常出现在数据序列化中。给定一个类,能够循环遍历它们的数据成员、获取它们的方法名、检索类名并将所有这些推送到$data_FILE_TYPE将是令人难以置信的。

我是从一个科学家的角度来问的。我经常处理很多不同的硬件。存储数据很便宜,而实验则不然。能够干净地保存结构和类,并为数据格式编写一次序列化程序和反序列化程序,这样就不用担心更改类了,这将是令人惊叹的。

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

我所描述的内容在任何流行的汇编语言中都可能吗?

C,以及C++,都是建立在"你不为你不使用的东西付费"的基本前提之上的。

反思需要大量的记账工作。对于一个科学家来说有用的事情就是谋杀一个试图只放入几兆RAM的嵌入式系统的家伙。

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

至于解决方案:您可以查看QT。这是C++的一个框架。它提供运行时元数据以及许多其他内容。

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