gpt4 book ai didi

performance - Scala 中的模式匹配是如何在字节码级别实现的?

转载 作者:行者123 更新时间:2023-12-03 04:36:29 26 4
gpt4 key购买 nike

Scala 中的模式匹配是如何在字节码级别实现的?

它是不是像一系列 if (x instanceof Foo) 结构,还是其他东西?它对性能有何影响?

例如,给定以下代码(来自 Scala By Example 第 46-48 页),eval 方法的等效 Java 代码会是什么样子?

abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr

def eval(e: Expr): Int = e match {
case Number(x) => x
case Sum(l, r) => eval(l) + eval(r)
}

附注我可以读取 Java 字节码,因此字节码表示形式对我来说就足够了,但对于其他读者来说,了解它作为 Java 代码的样子可能会更好。

P.P.S。有本书吗Programming in Scala回答这个问题以及有关 Scala 如何实现的类似问题?我已经订购了这本书,但还没到。

最佳答案

可以使用反汇编程序探索低级别,但简短的答案是,它是一堆 if/else,其中谓词取决于模式

case Sum(l,r) // instance of check followed by fetching the two arguments and assigning to two variables l and r but see below about custom extractors 
case "hello" // equality check
case _ : Foo // instance of check
case x => // assignment to a fresh variable
case _ => // do nothing, this is the tail else on the if/else

您可以使用诸如“case Foo(45, x)”之类的模式和组合来执行更多操作,但通常这些只是我刚才描述的内容的逻辑扩展。模式还可以有守卫,这是对谓词的附加约束。在某些情况下,编译器可以优化模式匹配,例如,当情况之间存在一些重叠时,它可能会稍微合并一些东西。高级模式和优化是编译器中的一个活跃工作领域,因此,如果当前和 future 版本的 Scala 中字节码相对于这些基本规则有了显着改进,请不要感到惊讶。

除此之外,您还可以编写自己的自定义提取器来补充或代替 Scala 用于案例类的默认提取器。如果这样做,那么模式匹配的成本就是提取器所做的任何事情的成本。一个很好的概述可以在 http://lamp.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf 中找到。

关于performance - Scala 中的模式匹配是如何在字节码级别实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com