2011-08-20 8 views
9

के लिए हॉट रीकंपिलेशन मैं हाल ही में जावा कोड को स्वचालित रूप से पुन: संकलित करने और एक चल रहे प्रोग्राम में इंजेक्शन देखने के लिए आश्चर्यचकित था। चूंकि आधुनिक सी ++ कंपाइलर्स (उदाहरण के लिए एलएलवीएम-आधारित) जेआईटी संकलन की जांच शुरू करते हैं, इसलिए मुझे आश्चर्य है कि इस विषय पर कोई काम किया गया है या नहीं।सी ++

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

सी ++ के लिए गर्म पुनर्मूल्यांकन की शोध स्थिति क्या है? क्या कोई कामकाजी कार्यान्वयन है?

+0

प्रश्न वास्तव में क्या है? – Hogan

+0

@ होगन मैंने प्रश्न अपडेट किया है। –

+0

परिभाषित करें "गर्म पुनर्मूल्यांकन"। –

उत्तर

10

यह संभव है कि "हॉट रीकंपिलेशन" से आपका मतलब विज़ुअल सी ++ में "Edit and continue" जैसा कुछ है।

शायद यह लिंक आपके प्रश्न का उत्तर गठित करता है।

लेकिन यह आसान होगा यदि आप उस शब्द को परिभाषित करेंगे जो आप पूछ रहे हैं, "गर्म पुनर्मूल्यांकन", अधिक स्पष्ट रूप से (जैसा कि मैं इसे लिख रहा हूं यह अच्छी तरह परिभाषित नहीं है)। 1990 में "संपादित करें और आगे बढ़ें" के लिए सी ++ जाहिरा तौर पर introduced with Visual C++ 6.0 था,:

गयी। तो यह केवल थोड़ा आश्चर्यजनक है कि कुछ जावा कार्यान्वयन अब यह कर सकता है। < जी > हालांकि, /Zi स्विच जो संपादन-और-जारी करता है, भी मुझे याद करता है, जैसा कि मुझे याद है, __LINE__ के व्यवहार को बदलें ताकि उदा। मूल ScopeGuard कार्यान्वयन कार्य नहीं करता है (एक को तब माइक्रोसॉफ्ट-विशिष्ट __COUNTER__ का उपयोग करना होगा)।

चीयर्स & hth।,

+1

+1 संपादन और जारी रखने का उल्लेख करने के लिए।मैंने इसे कुछ चीजों को डीबग करने के लिए अंतहीन रूप से उपयोगी पाया है। –

+0

वाह। मुझे वीएस में इस सुविधा के बारे में कोई जानकारी नहीं थी। क्या कोई अन्य कंपाइलर/आईडीई इसे कार्यान्वित करता है? –

2

automatically recompiled and injected into a running program. से मैं तुम्हारे बारे में JVM वास्तव में प्रोग्राम निष्पादन देख रहे हैं और रनटाइम पर भविष्यवाणी की शाखा मूल्यों में परिवर्तन, उदाहरण के लिए छलांग और अन-पाइपलाइनिंग कम करने के लिए बात कर रहे हैं मान।

यह जावा में किया जा सकता है क्योंकि स्रोत कोड और वास्तविक मशीन निर्देशों के बीच एक अलग अच्छी परिभाषित मध्यवर्ती चरण है। यह रनटाइम पर इंटरमीडिएट कोड को प्रतिस्थापित करने में सक्षम होगा, संभवतः प्रदर्शन में सुधार करेगा।

सी ++ में प्रोग्राम सीधे किसी विशेष आर्किटेक्चर की मशीन भाषा में बनाया गया है और अधिकांश हार्डवेयर पर, कोड पेज केवल विभिन्न कारणों से पढ़े जाते हैं जिनमें आकस्मिक और दुर्भावनापूर्ण कोड परिवर्तनों को रोकना शामिल है।

अब

, क्या आप सी में कर सकता ++ जैसे वह बजना पुस्तकालय एक साझा वस्तु में कोड के वर्गों के पुनर्निर्माण के लिए कुछ का उपयोग करें और फिर dlopen आदि का उपयोग कंपाइल साझा वस्तु को खोलने के लिए मशीन के नए संस्करण को लेने के लिए है कोड। निश्चित रूप से जावा प्रोग्राम की तुलना में आपके प्रोग्राम को बहुत अधिक स्मार्ट होने की आवश्यकता है जो JVM का लाभ उठाना है। I मानते हैं कि g ++/gprof में एक मोड है जहां g ++ के अनुकूलन को प्रभावित करने के लिए प्रोफाइलिंग डेटा का उपयोग किया जा सकता है, हो सकता है कि आप यही खोज रहे हों?

+0

जो आप उल्लेख कर रहे हैं वह एक सामान्य विशेषता है जो एक जेआईटी कंपाइलर होना चाहिए। मैं अनुकूलन का जिक्र नहीं कर रहा था। मेरा सवाल @ एएलएफ के सुझाव से अधिक संबंधित था। –