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
'developer tip' 카테고리의 다른 글
| 다른 것 또는 프롬프트에서 Windows 배치 파일을 호출하는 여러 가지 방법. (0) | 2020.09.06 |
|---|---|
| 파이썬에서 좋은 기하학 라이브러리? (0) | 2020.09.06 |
| os.name, sys.platform 또는 platform.system을 언제 사용합니까? (0) | 2020.09.06 |
| Google 포토 용 업로드 API (photos.google.com)가 있습니까? (0) | 2020.09.06 |
| Scala의 기호 리터럴에 대한 몇 가지 사용 사례는 무엇입니까? (0) | 2020.09.06 |