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

时间:2015-03-17 21:22:25

标签: c++ reflection compilation language-agnostic language-design

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

这经常出现在数据序列化中。给定一个类,能够循环遍历其数据成员,获取其方法名称,检索类名,并将所有内容推送到$ DATA_FILE_TYPE将是不可思议的。

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

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

我在任何流行的编译语言中描述的是什么?

1 个答案:

答案 0 :(得分:1)

C,因此C ++建立在基本前提下,你不会为你不能使用的东西买单。#34;

反思需要大量的记账。那些对科学家有用的事情对于一个试图只适合几兆字节RAM的嵌入式系统来说就是谋杀。

这很痛苦,但反思可以在图书馆中实施。我在自己的代码中使用了这样的东西,但仅限于少数需要它的子系统,因为我在甚至异常和普通RTTI太昂贵的系统上运行。

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

编辑:纯编译时解决方案: LEX和YACC / FLEX。通过任何方式向量都没有错,但没有理由不让你的解析器像许多Java生成器那样只是转出序列化函数。