JavaScript에서 구현 한 꼬리 재귀 경로 찾기 알고리즘이 있으며 (모든?) 브라우저에서 스택 오버플로 예외가 발생할 수 있는지 알고 싶습니다.
only
최적화 가 아니라는 점을 덧붙이고 싶습니다 . TCO가있는 하나의 인터프리터 / 컴파일러에 대해 작성된 코드는 아마도 TCO가없는 인터프리터 / 컴파일러에서 작동하지 않기 때문에이를 지원하는 것은 컴파일러 / 인터프리터가 아닌 언어 사양의 일부 여야합니다.
JavaScript에서 구현 한 꼬리 재귀 경로 찾기 알고리즘이 있으며 (모든?) 브라우저에서 스택 오버플로 예외가 발생할 수 있는지 알고 싶습니다.
only
최적화 가 아니라는 점을 덧붙이고 싶습니다 . TCO가있는 하나의 인터프리터 / 컴파일러에 대해 작성된 코드는 아마도 TCO가없는 인터프리터 / 컴파일러에서 작동하지 않기 때문에이를 지원하는 것은 컴파일러 / 인터프리터가 아닌 언어 사양의 일부 여야합니다.
답변:
ECMAScript 4 사양은 원래 TCO에 대한 지원을 추가하려고했지만 삭제되었습니다.
JavaScript에서 더 이상 꼬리 호출이 없습니까?
내가 아는 한 널리 사용 가능한 JavaScript 구현은 현재 자동 TCO를 수행하지 않습니다. 하지만 다음과 같이 유용 할 수 있습니다.
기본적으로 누산기 패턴을 사용하면 동일한 효과를 얻을 수 있습니다.
현재로서는 기쁨이 없지만 고맙게도 Harmony (ECMAScript 버전 6)에 대한 적절한 테일 콜이 예정되어 있습니다. http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
테일 콜 최적화는 향후 ECMAScript 6 엄격 모드에서 지원됩니다. 자세한 내용은 http://www.2ality.com/2015/06/tail-call-optimization.html 을 확인 하십시오 .
현재 엔진 지원은 http://kangax.github.io/compat-table/es6/ 에서 확인하십시오 .
현재 (2019 년 7 월 18 일) 다음 엔진은 테일 호출 최적화를 지원합니다.
"실험용 JavaScript 기능"플래그가 켜져있는 경우 지원 :
테일 호출 최적화는 이제 JavaScript로 컴파일 되는 LispyScript 에서 사용할 수 있습니다 . 여기에서 자세한 내용을 읽을 수 있습니다 .
현재는 꼬리 재귀를 인식하는 JavaScript 구현이 없습니다. ECMAScript 6 에서 변경이 이루어 지고 있으며 다른 사람들이 말했듯이 V8 에 대한 공개 티켓이 있습니다 .
꼬리 재귀 함수에 대해 V8에서 생성 된 어셈블러를 볼 수 있습니다.
Clang 이 C에서 동일한 함수를 컴파일 한 방법과 비교 해보세요.
V8은 재귀 호출을 유지하는 반면 C 컴파일러는 꼬리 재귀를 인식하여 루프로 변경했습니다.