【问题标题】:Dynamic Type of InvokeDynamic ArgumentsInvokeDynamic 参数的动态类型
【发布时间】:2015-09-30 18:32:49
【问题描述】:

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

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

【问题讨论】:

    标签: java jvm java-8 invokedynamic


    【解决方案1】:

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

    【讨论】:

    • 那么它将如何帮助 JVM 上的动态语言呢?这不是像......打败了invoke*dynamic*的全部观点吗?
    • 我不会这么说的。这个问题相当广泛,但简而言之,invokedynamic 主要有助于将方法与具体实现的链接推迟到运行时。
    • 这就是我想要做的。我知道编译器将MethodType(或至少一个签名字符串)传递给引导方法,实际上我什至发现了如何获取参数类型here
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2021-01-15
      • 1970-01-01
      • 2021-12-24
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多