[java] JVM이 테일 호출 최적화를 방지합니까?

다음 질문에 대한 인용문을 보았습니다 . 웹 서비스를 구축 할 좋은 기능적 언어는 무엇입니까?

특히 Scala는 수행 할 수있는 구성의 종류를 제한하는 자체 재귀 함수를 제외하고는 꼬리 호출 제거를 지원하지 않습니다 (이는 JVM의 근본적인 제한 사항입니다).

이것이 사실입니까? 그렇다면 이러한 근본적인 한계를 만드는 JVM은 무엇입니까?



답변

이 게시물 : 재귀 또는 반복? 도움이 될 수 있습니다.

간단히 말해서, 보안 모델과 항상 스택 추적을 사용할 수 있어야하기 때문에 테일 호출 최적화는 JVM에서 수행하기 어렵습니다. 이론상 이러한 요구 사항은 지원 될 수 있지만 아마도 새로운 바이트 코드가 필요할 것입니다 ( John Rose의 비공식적 제안 참조 ).

평가 (2002 년부터)가 끝나는 썬 버그 # 4726340 에서 더 많은 논의가 있습니다 .

그래도 할 수 있다고 생각하지만 작은 일이 아닙니다.

현재 Da Vinci Machine 프로젝트 에서 몇 가지 작업이 진행되고 있습니다. 테일 콜 하위 프로젝트의 상태는 “proto 80 %”로 나열됩니다. Java 7로 만들 가능성은 낮지 만 Java 8에서는 매우 좋은 기회가 있다고 생각합니다.


답변

근본적인 제한은 단순히 JVM이 바이트 코드에서 테일 호출을 제공하지 않기 때문에 JVM에 빌드 된 언어가 자체적으로 테일 호출을 제공하는 직접적인 방법이 없다는 것입니다. 유사한 효과 (예 : 트램폴린)를 달성 할 수있는 해결 방법이 있지만 끔찍한 성능과 생성 된 중간 코드를 난독 화하여 디버거를 쓸모 없게 만드는 엄청난 비용이 발생합니다.

따라서 JVM은 Sun이 JVM 자체에서 테일 호출을 구현할 때까지 생산 품질의 함수형 프로그래밍 언어를 지원할 수 없습니다. 그들은 수년 동안 그것에 대해 논의 해 왔지만 그들이 테일 콜을 구현할 것 같지 않습니다. 이러한 기본 기능을 구현하기 전에 VM을 조기에 최적화했기 때문에 매우 어려울 것이며 Sun의 노력은 기능적 언어가 아닌 동적 언어에 집중되어 있습니다.

따라서 Scala가 실제 함수형 프로그래밍 언어가 아니라는 매우 강력한 주장이 있습니다. 이러한 언어는 30 년 전에 Scheme이 처음 소개 된 이후 테일 호출을 필수 기능으로 간주했습니다.


답변

Scala 2.7.x는 최종 메서드 및 로컬 함수의 자체 재귀 (자신을 호출하는 함수)에 대한 테일 호출 최적화를 지원합니다.

Scala 2.8에는 상호 재귀 함수를 최적화하는 기술인 트램폴린에 대한 라이브러리 지원도 함께 제공 될 수 있습니다.

Scala 재귀 상태에 대한 많은 정보는 Rich Dougherty의 블로그 에서 찾을 수 있습니다 .


답변

Lambda The Ultimate (위에 게시 된 링크 mmyers에서)에 링크 된 문서 외에도 Sun의 John Rose는 테일 콜 최적화에 대해 더 많은 이야기를했습니다.

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

언젠가 JVM에서 구현 될 수 있다고 들었습니다. 다빈치 머신에서 다른 것들 중에서 테일 콜 지원이 검토되고 있습니다.

http://openjdk.java.net/projects/mlvm/


답변

모든 소스는 JVM이 꼬리 재귀의 경우 최적화 할 수 없다고 지적하지만 Java 성능 튜닝 (2003, O’reilly)을 읽은 후 저자는 꼬리 재귀를 구현하여 더 큰 재귀 성능을 달성 할 수 있다고 주장했습니다.

그의 주장은 212 페이지에서 찾을 수 있습니다 ( ‘꼬리 재귀’를 검색하면 두 번째 결과가됩니다). 무엇을 제공합니까?


답변