InvokeDynamic 参数的动态类型

Dynamic Type of InvokeDynamic Arguments

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

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

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

invokedynamic的重点不是JVM要实现动态类型系统。这将是一个巨大的变化,它会影响 JVM 的许多部分,甚至在不使用该功能的地方也可能导致性能下降,而好处微乎其微:毕竟,每种动态语言对类型系统都有不同的想法。

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

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