reflection - 元编程是反射的一个子集吗?

标签 reflection metaprogramming terminology

我曾经认为元编程涉及修改程序,并且(就像What is reflection and why is it useful?的一些答案一样)反射仅仅包括对程序的内省(introspection)。然而,反射标签维基说

Reflection is the process by which a program can observe and modify its own structure and behavior at runtime.

Reflection is the process by which a program can perform introspection. This introspection usually involves the ability to observe and modify its own structure and behavior at runtime. From theoretical perspective reflection relates to the fact that program instructions are stored as data. The distinction between program code and data is a matter of how the information is treated. Hence programs can treat their own code as data and observe or modify them.

[强调]

元编程的描述是

Metaprogramming is writing programs that write or manipulate other programs as their data.

Metaprogramming is useful because it can save programmers valuable time. Some languages have support to metaprogram themselves and this allows to create code with great expressive power.

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

这会让元编程仅仅是反射的一个子集吗?

或者这些术语是否不同,因为某些编程语言是由另一种语言进行元编程的,在这种情况下会发生元编程但不会发生反射? (metaprogramming Wikipedia article 中有一个未引用的句子声称这一点)

或者术语“反射”和“元编程”的使用是否会根据人们使用的编程语言的不同而有所不同?

最佳答案

没有。相反,反射提供的功能是元编程功能的一个子集。

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

我理解的反射是程序查询自身结构的能力。在我见过的几乎所有可以进行反射的系统中(Lisp 及其等效变体的真正异常(exception)情况),反射机制仅提供了有限的内省(introspection)手段。 Java 和 C# 可以让你找到类和方法的名称,但你不能向这些系统询问方法、语句或局部声明的内容。您也不能要求大多数此类反射语言实际更改其结构,也就是说,您不能使用反射工具添加新的类或字段。大多数语言(例如 C++)基本上没有内置的“反射”能力。虽然内置于语言中的反射实用程序可能很有用,但相对于语言设计者/编译器构建者决定在运行时保留的内容而言,它们往往是特殊的。

如果你超越语言以及语言设计者内置的一组限制,你最终会获得更强大的“反射”能力。一个真正好的元编程系统可以访问整个程序结构,因此可以回答有关程序结构的任意问题(模图灵限制)。

例如,我们的 DMS Software Reengineering Toolkit是一个程序转换工具,可以完全访问程序的抽象语法树以及由各种DMS language front ends派生的许多其他事实。 。因此,DMS 可以相当任意地“反射(reflect)”(检查/分析/推理)它正在处理的语言。它可以对 C、COBOL、Java、C# 和 C++ 执行此操作;对于其中许多语言,它不仅可以提供对 AST 的访问,还可以提供对符号表信息以及各种形式的控制和数据流的访问,这是我见过的反射工具所没有提供的。

此外,像DMS这样的程序转换工具可以根据“反射”修改代码来生成新代码、优化、重组、检测......这种方式可以实现的各种效果是范围之广令人惊讶。

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

关于reflection - 元编程是反射的一个子集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641881/

相关文章:

c# - 带有可为空参数的 Type.InvokeMember

python - 类声明内部调用的函数如何?

design-patterns - 这种反模式叫什么?

javascript - 什么叫没有服务器端的纯 JavaScript 独立(网络)应用程序?

javascript - 延迟加载外部 Javascript 文件

java - I/O 和控制台 I/O 区别

java - 如何在Java中创建通用数组?

java - 如何使用反射访问对象中的字段值

C#反射,获取重载方法

c++ - 惰性评估