it-swarm.dev

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

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

Açıklama:

Yazılımın, C ve C++ gibi derlenmiş makine dillerinde bile, çalışma zamanı profili oluşturma geri bildirimi ve çalışma zamanında sıcak noktaların agresif şekilde optimize edilmiş yeniden derlemesinden faydalanabileceğini düşünüyorum.

Profil güdümlü optimizasyon benzer bir iş yapar, ancak farkla bir JIT farklı ortamlarda daha esnek olacaktır. PGO'da serbest bırakmadan önce ikili dosyalarınızı çalıştırırsınız. Yayınlandıktan sonra, çalışma zamanında toplanan ortam/girdi geri bildirimleri kullanılmaz. Dolayısıyla, eğer giriş modeli değiştirilirse, performans cezası araştırılır. Ancak JIT bu koşullarda bile iyi çalışır.

Ancak, JIT derleme performansı fayda kendi yükü ağır basarsa tartışmalı olduğunu düşünüyorum.

33

[Artık temelde kullanılmayan oldukça farklı bir yanıt için düzenleme geçmişine bakın.]

Evet, C ve/veya C++ için birkaç JIT derleyicisi vardır.

CLing (oyundan tahmin edebileceğiniz gibi) Clang/LLVM'ye dayanmaktadır. Bir tercüman gibi davranır. Yani, ona bazı kaynak kodu verir, çalışması için bir komut verirsiniz ve çalışır. Buradaki vurgu, maksimum optimizasyon değil, öncelikle 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 uymuyor.

Başka bir olasılık NativeJIT . Bu soruya biraz farklı bir şekilde uyuyor. Özellikle, C veya C++ kaynak kodunu kabul etmez ve derler ve çalıştırır. Aksine, C++ programınıza derleyebileceğiniz küçük bir derleyicidir. Temel olarak C++ programınızda 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, ancak çalışma zamanına kadar bilmeyeceğiniz, optimum yürütme hızına yaklaşan bir şeyle yürütmek istediğiniz birkaç ifadeye sahip olabileceğiniz bir çerçeveye çok daha uygundur.

Orijinal sorunun görünen amacına gelince, orijinal cevabımın temel noktası hala duruyor: JIT derleyicisi veri gibi şeylere uyum sağlayabilirken bir yürütmeden diğerine, hatta tek bir yürütme sırasında dinamik olarak değişen, gerçek şu ki, bu en azından genel bir kural olarak nispeten küçük bir fark yaratır. Çoğu durumda, bir derleyiciyi çalışma zamanında çalıştırmak, biraz optimizasyondan vazgeçmeniz gerektiği anlamına gelir, bu nedenle genellikle umduğunuz en iyi şey, geleneksel bir derleyicinin üretebileceği hıza yakın olmasıdır.

Bir JIT derleyicisinin mevcut bilgisinin geleneksel bir derleyiciden önemli ölçüde daha iyi kod üretmesine izin verebileceği durumları varsaymak mümkün olsa da, bunun uygulamada olması oldukça sıradışı görünüyor (ve çoğu durumda olduğunu doğrulayabildiğimde, bunun nedeni gerçekten kaynak koddaki bir sorundan kaynaklanıyordu, statik derleme modeliyle değil).

33
Jerry Coffin

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

Ancak bu, JIT derlemesinin henüz pratikte kullanılmadığı anlamına gelmez. Örneğin, Apple OpenGL boru hattı için LLVM'yi bir JIT olarak kullanır.

JIT'in bir başka ilginç uygulaması ise LLVM ve Clang tabanlı interaktif bir C++ yorumlayıcısı olan 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

Bir oyuncak projesi değildir, ancak aslında CERN'de, örneğin Büyük Hadron Çarpıştırıcısı'nın kodunu geliştirmek için kullanılır.

11
Philipp Claßen

C++/CLI eğrildi. Verilen, C++/CLI değil C++ ama oldukça yakın. Microsoft'un JIT'in, en azından bilgim için değil, sorduğunuz süper zeki/sevimli çalışma zamanı davranış tabanlı optimizasyonları yapmadığını söyledi. Yani bu gerçekten yardımcı olmuyor.

http://nestedvm.ibex.org/ MIPS'yi Java bayt koduna dönüştürür ve bu daha sonra verilebilir.) Sorunuzdaki bu yaklaşımla ilgili sorun atmanızdır. JIT'e ulaştığında faydalı bilgilerin çoğu.

7
Logan Capaldo

Öncelikle, bir yöntem jitinden ziyade bir izleme jit'i isteyeceğinizi varsayıyorum.

Alınacak en iyi yaklaşım, kodu llvm IR'ye derlemek, ardından yerel bir yürütülebilir dosya oluşturmadan önce izleme kodunu eklemek olacaktır. Bir kod bloğu yeterince iyi kullanıldığında ve değişkenlerin değerler (dinamik dillerdeki gibi değil) hakkında yeterli bilgi toplandıktan sonra, kod korumalara dayalı olarak yeniden derlenebilir (IR'den) değişkenlerin değerleri.

Ben libclang adı altında clang c/c ++ jit yapma konusunda bazı ilerleme olduğunu hatırlıyorum gibi görünüyor.

2
dan_waterworth