복붙노트

[SCALA] 어떻게 스칼라에서 패턴 매칭은 바이트 코드 수준에서 구현됩니다?

SCALA

어떻게 스칼라에서 패턴 매칭은 바이트 코드 수준에서 구현됩니다?

어떻게 스칼라에서 패턴 매칭은 바이트 코드 수준에서 구현됩니다?

그것은 구조, 또는 뭔가 다른 경우 (푸 instanceof를 x)는 일련의 같은가요? 성능에 미치는 영향은 무엇입니까?

예를 들어, (스칼라으로 예 페이지 46-48)에서 다음 코드를 부여하는 방법을 것 같은 평가 방법 모양에 해당하는 자바 코드?

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)
}

추신 바이트 코드 표현 나를 위해 충분히 좋은 것, 그래서 나는, 자바 바이트 코드를 읽을 수 있지만, 다른 독자는 자바 코드로 어떻게 보이는지 아는 아마 더 좋을 것입니다.

P.P.S. 스칼라에서 책 프로그래밍이와 스칼라 구현 방법에 대해 비슷한 질문에 대한 답변을 제공합니까? 나는 책을 주문했지만 아직 도착하지 않았다.

해결법

  1. ==============================

    1.낮은 레벨은 디스어셈블러로 탐구하지만 짧은 대답은 술어 패턴에 따라 다릅니다 경우 /를 elses의 무리가 있다는 것입니다 수 있습니다

    낮은 레벨은 디스어셈블러로 탐구하지만 짧은 대답은 술어 패턴에 따라 다릅니다 경우 /를 elses의 무리가 있다는 것입니다 수 있습니다

    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
    

    이 당신이 "경우 푸 (45, X)"와 같은 같은 패턴이나 패턴과 조합 할 수있는 더 많은,하지만 일반적으로 사람들은 내가 방금 설명한 것에 불과 논리적 확장입니다. 패턴은 또한 술어에 대한 추가적인 제약 조건이다 가드를 가질 수 있습니다. 이 일을 조금 유착 수있는 경우 사이에 중복이있을 때 컴파일러는 패턴 매칭, 예컨대을 최적화 할 수있는 경우도 있습니다. 고급 패턴과 최적화는 바이트 코드는 스칼라의 현재와 미래의 버전이 기본 규칙보다 실질적으로 개선하면 너무 놀라지 마세요, 컴파일러 작업의 활성 영역입니다.

    모든 이외에, 당신은 경우 클래스에 대한 스칼라의 사용 또는 대신 기본 것들의 추가로 사용자 정의 추출기를 작성할 수 있습니다. 당신이 할 경우, 패턴 일치의 비용은 추출기가하는 어떤의 비용입니다. 좋은 개요는 http://lamp.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf에서 발견된다

  2. ==============================

    2.(위) 제임스는 가장 잘했다. 당신이 궁금 경우, 항상 디스 어셈블 된 바이트 코드에보기에 좋은 운동입니다. 당신은 또한 모든 스칼라 별과 프로그램을 인쇄 할 -print 옵션과 scalac 된 invoke 제거 기능을 할 수 있습니다. 그것은 스칼라의 옷을 자바 기본적입니다. 여기에 코드 관련 scalac의 -print 출력 당신이 준 니펫 :

    (위) 제임스는 가장 잘했다. 당신이 궁금 경우, 항상 디스 어셈블 된 바이트 코드에보기에 좋은 운동입니다. 당신은 또한 모든 스칼라 별과 프로그램을 인쇄 할 -print 옵션과 scalac 된 invoke 제거 기능을 할 수 있습니다. 그것은 스칼라의 옷을 자바 기본적입니다. 여기에 코드 관련 scalac의 -print 출력 당신이 준 니펫 :

    def eval(e: Expr): Int = {
      <synthetic> val temp10: Expr = e;
      if (temp10.$isInstanceOf[Number]())
        temp10.$asInstanceOf[Number]().n()
      else
        if (temp10.$isInstanceOf[Sum]())
          {
            <synthetic> val temp13: Sum = temp10.$asInstanceOf[Sum]();
            Main.this.eval(temp13.e1()).+(Main.this.eval(temp13.e2()))
          }
        else
          throw new MatchError(temp10)
    };
    
  3. ==============================

    3.버전 2.8 이후, 스칼라는 @switch 주석을했다. 목표는 패턴 매칭이 tableswitch 또는 lookupswitch 대신 조건의 일련의 if 문으로 컴파일됩니다 보장하는 것입니다.

    버전 2.8 이후, 스칼라는 @switch 주석을했다. 목표는 패턴 매칭이 tableswitch 또는 lookupswitch 대신 조건의 일련의 if 문으로 컴파일됩니다 보장하는 것입니다.

  4. from https://stackoverflow.com/questions/754166/how-is-pattern-matching-in-scala-implemented-at-the-bytecode-level by cc-by-sa and MIT license