CIY मानसिकता के उदय के कारण किन सामाजिक या तकनीकी कारकों का जन्म हुआ ?
मूल कारण बहुत स्पष्ट रूप से तकनीकी कारण है: बाइनरी-पोर्टेबिलिटी स्रोत-पोर्टेबिलिटी की तुलना में कठिन है । डिस्ट्रो पैकेज के बाहर, अधिकांश फ्री सॉफ्टवेयर अभी भी केवल स्रोत रूप में उपलब्ध है क्योंकि यह लेखक (एस) / अनुरक्षक (ओं) के लिए बहुत अधिक सुविधाजनक है।
जब तक लिनक्स डिस्ट्रोस ने अधिकांश चीजों की पैकेजिंग शुरू कर दी, जो औसत लोग उपयोग करना चाहते हैं, तो आपका एकमात्र विकल्प स्रोत प्राप्त करना और इसे अपने सिस्टम के लिए संकलित करना था। वाणिज्यिक यूनिक्स विक्रेताओं में आमतौर पर वे सामान शामिल नहीं होते थे जो लगभग सभी चाहते थे (उदाहरण के लिए जीएनयू bashया इसी तरह का एक अच्छा खोल ), बस अपने स्वयं के कार्यान्वयन shऔर / या csh, इसलिए आपको सामान बनाने की आवश्यकता थी यदि आप (एक एसवाईएस-एडमिन के रूप में) चाहते थे इंटरैक्टिव उपयोग के लिए अपने उपयोगकर्ताओं को एक अच्छा यूनिक्स वातावरण प्रदान करने के लिए।
अब स्थिति, अधिकांश लोगों के पास केवल अपने डेस्कटॉप पर बैठे मशीन का केवल व्यवस्थापक और एकमात्र उपयोगकर्ता होने के नाते, पारंपरिक यूनिक्स मॉडल से काफी अलग है। एक sysadmin ने केंद्रीय प्रणाली और सभी के डेस्कटॉप पर सॉफ्टवेयर को बनाए रखा। (अक्सर लोगों के वर्कस्टेशन सिर्फ एनएफएस-माउंट /optऔर /usr/local/सेंट्रल सर्वर से होते हैं, और वहां सामान स्थापित करते हैं।)
.NET और Java जैसी चीजों से पहले, विभिन्न CPU आर्किटेक्चर में सच बाइनरी-पोर्टेबिलिटी असंभव थी। यूनिक्स संस्कृति इस कारण से डिफ़ॉल्ट के रूप में स्रोत-पोर्टेबिलिटी के साथ विकसित हुई, यहां तक कि एलएसबी जैसे हाल ही में लिनक्स प्रयासों तक बाइनरी-पोर्टेबिलिटी को सक्षम करने का प्रयास करने के लिए। उदाहरण के लिए, POSIX ( प्रमुख यूनिक्स मानक) एकमात्र स्रोत-पोर्टेबिलिटी मानकीकरण करने के लिए, हाल के संस्करणों में भी प्रयास करता है।
संबंधित सांस्कृतिक कारक: प्रारंभिक वाणिज्यिक एटी एंड टी यूनिक्स स्रोत कोड (टेप पर) के साथ आया था। आपको स्रोत से सिस्टम का निर्माण नहीं करना था, यह सिर्फ वहां था जब आप यह देखना चाहते थे कि जब डॉक्स पर्याप्त नहीं थे, तो वास्तव में कुछ कैसे काम करता है।
विकिपीडिया कहता है :
"व्यापक ऑन-लाइन प्रलेखन की यूनिक्स नीति और (कई वर्षों तक) सभी सिस्टम स्रोत कोड के लिए तैयार पहुंच प्रोग्रामर की उम्मीदों को बढ़ाती है, और मुफ्त सॉफ्टवेयर आंदोलन के 1983 के लॉन्च में योगदान दिया है।"
मुझे यकीन नहीं है कि इस निर्णय ने क्या प्रेरित किया, क्योंकि ग्राहकों को वाणिज्यिक सॉफ़्टवेयर के स्रोत कोड तक पहुंच देना इन दिनों अनसुना है। इस दिशा में स्पष्ट रूप से कुछ प्रारंभिक सांस्कृतिक पूर्वाग्रह हैं, लेकिन शायद यह यूनिक्स की जड़ों के रूप में एक पोर्टेबल ओएस के रूप में विकसित हुआ है जो ज्यादातर सी (असेंबली भाषा में नहीं) में लिखा गया है जिसे विभिन्न हार्डवेयर के लिए संकलित किया जा सकता है। मुझे लगता है कि पहले के कई OSes में एक विशिष्ट CPU के लिए उनके कोड अधिक लिखे गए थे, इसलिए स्रोत-स्तरीय पोर्टेबिलिटी प्रारंभिक यूनिक्स की ताकत में से एक थी। (मैं इस बारे में गलत हो सकता हूं; मैं शुरुआती यूनिक्स का विशेषज्ञ नहीं हूं, लेकिन यूनिक्स और सी संबंधित हैं।)
स्रोत के रूप में सॉफ्टवेयर का वितरण लोगों को इसे चलाने के लिए जिस भी प्रणाली के लिए अनुकूलित करना है, उसे करने का सबसे आसान तरीका है। (या तो अंतिम-उपयोगकर्ता या लोग इसे लिनक्स डिस्ट्रो के लिए पैकेजिंग करते हैं)। यदि सॉफ़्टवेयर वितरण के लिए पहले से ही पैक किया गया है, तो अंत-उपयोगकर्ता इसका उपयोग कर सकते हैं।
लेकिन अधिकांश पैकेजों के लेखकों से अपेक्षा करना बहुत अधिक है कि वे स्वयं को हर संभव प्रणाली के लिए बायनेरिज़ बनाएं। कुछ प्रमुख परियोजनाएँ कुछ सामान्य मामलों के लिए बायनेरिज़ प्रदान करती हैं (विशेष रूप से x86 / विंडोज़ जहाँ ओएस बिल्ड वातावरण के साथ नहीं आता है, और ओएस विक्रेता ने बाइनरी-ओनली इंस्टालर के वितरण पर एक बड़ा जोर दिया है)।
सॉफ्टवेयर के एक टुकड़े को लेखक द्वारा उपयोग किए जाने वाले एक अलग सिस्टम पर चलाने के लिए भी कुछ छोटे बदलावों की आवश्यकता हो सकती है, जो स्रोत के साथ आसान हैं । एक छोटा-सा एक कार्यक्रम जिसे किसी ने अपने स्वयं के खुजली को खरोंचने के लिए लिखा था, शायद सबसे अस्पष्ट प्रणालियों पर कभी भी परीक्षण नहीं किया गया है। स्रोत होने से इस तरह के बदलाव करना संभव हो जाता है। मूल लेखक ने कुछ अनदेखी की होगी, या जानबूझकर कम पोर्टेबल कोड लिखा होगा क्योंकि इसमें बहुत समय बचा था। Info-ZIP जैसे बड़े पैकेजों में भी हर प्लेटफ़ॉर्म पर परीक्षक नहीं थे, और लोगों को अपनी पोर्टेबिलिटी पैच में भेजने की आवश्यकता थी क्योंकि समस्याओं का पता चला था।
(स्रोत-स्तरीय पोर्टेबिलिटी मुद्दों के अन्य प्रकार है कि सिर्फ इसलिए कि निर्माण env में मतभेद की होती हैं, और वास्तव में यहां मुद्दा यह है। साथ जावा शैली द्विआधारी पोर्टेबिलिटी, ऑटो उपकरण (लिए प्रासंगिक नहीं हैं कर रहे हैं autoconf/ auto-make) और की तरह इसी तरह की बातों cmakewouldn 'टी की जरूरत हो। और हम चीजों को नहीं होगा की तरह कुछ सिस्टम के शामिल किए जाने की आवश्यकता <netinet/in.h>के बजाय<arpa/inet.h> के लिएntohl(3) । (और शायद हमारे पास नहीं हैं ntohl()या पहली जगह में किसी भी अन्य बाइट-आदेश सामान!)
मैं नियमित रूप से .NET भाषाओं में विकास करता हूं, इसलिए मैं कंप्यूटर अनपढ़ नहीं हूं।
संकलन-एक बार, रन-कहीं भी .NET और जावा के प्रमुख लक्ष्यों में से एक है, इसलिए यह कहना उचित है कि इस समस्या को हल करने के प्रयास में पूरी भाषाओं का आविष्कार किया गया है , और आपका देव अनुभव उनमें से एक के साथ है। .NET के साथ, आपका बाइनरी पोर्टेबल रनटाइम वातावरण (CLR) पर चलता है । जावा कॉल यह रनटाइम वातावरण जावा वर्चुअल मशीन है । आपको केवल एक बाइनरी वितरित करने की आवश्यकता है जो किसी भी सिस्टम पर काम करेगी (कम से कम, कोई भी सिस्टम जहां किसी ने पहले से ही एक जेवीएम या सीएलआर लागू किया है)। तुम अब भी तरह पोर्टेबिलिटी समस्याएं हो सकती, /बनाम \पथ विभाजक, या प्रिंट करने, या जीयूआई लेआउट विवरण ज़ाहिर है,।
बहुत सारे सॉफ्टवेयर भाषाओं में लिखे गए हैं जो पूरी तरह से देशी कोड में संकलित हैं । कोई .netया जावा बायटेकोड नहीं है, सीपीयू के लिए सिर्फ देशी मशीन-कोड है, जो एक गैर-पोर्टेबल निष्पादन योग्य फ़ाइल प्रारूप में संग्रहीत होगा। C और C ++ इसके प्रमुख उदाहरण हैं, विशेषकर यूनिक्स दुनिया में। जाहिर है इसका मतलब है कि एक विशिष्ट सीपीयू वास्तुकला के लिए एक द्विआधारी संकलित किया जाना है।
लाइब्रेरी संस्करण एक और समस्या है । लाइब्रेरीज़ बाइनरी-लेवल ABI को बदलते समय अक्सर सोर्स-लेवल API को स्थिर रख सकते हैं। ( एपीआई और एबीआई के बीच अंतर देखें ।) उदाहरण के लिए, एक अपारदर्शी में किसी अन्य सदस्य को जोड़ने से structअभी भी इसका आकार बदल जाता है, और किसी भी कोड के लिए नए लाइब्रेरी संस्करण के लिए हेडर के साथ एक recompile की आवश्यकता होती है जो इस तरह की संरचना के लिए स्थान आवंटित करता है, चाहे वह गतिशील हो (मैलोक) ), स्थैतिक (वैश्विक), या स्वचालित (स्टैक पर स्थानीय)।
ऑपरेटिंग सिस्टम भी महत्वपूर्ण हैं । एक ही CPU वास्तुकला के लिए यूनिक्स का एक अलग स्वाद अलग बाइनरी फ़ाइल स्वरूपों हो सकता है, जैसे स्थिरांक के लिए सिस्टम कॉल, और अलग अलग संख्यात्मक मान बनाने के लिए एक अलग ABI fopen(3)की O_RDONLY, O_APPEND,O_TRUNC ।
ध्यान दें कि यहां तक कि एक गतिशील रूप से जुड़े बाइनरी में अभी भी कुछ ओएस-विशिष्ट स्टार्टअप कोड हैं जो पहले चलते हैं main()। विंडोज पर, यह है crt0। यूनिक्स और लिनक्स में एक ही बात है, जहां कुछ सी-रनटाइम स्टार्टअप कोड हर बाइनरी में सांख्यिकीय रूप से जुड़ा हुआ है। मुझे लगता है कि सिद्धांत में आप एक ऐसी प्रणाली डिजाइन कर सकते हैं जहां वह कोड गतिशील रूप से भी जुड़ा हुआ था, और libc या डायनेमिक लिंकर का ही हिस्सा है, लेकिन यह नहीं है कि किसी भी ओएस पर व्यवहार में चीजें कैसे काम करती हैं, इससे मैं अवगत हूं। यह केवल सिस्टम-कॉल ABI समस्या को हल करेगा, न कि मानक-पुस्तकालय कार्यों के लिए स्थिरांक के लिए संख्यात्मक मानों की समस्या। (आम तौर पर सिस्टम-कॉल को लिबास रैपर फ़ंक्शन के माध्यम से किया जाता है: स्रोत के लिए एक सामान्य x86-64 लिनक्स बाइनरी mmap()जो syscallनिर्देश का उपयोग नहीं करेगा , बस एकcall इसी नाम के लिबास रैपर फ़ंक्शन को निर्देश।
यह इस बात का हिस्सा है कि आप i386-Linux पर i386-FreeBSD बायनेरी क्यों नहीं चला सकते। (थोड़ी देर के लिए, लिनक्स कर्नेल में सिस्टम-कॉल संगतता परत थी। मुझे लगता है कि बीएसडी कम से कम एक बीएसएनएल लिनक्स को एक समान कम्प्रेसर परत के साथ चला सकता है, लेकिन आपको निश्चित रूप से लिनक्स पुस्तकालयों की आवश्यकता है।)
यदि आप बायनेरिज़ वितरित करना चाहते हैं, तो आपको सीपीयू / ओएस-फ्लेवर + संस्करण / स्थापित-लाइब्रेरी-संस्करणों के हर संयोजन के लिए एक अलग से एक बनाना होगा ।
'80 / 80 'के दशक में वापस, यूनिक्स सिस्टम (MIPS, SPARC, POWER, PA-RISC, m68k, आदि) के लिए आम उपयोग में कई अलग-अलग प्रकार के CPU थे, और Unix (IRIX, SunOS, SunOS) के कई अलग-अलग स्वाद थे। सोलारिस, एआईएक्स, एचपी-यूएक्स, बीएसडी, आदि)।
और यह सिर्फ यूनिक्स सिस्टम है। कई स्रोत पैकेज अन्य प्रणालियों पर भी संकलन और काम करेंगे , जैसे VAX / VMS, MacOS (m68k और PPC), Amiga, PC / MS-DOS, अटारी एसटी, आदि।
अभी भी कई सीपीयू आर्किटेक्चर और ओएस हैं, हालांकि अब डेस्कटॉप का एक बड़ा हिस्सा x86 तीन प्रमुख ओएस में से एक चल रहा है।
इसलिए आपके पास पहले से अधिक सीपीयू / ओएस संयोजन हैं, इससे पहले कि आप 3-पार्टी पुस्तकालयों पर निर्भरता के बारे में सोचना शुरू कर दें, इससे पहले कि आप विभिन्न प्रणालियों पर विभिन्न संस्करणों में हो सकते हैं। (कुछ भी जो ओएस विक्रेता द्वारा पैक नहीं किया गया है उसे हाथ से स्थापित करना होगा।)
बाइनरी में संकलित कोई भी पथ सिस्टम-विशिष्ट भी हैं। (यह स्टार्टअप पर उन्हें एक config फाइल से पढ़ने की तुलना में RAM और समय बचाता है)। पुराने स्कूल यूनिक्स सिस्टम में आमतौर पर बहुत सारे हाथ से अनुकूलित सामान होते थे, इसलिए ऐसा कोई तरीका नहीं है जिससे आप इस बारे में कोई मान्य धारणा बना सकें कि क्या है।
मुख्य व्यावसायिक परियोजनाओं को छोड़कर सभी प्रमुख संयोजनों पर निर्माण और परीक्षण करने की लागत को छोड़कर, पुराने स्कूल यूनिक्स के लिए बायनेरिज़ वितरित करना पूरी तरह से संभव था ।
यहां तक कि बस के लिए बायनेरी बनाना i386-linux-gnuऔर amd64-linux-gnuकठिन है। पोर्टेबल बायनेरिज़ को संभव बनाने के लिए लिनक्स स्टैंडर्ड बेस जैसी चीजों पर बहुत समय और प्रयास खर्च किया गया है । यहां तक कि सांख्यिकीय रूप से लिंकिंग बायनेरी सब कुछ हल नहीं करता है। (उदा। रेडहैट सिस्टम बनाम डेबियन सिस्टम पर वर्ड-प्रोसेसिंग प्रोग्राम को कैसे प्रिंट करना चाहिए? एक डेमॉन के लिए उपयोगकर्ता या समूह को कैसे स्थापित करना चाहिए, और इसके स्टार्टअप स्क्रिप्ट को हर रिबूट के बाद चलाने की व्यवस्था करनी चाहिए?) वे महान नहीं हैं उदाहरण, क्योंकि स्रोत से पुनर्प्राप्ति उन्हें हल नहीं करता है।
उस सब के अलावा, दिन में वापस स्मृति अब की तुलना में अधिक कीमती थी। संकलन-समय पर वैकल्पिक सुविधाओं को छोड़कर छोटे बायनेरिज़ (कम कोड आकार) बना सकते हैं जो अपने डेटा संरचनाओं के लिए कम मेमोरी का उपयोग करते हैं। यदि किसी सुविधा में किसी निश्चित classया हर structचीज़ को ट्रैक करने के लिए किसी अतिरिक्त सदस्य की आवश्यकता होती है, तो उस सुविधा को अक्षम करने से ऑब्जेक्ट 4 बाइट्स (उदाहरण के लिए) से हट जाएगा, जो कि एक वस्तु है जिसे प्रोग्राम 100k आवंटित करता है तो अच्छा है।
इन दिनों वैकल्पिक संकलन-समय की विशेषताएं अक्सर अतिरिक्त पुस्तकालयों को वैकल्पिक बनाने के लिए उपयोग की जाती हैं। जैसे आप संकलन कर सकते हैं ffmpegके साथ या बिना libx264, libx265, libvorbisविशिष्ट वीडियो / ऑडियो एनकोडर, उपशीर्षक हैंडलिंग, आदि आदि के लिए, और कई अन्य पुस्तकालयों अधिक सामान्यतः, बहुत कुछ के साथ या बिना संकलित किया जा सकता libreadline: अगर यह उपलब्ध है जब आप चलाने ./configure, परिणामस्वरूप बाइनरी लाइब्रेरी पर निर्भर करेगा, और टर्मिनल से पढ़ते समय फैंसी लाइन-संपादन प्रदान करेगा। यदि यह नहीं है, तो कार्यक्रम स्टैन से fgets()या कुछ और के साथ लाइनों को पढ़ने के लिए कुछ फ़ॉल-बैक समर्थन का उपयोग करेगा ।)
कुछ प्रोजेक्ट अभी भी प्रदर्शन कारणों के लिए गैर-आवश्यक कोड को छोड़ने के लिए वैकल्पिक सुविधाओं का उपयोग करते हैं। उदाहरण के लिए लिनक्स कर्नेल को SMP सपोर्ट के बिना बनाया जा सकता है (उदाहरण के लिए एक एम्बेडेड सिस्टम या एक प्राचीन डेस्कटॉप के लिए), जिस स्थिति में बहुत से लॉकिंग सरल है। या कई अन्य वैकल्पिक सुविधाओं के साथ जो कुछ कोर कोड को प्रभावित करते हैं, न कि केवल ड्राइवरों या अन्य हार्डवेयर सुविधाओं को छोड़कर। (हालांकि आर्क-विशिष्ट और हार्डवेयर-विशिष्ट कॉन्फ़िगरेशन विकल्प कुल स्रोत कोड के बहुत सारे खाते हैं । देखें कि लिनक्स कर्नेल कोड की 15+ मिलियन लाइनें क्यों है? )