2010-09-02 8 views
6

64-बिट वातावरण में अपने सॉफ़्टवेयर को डिज़ाइन करते समय सभी पहलुओं को ध्यान में रखा जाना चाहिए, और 32-बिट और 64-बिट (अनुप्रयोगों के बारे में बात करते समय) के समान कोड क्यों नहीं काम करेगा?सॉफ्टवेयर के 64-बिट संस्करणों को बनाना इतना मुश्किल क्यों है?

ड्राइवर्स स्पष्ट रूप से एक अलग जानवर हैं, गायब 64-बिट ड्राइवर लगभग सभी हार्डवेयर के लिए कुख्यात समस्या हैं। उस डोमेन में इतना अलग क्या है कि ड्राइवरों को ढूंढना असंभव है?

सॉफ्टवेयर के 64-बिट संस्करणों को बनाना इतना मुश्किल क्यों है?

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

निष्कर्ष: ऐसा लगता है कि यह तकनीकी कारणों से मानव आलस्य और ऐतिहासिक कारणों के बारे में है।

+1

यदि आप एक अच्छा जवाब चाहते हैं तो आपको अधिक विशिष्ट होना चाहिए। उदाहरण के लिए, यह .NET अनुप्रयोगों के 64 बिट संस्करण बनाने के लिए दिमागी है - इसे किसी भी CPU या x64 के रूप में संकलित करने के लिए सेट करें। तो जाहिर है, आप .NET अनुप्रयोगों के बारे में बात नहीं कर रहे हैं, लेकिन आप किस बारे में बात कर रहे हैं? :) –

+0

मैं सामान्य रूप से पूछ रहा हूं कि तकनीकी कारण क्या है जो स्पष्ट रूप से 32-बिट और 64-बिट ऐप्स बनाने के लिए सटीक उसी कोडबेस का उपयोग करना असंभव बनाता है। चूंकि यह केवल पुन: सम्मिलित होने के बारे में होगा, इसलिए सभी पुस्तकालय 64-बिट आदि के रूप में भी उपलब्ध होंगे, फिर सभी ऐप्स को 64-बिट -> यानी भी पुनः संकलित किया जा सकता है। कोई बात नहीं। – Tuminoid

+1

"सभी गायब 64-बिट सॉफ़्टवेयर बस नहीं हो सकते क्योंकि लोग जादू संख्या वाले कोड पसंद करते हैं ?!" - 64 बिट सॉफ़्टवेयर में बहुत कुछ गायब हो सकता है क्योंकि इसकी आवश्यकता नहीं है। अगर कोई गलत है तो कृपया मुझे सही करें, लेकिन अंगूठे का नियम मैंने सुना है: जब तक कि आप संभावित रूप से 4 जीबी से अधिक स्मृति को संबोधित नहीं कर रहे हैं, तो आपको 32 बिट के रूप में संकलित करना चाहिए। –

उत्तर

14

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

एक समस्या है कि अगर सॉफ्टवेयर कहीं सी में एक reinterpret_cast ++ (जो वास्तव में कुछ कम स्तर कोड में हो सकता है) के माध्यम से एक int में एक सूचक shoehorns, और यह क्योंकि एक int के आकार काम करने के लिए हुआ है और एक सूचक थे एक माप। असल में, कोड एक सूचक के लिए एक निश्चित आकार माना जाता है।

एक और तरीका है कि वापस काट सकते हैं, तो कोड 4 बजाय sizeof(void*), या 0xffffffff बजाय INT_MAX या कुछ इसी तरह की तरह जादू संख्या से अटे पड़े है।

सॉफ़्टवेयर का 64-बिट संस्करण नहीं हो सकता है यदि यह लाइब्रेरी या 64 बिट्स में उपलब्ध फ़ंक्शन पर निर्भर करता है। आपके पास कोई ऐसा एप्लिकेशन नहीं हो सकता है जो भाग 32 बिट्स और 64 बिट्स है। उदाहरण के लिए, विंडोज़ में, SetWindowLong नामक एक फ़ंक्शन है जो केवल 32-बिट डेटा को स्वीकार कर सकता है, इसलिए यदि पॉइंटर को फ़ंक्शन में पास करने की आवश्यकता होती है तो यह 64-बिट प्रोग्राम के लिए बहुत उपयोगी नहीं है। यही कारण है कि SetWindowLongPtr नामक एक फ़ंक्शन है जो 64-बिट प्रोग्राम में 64-बिट्स और 32-बिट प्रोग्राम में 32-बिट्स को संभाल सकता है।

ध्यान दें कि इंटरनेट एक्सप्लोरर 64-बिट विंडोज़ पर भी डिफ़ॉल्ट रूप से 32-बिट्स पर चलता है, क्योंकि इसके लिए प्लगइन का एक बड़ा बहुमत केवल 32-बिट्स में उपलब्ध है। इसका एक बड़ा उदाहरण the Adobe Flash Player है, जो केवल 32-बिट्स में उपलब्ध है। तो जाहिर है, एडोब जैसे एक बड़ी कंपनी के लिए भी, 64-बिट्स के लिए पोर्टिंग हमेशा तुच्छ नहीं हो सकता है।

बिट्सफ़िफ्टिंग परिचालन प्रभावित हो सकते हैं। उदाहरण के लिए, बिटर स्थानांतरण 0x80000 32 बिट्स में 10 बार छोड़ा गया है, आपको 0x0 देता है, लेकिन बिट बिटिंग 0x80000 64 बिट्स में 10 बार छोड़ा गया है आपको 0x200000000 देता है।

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

मेरे क्रांतिकारी पक्ष का कहना है कि कंपनियां योजनाबद्ध अशुभता को लागू करने के लिए एक तरीके के रूप में इसका उपयोग करती हैं या लोगों को नए उत्पादों को अपग्रेड/खरीदने के लिए प्रोत्साहित करती हैं!

+0

लेकिन यह एक समस्या क्यों है? संकलक को बेहतर नहीं पता होना चाहिए? – Tuminoid

+1

ऐसा करता है, लेकिन यदि कोड 'reinterpret_cast' का उपयोग करता है, तो संकलक नैदानिक ​​उत्सर्जित नहीं करेगा (यही कारण है कि टाइपकास्टिंग सावधानीपूर्वक करने की आवश्यकता है)। –

+0

और मैं उचित गुणवत्ता वाले सॉफ़्टवेयर के बारे में बात कर रहा हूं जो जादू संख्याओं से भरा नहीं है। यदि यह मदद करता है, तो दोनों दुनिया पर संगत होने के लिए सॉफ्टवेयर बनाने के बारे में सोचें। – Tuminoid

3

उचित रूप से लिखित सॉफ्टवेयर आमतौर पर किसी अन्य वास्तुकला के लिए बंदरगाह के लिए बहुत आसान है। बस नेटबीएसडी, डेबियन या अन्य बड़े फ्री ओएस देखें ... बहुत से खुले स्रोत सॉफ्टवेयर दो से अधिक आर्किटेक्चर पर काम करते हैं।

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

ड्राइवर्स यहां थोड़ा अलग हैं। विभिन्न आर्किटेक्चर विभिन्न तरीकों से कम-स्तर की सामग्री को संभाल सकते हैं। x86 और amd64 विंडोज़ में एक और समस्या है: माइक्रोसॉफ्ट ने amd64 ड्राइवरों के लिए अधिक सख्त मानकों को सेट किया है - हार्डवेयर कंपनियां पुराने हार्डवेयर के लिए ड्राइवरों का उत्पादन करने के लिए परेशान नहीं हैं जो कठोर आवश्यकताओं का पालन करती हैं (फिर से: परेशान क्यों? ग्राहक आमतौर पर पहले से ही अपने नए हार्डवेयर के साथ नए हार्डवेयर खरीदता है 64-बिट बक्से; और यदि वह नहीं करता है, तो हम उसे ड्राइवरों को प्रदान न करके वैसे भी करेंगे)। दोबारा, ओपन सोर्स ड्राइवर अक्सर amd64 और x86 दोनों पर काम करते हैं।

मेरे पास एक ध्वनि कार्ड है जो लिनक्स पर x86 और amd64 सिस्टम दोनों पर काफी अच्छा काम करता है, लेकिन इस समस्या के कारण विंडोज amd64 विंडोज के साथ काम नहीं करता है। तो इसके लिए amd64 के लिए ड्राइवर लिखना असंभव नहीं था; हार्डवेयर कंपनी बस नहीं चाहता था।

तो, आपके प्रश्न का अंतिम जवाब यह है: पैसा।

+0

मुझे 6 माह पुराना कैनन रंग लेजर प्रिंटर मिला है और उन्होंने 64-बिट ड्राइवर, *** में प्रमुख दर्द प्रदान नहीं किया है। तो नए हार्डवेयर खरीदना खुशी प्रदान नहीं करता है ... – Tuminoid

4

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

यह मुख्य रूप से इन निम्न-स्तर की विशेषताएं हैं जो आर्किटेक्चर स्वतंत्रता को कठिन बनाते हैं। पायथन और सी # जैसी उच्च स्तरीय भाषाओं में, यह बहुत आसान है।

संबंधित मुद्दे