首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元编程是反射的子集吗?

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

Stack Overflow用户
提问于 2011-10-03 23:41:53
回答 2查看 4.7K关注 0票数 22

我以前认为元编程涉及修改程序,而且(就像对什么是反射,为什么它是有用的?的一些回答一样),这种反映仅仅是对程序的反思。然而,反射标记wiki表示

反射是程序在运行时可以观察和修改自身结构和行为的过程。 反射是程序可以进行反省的过程。这种内省通常涉及到在运行时观察和修改本身的结构和行为的能力。从理论上看,反射与程序指令作为数据存储的事实有关。程序代码和数据之间的区别在于如何处理信息。因此,程序可以将自己的代码视为数据,并观察或修改代码。

重点增加

元编程的描述是

元编程是编写或操作其他程序作为数据的程序。 元编程很有用,因为它可以节省程序员宝贵的时间。有些语言支持元程序本身,这允许创建具有强大表达能力的代码。

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

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

或者这些术语是不同的,因为有些编程语言是由另一种语言进行元编程的,在这种情况下,元编程是发生而不是反射的吗?(在“元编程维基百科文章”中有一句未加解释的句子声称这一点)

或者,“反射”和“元编程”这两个术语的使用方式取决于人们使用的是哪种编程语言?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-06 05:22:11

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

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

正如我所理解的,这是一个程序询问自己结构的能力。实际上,在我所见过的所有系统中,反射都是可能的(特别是Lisp和类似的变体),反射机制只提供了有限的内省手段。Java和C#将允许您查找类和方法的名称,但您不能向这些系统询问方法、语句或本地声明的内容。您也不能要求大多数这样的反射语言实际改变它们的结构,也就是说,您不能使用反射工具添加新的类或字段。大多数语言(如C++)基本上没有内置的“反映”能力。虽然内置于langauges中的反射实用程序可能很有用,但它们往往与语言设计人员/编译器构建人员决定在运行时保持的特性有关。

如果您走出语言和语言设计人员内置的一组限制,您最终将拥有更强大的“反射”功能。一个非常好的元编程系统可以访问整个程序结构,因此可以回答有关程序结构的任意问题(模块化图灵限制)。

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

另外,像DMS这样的程序转换工具可以根据“反射”来修改代码,以生成新代码、优化、重构、仪器、.以这种方式实现的各种效果令人惊讶地广泛。

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

票数 19
EN

Stack Overflow用户

发布于 2011-10-22 21:08:35

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

您可以考虑阅读雅克·皮特拉关于人造人-有意识机器的良知的书,这本书详细解释了为什么这是有用的以及如何实现它。另见他的博客

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7641881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档