谁能从语言/环境不可知论的角度解释这两个概念之间的区别?
此外,编程语言是否需要满足一组条件才能进行反思和/或内省?
如果有,这些条件是什么?
维基百科的文章有一个相当不错的总结:
在计算中,类型自检是程序在运行时检查对象的类型或属性的能力。某些编程语言具有此功能。
内省不应与反射混淆,反射更进一步,是程序在运行时操作对象的值、元数据、属性和/或函数的能力。一些编程语言,例如Java,也具有这种能力。
以静态类型、编译的程序为例:
SomeType function foo(int i) {
return new SomeType(i);
}
所有类型都是已知的,并在编译时强制执行,如果程序不满足自己的显式类型约束,它甚至不应该编译。动态编程语言通常不会表现出这种僵化,变量的类型在编译时不一定是已知的。它们可能看起来更像这样:
function foo(i) {
return new SomeType(i);
}
该函数无法保证i
到底是什么,它只是传递它。这可能会也可能不会在某处引起问题,类型系统在这里无济于事。然后,这种错误检查通常被降级为用户空间代码,对于这些代码,此类代码需要自省功能:
function foo(i) {
if (!is_int(i)) {
throw new InvalidArgumentException;
}
return new SomeType(i);
}
内省和反思之间的界限究竟在哪里是值得商榷的。有人可能会说内省是允许代码测试某物是什么的东西("我是什么?"(,而反射是操纵程序结构本身的能力。例如,一个PHP示例:
$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();
上面的代码在创建类 Foo
的新实例时避免运行该类的构造函数。这就是运行时的代码操作。但在实践中,PHP 中的反射 API 也包含内省功能。其中一些能力与"较低"的内省能力可以完成的功能重复。例如:
$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...
if ($obj instanceof Foo) ...
两个片段本质上都做同样的事情,但一个使用反射,另一个使用所谓的内省。如您所见,几乎没有明确的分界线。然而,反思通常比内省更强大。例如,在PHP中,您必须使用反射API来获取有关函数接受的参数类型的信息。这只是"被动"内省,但属于反射API。不过,这主要是实际实施的问题。
简而言之,根据一般定义,要进行内省,程序需要能够在运行时检查自身的部分,并根据此信息执行不同的代码。除此之外的反射程序可以在运行时更改自己的代码执行规则,例如选择不调用构造函数,否则这是语言定义的强制性操作。
是一种由两种技术组成的机制:
内省
程序自我检查的能力
调解
程序自我修改的能力(他的行为或状态(
参考 https://fr.wikipedia.org/wiki/R%C3%A9flexion_(信息(#Introspection_et_intercession
我的参考是一个法语页面,因为英文页面没有直接提到代祷这个词。
类型内省:
编程语言在运行时检查对象的类型或属性的能力。
示例(Java(:
String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
System.out.println("This is an example of type interospection");
}
反射:
编程语言在运行时实现以下目标的能力。
- 类型内省(如上所示(
- 检查和修改对象。
- 等等