किसी प्रोग्राम का 64 बिट संस्करण बनाना मुश्किल क्यों हो सकता है?


29

मेरी कम समय की प्रोग्रामिंग में, मेरे C ++, जावा आदि में से किसी एक को 32 या 64 बिट मशीन के लिए संकलित करना तुच्छ है, जब तक कि मेरे पास कार्यक्रम के लिए पूर्ण स्रोत न हो।

लेकिन बहुत सारे सॉफ्टवेयर 64 बिट रिलीज़ नहीं होते हैं। सबसे अधिक परेशान करने वाली बात यह है कि अभी तक एकता इंजन का 64 बिट का रिलीज नहीं हुआ है।

64 बिट मशीनों के लिए कुछ कार्यक्रमों को संकलित करने में क्या मुश्किल है?


57
क्योंकि बेवकूफ प्रोग्रामर मानते हैंsizeof(int)==sizeof(void*)
शाफ़्ट फ्रीक

16
हमारे पर्यावरण में सबसे ऊपरी कारण कुछ तृतीय-पक्ष घटकों पर निर्भरता है जो 64 बिट के रूप में उपलब्ध नहीं हैं। पता नहीं अगर यह एकता पर लागू होता है, तो भी, लेकिन अगर ऐसा है तो मुझे बहुत आश्चर्य नहीं होगा।
Doc Brown

वे अपने आकार को संभालने के बजाय int32, int64 for int, float, पॉइंटर जैसे टाइपडिफ का उपयोग कर सकते हैं। जिससे बहुत समस्या हल हो सकती है। हम जिस समय से ग्रहण करना शुरू करते हैं, कई समस्याएं शुरू हो जाती हैं।
क्षितिज

जो वास्तव में फ्लैट आर्किटेक्चर पर पूरी तरह से उचित धारणा है। विंडोज ने अपने स्वयं के स्क्रू-अप को तोड़ने से बचने के लिए जानबूझकर गलत किया।
जोशुआ

3
यह एक उचित धारणा क्यों होगी? मैं एक सभ्य के operator*लिए उम्मीद है int, लेकिन संकेत की जरूरत नहीं है कि। इसके अलावा, अधिकांश लिनक्स और यूनिक्स के वातावरण intमें 32 बिट्स भी हैं।
एमएसलटर्स

जवाबों:


61

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

  • यह मानते हुए कि intएक पॉइंटर को स्टोर करने के लिए पर्याप्त बड़ा है

  • पॉइंटर टैगिंग के लिए, पॉइंटर्स के प्रतिनिधित्व के गुणों को मान लेना

  • यह मानते हुए कि डेटा पॉइंटर्स और कोड पॉइंटर्स का आकार समान है

रिलीज मैनेजमेंट की व्यावहारिक चिंता भी है। अगर मैं केवल एक x86 का निर्माण करता हूं, यह अभी भी x86-64 पर चलेगा, यद्यपि रजिस्टरों की सीमित उपलब्धता के कारण शायद अधिक धीरे-धीरे। जबकि अगर मैं x86 और x86-64 दोनों के लिए निर्माण करता हूं, तो मुझे अब दोनों आर्किटेक्चर पर परीक्षण करना चाहिए और उन बगों से निपटना होगा जो केवल एक आर्किटेक्चर पर उत्पन्न हो सकते हैं, जिससे शिपिंग की लागत में वृद्धि होगी।


10
ध्यान दें कि एक बग लिखना संभव है जो केवल तब प्रकट होता है जब एक x86 बाइनरी ओएस के 64 बिट संस्करण पर चलाया जाता है। यह कठिन है ;-)
स्टीव जेसप

6
+1। मैं "रिलीज मैनेजमेंट" के बिंदु पर निम्नलिखित जोड़ना चाहूंगा: यदि मेरा सॉफ्टवेयर तीसरे पक्ष के घटकों पर निर्भर करता है, भले ही एक विशिष्ट घटक का 32 और 64 बिट संस्करण उपलब्ध हो, नई रिलीज के परीक्षण के लिए अतिरिक्त प्रयास कम नहीं होना चाहिए। तो IMHO रिलीज प्रबंधन उस सूची पर पहला बिंदु होना चाहिए , न कि केवल एक साइड नोट।
Doc Brown

आप int सूचक आकार के मुद्दे पर विस्तृत कर सकते हैं? क्या ऐसा इसलिए है क्योंकि 64 बिट के वातावरण में, मेमोरी स्पेस एक इंट की अनुमति से अधिक होगा?
टैंकरस्मैश

4
@TankorSmash: सामान्य रूप से x86 पर sizeof(int) == sizeof(void *)(वे दोनों 32 बिट हैं); x86_64 पर, यह int32 बिट रखने के लिए सामान्य है (यह x86 के साथ संगत रहता है और मेमोरी में जगह बर्बाद करने से बचता है), लेकिन पॉइंटर्स को 64 बिट होना चाहिए (चूंकि वर्चुअल एड्रेस स्पेस 2 ^ 64 तक जाता है), इसलिए वे अब नहीं रह सकते हैं एक में shoved intया unsigned int
मट्टियो इटालिया

26

अधिकांश सॉफ्टवेयर 32 और 64 बिट इंटेल / एएमडी आर्किटेक्चर दोनों के लिए संकलित होने पर समान काम करेंगे। हालांकि, कुछ सॉफ्टवेयर नहीं होगा। आलस से, या बड़े दर्शकों तक पहुंचने के बावजूद, कुछ विशिष्ट कारण हैं कि 64 बिट के रूप में फिर से काम करने से काम नहीं चलेगा।

  • सॉफ़्टवेयर असुरक्षित पॉइंटर ऑपरेशन का उपयोग कर सकता है। शायद एक प्रोग्राम एक पॉइंटर को एक इंट में डालता है, जो आमतौर पर अधिकांश सी और सी ++ कंपाइलरों के लिए 32 बिट है। 64 बिट प्रोग्राम में पॉइंटर्स 64 बिट्स हैं। वह काम नहीं करता।

  • यदि भिन्न प्रकार का उपयोग किया जा रहा है तो बिट शिफ्ट ऑपरेशन अलग परिणाम उत्पन्न कर सकता है। यह एक मानक टाइपएड की बजाय नियमित डेटा प्रकार का उपयोग करते समय एक समस्या हो सकती हैint32_t

  • संघ में उपयोग किया जाने वाला डेटा प्रकार, संघ के व्यवहार को बदलते हुए आकार बदल सकता है।

  • सॉफ्टवेयर उन पुस्तकालयों पर निर्भर हो सकता है जो केवल 32-बिट हैं। सामान्य तौर पर, एक 64 बिट प्रोग्राम केवल स्टैक, पॉइंटर्स, आदि के बारे में मान्यताओं के कारण 64 बिट पुस्तकालयों के साथ काम करेगा।

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

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

यह लेख इस उत्तर में शामिल होने की उम्मीद से कहीं अधिक विस्तार में जाता है: 64-बिट प्लेटफॉर्म पर C ++ कोड को पोर्ट करने के 20 मुद्दे


8
मुद्दे सिर्फ संकलन से भी आगे जा सकते हैं, भी; मेरे पास एक मुस्लिम दोस्त है जो उपलब्ध 64-बिट FL स्टूडियो का उपयोग नहीं कर सकता है क्योंकि उन्हें कई VSTi की आवश्यकता होती है जो केवल 32 बिट हैं; अन्य डायनामिक-लिंक आधारित प्लगइन आर्किटेक्चर simillarly से प्रभावित हैं।
StarWeaver

संपादन के लिए धन्यवाद: मैं सामान्य रूप से व्याकरण के बारे में बहुत चुस्त हूँ, लेकिन कुछ गलतियाँ की है। और @StarWeaver मुझे लगता है कि मैंने उस पर छुआ था जब मैंने कहा था कि कोड संकलित कर सकता है, लेकिन इसमें कीड़े हैं। यह अभी भी मेरी बात पर वापस जाता है कि आप जिस भी भाषा और मंच को लक्षित कर रहे हैं, उसके लिए स्वच्छ कोड लिखना है।

"शो-स्टॉपर कीड़े हैं" शो स्टॉपर स्पष्ट और "आपके चेहरे में" हैं और इससे निपटा जा सकता है। मुझे लगता है कि शायद बदतर है वह सभी समस्याएं हैं जो सूक्ष्म रूप से गलत परिणाम पैदा करती हैं जो लंबे समय तक किसी का ध्यान नहीं जाएगा।
बुरहान अली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.