메소드가 순수한 함수일 때 감지 할 수있을만큼 Javac 스마트와 같은 컴파일러입니다.
"충분히 똑똑하다"는 문제는 아닙니다. 이를 순도 분석 이라고 하며 일반적인 경우에는 불가능합니다. 중지 문제를 해결하는 것과 같습니다.
물론, 옵티마이 저는 항상 불가능한 일을합니다. "일반적으로 불가능할 것"은 결코 작동하지 않는다는 것을 의미하지 않으며, 모든 경우에 작동 할 수 없다는 것을 의미합니다. 사실, 함수가 순수한지 아닌지를 확인하는 알고리즘이 있습니다. 결과는 "알지 못합니다"라는 결과보다 더 자주 나타납니다. 즉, 안전과 정확성을 이유로 가정해야합니다. 이 특정 기능이 불완전 할 수 있습니다.
그리고 심지어는 경우 않는 일을, 알고리즘은 복잡하고 비싸다.
따라서 그것은 문제 # 1입니다 : 특별한 경우에만 작동합니다 .
문제 # 2 : 라이브러리 . 함수가 순수하기 위해서는 항상 순수 함수 만 호출 할 수 있습니다 (이러한 함수는 순수 함수 만 호출 할 수 있음 등). Javac은 분명히 Java에 대해서만 알고 있으며 볼 수있는 코드에 대해서만 알고 있습니다. 따라서 함수가 다른 컴파일 단위에서 함수를 호출하면 함수가 순수한지 여부를 알 수 없습니다. 다른 언어로 작성된 함수를 호출하면 알 수 없습니다. 아직 설치되지 않은 라이브러리에서 함수를 호출하면 알 수 없습니다. 등등.
이것은 전체 프로그램 분석이 있고 전체 프로그램이 동일한 언어로 작성되고 모든 것이 한 번에 한 번에 컴파일 될 때만 작동합니다. 라이브러리를 사용할 수 없습니다.
문제 # 3 : 스케줄링 . 어느 부분이 순수한지를 알아 낸 후에도 여전히 스레드를 분리하도록 일정을 예약해야합니다. 아님 스레드 시작 및 중지는 매우 비쌉니다 (특히 Java의 경우). 스레드 풀을 유지하고 시작 또는 중지하지 않더라도 스레드 컨텍스트 전환 비용도 많이 듭니다. 당신은 그렇지 않으면 당신은 것입니다, 계산에 상당한 시간이 문맥 스위치를 예약하는 데 걸리는 시간보다 실행됩니다 있는지 확인해야 손실 을 얻지 성능을.
지금까지 짐작할 수 있듯이, 일반적인 경우에는 계산에 걸리는 시간을 알아내는 것이 불가능할 것입니다. 특별한 경우.
따로 : Javac 및 최적화 . javac의 대부분의 구현은 실제로 많은 최적화를 수행하지는 않습니다. 예를 들어, Oracle의 javac 구현은 기본 실행 엔진을 사용하여 최적화를 수행합니다 . javac는 특정 함수가 순수하고 충분히 비싸다고 판단하여 다른 스레드에서 실행되도록 컴파일합니다. 그런 다음 플랫폼의 최적화 프로그램 (예 : HotSpot C2 JIT 컴파일러)이 제공되어 전체 기능을 최적화합니다. 이제 아무것도하지 않는 빈 스레드가 있습니다. 또는 javac가 다른 스레드에서 함수를 예약하기로 결정하고 플랫폼 최적화 프로그램 이 스레드 경계에 걸쳐 인라인을 수행 할 수 없다는 점을 제외하고 완전히 최적화하십시오. 따라서 완전히 최적화 할 수있는 기능이 불필요하게 실행됩니다.
따라서 이와 같은 작업을 수행하면 대부분의 최적화를 한 번에 수행하는 단일 컴파일러가있는 경우 컴파일러가 서로 다른 수준에서 서로 다른 모든 최적화 및 상호 작용을 알고이를 활용할 수 있습니다.
그 참고, 예를 들어, 핫 스폿 C2 JIT 컴파일러는 실제로 수행 또한 자동 병렬화의 형태 일부 자동 벡터화를 수행한다.