程序化内省/反思 - 在虚拟机中更容易?

时间:2015-03-05 21:00:22

标签: jvm vm-implementation

什么使程序化内省/反射在虚拟机而不是本机代码中更容易?

我在某处读到VM本质上允许更好的内省/反射功能,但我无法在线找到更多关于它的信息。想知道原因。

2 个答案:

答案 0 :(得分:1)

我认为你的意思是高级语言而不是低级语言而不是虚拟机。

Java和C#等高级语言实现了反射和内省,因此开发人员可以使用这些信息来使用这些信息。

像C这样的语言没有任何预先构建的反射功能。

对于任何语言来说,反射都非常昂贵(耗时),并且不应该在需要非常快的代码中使用。

答案 1 :(得分:0)

程序化内省本质上意味着要检查&检查当前的call stack或当前的continuation。 (阅读Appel的书:使用Continuations进行编译)。

很少有编程语言提供此功能。 Scheme的call/cc表示当前的延续,但没有提供标准的方法来检查它。

当前的调用堆栈可能是可检查的(例如,请参阅GCC __builtin_return_address作为临时示例)。

大多数编译器(但不是全部)都没有简单的方法来提供有关当前调用帧布局的信息(但是,调试器DWARF格式包含它)。

优化编译器(例如C语言)通常不允许访问调用帧中某些局部变量的偏移量(即使编译器计算此偏移量)。顺便说一下,相同的堆栈槽可能会被重用于不同的变量;阅读register spilling

另见J.Pitrat的CAIA系统 - 生成的C代码能够组织堆栈以便能够检查它;

在像JVMNekoVMParrot这样的字节码虚拟机中,内省更容易,因为每个局部变量在调用帧中都有一个定义良好的插槽。大多数编译语言(例如C或C ++)都不是这种情况,因为编译器能够重用(出于优化目的)某些插槽,甚至只将变量放在某个机器寄存器中,甚至不需要分配任何调用堆栈插槽来溢出它。