[javascript] JavaScript 엔진 꼬리 호출 (TCO)이 최적화되어 있습니까?

JavaScript에서 구현 한 꼬리 재귀 경로 찾기 알고리즘이 있으며 (모든?) 브라우저에서 스택 오버플로 예외가 발생할 수 있는지 알고 싶습니다.



답변

ECMAScript 4 사양은 원래 TCO에 대한 지원을 추가하려고했지만 삭제되었습니다.

JavaScript에서 더 이상 꼬리 호출이 없습니까?

내가 아는 한 널리 사용 가능한 JavaScript 구현은 현재 자동 TCO를 수행하지 않습니다. 하지만 다음과 같이 유용 할 수 있습니다.

테일 콜 최적화

기본적으로 누산기 패턴을 사용하면 동일한 효과를 얻을 수 있습니다.


답변

현재로서는 기쁨이 없지만 고맙게도 Harmony (ECMAScript 버전 6)에 대한 적절한 테일 콜이 예정되어 있습니다.
http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls


답변

거의 모든 브라우저에서 “너무 많은 재귀”를 사용합니다. 다음 은 흥미로운 읽을 거리가 될 V8 버그 추적기항목입니다 .

간단한 자기 재귀라면 꼬리 호출 제거를 기대하기보다는 명시 적 반복을 사용하는 것이 가치가있을 것입니다.


답변

테일 콜 최적화는 향후 ECMAScript 6 엄격 모드에서 지원됩니다. 자세한 내용은 http://www.2ality.com/2015/06/tail-call-optimization.html 을 확인 하십시오 .

현재 엔진 지원은 http://kangax.github.io/compat-table/es6/ 에서 확인하십시오 .

현재 (2019 년 7 월 18 일) 다음 엔진은 테일 호출 최적화를 지원합니다.

  • Safari> = 10
  • iOS> = 10
  • 키노 마 XS6
  • Duktape 2.3

“실험용 JavaScript 기능”플래그가 켜져있는 경우 지원 :

  • 노드 6.5
  • Chrome 54 / Opera 41 현재 버전의 호환성 테이블에 더 이상 나열되지 않습니다.


답변

테일 호출 최적화는 이제 JavaScript로 컴파일 되는 LispyScript 에서 사용할 수 있습니다 . 여기에서 자세한 내용을 읽을 수 있습니다 .


답변

현재는 꼬리 재귀를 인식하는 JavaScript 구현이 없습니다. ECMAScript 6 에서 변경이 이루어 지고 있으며 다른 사람들이 말했듯이 V8 에 대한 공개 티켓이 있습니다 .

꼬리 재귀 함수에 대해 V8에서 생성 된 어셈블러를 볼 수 있습니다.

V8이 재귀를 컴파일하는 방법의 예

Clang 이 C에서 동일한 함수를 컴파일 한 방법과 비교 해보세요.

C 컴파일러 테일 재귀의 예

V8은 재귀 호출을 유지하는 반면 C 컴파일러는 꼬리 재귀를 인식하여 루프로 변경했습니다.


답변