में एंड्रयू Tanenbaum के साथ एक बहस बनाम अखंड ऑपरेटिंग सिस्टम वास्तुकला microkernel से अधिक, लिनुस टोर्वाल्ड ने कहा,
पोर्टेबिलिटी उन लोगों के लिए है जो नए प्रोग्राम नहीं लिख सकते हैं।
उनका इससे क्या मतलब था?
में एंड्रयू Tanenbaum के साथ एक बहस बनाम अखंड ऑपरेटिंग सिस्टम वास्तुकला microkernel से अधिक, लिनुस टोर्वाल्ड ने कहा,
पोर्टेबिलिटी उन लोगों के लिए है जो नए प्रोग्राम नहीं लिख सकते हैं।
उनका इससे क्या मतलब था?
जवाबों:
जैसा कि लिनुस बहस में लिखते हैं, यह गाल में जीभ के साथ है (यानी बहुत गंभीरता से नहीं लिया जाना चाहिए)।
फिर, वह समझाता है कि जबकि पोर्टेबिलिटी अच्छी बात है, यह एक व्यापार-बंद भी है; unportable कोड बहुत सरल हो सकता है। यही है, कोड को पूरी तरह से पोर्टेबल बनाने के बजाय, बस इसे सरल और पोर्टेबल बनाएं ("एक पोर्टेबल एपीआई का पालन करें"), और फिर अगर इसे पोर्ट किया जाना है, तो आवश्यकतानुसार इसे फिर से लिखना चाहिए। कोड को पूरी तरह से पोर्टेबल बनाना समय से पहले अनुकूलन के रूप में भी देखा जा सकता है - अक्सर अच्छे से अधिक नुकसान।
निश्चित रूप से यह संभव नहीं है यदि आप नए कार्यक्रम नहीं लिख सकते हैं और मूल के साथ रहना होगा :)
मुझे लगता है कि इसका मतलब है कि प्रत्येक प्रोग्राम को विशेष रूप से उस पर चलने वाले हार्डवेयर और ऑपरेटिंग सिस्टम के लिए लिखा जाना चाहिए।
मुझे लगता है कि वह जो ड्राइविंग कर रहा है वह सामान्य उद्देश्य कोड है जो कई प्लेटफार्मों पर चल सकता है, विशेष रूप से लिखे और एक मंच के अनुरूप लिखे गए कोड की तुलना में कम कुशल या अधिक त्रुटि प्रवण है। हालांकि, इसका मतलब यह है कि जब आप इस तरह विकसित होते हैं तो आपको कई अलग-अलग कोड लाइनों को बनाए रखना पड़ता है।
जब लिनक्स पहली बार लिखा गया था, तो इसमें केवल i386 सीपीयू पर उपलब्ध सुविधाओं का उपयोग किया गया था, जो उस समय काफी नया और महंगा था।
ठीक वही है जो लिनक्स करता है: यह 386 सुविधाओं के एक बड़े उपसमुच्चय का उपयोग करता है अन्य कर्नेल की तुलना में ऐसा लगता है। बेशक यह कर्नेल को उचित रूप से अप्रमाणित बनाता है, लेकिन यह एक / बहुत / सरल डिजाइन के लिए भी बनाता है। एक स्वीकार्य व्यापार-बंद, और एक जिसने पहले स्थान पर लिनक्स को संभव बनाया।
जैसे ही हम 21 वीं सदी में गए, i386 को अद्वितीय बनाने वाली सुविधाएँ पूरी तरह से मुख्यधारा बन गईं, जिससे लिनक्स बहुत पोर्टेबल हो गया।
जैसा कि किसी ने बहुत सारे जावा किया है, और वर्षों के लिए साप्ताहिक आधार पर "लिखना एक बार, हर जगह डिबग" घटना का अनुभव किया है, मैं पूरी तरह से इस से संबंधित हो सकता हूं।
और जावा शायद एक हल्का उदाहरण है। मैं यह कल्पना करना भी शुरू नहीं कर सकता कि लोग किस माध्यम से जाते हैं, जो एक भाषा / टूलकिट में एक पोर्टेबल कोड आधार की कोशिश करते हैं, जिसे खुद में और पोर्टेबल होने के लिए डिज़ाइन नहीं किया गया था।
अभी काम पर, हम मोबाइल उपकरणों के लिए हमारे उत्पादों में से एक के संस्करण को लिखने के विचार की जांच कर रहे हैं। मैंने J2ME और Android दोनों के लिए इसका एक पोर्टेबल संस्करण कैसे किया जाए, इसके बारे में कुछ शोध किया है - जो कि जितना संभव हो उतना कोडबेस साझा करने की कोशिश करता है (जाहिर है कि प्रति se पूरी तरह से "पोर्टेबल" नहीं हो सकता है, लेकिन यह एक समान दर्शन है )। यह एक दुःस्वप्न है।
तो हाँ, कभी-कभी यह वास्तव में दिए गए काम के लिए दिए गए टूल का उपयोग करने के मामले में सोचने (और करने) में सक्षम होने के लिए अच्छा है। यानी स्वतंत्र रूप से एक, एकल, अखंड मंच / पर्यावरण के खिलाफ विकसित करना। और सिर्फ प्रत्येक के लिए अलग, स्वच्छ संस्करण लिखना।
हालाँकि, कुछ लोग पोर्टेबिलिटी, निम्न मानकों आदि को देखते हैं, नैतिक रूप से श्रेष्ठ हैं, या उस आदेश पर कुछ करते हैं, जो वास्तव में उबलता है वह है अर्थशास्त्र।
पोर्टेबल कोड लिखना कोड को पोर्टेबल बनाने के प्रयास के संदर्भ में लागत है, और (अक्सर) कुछ सुविधाओं को पूर्वगामी बनाना है जो सभी लक्ष्यों पर उपलब्ध नहीं हैं।
गैर-पोर्टेबल कोड में कोड को पोर्ट करने के प्रयास के संदर्भ में एक लागत होती है, जब आप एक नई वास्तुकला के बारे में परवाह करते हैं, और (अक्सर) मूल लक्ष्य पर उपलब्ध नहीं हैं (या नहीं थे) कुछ सुविधाओं को पूर्वगामी।
वहाँ बड़ा क्वालीफायर "जब / यदि आप एक नई वास्तुकला की परवाह करते हैं"। पोर्टेबल कोड लिखने से छोटे या बिना किसी प्रयास के नए / अलग आर्किटेक्चर पर उस कोड का उपयोग करने में सक्षम होने की अंतिम अदायगी की उम्मीद में अप-फ्रंट की आवश्यकता होती है । गैर-पोर्टेबल कोड आपको उस निवेश को पोर्ट करने में देरी करता है जब तक कि आप (कम से कम यथोचित) यह सुनिश्चित न कर लें कि आपको वास्तव में कुछ विशेष लक्ष्य के लिए पोर्ट करने की आवश्यकता है।
यदि आप सुनिश्चित हैं कि आप बहुत सारे लक्ष्यों को पोर्ट करने जा रहे हैं, तो आमतौर पर लंबी अवधि के पोर्टिंग लागत को कम करने के लिए अप-फ्रंट में निवेश करना सार्थक होता है। यदि आप इस बारे में कम निश्चित हैं कि आपको कितना (या यहां तक कि) कोड को पोर्ट करने की आवश्यकता होगी, तो गैर-पोर्टेबल कोड लिखने से अप-फ्रंट लागत को कम करने में देरी होती है, या संभवत: कोड को पोर्टेबल बनाने की लागत से पूरी तरह से परहेज करते हैं।
मुझे लगता है कि यह भी ध्यान देने योग्य है कि मैंने "पोर्टेबल" और "गैर-पोर्टेबल" की बात की है जैसे कि दोनों के बीच स्पष्ट-कट विभाजन था। वास्तव में, यह सच नहीं है - पोर्टेबिलिटी एक निरंतरता है, जो पूरी तरह से गैर-पोर्टेबल (जैसे, असेंबली कोड) से बेहद पोर्टेबल (जैसे, जानकारी-ज़िप), और हर जगह बीच में चल रही है।
Tanenbaum बिंदु बनाता है कि लिनक्स का अधिकांश गैर-मॉड्यूलर तरीके से 386 सीपीयू का लाभ उठाने के लिए लिखा जाता है, उस समय कला की स्थिति, सीपीयू इंटरैक्शन को एक घटक बनाने के बजाय, और इस प्रकार बहुत आसानी से स्वैपेबल है। तनबेनम अनिवार्य रूप से मानते हैं कि तथ्य यह है कि कर्नेल इतना अखंड है और 386 सीपीयू से बंधा है, यह बहुत मुश्किल है
लिनक्स शिविर कई बिंदु बनाता है, जिनमें से:
यदि आप पोर्टेबल कोड लिखना चाहते हैं, तो आपको पोर्टेबल कोड लिखना होगा।
उससे मेरा मतलब क्या है?
डिजाइन उद्देश्य को प्रतिबिंबित करना चाहिए। उदाहरण के लिए, यदि भाषा C है, तो इसे डिज़ाइन करें ताकि काम करने के लिए कोड की न्यूनतम संख्या को बदलने की आवश्यकता हो। इसका अर्थ अक्सर प्रदर्शन को संगणना से अलग करना होता है, जो कि एक अच्छा डिज़ाइन दर्शन है (MVC)। अधिकांश सी कोड कहीं भी संकलित किए जा सकते हैं, बशर्ते आपके पास एक अच्छे संकलक की पहुंच हो। उत्तोलन करें और जितना सामान्य हो सके उतना लिखें।
BTW, यह जवाब केवल अनुप्रयोगों के लिए लागू होगा। ओएस और एम्बेडेड पूरी तरह से एक और जानवर हैं।
इस कथन की व्याख्या "वस्तुतः" है जिस तरह से है।
लीनुस के उद्धरण का एक और में उन्होंने कहा: "सी ++ सब गलत समस्याएं हल करने की कोशिश कर रहा है बातें सी ++। हल तुच्छ बातों, बल्कि कुछ सच गहरी समस्या को ठीक करने से सेल्सियस के लिए लगभग पूरी तरह वाक्यात्मक एक्सटेंशन हैं।"
इसके अलावा उनकी जीवनी में, "जस्ट फॉर फन" लाइनस ने माइक्रोकर्नेल के बारे में उद्धृत करते हुए कहा कि जटिलता 'एन' के साथ एक समस्या के लिए यदि आप समस्या को '1 / n' अद्वितीय भागों में विभाजित करते हैं .. तो ऐसी प्रणाली विकसित करने की कुल जटिलता। हो 'n!' यह अपने आप में एक ऐसा कारक है जो इस तरह की कोशिश करने के लिए पर्याप्त नहीं है, और ऐसी जटिल प्रणाली से दक्षता निकालना बहुत मुश्किल होगा।
आपको इस तथ्य को ध्यान में रखना होगा कि उन बहस के दौरान, लिनक्स बहुत नया था और मोटे तौर पर केवल 386 ओएस था। मुझे लगता है कि अगर आपने आज लिनुस से पूछा, तो उनकी राय अलग होगी। हो सकता है कि तन्नानबौम के रूप में बहुत चरम पर नहीं है, लेकिन वह शायद हीम को एक संकेत देगा और कहेगा कि वह कुछ चीजों के बारे में सही था।
लिनक्स को पोर्टेबल बनाने के लिए लिनस और अन्य कर्नेल डेवलपर्स बहुत दर्द से गुजरे, लेकिन फिर, लिनक्स कभी भी अस्तित्व में नहीं होता अगर लिनस को इसे शुरू करने के लिए पोर्टेबल बनाना पड़ता।