2008-09-19 4 views

답변

72

이 게시물 : Recursion or Iteration? 도움이 될 수 있습니다.

즉, 보안 모델과 항상 스택 추적을 사용할 수 있어야하기 때문에 꼬리 호출 최적화가 JVM에서 수행하기가 어렵습니다. 이러한 요구 사항은 이론적으로는 지원 될 수 있지만 새로운 바이트 코드가 필요합니다 (John Rose's informal proposal 참조).

있다 (2002 년부터) 평가가 종료 Sun bug #4726340에서 더 논의, 또한 :

내가이 그럼에도 불구하고 할 수 있으리라 생각합니다,하지만 그것은 작은 일이 아니다.

현재 Da Vinci Machine 프로젝트에서 몇 가지 작업이 진행 중입니다. 꼬리 호출 하위 프로젝트의 상태는 "proto 80 %"로 표시됩니다. Java 7로 만들 가능성은 거의 없지만 Java 8에서 매우 좋은 기회라고 생각합니다.

+0

나는 그 설명을 따르지 않았다. 나는 tail-call 최적화가 컴파일러에 의해 구현되었다고 생각했다. 컴파일러에 의해 tail-call 최적화 된 함수가 있다고 가정하면 루프를 사용하여 동일한 기능을 구현하는 동등한 비 재귀 함수를 가질 수도 있습니다. 그렇다면 컴파일러가 수행 할 수 없습니다. 나는 JVM에 대한 의존성을 따를 수 없다. 이 코드는 기본 i386 코드를 생성 한 Scheme 컴파일러와 어떻게 비교됩니까? –

+0

자, 아래 Jon의 답변을 보았습니다. 따라서 구현할 수 없다는 것이 아니라 올바른 디버거 지원으로 구현할 수 없다는 것을 의미합니다. –

+4

@Gautham : 디버깅에 대한 내 주장은 JVM에서 테일 콜 제거의 부족을 해결하기위한 방법으로 trampolines를 사용하는 것과 관련되어있었습니다. 테일 호출 제거는 JVM (Arnold Schaighofer는 OpenJDK와 LLVM에서 구현되었습니다.)에서 구현 될 수 있고 그렇게 할 수 있는지 여부는 의문의 여지가 없습니다. Microsoft의 CLR은 물론 10 년 동안 테일 콜 제거 기능을 지원했으며 F #의 출시로 게임 체인저임을 입증했습니다. 그 대답은 JVM이 오랫동안 정체되어 오랫동안 지속되었다는 것입니다. –

27

근본적인 한계는 JVM이 꼬리 결과적으로 자신을 호출 꼬리를 제공하기 위해 JVM에 내장 된 언어에 대한 직접적인 방법이 없다, 그 바이트 코드 호출에서는 제공하지 않습니다 단순히 것입니다. 유사한 효과 (예 : trampolining)를 얻을 수있는 해결 방법이 있지만 심각한 성능의 심각한 비용과 디버거를 쓸모 없게 만드는 생성 된 중간 코드를 모호하게 만듭니다.

그래서 JVM은 Sun이 JVM 자체에서 꼬리 호출을 구현할 때까지 프로덕션 수준의 함수 프로그래밍 언어를 지원할 수 없습니다. 그들은 몇 년 동안 논의 해 왔지만 꼬리 호출을 구현할 것인지는 의문입니다. 이러한 기본 기능을 구현하기 전에 VM을 조기에 최적화했기 때문에 매우 어려울 것이며 Sun의 노력은 기능 언어가 아닌 동적 언어에 집중되어 있습니다.

따라서 Scala는 실제 함수형 프로그래밍 언어가 아닙니다. 이러한 언어는 Scheme이 30 년 전에 처음 도입 된 이래로 꼬리 호출을 필수 기능으로 간주했습니다.

+3

따라서 Scala가 실제 함수형 프로그래밍 언어가 아니라는 강력한 주장이 있습니다. 인수는 실제로 매우 약합니다. 물론'꼬리 호출은 필수 기능으로 ', 기본 하드웨어 (또는 가상 머신)가 직접 지원하는 경우에는 유용합니다. 하지만 구현 세부 사항입니다. – Ingo

+8

@Ingo : 사용자가 보는 런타임에 프로그램에서 스택 오버플로를 중요한 문제로 간주하지 않는 경우에만 해당합니다. 버그 추적기에 따르면 스칼라 컴파일러도 스택 오버플로에 시달리고 있습니다. 심지어 가장 노련한 스칼라 개발자조차도 여전히 잘못된 결과를 얻고 있습니다 ... –

+7

F #을 옹호하는 것은 괜찮습니다. 그러나 나는 F #이 아닌 모든 것에 적대감을 나타 내기 위해 오랜 시간 (심지어 몇 년 전에는 유즈넷에서) 당신을 언급했지만, 당신이 말하는 것은 당신이 무슨 말을하는지 모른다는 것을 보여줍니다. 여기처럼 : 당신의 주장은 스택 오버 플로우로 중단되는 프로그램을 작성할 수있는 언어가 기능적인 것이 아닌 것 같습니다. 그러나 힙 오버 플로우를 유발할 수있는 언어에 대해 동일한 논증을 제기 할 수는 없습니까? 따라서 거룩한 F # 자체는 기능적으로 간주되지 않습니다. – Ingo

21

스칼라 2.7.x는 최종 메소드 및 로컬 함수의 자체 재귀 (자체 호출 함수)를위한 테일 호출 최적화를 지원합니다.

스컬라 2.8은 trampoline에 대한 라이브러리 지원도 제공 할 수 있는데, 이는 상호 재귀 함수를 최적화하는 기술입니다.

스칼라 재귀 상태에 대한 많은 정보는 Rich Dougherty's blog에서 찾을 수 있습니다.

+0

현재 스칼라 상태에 대한 질문을 업데이트 할 수 있습니까? –

+0

@ om-nom-nom AFAIK, Scala 측에서도 JVM 측에서도 아무 것도 변경되지 않았습니다. –

0

모든 소스에서 꼬리 재귀의 경우 최적화 할 수없는 JVM을 가리 킵니다. 그러나 Java performance tuning (2003, O'reilly)을 읽으면 꼬리 재귀를 구현하여 더 큰 재귀 성능을 얻을 수 있다고 주장하는 저자를 발견했습니다.

212 페이지에서 그의 주장을 찾을 수 있습니다 ('꼬리 재귀 검색'은 두 번째 결과 여야 함). 뭐라 구요?

+0

IBM은 JVM 구현에서 일부 형태의 TCO를 지원합니다 (최적화로서 보장 할 수 없음). 어쩌면 자바 퍼포먼스 튜닝의 저자는이 기능이 결국 모든 JVM에 의해 구현 될 것이라고 생각했을 것입니다. http://www.ibm.com/developerworks/java/library/j-diag8.html – llemieng

관련 문제