Javac smart gibi bir yöntemin saf bir işlev olduğunu algılayacak kadar derleyicidir.
"Yeterince akıllı" sorunu değil. Buna Saflık Analizi denir ve genel durumda imkansızdır: Durdurma Problemini çözmeye eşdeğerdir.
Şimdi, elbette, optimize ediciler her zaman makul bir şekilde imkansız şeyler yapıyorlar, "genel durumda muhtemelen imkansız" hiçbir zaman çalışmadığı anlamına gelmiyor, sadece her durumda çalışamayacağı anlamına geliyor. Yani, aslında bir fonksiyonun saf olup olmadığını kontrol etmek için algoritmalar vardır, sonuçtan daha sık "Bilmiyorum" olacaktır, yani güvenlik ve doğruluk nedenleriyle, bu özel işlev saf olmayabilir.
Ve işe yaradığı durumlarda bile , algoritmalar karmaşık ve pahalıdır.
Yani, bu Sorun # 1: sadece özel durumlar için çalışıyor .
Sorun # 2: Kütüphaneler . Bir fonksiyonun saf olması için, sadece saf fonksiyonları çağırabilir (ve bu fonksiyonlar sadece saf fonksiyonları çağırabilir, vb.). Javac açıkçası sadece Java'yı biliyor ve sadece görebileceği kodu biliyor. Bu nedenle, işleviniz başka bir derleme birimindeki bir işlevi çağırırsa, bunun saf olup olmadığını bilemezsiniz. Başka bir dilde yazılmış bir işlevi çağırırsa, bilemezsiniz. Kütüphanede henüz yüklenmemiş bir işlevi çağırırsa, bilemezsiniz. Ve bunun gibi.
Bu, tüm program analiziniz olduğunda, tüm program aynı dilde yazıldığında ve hepsi bir seferde bir kerede derlendiğinde çalışır. Hiçbir kitaplığı kullanamazsınız.
Sorun # 3: Zamanlama . Hangi parçaların saf olduğunu anladıktan sonra, bunları yine de dişleri ayırmak için zamanlamanız gerekir. Ya da değil. İş parçacıklarını başlatmak ve durdurmak çok pahalıdır (özellikle Java'da). Bir iş parçacığı havuzu tutup başlatmamanız veya durdurmasanız bile, iş parçacığı bağlamı geçişi de pahalıdır. Hesaplamanın zamanlama ve bağlam değiştirme için gereken süreden önemli ölçüde daha uzun çalışacağından emin olmanız gerekir, aksi takdirde performansı kaybetmezsiniz , kazanmazsınız.
Muhtemelen şimdiye kadar tahmin ettiğiniz gibi, bir hesaplamanın ne kadar süreceğini anlamak genel durumda imkansızdır (hatta ne kadar zaman geçse de, sınırlı bir zaman alıp almayacağını bile anlayamayız) ve hatta zor ve pahalı özel durum.
Bir yana: Javac ve optimizasyonlar . Javac uygulamalarının çoğunun aslında pek çok optimizasyon yapmadığını unutmayın. Örneğin Oracle'ın javac uygulaması, optimizasyon yapmak için temel yürütme motoruna dayanır . Bu, başka bir sorun kümesine yol açar: diyelim ki, javac belirli bir işlevin saf ve yeterince pahalı olduğuna karar verdi ve bu yüzden farklı bir iş parçacığında yürütülmesini derledi. Ardından, platformun iyileştiricisi (örneğin, HotSpot C2 JIT derleyicisi) birlikte gelir ve tüm işlevi ortadan kaldırır. Artık boş bir iş parçacığınız yok. Ya da, hayal, yine Javac farklı bir iş parçacığı üzerinde bir işlevi zamanlama karar verir ve platform iyileştirici olabilir iplik sınırları boyunca satır içi işlem yapamaması dışında tamamen optimize edin ve böylece tamamen optimize edilebilen bir işlev artık gereksiz yere yürütülmektedir.
Yani, böyle bir şey yapmak sadece bir seferde optimizasyonların çoğunu yapan tek bir derleyiciniz varsa mantıklıdır, böylece derleyici farklı seviyelerdeki tüm farklı optimizasyonları ve birbirleriyle etkileşimlerini bilir ve bunlardan yararlanabilir.
Not örneğin HotSpot C2 JIT derleyicisi aslında yapar oto-paralelleştirme şeklidir bir otomatik vektörelleştirmeyi gerçekleştirmek.