动态类型的InvokeDynamic参数

时间:2015-07-12 11:39:16

标签: java jvm java-8 invokedynamic

为了支持动态类型和方法调度,我的编程语言引入了一个名为dynamic的类型。在类型为dynamic的被调用者上调用方法时,编译器首先推送被调用者和堆栈上的所有参数,然后生成invokedynamic指令而不是正常的invoke*指令。该指令指向名为DynamicLinker的类中的特殊引导方法,但只有静态类型在调用时才可用。

我的问题:如何获取传递给invokedynamic指令的参数的运行时类型?

2 个答案:

答案 0 :(得分:3)

invokedynamic“dynamic”部分并不意味着方法参数可以具有动态类型。这意味着invoke指令的行为可以自定义。 invokedynamic参数的确切类型在编译时是已知的。

答案 1 :(得分:2)

invokedynamic的重点不在于JVM将实现动态类型系统。这将是一个巨大的变化,会影响JVM的许多部分,并且可能会导致性能下降,即使在没有使用该功能的地方也是如此,效果非常小:毕竟,每种动态语言对类型系统都有不同的想法。

相反,invokedynamic允许实现动态类型系统。您可以完成JVM和热点优化器所做的事情,但使用您自己的语义。因此,您正在实现动态方法调用调度程序,就像没有invokedynamic一样。在第一次调用时,您将链接到该动态调度程序,该调度程序将使用参数的运行时类型来查找目标。但它也可能记录目标,如果它发现某个特定的调用站点具有单态行为,它的目标可能会被重定向到优化的调度程序,甚至可能直接重定向到目标方法,具体取决于您如何防止以后的变化。行为。例如,如果运行时将检测相关不变量的无效,例如,通过将新类型加载到运行时,您可以将调用站点直接链接到目标,并在事件使目标无效时再次更改目标。或者您将调用指向一个sentinel代码,该代码在执行之前检查优化调用的前提条件,假设检查已知前置条件比完全动态查找更快。

如上所述,这与优化技术类似,JVM将自身用于带有Java语义的调用。但是您可以控制现有类型的调用以及如何解决它们。当然,你可以在没有invokedynamic指令的情况下实现所有这些,使用建模你的类型系统的普通对象结构,但是,invokedynamic指令允许你告诉JVM调用者和被调用者的语义然后可以由HotSpot优化器用于在它们之间建立直接链接。