developer tip

Javascript 엔진 테일 호출이 최적화되어 있습니까?

optionbox 2020. 9. 6. 09:29
반응형

Javascript 엔진 테일 호출이 최적화되어 있습니까?


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


ECMAScript 4 사양은 원래 TCO에 대한 지원을 추가 할 예정 이었지만 삭제되었습니다.

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

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

http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization

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


현재로서는 기쁨이 없지만 고맙게도 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 현재 버전의 호환성 테이블에 더 이상 나열되지 않습니다.

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


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

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

https://gist.github.com/mcfedr/832e3553964a014621d5

clang이 C에서 동일한 함수를 컴파일 한 방법과 비교하십시오.

https://gist.github.com/mcfedr/63ad08370d856bad3694

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

참고 URL : https://stackoverflow.com/questions/3660577/are-any-javascript-engines-tail-call-optimized

반응형