Guido'nun sorunuzu ifade etme konusundaki ifadesini aşırı basitleştirdiniz. Sorun dinamik olarak yazılan bir dil için derleyici yazmıyor. Sorun, (ölçüt 1) her zaman doğru olan, (ölçüt 2) dinamik yazmayı koruyan ve (ölçüt 3) önemli miktarda kod için belirgin şekilde daha hızlı olan bir yazıyor .
Python'un% 90'ını (başarısız kriterler 1) uygulamak ve sürekli olarak hızlı olmak kolaydır. Benzer şekilde, statik yazarak daha hızlı bir Python varyantı oluşturmak kolaydır (başarısızlık kriteri 2). % 100'ü uygulamak da kolaydır (karmaşık olan bir dili uygulamakla birlikte), ancak şimdiye kadar onu uygulamak için her kolay yol nispeten yavaştır (başarısız kriterler 3).
Doğru bir tercüman artı JIT uygulamak, tüm dili uygular ve bazı kodlar için daha hızlıdır, ancak daha zor olsa da (cf. PyPy) ve sadece JIT derleyicisinin (Psyco onsuz yapmasını otomatikleştirdiyseniz) mümkün olur , ancak hangi kodu hızlandırabileceğiyle çok sınırlıydı). Ancak, statikten bahsederken bunun açıkça kapsam dışı olduğunu unutmayın.(diğer adıyla vaktinden önce) derleyiciler. Sadece yaklaşımının statik derleyiciler için neden çalışmadığını açıklamak için bundan bahsediyorum (veya en azından mevcut karşı örnek yok): Önce programı yorumlamak ve gözlemlemek, daha sonra bir döngü (veya başka bir doğrusal kod için) sonra, yalnızca belirli yineleme için (veya en azından tüm olası yinelemeler için geçerli değildir) geçerli varsayımlara dayanarak cehennemi optimize edin. Beklenti, bu kodun daha sonraki birçok uygulamasının da beklentiyle eşleşmesi ve böylece optimizasyonlardan faydalanmasıdır. Doğruluğu sağlamak için bazı (nispeten ucuz) kontroller eklenir. Tüm bunları yapmak için, ne için uzmanlaşacağınız hakkında bir fikre ve geri dönmek için yavaş ama genel bir uygulamaya ihtiyacınız var. AOT derleyicilerin hiçbiri yoktur. Onlar uzmanlaşmak olamaz hiçgöremedikleri koda göre (örneğin dinamik olarak yüklenen kod) ve dikkatsizce uzmanlaşmak, bir dizi sorunu olan (icache kullanımı, ikili boyut, derleme zamanı, ek dallar) daha fazla kod üretilmesi anlamına gelir.
Tüm dili doğru bir şekilde uygulayan bir AOT derleyicisini uygulamak da nispeten kolaydır: Bu kodla beslendiğinde yorumlayıcının yapacağı şeyi yapmak için çalışma zamanını çağıran kod oluşturun. Nuitka (çoğunlukla) bunu yapar. Bununla birlikte, bu, tercüman olarak gereksiz iş yapmak zorunda kaldığınız için, bayt kodunu derlediğiniz şeyi yapan C kodu bloğuna göndermek için kaydettiğiniz için çok fazla performans avantajı (başarısızlık kriteri 3) sağlamaz. bu sadece oldukça küçük bir maliyettir - mevcut bir tercümanda optimize edilmeye değecek kadar önemli, ancak yeni bir uygulamayı kendi sorunları ile haklı çıkarmak için yeterince önemli değil.
Her üç kriteri de yerine getirmek için ne gerekir? Hiçbir fikrimiz yok. Python programlarından beton türleri, kontrol akışı vb. Hakkında bazı bilgiler elde edebilen bazı statik analiz şemaları vardır. Tek bir temel bloğun kapsamı dışında doğru veri sağlayanlar son derece yavaştır ve tüm programı veya en azından çoğunu görmeleri gerekir. Yine de, yerleşik türlerde birkaç işlemi optimize etmekten başka, bu bilgilerle fazla bir şey yapamazsınız.
Nedenmiş? Açıkça söylemek gerekirse, bir derleyici ya çalışma zamanında yüklenen Python kodunu yürütme yeteneğini kaldırır (başarısızlık ölçütleri 1) ya da herhangi bir Python kodu tarafından geçersiz kılınabilecek varsayımlar yapmaz. Ne yazık ki, programları optimize etmek için hemen hemen her şey yararlıdır içerir: vb tek dize geçirilen çeşitli yollarla kaçırılan edilebilir ithal ribaund olabilir fonksiyonları, sınıflar mutasyona uğramış olabilir veya tamamen değiştirilmesi, modüller keyfi de değiştirilebilir dahil Globals eval
, exec
, __import__
veya çok sayıda başka işlev, bunlardan herhangi birini yapabilir. Aslında bu, neredeyse hiç büyük optimizasyonun uygulanamayacağı anlamına gelir, bu da çok az performans avantajı sağlar (başarısız kriterler 3). Yukarıdaki paragrafa geri dön.