Reflection 元编程是反射的子集吗?

Reflection 元编程是反射的子集吗?,reflection,metaprogramming,terminology,Reflection,Metaprogramming,Terminology,我曾经认为元编程涉及到修改程序,而且(就像一些答案一样)反射仅仅包括对程序的内省。然而,反射标签wiki说 反射是程序可以观察和处理的过程 在运行时修改它自己的结构和行为 反射是程序可以执行的过程 反省这种自省通常包括以下能力: 在运行时观察并修改它自己的结构和行为。从…起 理论视角的反思涉及到以下事实: 指令作为数据存储。程序代码之间的区别 数据是一个如何处理信息的问题。因此计划 可以将自己的代码视为数据,并观察或修改它们 [重点补充] 元编程的描述如下: 元编程是编写程序来编写或操纵其他程序

我曾经认为元编程涉及到修改程序,而且(就像一些答案一样)反射仅仅包括对程序的内省。然而,反射标签wiki说

反射是程序可以观察和处理的过程 在运行时修改它自己的结构和行为

反射是程序可以执行的过程 反省这种自省通常包括以下能力: 在运行时观察并修改它自己的结构和行为。从…起 理论视角的反思涉及到以下事实: 指令作为数据存储。程序代码之间的区别 数据是一个如何处理信息的问题。因此计划 可以将自己的代码视为数据,并观察或修改它们

[重点补充]

元编程的描述如下:

元编程是编写程序来编写或操纵其他程序 程序作为其数据

元编程很有用,因为它可以节省程序员的宝贵时间 时间有些语言本身支持元程序,这一点 允许创建具有强大表达能力的代码

(我假设“写入”并不意味着将源代码写入文件,因为这就是代码生成。)

这会使元编程仅仅成为反射的一个子集吗

或者是因为某些编程语言是由另一种语言元编程的,在这种情况下,元编程发生,而不是反射,所以术语是不同的?(有一个未加说明的句子声称这一点)


或者“反射”和“元编程”这两个术语的使用是否会因用户使用的编程语言而有所不同?

否。相反,反射提供了元编程功能的子集

元编程是“编写程序的程序”。这包括读取程序文本的程序(可以说包括程序本身,但这是相当罕见的)、分析代码并进行更改的程序。是的,它包括将源文本写入文件。代码生成是元编程的一个特例

据我所知,反射是程序查询自身结构的能力。在我所见过的几乎每一个可以进行反射的系统中(在Lisp和等效变体的真正例外情况下),反射机制只提供了有限的内省手段。Java和C#将让您找到类和方法的名称,但您不能向这些系统询问方法、语句或本地声明的内容。您也不能要求大多数此类反射语言实际更改其结构,也就是说,您不能使用反射功能添加新的类或字段。大多数语言(如C++)基本上没有内置的“反映”能力。尽管内置在Langagues中的反射实用程序可能很有用,但它们往往与语言设计者/编译器构建者决定在运行时保留的内容不同

如果你跳出语言和langauge设计师内置的一系列限制,你最终会拥有一个更强大的“反射”功能。一个真正优秀的元编程系统可以访问整个程序结构,因此可以回答关于程序结构的任意问题(模图灵限制)

例如,我们的是一个程序转换工具,它可以完全访问程序的抽象语法树以及由各种程序派生的许多其他事实。因此,DMS可以相当随意地“反映”(检查/分析/推理)它正在处理的语言。它可以为C、COBOL、java、C++和C++编写;对于许多这样的语言,它不仅可以提供对AST的访问,还可以提供对符号表信息和各种形式的控制和数据流的访问,这是我从未见过的反射工具提供给您的

此外,像DMS这样的程序转换工具可以基于“反射”修改代码,以生成新代码、优化、重构、工具化等。。。通过这种方式可以实现的各种效果出人意料地广泛


[由于DMS是作为一组DSL实现的,它实际上可以并且确实对自己的代码进行推理(“反射”)。我们使用DMS从其DSL中合成其大部分,包括代码生成和一些非常有趣的优化,包括工作并行化。]

反射也可以在执行过程中发生,例如,当程序能够检查自己的调用堆栈(通过查看内部调用帧)时,元编程甚至可以更改已调用的函数(即调用堆栈中帧较低的函数)及其调用帧


你可以考虑阅读Jacques Pitrat的书,其中详细解释了为什么这是有用的,以及它是如何实现的。另请参见。

您说过C#
ava和C中的将让您找到类和方法的名称,但您不能要求这些系统提供方法、语句或本地声明的内容
。这不是真的,你可以得到方法信息,包括它本身的主体实现,它不会用C代码或VB/F,但在MSIL Btw中,这是可能的,从.NET 2.0版本,这是非常旧的(版本2.0于2006年1月22日发布)是的,从C#或Java源代码的角度来看,您可以得到一个很难解释的程序表示。你可以在C++程序中通过处理函数的地址和提取字节序列来做同样的事情。只要付出足够的努力,你就可以了解机器并编写大量的特殊代码,甚至可以找到组成你函数的机器指令,但它们很难解释为源代码。。。。事实上,MS已经为MSIL实现了类似的功能