source

JVM은 테일콜 최적화를 방해합니까?

factcode 2023. 1. 15. 17:13
반응형

JVM은 테일콜 최적화를 방해합니까?

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

특히 Scala는 자기재귀적 함수를 제외하고 테일콜 제거를 지원하지 않으므로 수행할 수 있는 구성 유형이 제한됩니다(이는 JVM의 근본적인 제한 사항).

정말이에요?그렇다면 JVM의 어떤 점이 이러한 근본적인 제한을 초래합니까?

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

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

또, Sun bug #4726340 에서는, 한층 더 상세한 것에 대해 설명합니다.여기서 (2002년부터)의 평가가 종료됩니다.

그래도 할 수 있다고 믿지만, 그것은 결코 작은 일이 아니다.

현재, 다빈치 머신 프로젝트에는 몇 가지 작업이 진행 중입니다.테일콜 서브프로젝트의 상태는 "proto 80%"로 표시되어 있어 Java 7에 들어갈 가능성은 낮지만 Java 8에서는 가능성이 높다고 생각합니다.

근본적인 제한은 단순히 JVM이 바이트 코드로 테일콜을 제공하지 않기 때문에 JVM에 구축된 언어가 테일콜 자체를 제공할 수 있는 직접적인 방법이 없다는 것입니다.유사한 효과(예: 트램폴리닝)를 달성할 수 있는 회피책이 있지만, 그것들은 끔찍한 성능과 생성된 중간 코드를 혼란시켜 디버거를 무용지물로 만드는 심각한 비용이 든다.

따라서 Sun이 JVM 자체에 테일콜을 구현할 때까지 JVM은 프로덕션 품질의 기능 프로그래밍 언어를 지원할 수 없습니다.그들은 몇 년 동안 이 문제에 대해 논의해 왔지만, 그들이 후속 조치를 취할지는 의문입니다. 왜냐하면 그들은 이러한 기본적인 기능을 구현하기 전에 VM을 너무 일찍 최적화했기 때문입니다.또한 Sun의 노력은 기능 언어가 아닌 동적 언어에 중점을 두고 있기 때문입니다.

따라서 Scala가 실제 기능적 프로그래밍 언어가 아니라는 주장은 매우 강력합니다. 이 언어들은 Scheme가 처음 도입된 이후 테일콜을 필수적인 기능으로 간주해 왔습니다.

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

Scala 2.8은 상호 재귀 함수를 최적화하는 기술인 trampoline에 대한 라이브러리 지원도 제공합니다.

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

Lambda The Ultimate에 링크된 문서(위의 링크 마스터에서) 외에 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페이지에서 그의 주장을 찾을 수 있습니다('꼬리 재귀' 검색은 두 번째 결과여야 합니다).왜 그러고 있어?

언급URL : https://stackoverflow.com/questions/105834/does-the-jvm-prevent-tail-call-optimizations

반응형