C, C ++ और पसंद के लिए JIT कंपाइलर


33

क्या संकलित भाषाओं, जैसे कि C और C ++ के लिए कोई जस्ट-इन-टाइम कंपाइलर है? (दिमाग में आने वाले पहले नाम क्लैंग और एलएलवीएम हैं! लेकिन मुझे नहीं लगता कि वे वर्तमान में इसका समर्थन करते हैं।)

स्पष्टीकरण:

मुझे लगता है कि सॉफ्टवेयर रनटाइम प्रोफाइलिंग फीडबैक से लाभान्वित हो सकता है और सी, सी ++ जैसी संकलित-टू-मशीन भाषाओं के लिए, रनटाइम पर हॉटस्पॉट्स के आक्रामक रूप से अनुकूलित पुनर्संयोजन से भी लाभ उठा सकता है।

प्रोफ़ाइल-निर्देशित अनुकूलन एक समान कार्य करता है, लेकिन अंतर के साथ एक JIT विभिन्न वातावरणों में अधिक लचीला होगा। PGO में आप इसे जारी करने से पहले अपना बाइनरी चलाते हैं। आपके द्वारा इसे जारी करने के बाद, यह रनटाइम पर एकत्र किए गए पर्यावरण / इनपुट फीडबैक का उपयोग नहीं करेगा। इसलिए यदि इनपुट पैटर्न को बदल दिया जाता है, तो यह निष्पादन दंड की जांच है। लेकिन जेआईटी उस स्थिति में भी अच्छा काम करता है।

हालांकि मुझे लगता है कि यह विवादास्पद है कि जेआईटी संकलन प्रदर्शन का लाभ अपने स्वयं के ओवरहेड से दूर है।


1
ऑफ-टॉपिक- ऑफ-साइट संसाधन।
डेडएमजी

1
यकीन नहीं होता है कि यह सवाल फिट बैठता है, लेकिन एक संभावित संभावना के लिए मुझे जूलिया भाषा में Cxx पैकेज उपयोगी लगता है .. यह आपको @ PhilippClaßen उत्तर में वर्णित के समान इंटरएक्टिव C ++ प्रॉम्प्ट देता है।
एंटेलियो

GCC 9 में अब एक jit compiler है gcc.gnu.org/oniltocs/jit/intro/index.html
user3071643

जवाबों:


33

[संपादित करें इतिहास को एक अलग उत्तर के लिए देखें जो अब मूल रूप से अप्रचलित है।]

हां, C और / या C ++ के लिए कुछ JIT कंपाइलर हैं।

CLing (जैसा कि आप खेल से अनुमान लगा सकते हैं) Clang / LLVM पर आधारित है। यह एक दुभाषिया की तरह काम करता है। यही है, आप इसे कुछ स्रोत कोड देते हैं, इसे चलाने के लिए एक कमांड देते हैं, और यह चलता है। यहां जोर मुख्य रूप से सुविधा और तेज संकलन पर है, अधिकतम अनुकूलन पर नहीं। इस तरह, हालांकि तकनीकी रूप से इस सवाल का जवाब है, लेकिन यह वास्तव में ओपी के इरादे के अनुरूप नहीं है।

एक और संभावना मूल निवासी है । यह सवाल कुछ अलग तरह से फिट बैठता है। विशेष रूप से, यह C या C ++ स्रोत कोड को स्वीकार नहीं करता है, और इसे संकलित और निष्पादित करता है। बल्कि, यह एक छोटा संकलक है जिसे आप अपने C ++ प्रोग्राम में संकलित कर सकते हैं। यह एक अभिव्यक्ति को स्वीकार करता है जिसे मूल रूप से आपके C ++ प्रोग्राम के अंदर एक ईडीएसएल के रूप में व्यक्त किया गया है, और इससे वास्तविक मशीन कोड उत्पन्न होता है, जिसे आप तब निष्पादित कर सकते हैं। यह एक रूपरेखा के साथ बहुत बेहतर बैठता है जहां आप अपने अधिकांश कार्यक्रम को सामान्य संकलक के साथ संकलित कर सकते हैं, लेकिन कुछ अभिव्यक्तियाँ हैं जिन्हें आप रन-टाइम तक नहीं जान पाएंगे, जिसे आप उस चीज़ के साथ निष्पादित करना चाहते हैं जो इष्टतम निष्पादन की गति तक पहुंचती है।

मूल प्रश्न के स्पष्ट आशय के लिए, मुझे लगता है कि मेरे मूल उत्तर का मूल बिंदु अभी भी खड़ा है: जबकि एक जेआईटी संकलक डेटा के रूप में ऐसी चीजों के लिए अनुकूल हो सकता है जो एक निष्पादन से दूसरे में भिन्न होता है, या एक निष्पादन के दौरान गतिशील रूप से भिन्न होता है, वास्तविकता यह है कि यह सामान्य नियम के रूप में कम से कम अंतर बनाता है। ज्यादातर मामलों में, रन समय में एक कंपाइलर चलाने का मतलब है कि आपको अनुकूलन का थोड़ा सा हिस्सा लेने की आवश्यकता है, इसलिए सबसे अच्छी बात यह है कि आप आमतौर पर आशा करते हैं कि यह एक पारंपरिक कंपाइलर के रूप में उपवास के करीब है।

यद्यपि ऐसी परिस्थितियों को पोस्ट करना संभव है जहां एक जेआईटी संकलक के लिए उपलब्ध जानकारी इसे पारंपरिक संकलक की तुलना में काफी बेहतर कोड उत्पन्न करने की अनुमति दे सकती है , व्यवहार में ऐसा होने के उदाहरण बहुत ही असामान्य प्रतीत होते हैं (और ज्यादातर मामलों में जहां मैं सत्यापित करने में सक्षम रहा हूं। यह हो रहा है, यह वास्तव में स्रोत कोड में एक समस्या के कारण था, स्थैतिक संकलन मॉडल के साथ नहीं)।


1
क्यों नहीं JITs कैश जैसी फ़ाइल को सहेजते हैं ताकि वे खरोंच से सब कुछ छोड़ सकें?
जॉनमुद्द

3
@ जॉनमन: मुझे संदेह है कि तर्क सुरक्षा है। उदाहरण के लिए, कैश्ड कोड को संशोधित करें, फिर अगली बार जब वीएम शुरू होता है, तो यह कोड को निष्पादित करता है जो मैंने वहां लिखा था बजाय इसके कि मैंने वहां क्या लिखा है।
जेरी कॉफिन

4
OTOH, यदि आप कैश को संशोधित कर सकते हैं, तो आप स्रोत फ़ाइलों को भी संशोधित कर सकते हैं।
user3125367

1
@ user3125367: हाँ, लेकिन कई मामलों में कंपाइलर विभिन्न प्रकार की जाँच करता है और जैसे कि अगर आप सीधे संकलित कोड को कैशे से लोड करते हैं, तो उसे बायपास किया जा सकता है। JIT पर निर्भर करता है, बेशक - जावा एक (संकलित) .class फ़ाइल को लोड करते समय बहुत सारे प्रवर्तन कार्य करता है, लेकिन कई अन्य बहुत कम (लगभग कोई नहीं, कई मामलों में) करते हैं।
जेरी कॉफिन

11

हां, C ++ के लिए JIT कंपाइलर हैं। शुद्ध प्रदर्शन के दृष्टिकोण से, मुझे लगता है कि प्रोफ़ाइल निर्देशित अनुकूलन (पीजीओ) अभी भी बेहतर है।

हालांकि, इसका मतलब यह नहीं है कि जेआईटी संकलन अभी तक अभ्यास में उपयोग नहीं किया गया है। उदाहरण के लिए, Apple अपने OpenGL पाइपलाइन के लिए JIT के रूप में LLVM का उपयोग करता है। यह एक ऐसा डोमेन है जहाँ आपको रनटाइम के बारे में अधिक जानकारी होती है, जिसका उपयोग बहुत सारे डेड कोड को हटाने के लिए किया जा सकता है।

JIT का एक और दिलचस्प आवेदन क्लिंग है, एलएलवीएम और क्लैंग पर आधारित एक इंटरैक्टिव सी ++ इंटरप्रेटर: https://root.cern.ch/cling

यहाँ एक नमूना सत्र है:

[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

यह कोई खिलौना परियोजना नहीं है, लेकिन इसका उपयोग वास्तव में CERN में किया जाता है, उदाहरण के लिए, लार्ज हैड्रोन कोलाइडर के लिए कोड विकसित करना।


7

C ++ / CLI को jitted किया जाता है। दी, C ++ / CLI C ++ नहीं है, लेकिन यह बहुत करीब है। कहा कि Microsoft का JIT उस समय के सुपर चालाक / प्यारे प्रकार के व्यवहार पर आधारित अनुकूलन नहीं करता है जिसके बारे में आप पूछ रहे हैं, कम से कम मेरी जानकारी के लिए नहीं। तो यह वास्तव में मदद नहीं करता है।

http://nestedvm.ibex.org/ MIPS को जावा बाइटकोड में बदल देता है, जिसे बाद में बंद कर दिया जाएगा। आपके प्रश्न से इस दृष्टिकोण के साथ समस्या यह है कि जब तक यह JIT को प्राप्त नहीं हो जाता है तब तक आप बहुत सारी उपयोगी जानकारी फेंक देते हैं।


2

सबसे पहले, मुझे लगता है कि आप एक विधि jit के बजाय एक अनुरेखण jit चाहते हैं।

लेने के लिए सबसे अच्छा तरीका यह होगा कि कोड को llvm IR पर संकलित किया जाए, फिर देशी निष्पादन योग्य बनाने से पहले अनुरेखण कोड में जोड़ा जाए। एक बार एक कोड ब्लॉक पर्याप्त रूप से अच्छी तरह से उपयोग हो जाता है और एक बार पर्याप्त जानकारी के बारे में वेरिएबल्स मूल्यों (डायनामिक भाषाओं में प्रकार नहीं) के एकत्र कर ली गई है, तो कोड को वेरिएबल्स के मूल्यों के आधार पर गार्ड के साथ (आईआर से) recompiled किया जा सकता है।

मुझे याद है कि लिबक्लैंग नाम के तहत क्लच में एसी / सी ++ जीट बनाने पर कुछ प्रगति हुई थी।


1
AFAIK, libclang एक लाइब्रेरी के रूप में फैले क्लैंग फंक्शनलिटी का अधिकांश हिस्सा है। इसलिए, आप इसका उपयोग परिष्कृत सिंटैक्स रंग बनाने के लिए सोर्स कोड का विश्लेषण करने के लिए, लिंट्स, कोड ब्राउज़िंग आदि के लिए कर सकते हैं
जेवियर

@ जेवियर, सही के बारे में लगता है। मुझे लगता है कि पुस्तकालय में एक फ़ंक्शन था जो स्रोत कोड के एक कॉन्स्ट चर * लेता था और llvm ir का उत्पादन करता था, लेकिन अब सोच रहा है, यह शायद स्रोत के बजाय आईआर के आधार पर चुटकी लेना बेहतर है।
dan_waterworth
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.