C, C ++ ve benzerleri için JIT derleyicisi


33

C ve C ++ gibi derlenmiş diller için tam zamanında bir derleyici var mı? (Akla gelen ilk isimler Clang ve LLVM'dir! Ama şu anda desteklediklerini sanmıyorum.)

Açıklama:

Yazılımın çalışma zamanı profili oluşturma geribildiriminden ve çalışma zamanındaki sıcak noktaların agresif bir şekilde optimize edilmesinden, hatta C ve C ++ gibi makineden derlenmiş diller için bile fayda sağlayabileceğini düşünüyorum.

Profil güdümlü optimizasyon benzer bir iş yapar, ancak farkla birlikte bir JIT farklı ortamlarda daha esnek olur. PGO'da, sürümünüzü serbest bırakmadan önce çalıştırın. Yayınladıktan sonra, çalışma zamanında toplanan hiçbir ortam / girdi geri bildirimi kullanmaz. Dolayısıyla giriş paterni değişirse, performans cezası aranır. Ancak JIT bu koşullarda bile iyi çalışıyor.

Bununla birlikte, JIT'in derleme performansının kendi genel giderinden daha ağır basıp basmamasının tartışmalı olduğunu düşünüyorum.


1
Konu dışı site dışı kaynak.
DeadMG

1
Soruya uyup uymadığından emin değilim, ancak kullanılabilirlik adayı için Julia dilindeki Cxx paketini yararlı buluyorum .
Antonello

GCC 9 şimdi jit derleyicisine sahip gcc.gnu.org/onlinedocs/jit/intro/index.html
user3071643

Yanıtlar:


33

[Şimdi temelde eski olan oldukça farklı bir cevap için düzenleme geçmişine bakın.]

Evet, C ve / veya C ++ için birkaç JIT derleyicisi var.

CLing (oyundan tahmin edebileceğiniz gibi) Clang / LLVM'ye dayanmaktadır. Tercüman gibi davranır. Yani, bir miktar kaynak kodu verin, çalışması için bir komut verin ve çalışır. Buradaki vurgu, maksimum optimizasyon değil, temel olarak kolaylık ve hızlı derleme üzerinedir. Bu nedenle, teknik olarak sorunun kendisine bir cevap olmasına rağmen, bu OP'nin amacına pek uygun değil.

Başka bir olasılık da NativeJIT . Bu, soruyu biraz farklı şekilde ele alır. Özellikle, C veya C ++ kaynak kodunu kabul etmez, derler ve çalıştırır. Aksine, C ++ programınıza derleyebileceğiniz küçük bir derleyicidir. Temelde C ++ programınız içinde bir EDSL olarak ifade edilen bir ifadeyi kabul eder ve bundan sonra gerçekleştirebileceğiniz gerçek makine kodunu üretir. Bu, programınızın çoğunu normal bir derleyici ile derleyebileceğiniz bir çerçeveye çok daha uygun olur, ancak çalışma zamanına kadar bilemeyeceğiniz, optimum yürütme hızına yaklaşan bir şeyle yürütmek istediğiniz bazı ifadeleriniz vardır.

Asıl soruya belirgin niyet gelince, benim orijinal cevap temel nokta hala duruyor düşünüyorum: Bir JIT derleyicisi ise edebilir sonraki bir yürütme değişir veri olarak böyle şeylere adapte, hatta tek yürütme sırasında dinamik olarak değişen, Gerçek şu ki, bu en azından genel bir kural olarak nispeten az bir fark yaratıyor. Çoğu durumda, bir derleyiciyi çalışma zamanında çalıştırmak, bir miktar optimizasyondan vazgeçmeniz gerektiği anlamına gelir; bu nedenle, genellikle umduğunuz en iyi şey, bunun geleneksel bir derleyicinin üretebileceği kadar hızlı olması gerektiğidir.

Bir JIT derleyicisine sunulan bilgilerin , geleneksel bir derleyiciden önemli ölçüde daha iyi kod üretmesine izin verebileceği durumları ortaya koymak mümkün olsa da, uygulamada bu olayın örnekleri oldukça sıra dışı görünüyor (ve çoğu durumda doğrulayabildiğim gibi) bunun gerçekleşmesi, kaynak kodundaki statik derleme modelinde olmayan bir problemden kaynaklanıyordu).


1
JIT'ler neden önbellek benzeri bir dosya kaydetmiyor, böylece her şeyi sıfırdan öğrenmeyi atlayabilirler?
JohnMudd

3
@JohnMudd: Muhakemenin güvenlik olduğunu sanıyorum. Örneğin, önbelleğe alınmış kodu değiştirin, ardından VM bir dahaki sefere başladığında, orada yazdıklarının yerine koyduğum kodu çalıştırır.
Jerry Coffin,

4
OTOH, önbellekleri değiştirebiliyorsanız, kaynak dosyalarını da değiştirebilirsiniz.
user3125367

1
@ user3125367: Evet, ancak çoğu durumda, derleyici çeşitli tür denetimleri yapar ve derlenmiş kodu doğrudan önbellekten yüklerseniz atlanabilir. Tabii ki JIT'e bağlı olarak - Java, bir (derlenmiş) .class dosyasını yüklerken çok fazla zorlama çalışması yapar, fakat çoğu kişi daha az şey yapar (çoğu durumda neredeyse hiçbiri yoktur).
Jerry Coffin

11

Evet, C ++ için JIT derleyicileri var. Saf bir performans açısından, Profil Kılavuzlu Optimizasyonun (PGO) hala üstün olduğunu düşünüyorum.

Bununla birlikte, bu, JIT derlemesinin henüz uygulamada kullanılmadığı anlamına gelmez. Örneğin, Apple, OpenGL boru hatları için bir JIT olarak LLVM kullanır. Bu, çok fazla ölü kodu kaldırmak için kullanılabilecek, çalışma zamanında önemli ölçüde daha fazla bilgiye sahip olduğunuz bir etki alanıdır.

JIT'in bir başka ilginç uygulaması, LLVM ve Clang'ı temel alan etkileşimli bir C ++ yorumlayıcısı Cling'dir: https://root.cern.ch/cling

İşte örnek bir oturum:

[cling]$ #include <iostream>
[cling]$ std::cout << "Hallo, world!" << std::endl;
Hallo, world!
[cling]$ 3 + 5
(int const) 8
[cling]$ int x = 3; x++
(int) 3
(int const) 3
[cling]$ x
(int) 4

Bu bir oyuncak projesi değil ama aslında CERN'de Büyük Hadron Çarpıştırıcısı kodunu geliştirmek için kullanılıyor.


7

C ++ / CLI attı. Kabul, C ++ / CLI olduğunu değil C ++ ama oldukça yakındır. Microsoft’un JIT’inin, en azından benim bildiğim kadarıyla, sorduğunuz süper zeki / sevimli çalışma zamanı davranışına dayalı optimizasyonları yapmadığını söyledi. Yani bu gerçekten yardımcı olmuyor.

http://nestedvm.ibex.org/ MIPS'yi daha sonra atlatılacak olan Java bayt koduna dönüştürür. Sorunuzdaki bu yaklaşımla ilgili sorun, JIT'ye gelene kadar birçok yararlı bilgiyi atmanızdır.


2

Öncelikle, yöntem jitinden ziyade izleme jitini isteyeceğinizi farz ediyorum.

Alınacak en iyi yaklaşım, kodu yerel bir yürütülebilir dosya üretmeden önce llvm IR'ye derleyip ardından izleme kodunu eklemektir. Bir kod bloğu yeterince iyi kullanıldığında ve değişkenlerin değerleri hakkında (dinamik dillerdeki türler gibi) yeterli bilgi toplandıktan sonra, kod değişkenlerin değerlerine dayanan korumalarla yeniden derlenebilir (IR'den).

Libclang adı altında clang'da ac / c ++ jit konusunda bazı ilerlemeler olduğunu hatırlıyor gibiyim.


1
AFAIK, libclang, kütüphane olarak kabul edilen klan fonksiyonelliğinin çoğudur. Böylece, karmaşık sözdizimi renklendirme, çizgileri, kod tarama vb. oluşturmak için kaynak kodunu analiz etmek için kullanabilirsiniz.
Javier

@Javier, bu doğru gibi geliyor. Bence kütüphanede kaynak kodunun temelini * alan ve llvm ir üreten bir işlev vardı, ama şimdi düşününce, kaynak yerine ir'e dayanarak jit yapmak daha iyi olur.
dan_waterworth
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.