문제

사람들은 Clojure 구현이 꼬리 통화 최적화가없는 제한과는 별도로 우수하다고 말합니다.

http://lambda-the-ultimate.org/node/2547

Python에 TCO를 구현하는 것은 희생 될 것이라고합니다.

  • 스택 트레이스 덤프 및
  • 디버깅 규칙 성.

테일 콜 최적화와의 큰 문제가 무엇인지, 파이썬이 필요한 이유를 설명하십시오.

TCO의 JVM 구현을 위해서도 동일한 희생이 이루어져야합니까? 다른 것이 희생되어야합니까?

도움이 되었습니까?

해결책

다르지만 (IL 지침이 이미 존재한다는 점에서) 추가 노력에 주목할 가치가 있습니다. 64 비트 JIT 팀 모든 꼬리 통화를 존중하기 위해 노력해야했습니다.

특히 의견을 부릅니다.

물론 아래쪽은 최적화 된 코드를 디버그하거나 프로파일 해야하는 경우 몇 개의 프레임이없는 것처럼 보이는 통화 스택을 처리 할 준비를해야한다는 것입니다.

나는 JVM이 이것을 피할 수 없을 것 같지 않다고 생각합니다.

꼬리 통화 최적화가 요청 된 상황에서 JIT는 그것이 필수의 스택 오버플로를 피하기 위해 디버그 빌드에서 꺼질 수있는 것은 아닙니다. 흥미로운 부분에 도달하기 전에 충돌하는 경우 디버깅에별로 사용되지 않습니다. '최적화'는 실제로 영구적 인 기능이며 그 영향을받는 스택 추적에 대한 문제입니다.

프로그래머가 스택 작업 (예를 들어 함수 호출)을 개념적으로 설명/이해하는 작업을 수행 할 때 실제 스택 프레임을 생성하는 것을 피하는 최적화는 본질적으로 사용자에게 제시된 내용간에 분리를 일으킬 것임을 지적 할 가치가 있습니다. 스택 추적 및 현실을 디버깅/제공 할 때.
이는 작업을 수행하는 상태 머신의 메커니즘과 더 분리되는 작업을 설명하는 코드가 피할 수 없습니다.

다른 팁

일입니다 지금 진행 중입니다 JVM에 꼬리 통화를 추가합니다. 거기에 위키 페이지 세부 사항에 대해 이야기합니다.

예, 일반적으로 TCO를 구현하면 전체 스택 추적이 발생하지 못하게됩니다. TCO의 요점은 추가 스택 프레임을 생성하지 않기 때문에 불가피합니다.

Clojure는 현재 JVM 버전에서 이러한 제약을 얻을 수있는 스택이 아닌 "recur"기능이 있다는 점에 주목할 가치가 있습니다.

예시:

(defn triangle [n accumulator] 
  (if 
    (<= n 0)  
      accumulator
      (recur (dec n) (+ n accumulator))))

(triangle 1000000 0)

=> 500000500000     (note stack does not explode here!)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top