Emacs संस्करणों के बीच बाइटकोड की पोर्टेबिलिटी


9

मैं कभी-कभी एक ही होम डायरेक्टरी से Emacs के कई संस्करण चलाता हूं। मेरे पास कई बाइट-संकलित फ़ाइलें हैं। बाइटकोड सभी एमएसीएस संस्करणों में संगत नहीं है, इसलिए मैं .elcप्रत्येक संस्करण रेंज के लिए फाइलों के लिए अलग निर्देशिका बनाए रखता हूं ।

संस्करण रेंज क्या हैं जिनके लिए बायोटेक संगत है? मेरे पास वर्तमान में है

gnu-19.29
gnu-20
gnu-21
gnu-22
gnu-23
gnu-24
source
x-19
x-20
x-21

19.29 पर एक अलग पृथक्करण के साथ प्रत्येक बड़ी रिलीज़ के लिए निर्देशिकाएं (मैंने इस मशीन पर पुराने संस्करण का उपयोग कभी नहीं किया है, अन्यथा वहाँ होगा gnu-19), और GNU Emacs और XEmacs के लिए अलग निर्देशिका। मैं शायद अत्यधिक सतर्क हूं, हालांकि।

Emacs संस्करणों में बाइटकोड संगतता के बारे में आधिकारिक नीति क्या है? क्या मैं आत्मविश्वास से प्रमुख संस्करण का उपयोग कर सकता हूं? क्या मैं कुछ संस्करणों का विलय कर सकता हूं? क्या कोई बाईटकोड संस्करण संकेत या चेकसम है जिसे मैं Emacs संस्करण पर निर्भर होने के बजाय निर्देशिका नाम बनाने के लिए संकलन करते समय क्वेरी कर सकता हूं?

ध्यान दें कि मैं मुख्य रूप से पूर्ण संगतता में दिलचस्पी रखता हूं, न कि केवल पिछड़ी संगतता। मैं कुछ फ़ाइलों को Emacs 27.3 और बाइट-संकलित कर सकता हूं और बाद में Emacs 27.2 को उसी होम डायरेक्टरी के साथ चला सकता हूं।


जिज्ञासा से बाहर, आप ऐसे पुराने संस्करण क्यों चलाते हैं? 19 अब तक एक दशक से अधिक होना चाहिए।
टायलर

कुछ Emacs 24.2 .elc फाइलें Emacs 24.3 के साथ काम नहीं करती हैं: github.com/mooz/js2-mode/issues/72
Wilfred Hughes

जवाबों:


9

अनुचर के रूप में, मैं निम्नलिखित को संरक्षित करने का प्रयास करता हूं:

  • बाइट-कोड की बैकवर्ड संगतता। यानी आपको Emacs-19 के साथ संकलित अपनी .elc फ़ाइल को लेने और Emacs-27 में इसे सफलतापूर्वक चलाने में सक्षम होना चाहिए। बेशक, व्यवहार में यह हमेशा काम नहीं करता है, क्योंकि पिछड़े असंगतता या तो दुर्घटना या होशपूर्वक पेश किए जाते हैं (थियो इन आमतौर पर बायटेकॉम्फ़ेड फ़ाइलों के लिए विशिष्ट नहीं होते हैं)।
  • एक प्रमुख संस्करण के भीतर पूर्ण बाइट-कोड संगतता। यह कम देखभाल के साथ पीछा किया जाता है, ज्यादातर क्योंकि यह स्वचालित रूप से होता है, लेकिन आम तौर पर आपको 27.N पर बाइट-संकलन करने में सक्षम होना चाहिए और इसे 27.1 पर सफलतापूर्वक चलाना होगा। यह कहा, यह हमेशा पुराने संस्करण पर बाइट-संकलन करने के लिए अनुशंसित है।

बेशक, ऊपर विशेष रूप से बाइट संकलित कोड के बारे में है, और अभी भी वास्तविक सामान्य संगतता पर निर्भर करता है: यदि foo.elEmacs-19 और Emacs-27 में चलता है, तो foo.elcEmacs-19 पर संकलित Emacs-27 पर काम करना चाहिए। लेकिन अगर वह foo.elEmacs-19 या Emacs-27 पर काम नहीं करता है, तो foo.elcEmacs-19 पर संकलित शायद Emacs-27 पर काम नहीं करेगा।

इसके अलावा, कुछ मामले हैं जहां हम जानबूझकर बाइट-संकलित कोड की पिछड़ी संगतता को तोड़ते हैं।


5

आपको अलग-अलग Emacs संस्करणों के बीच बाइटकोड फ़ाइलों के संगत होने की उम्मीद नहीं करनी चाहिए। वास्तविक बाइटकोड प्रारूप ज्यादातर ऊपर की ओर संगत है, लेकिन आप विस्तारित मैक्रोज़ के साथ परेशानी में चलेंगे।

मुझे समझाने दो। जब बाइट-कंपाइलर एक मैक्रो का सामना करता है, तो यह मैक्रो के विस्तार की गणना करता है और परिणाम को संकलित करता है। यदि मैक्रो किसी फ़ंक्शन पर कॉल करने के लिए विस्तारित हो जाता है, तो परिणामस्वरूप बाइटकोड फ़ाइल में फ़ंक्शन का संदर्भ होगा। यदि एक आंतरिक फ़ंक्शन जो एमएसीएस संस्करणों के बीच मैक्रो परिवर्तन के विस्तार में दिखाई देता है, तो बायटेकोड संगत नहीं होगा।

जाहिर है, Emacs डेवलपर्स मैक्रोज़ से बचने की कोशिश करते हैं जो आंतरिक कार्यों में विस्तार करते हैं जो बदल सकते हैं। हालांकि, यह कभी-कभी हासिल करना मुश्किल होता है, और मैं उस पर भरोसा नहीं करूंगा, विशेष रूप से बड़े बदलावों की उपस्थिति में जैसे कि gv.elEmacs 24।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.