복붙노트

[SCALA] 스칼라 지원 꼬리 재귀 최적화합니까?

SCALA

스칼라 지원 꼬리 재귀 최적화합니까?

스칼라 지원 꼬리 재귀 최적화합니까?

해결법

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

    1.다른 포스터가 말했듯이 스칼라는, 컴파일시에 꼬리 재귀 최적화를 수행합니다. 즉, 꼬리 재귀 함수는 컴파일러에 의해 루프로 변환된다 꼬리 재귀 함수를 실행할 때와 같은 스택 트레이스로부터 알 수있는, (a 메소드 호출은 점프로 변환된다).

    다른 포스터가 말했듯이 스칼라는, 컴파일시에 꼬리 재귀 최적화를 수행합니다. 즉, 꼬리 재귀 함수는 컴파일러에 의해 루프로 변환된다 꼬리 재귀 함수를 실행할 때와 같은 스택 트레이스로부터 알 수있는, (a 메소드 호출은 점프로 변환된다).

    다음 코드를 사용해보십시오 :

    def boom(n: Int): Nothing = if(n<=0) throw new Exception else boom(n-1)
    boom(10)
    

    스택 추적을 검사합니다. 따라서 컴파일 된 바이트 코드는 재귀하지 않습니다 - 그것은 함수 붐에 한 통화 만 표시됩니다.

    다음 JVM 코드의 단지 컴파일시 최적화가 아닌, 런타임 최적화를 할 수 있기 때문에, 내 의견에 큰 일을 할 것입니다 - - 거기 JVM 수준에서 꼬리 호출을 구현하는 주위에 떠있는 제안이며, 수 가능성이 평균보다 유연한 꼬리 재귀. 기본적으로 tailcall 호출 정상적인 방법 호출 똑같이 행동 것이지만, 그렇게하는 것이 안전 호출자의 스택 떨어질 것이다 - JIT를 일부 정적 코드 분석을 할 수있다, 그래서 JVM의 사양이 스택 프레임이 보존되어야 상태를 스택 프레임이 결코 사용하려고하지 않습니다 있는지 확인합니다.

    그것의 현재 상태는 80 % 프로토이다. 나는 그것이 (invokedynamic이 더 큰 우선 순위를 가지고 있으며, 구현이 거의 완료) 자바 7 시간에 할 것이라고 생각하지 않지만 자바 (8)는 구현 볼 수 있습니다.

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

    2.스칼라 2.8에서는 컴파일러가 최적화 기대하는 구체적인 방법을 표시 @tailrec 사용할 수 있습니다 :

    스칼라 2.8에서는 컴파일러가 최적화 기대하는 구체적인 방법을 표시 @tailrec 사용할 수 있습니다 :

    import scala.annotation.tailrec
    
    @tailrec def factorialAcc(acc: Int, n: Int): Int = {
      if (n <= 1) acc
      else factorialAcc(n * acc, n - 1)
    }
    

    방법을 최적화 할 수없는 경우 당신은 컴파일시 오류가 발생합니다.

  3. ==============================

    3.자기 재귀 스칼라 2.7.x 지원 꼬리 호출 최적화 마지막 방법과 지방의 기능으로 (함수는 자신을 호출).

    자기 재귀 스칼라 2.7.x 지원 꼬리 호출 최적화 마지막 방법과 지방의 기능으로 (함수는 자신을 호출).

    스칼라 2.8은 기술이 상호 재귀 함수를 최적화하는 것입니다 너무 트램 폴린을 지원하는 라이브러리와 함께 올 수 있습니다.

    스칼라 재귀의 상태에 대한 정보의 좋은 거래는 리치 도허티의 블로그에서 확인할 수 있습니다.

  4. ==============================

    4.매우 간단한 경우에 함수는 자기 재귀입니다.

    매우 간단한 경우에 함수는 자기 재귀입니다.

    꼬리 재귀 능력의 증명.

    그것은하지만, 꼬리 재귀 인식을 개선 할 수있는 스칼라 2.8 것 같습니다.

  5. from https://stackoverflow.com/questions/1677419/does-scala-support-tail-recursion-optimization by cc-by-sa and MIT license