2015-07-12 82 views
2

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

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

回答

2

“动态”invokedynamic的一部分并不意味着方法参数可以有动态类型。这意味着可以定制invoke指令的行为。编译时知道invokedynamic参数的确切类型。

+0

那么它将如何帮助JVM上的动态语言?难道不像...打败了'invoke * dynamic *'的整个观点? – Clashsoft

+1

我不会这么说。这个问题相当广泛,但简而言之,'invokedynamic'主要有助于延迟方法与具体实现之间的联系,直到运行时。 – apangin

+0

这就是我想要做的。我知道编译器将'MethodType'(或至少一个签名字符串)传递给引导方法,实际上我甚至发现如何获取参数类型[here](https://code.google.com/ p/jsr292-食谱/源/浏览/中继/内联高速缓存器/ SRC/jsr292 /食谱/ ICACHE/RT.java) – Clashsoft

2

invokedynamic的关键不在于JVM要实现动态类型系统。这将是一个巨大的变化,它会影响JVM的很多部分,甚至在不使用该功能的地方也可能会导致性能下降,但效果很小:毕竟,每种动态语言对类型系统都有不同的想法。

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

如上所述,这与优化技术类似,JVM使用自身来调用承载Java语义的调用。但是,您可以控制现有的各种调用以及如何解决它们。当然,你可以使用普通的对象结构来建模你的类型系统,但是你可以通过invokedynamic指令来实现所有这些,但是,invokedynamic指令允许你告诉JVM调用者和被调用者的语义,然后HotSpot优化器可以使用它来做他们之间的直接联系。