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

And*_*imm 20 reflection terminology metaprogramming

我曾经认为元编程涉及修改程序,并且(对于什么是反射及其为什么有用?)的一些答案,反思仅仅包括对程序的内省.但是,反射标签维基说

反射是程序在运行时可以观察和 修改自身结构和行为的过程.

反思是程序可以执行内省的过程.这种内省通常涉及在运行时观察和修改自身结构和行为的能力.从理论角度来看,反思涉及程序指令作为数据存储的事实.程序代码和数据之间的区别在于如何处理信息.因此,程序可以将自己的代码视为数据并观察或修改它们.

[强调补充]

元编程的描述是

元编程正在编写编写或操纵其他程序作为其数据的程序.

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

(我认为"写"并不意味着将源代码写入文件,因为这是代码生成.)

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

或者这些术语是不同的,因为某些编程语言是由另一种语言元编程的,在这种情况下,元编程会发生而不是反射?(在维基百科元编程文章中有一个未被引用的句子声称这个)

或者"反射"和"元编程"这两个术语的使用方式会有所不同,具体取决于该人使用的编程语言?

Ira*_*ter 15

相反,反射提供的设施是元编程可以做的一部分.

元编程是"编写程序的程序".这包括阅读程序文本的程序(可以说包括自己但很少见),分析代码并进行更改.是的,它包括将源文本写入文件.代码生成是元编程的一个特例.

我理解的反思是程序能够查询自己的结构.几乎在我看到的每个系统中都可以进行反射(使用Lisp的真正特殊情况和等效变体),反射机制只提供了有限的内省方法.Java和C#将让您找到类和方法的名称,但是您不能向这些系统询问方法,语句或本地声明的内容.你也不能要求大多数这样的反射语言实际上改变它们的结构,也就是说,你不能使用反射设施添加新的类或字段.大多数语言(例如,C++)基本上没有内置的"反映"能力.虽然内置于语言中的反射实用程序可能很有用,但就语言设计人员/编译器构建者决定在运行时保留的内容而言,它们往往是特殊的.

如果你超越语言和语言设计者在其中构建的一系列限制,你最终会得到更强大的"反射"功能.一个非常好的元编程系统可以访问整个程序结构,因此可以回答有关程序结构的任意问题(模数图灵限制).

例如,我们的DMS软件重组工具包是一个程序转换工具,可以完全访问程序的抽象语法树以及各种DMS语言前端派生的许多其他事实.因此,DMS可以"反思"(检查/分析/推理)而不是任意地处理它正在处理的语言.它可以用于C,COBOL,Java,C#和C++; 对于许多这样的语言,它不仅可以提供对AST的访问,还可以访问符号表信息以及各种形式的控制和数据流,这些都没有我见过的反射设施.

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

[由于DMS是作为一组DSL实现的,它实际上可以并且确实有理由("反映")它自己的代码.我们使用DMS从其DSL中合成自身的大部分内容,包括代码生成以及一些非常有趣的优化,包括工作并行化.