- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我曾经认为元编程涉及修改程序,并且(就像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/
我正在执行大型 ffdf 对象的子集,我注意到当我使用 subset.ff 时,它会生成大量 NA。我通过使用 ffwhich 尝试了另一种方法,结果要快得多,并且没有生成 NA。这是我的测试: li
我对 Prolog 有点陌生。我正在尝试编写一个函数subset(Set, Subset) 来确定Subset 是否是Set 的子集(duh)。另外,如果第二个参数没有实例化,它应该输出每个可能的子集
一、题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 二、示例 输入:nums = [1,2
我想从数据帧的操作中排除一列。当然,我可以在没有要排除的列的情况下复制数据框,但这似乎是一种解决方法。我认为必须有一种更简单的方法来进行子集化。 所以这个示例代码应该显示我在做什么。 df colMe
我有一个 SpatialPolygonsDataFrame我通过使用 readOGR 读取 shapefile 创建的在 rgdal包裹。我正在尝试使用它来使用 spsample 生成采样网格在 sp
我想解决一个简单的问题,但即使我尝试了很多不同的方法,我也找不到解决方案。我正在使用 SICStus Prolog (如果这很重要),并且我想获取列表的所有子列表/子集(我不知道哪个术语是正确的),其
我目前正在使用 shinyTable,它是 HandsonTable (https://github.com/trestletech/shinyTable) 的 shiny 兼容实现。巧合的是,我意识
我正在 Delphi 中构建一个表单,其中包含服务下拉列表和用于选择服务的附加组件网格。我获取的数据来自 API,并且我将服务的数据存储在 ADODataSet 中,如下所示: ID (integer
subset() 函数有问题。如何通过观察次数对我的数据框的一个因子进行子集化? NAME CLASS COLOR VALUE antonio
我想知道是否有任何简单的算法来比较一个散列是否是另一个散列的子集。 例如,如果 $HASH{A} = B; $HASH{B} = C; $HASH{C} = D; $HASH2{A} = B; $HA
这个问题在这里已经有了答案: Array combinations without repetition (1 个回答) 关闭 8 年前。 给定一个数组,如何在 postgresql 中找到一定大小
我有下一个程序。我应该如何在 main 中使用迭代器以显示总和为 0 的子集? 我的程序应该打印: 2 -2 5 -5 # include # include using namespace st
我正在寻找一个可以自定义的 Markdown 解析器,最好是 Javascript。特别是,我想删除使用实际 HTML 标签的选项。我尝试编辑摊牌的来源,但无法弄清楚。 Jquery 集成也很好,尽管
我有一个包含名称列表的文件(引用文件 1): Apple Bat Cat 我有另一个文件(引用文件 2),其中包含名称列表和详细信息引用: Apple bla blaa aaaaaaaaagggggg
我有两个带有排序行的文件。一个文件 (B) 是另一个文件 (A) 的子集。我想找到 A 中不在 B 中的所有行。理想情况下,我想创建一个包含这些行的文件 (C)。这在 Unix 中可能吗?我正在寻找一
我有一个包含肽序列的列的数据框,我只想保留字符串中没有内部“R”或“K”的行。 df1 <- data.frame( Peptide = c("ABCOIIJUHFSAUJHR", "AOFI
这个问题在这里已经有了答案: How to subset matrix to one column, maintain matrix data type, maintain row/column na
假设我有一个列表向量: library(tidyverse) d 2) # A tibble: 5 x 1 x 1 2 3 4 5 最佳答案 应该是 lengt
我自己从来没有运行过javadoc(无论是在命令行还是ant's javadoc task;我将使用ant)——我需要为我编写的库生成一个javadoc。 问题是我的 java 库被组织成几个包,在
假设一个多方加密方案,类似于答案:Encryption with multiple different keys? . 那是。一组键K可以用来破译密文。 有没有办法过期: K'⊆ K 这样 K \ K
我是一名优秀的程序员,十分优秀!