पोर्टेबिलिटी के बारे में उनके उद्धरण से लिनुस टॉर्वाल्ड्स का क्या मतलब था? [बन्द है]


41

में एंड्रयू Tanenbaum के साथ एक बहस बनाम अखंड ऑपरेटिंग सिस्टम वास्तुकला microkernel से अधिक, लिनुस टोर्वाल्ड ने कहा,

पोर्टेबिलिटी उन लोगों के लिए है जो नए प्रोग्राम नहीं लिख सकते हैं।

उनका इससे क्या मतलब था?


8
सावधान रहें कि आप "पुराने" दिनों से इन "वाद-विवादों" (फ़्लेम्वार) को बाहर निकालते समय क्या पढ़ते हैं। इस बात पर विचार करें कि चूंकि लिनक्स लिनस के दिल के लिए बहुत प्रिय था, इसलिए इन चर्चाओं के दौरान बहुत अधिक भावनाएं बढ़ रही थीं। इसलिए आपको कई बयानों के आने की संभावना है, सिर्फ चुटीले होने या किसी को नाराज करने के लिए।
वेन कोर्ट्स

इस प्रकार के प्रश्न पर अब हमारी मेटा-चर्चा साइट पर चर्चा की जा रही है ।

1
अनुशंसित पढ़ने: इस $ {ब्लॉग} पर चर्चा करें
gnat

जवाबों:


82

जैसा कि लिनुस बहस में लिखते हैं, यह गाल में जीभ के साथ है (यानी बहुत गंभीरता से नहीं लिया जाना चाहिए)।

फिर, वह समझाता है कि जबकि पोर्टेबिलिटी अच्छी बात है, यह एक व्यापार-बंद भी है; unportable कोड बहुत सरल हो सकता है। यही है, कोड को पूरी तरह से पोर्टेबल बनाने के बजाय, बस इसे सरल और पोर्टेबल बनाएं ("एक पोर्टेबल एपीआई का पालन करें"), और फिर अगर इसे पोर्ट किया जाना है, तो आवश्यकतानुसार इसे फिर से लिखना चाहिए। कोड को पूरी तरह से पोर्टेबल बनाना समय से पहले अनुकूलन के रूप में भी देखा जा सकता है - अक्सर अच्छे से अधिक नुकसान।

निश्चित रूप से यह संभव नहीं है यदि आप नए कार्यक्रम नहीं लिख सकते हैं और मूल के साथ रहना होगा :)


20
समयपूर्व अनुकूलन पर सहमत हुए।
मार्क गिबाड

4
+1 लिनस को गाल हास्य में अपनी जीभ के लिए जाना जाता है, लेकिन कुछ लोग जो कहते हैं, उसे बहुत गंभीरता से लेते हैं।
Spoike

12

मुझे लगता है कि इसका मतलब है कि प्रत्येक प्रोग्राम को विशेष रूप से उस पर चलने वाले हार्डवेयर और ऑपरेटिंग सिस्टम के लिए लिखा जाना चाहिए।

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


मुझे लगता है कि यह वही है जिसका मतलब है
चानी

9

जब लिनक्स पहली बार लिखा गया था, तो इसमें केवल i386 सीपीयू पर उपलब्ध सुविधाओं का उपयोग किया गया था, जो उस समय काफी नया और महंगा था।

ठीक वही है जो लिनक्स करता है: यह 386 सुविधाओं के एक बड़े उपसमुच्चय का उपयोग करता है अन्य कर्नेल की तुलना में ऐसा लगता है। बेशक यह कर्नेल को उचित रूप से अप्रमाणित बनाता है, लेकिन यह एक / बहुत / सरल डिजाइन के लिए भी बनाता है। एक स्वीकार्य व्यापार-बंद, और एक जिसने पहले स्थान पर लिनक्स को संभव बनाया।

जैसे ही हम 21 वीं सदी में गए, i386 को अद्वितीय बनाने वाली सुविधाएँ पूरी तरह से मुख्यधारा बन गईं, जिससे लिनक्स बहुत पोर्टेबल हो गया।


2
"" पूरी तरह से मुख्यधारा बन गया, जिससे लिनक्स बहुत पोर्टेबल हो गया, "और साबित हुआ कि लिनक्स की पोर्टेबिलिटी, उस समय, समय से पहले अनुकूलन होगी।

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

@ जेरी - लगता है कि मैं जिस जगह पर काम करता था उस पर रिसर्च प्रोजेक्ट्स आते हैं: "आपको अब हार मान लेनी चाहिए। मैं जो काम कर रहा हूं, वह आपको अप्रचलित कर देगा।" यह बीस साल पहले था। अभी भी नहीं देखा है कि whiz-bang नया सामान अनुसंधान प्रयोगशाला छोड़ दें।
जल्दी_अगले

@ रेंजर, पोर्टेबिलिटी एक अनुकूलन नहीं है।

7

जैसा कि किसी ने बहुत सारे जावा किया है, और वर्षों के लिए साप्ताहिक आधार पर "लिखना एक बार, हर जगह डिबग" घटना का अनुभव किया है, मैं पूरी तरह से इस से संबंधित हो सकता हूं।

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

अभी काम पर, हम मोबाइल उपकरणों के लिए हमारे उत्पादों में से एक के संस्करण को लिखने के विचार की जांच कर रहे हैं। मैंने J2ME और Android दोनों के लिए इसका एक पोर्टेबल संस्करण कैसे किया जाए, इसके बारे में कुछ शोध किया है - जो कि जितना संभव हो उतना कोडबेस साझा करने की कोशिश करता है (जाहिर है कि प्रति se पूरी तरह से "पोर्टेबल" नहीं हो सकता है, लेकिन यह एक समान दर्शन है )। यह एक दुःस्वप्न है।

तो हाँ, कभी-कभी यह वास्तव में दिए गए काम के लिए दिए गए टूल का उपयोग करने के मामले में सोचने (और करने) में सक्षम होने के लिए अच्छा है। यानी स्वतंत्र रूप से एक, एकल, अखंड मंच / पर्यावरण के खिलाफ विकसित करना। और सिर्फ प्रत्येक के लिए अलग, स्वच्छ संस्करण लिखना।


5

हालाँकि, कुछ लोग पोर्टेबिलिटी, निम्न मानकों आदि को देखते हैं, नैतिक रूप से श्रेष्ठ हैं, या उस आदेश पर कुछ करते हैं, जो वास्तव में उबलता है वह है अर्थशास्त्र।

पोर्टेबल कोड लिखना कोड को पोर्टेबल बनाने के प्रयास के संदर्भ में लागत है, और (अक्सर) कुछ सुविधाओं को पूर्वगामी बनाना है जो सभी लक्ष्यों पर उपलब्ध नहीं हैं।

गैर-पोर्टेबल कोड में कोड को पोर्ट करने के प्रयास के संदर्भ में एक लागत होती है, जब आप एक नई वास्तुकला के बारे में परवाह करते हैं, और (अक्सर) मूल लक्ष्य पर उपलब्ध नहीं हैं (या नहीं थे) कुछ सुविधाओं को पूर्वगामी।

वहाँ बड़ा क्वालीफायर "जब / यदि आप एक नई वास्तुकला की परवाह करते हैं"। पोर्टेबल कोड लिखने से छोटे या बिना किसी प्रयास के नए / अलग आर्किटेक्चर पर उस कोड का उपयोग करने में सक्षम होने की अंतिम अदायगी की उम्मीद में अप-फ्रंट की आवश्यकता होती है । गैर-पोर्टेबल कोड आपको उस निवेश को पोर्ट करने में देरी करता है जब तक कि आप (कम से कम यथोचित) यह सुनिश्चित न कर लें कि आपको वास्तव में कुछ विशेष लक्ष्य के लिए पोर्ट करने की आवश्यकता है।

यदि आप सुनिश्चित हैं कि आप बहुत सारे लक्ष्यों को पोर्ट करने जा रहे हैं, तो आमतौर पर लंबी अवधि के पोर्टिंग लागत को कम करने के लिए अप-फ्रंट में निवेश करना सार्थक होता है। यदि आप इस बारे में कम निश्चित हैं कि आपको कितना (या यहां तक ​​कि) कोड को पोर्ट करने की आवश्यकता होगी, तो गैर-पोर्टेबल कोड लिखने से अप-फ्रंट लागत को कम करने में देरी होती है, या संभवत: कोड को पोर्टेबल बनाने की लागत से पूरी तरह से परहेज करते हैं।

मुझे लगता है कि यह भी ध्यान देने योग्य है कि मैंने "पोर्टेबल" और "गैर-पोर्टेबल" की बात की है जैसे कि दोनों के बीच स्पष्ट-कट विभाजन था। वास्तव में, यह सच नहीं है - पोर्टेबिलिटी एक निरंतरता है, जो पूरी तरह से गैर-पोर्टेबल (जैसे, असेंबली कोड) से बेहद पोर्टेबल (जैसे, जानकारी-ज़िप), और हर जगह बीच में चल रही है।


4

Tanenbaum बिंदु बनाता है कि लिनक्स का अधिकांश गैर-मॉड्यूलर तरीके से 386 सीपीयू का लाभ उठाने के लिए लिखा जाता है, उस समय कला की स्थिति, सीपीयू इंटरैक्शन को एक घटक बनाने के बजाय, और इस प्रकार बहुत आसानी से स्वैपेबल है। तनबेनम अनिवार्य रूप से मानते हैं कि तथ्य यह है कि कर्नेल इतना अखंड है और 386 सीपीयू से बंधा है, यह बहुत मुश्किल है

  • पोर्ट लिनक्स ही एक अन्य सीपीयू प्लेटफॉर्म (स्पष्ट रूप से गलत, एएमडी 64, पावरपीसी, आदि)
  • अन्य CPU आर्किटेक्चर के लिए linux x86 के लिए लिखे गए पोर्ट प्रोग्राम (भी गलत है)

लिनक्स शिविर कई बिंदु बनाता है, जिनमें से:

  • लिनक्स डिजाइन के हिस्से के रूप में मल्टीथ्रेडेड फाइल सिस्टम प्रदान करता है
  • माइक्रो कर्नेल, जबकि दिलचस्प और सहज ज्ञान युक्त प्रदर्शन नहीं कर रहे हैं
  • पोर्टेबल API पालन पोर्टेबिलिटी समस्या को अधिक बनाता है या अवरोधक के विपरीत एक niggle करता है।

1
अब पकड़ो ... इस बहस के समय, पोर्टेबिलिटी एक बहुत बड़ी चिंता थी। AMD64 और PPC को कई साल हो गए।
मैट ओलेनिक

1
आप बिलकुल सही हैं - हालाँकि, लिनुस सहित अन्य ने बताया कि यह उतनी चिंता का विषय नहीं था जितना कि तेनबाउम को लगता है
अनातोली जी

Microkernels अच्छा प्रदर्शन नहीं करते हैं? यह उन लोगों के लिए एक आघात के रूप में आएगा जिन्होंने उनका उपयोग किया है।
मेरे सही चुनाव

मुझे नहीं लगता कि माइक्रोकेर्नल अच्छी तरह से काम नहीं करता है - मैं मच (ओएक्सएक्स) का उपयोग करता हूं और यह बहुत अच्छा काम करता है। हालांकि, लिनस ने इसका उल्लेख किया।
अनातोली जी

3

यदि आप पोर्टेबल कोड लिखना चाहते हैं, तो आपको पोर्टेबल कोड लिखना होगा।

उससे मेरा मतलब क्या है?

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

BTW, यह जवाब केवल अनुप्रयोगों के लिए लागू होगा। ओएस और एम्बेडेड पूरी तरह से एक और जानवर हैं।


2

इस कथन की व्याख्या "वस्तुतः" है जिस तरह से है।

लीनुस के उद्धरण का एक और में उन्होंने कहा: "सी ++ सब गलत समस्याएं हल करने की कोशिश कर रहा है बातें सी ++। हल तुच्छ बातों, बल्कि कुछ सच गहरी समस्या को ठीक करने से सेल्सियस के लिए लगभग पूरी तरह वाक्यात्मक एक्सटेंशन हैं।"

इसके अलावा उनकी जीवनी में, "जस्ट फॉर फन" लाइनस ने माइक्रोकर्नेल के बारे में उद्धृत करते हुए कहा कि जटिलता 'एन' के साथ एक समस्या के लिए यदि आप समस्या को '1 / n' अद्वितीय भागों में विभाजित करते हैं .. तो ऐसी प्रणाली विकसित करने की कुल जटिलता। हो 'n!' यह अपने आप में एक ऐसा कारक है जो इस तरह की कोशिश करने के लिए पर्याप्त नहीं है, और ऐसी जटिल प्रणाली से दक्षता निकालना बहुत मुश्किल होगा।


2

आपको इस तथ्य को ध्यान में रखना होगा कि उन बहस के दौरान, लिनक्स बहुत नया था और मोटे तौर पर केवल 386 ओएस था। मुझे लगता है कि अगर आपने आज लिनुस से पूछा, तो उनकी राय अलग होगी। हो सकता है कि तन्नानबौम के रूप में बहुत चरम पर नहीं है, लेकिन वह शायद हीम को एक संकेत देगा और कहेगा कि वह कुछ चीजों के बारे में सही था।

लिनक्स को पोर्टेबल बनाने के लिए लिनस और अन्य कर्नेल डेवलपर्स बहुत दर्द से गुजरे, लेकिन फिर, लिनक्स कभी भी अस्तित्व में नहीं होता अगर लिनस को इसे शुरू करने के लिए पोर्टेबल बनाना पड़ता।


2

इसका मतलब है कि जो लोग अच्छे कार्यक्रम लिख सकते हैं उन्हें पोर्टेबल होने के लिए चीजों की आवश्यकता नहीं है, क्योंकि वे खरोंच से काम कर सकते हैं।

यह कम उपहार वाले प्रोग्रामर हैं जो वर्तमान में अन्य कार्यक्रमों (पोर्टेबिलिटी) को "आयात" करना चाहते हैं।

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