Meta-dairesel tercümanlar, sanal makineler ve artan performans arasındaki ilişki nedir?


12

Web'deki meta-dairesel tercümanları (SICP dahil) okudum ve bazı uygulamaların (PyPy ve Narcissus gibi) kodlarını inceledim.

Metakirküler değerlendirmeyi, Lisp ve Smalltalk'ı büyük ölçüde kullanan iki dil hakkında biraz okudum. Anladığım kadarıyla Lisp ilk kendi kendini barındıran derleyici ve Smalltalk ilk "gerçek" JIT uygulamasına sahipti.

Tam olarak anlamadığım bir şey, bu çevirmenlerin / derleyicilerin nasıl bu kadar iyi bir performans elde edebildikleri veya diğer bir deyişle PyPy neden CPython'dan daha hızlı? Yansıması yüzünden mi?

Ayrıca, Smalltalk araştırmam beni JIT, sanal makineler ve yansıma arasında bir ilişki olduğuna inandırdı. JVM ve CLR gibi Sanal Makineler çok fazla tür içgözlemine izin veriyor ve Just-in-Time (ve AOT, sanırım?) Derlemesinde büyük fayda sağladıklarına inanıyorum. Ama bildiğim kadarıyla, Sanal Makineler temel bir komut setine sahip oldukları için biraz CPU gibi. Sanal Makineler dile agnostik yansımayı sağlayacak tip ve referans bilgilerini içerdikleri için verimli midir?

Bunu soruyorum çünkü hem yorumlanmış hem de derlenmiş diller artık bayt kodunu bir hedef olarak (LLVM, Parrot, YARV, CPython) kullanıyor ve JVM ve CLR gibi geleneksel VM'ler performansta inanılmaz artışlar elde etti. Bana JIT ile ilgili olduğu söylendi, ama bildiğim kadarıyla JIT yeni bir şey değil çünkü Smalltalk ve Sun'ın Öz Benliği Java'dan önce yapıyor. Geçmişte özellikle iyi performans gösteren VM'leri hatırlamıyorum, JVM ve .NET dışında akademik olmayan pek çok şey yoktu ve performansları şu anki kadar iyi değildi (keşke bu iddiayı kaynaklayabilseydim ama ben kişisel deneyimlerden konuşun).

Sonra aniden, 2000'lerin sonunda bir şeyler değişti ve çok sayıda VM, yerleşik diller için bile ve çok iyi bir performansla ortaya çıkmaya başladı. Hemen hemen her modern VM'nin performansta hızla yükselmesine izin veren JIT uygulaması hakkında bir şey keşfedildi mi? Belki bir kağıt ya da bir kitap?


3
Para. Eskiden C ++ ve Fortran'a dökülen para HotSpot, CLR, Mono, V8, Nitro, SpiderMonkey, vb. İçine dökülür
Jörg W Mittag

Sadece tahmin edebilirim, ama burada açıklandığı gibi zaman içinde sadece iyileştirme olduğunu düşünüyorum joelonsoftware.com/articles/fog0000000017.html
Doc Brown


1
@Gomi Uygulama dilinin, uygulanan dile ne kadar benzediği değil. RPython ile yazılmış JavaScript, Lisp, Prolog, SmallTalk ve Ruby tercümanları var ve PyPy'nin sunduğu aynı güzellikleri alıyorlar. RPython'un Python'a dayanmasının tek nedeni, bir grup Python meraklısı tarafından yaratılmış olmasıdır. PyPy'yi hızlı yapan RPython'un özelliklerinin Python ile ilgisi yoktur: Otomatik JIT derleyici üretimi, çöp toplayıcıları, vb. - Ve evet, bunların çoğu prensip olarak diğer diller kullanılarak yapılabilir. Yine de tamamen yeni bir derleyici oluşturmanız gerekir.

4
-1 çünkü burada en az 3 farklı sorunuz var: (a) Meta-dairesel uygulamalar neden bu kadar iyi? (b) Sanal Makineler tip bilgisi nedeniyle verimli midir ve içgözlem performans için faydalı mıdır? (c) VM popülaritesi 2000'lerin sonunda nasıl arttı ve nasıl birdenbire iyi bir performans sergiliyorlar? Bence bu soruları ayrı ayrı sormak daha iyi.
Meşe

Yanıtlar:


1

3 üzerinden 2: "Meta-dairesel" ve "yüksek performanslı" dil çalışma zamanları arasında bir ilişki yoktur. Yüksek performansa ulaşan meta-dairesel çalışma zamanları bunu JIT tarafından yerel koda derleyerek ve yerel kodu çalıştırarak yapar. Yüksek mükemmellik Python çalışma zamanınızın Python veya Lisp'teki Lisp vb. İle yazılması için bir neden yoktur. Ancak, dilinizin diğerlerinden daha güçlü, etkileyici vb. kendi çalışma zamanı? Eğer Veya yok Dil "daha iyi" diğerlerinden daha nasılsa olduğunu düşünüyorum, neden hiç uygulamak sorun gidiyorsun?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.