एक प्रोग्राम शुद्ध बैश में कितना जटिल लिखा जा सकता है? [बन्द है]


17

कुछ बहुत ही त्वरित शोध के बाद, ऐसा लगता है कि बैश एक ट्यूरिंग-पूर्ण भाषा है

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

तो, क्या ऐसी कोई सीमा है कि इस तरह के कार्यक्रम कितने जटिल हो सकते हैं? क्या शुद्ध बैश का उपयोग जटिल कार्यक्रमों को लिखने के लिए किया जाता है? शुद्ध बैश में एक फ़ाइल कंप्रेसर / डिकम्प्रेसर लिखने, कहने के लिए संभव है? एक संकलक? एक साधारण वीडियो गेम?

क्या यह बहुत कम इस्तेमाल किया जाता है क्योंकि वहाँ केवल बहुत सीमित डिबगिंग उपकरण हैं?


2
shस्क्रिप्ट configureजो एक महान कई संयुक्त राष्ट्र * x संकुल के लिए निर्माण प्रक्रिया के हिस्से के रूप में किया जाता है 'अपेक्षाकृत सरल' नहीं है।
user4556274

@ user4556274 यह नहीं है, लेकिन यह आमतौर पर या तो हाथ से नहीं लिखा जाता है, लेकिन m4मैक्रोज़ के व्यापक सेट से ।
Kusalananda

2
बैश में एक x86 असेंबलर है, इसलिए हां, बैश का उपयोग कभी-कभी जटिल कार्यक्रमों को लिखने के लिए किया जाता है। लोग ऐसा क्यों नहीं करते हैं? संभवतः इसलिए कि दुभाषिया भी धीमा, भद्दा है, और यह "दिलचस्प" बग्स (फाई शेलशॉक देखें ) से ग्रस्त है । इसके अलावा, बैश स्क्रिप्ट आकार के साथ बनाए रखने के लिए तेजी से कठिन हो जाते हैं। ऊपर कोडांतरक को देखें; यदि आप एटी एंड टी या इंटेल सिंटैक्स का अनुसरण करते हैं तो क्या आप स्रोत से बता सकते हैं?
सातु कटुरा

configureस्क्रिप्ट भी धीमी हैं, बेकार काम का एक पूरा गुच्छा है और कुछ मनोरंजक रेंट का विषय रहा है। बेशक शेल का उपयोग बड़े कार्यक्रमों के लिए किया जा सकता है, लेकिन फिर लोगों ने कंप्यूटर को कॉनवे के गेम ऑफ लाइफ एंड माइनक्राफ्ट से भी बाहर कर दिया है , और ब्रेनफ ** के और हेक्सागोनी जैसी प्रोग्रामिंग भाषाएं भी हैं । जाहिरा तौर पर कुछ लोग वास्तव में छोटे और भ्रमित करने वाले परमाणुओं में से कुछ का निर्माण करना पसंद करते हैं। तुम भी उस विचार के साथ खेल बेच सकते हैं ...
ilkachachu

तो, यह सवाल जवाबदेह है या नहीं? उन्होंने इसे रोक दिया और कहा कि यह अचूक है, लेकिन फिर भी मुझे कुछ शानदार जवाब मिलते हैं। यह सुसंगत होना अच्छा होगा, क्योंकि मैं इस एसई के लिए नया हूं, मुझे यह निर्देशित करने के लिए कि इस एसई पर किस तरह के प्रश्न हैं और वांछनीय नहीं हैं।
ब्रिगेडल

जवाबों:


30

ऐसा लगता है कि बैश एक ट्यूरिंग-पूर्ण भाषा है

ट्यूरिंग संपूर्णता की अवधारणा पूरी तरह से प्रोग्रामिंग के लिए एक भाषा में उपयोगी कई अन्य अवधारणाओं से पूरी तरह से अलग है : प्रयोज्य, अभिव्यक्ति, समझ, गति, आदि।

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

बैश का उपयोग लगभग विशेष रूप से अपेक्षाकृत सरल स्क्रिप्ट लिखने के लिए क्यों किया जाता है?

बड़ी, जटिल शैल लिपियाँ - जैसे कि configureGNU Autoconf द्वारा स्क्रिप्ट आउटपुट - कई कारणों से प्रायश्चित्त हैं:

  1. अपेक्षाकृत हाल तक, आप हर जगह POSIX- संगत शेल होने पर भरोसा नहीं कर सकते

    कई सिस्टम, विशेष रूप से पुराने, तकनीकी रूप से सिस्टम पर कहीं न कहीं एक POSIX- संगत शेल होते हैं , लेकिन यह जैसे अनुमानित स्थिति में नहीं हो सकता है /bin/sh। यदि आप एक शेल स्क्रिप्ट लिख रहे हैं और इसे कई अलग-अलग प्रणालियों पर चलाना है, तो आप शेबंग लाइन कैसे लिखते हैं ? एक विकल्प आगे बढ़ने और उपयोग करने के लिए है /bin/sh, लेकिन इस तरह की प्रणाली पर चलने के मामले में प्री-पॉसिक्स बॉर्न शेल बोली के लिए खुद को प्रतिबंधित करने का विकल्प चुनें।

    प्री-पॉसिक बॉर्न गोले में बिल्ट-इन अंकगणित भी नहीं होता है; आप के लिए बाहर कॉल करनी होगी exprया bcकि किया जाना।

    POSIX शेल के साथ भी, आप साहचर्य सरणियों और उन अन्य विशेषताओं को याद कर रहे हैं, जिन्हें हमने यूनिक्स स्क्रिप्टिंग भाषाओं में खोजने की उम्मीद की थी क्योंकि पर्ल पहली बार 1990 के दशक में लोकप्रिय हुए थे

    इतिहास के इस तथ्य का अर्थ है कि आधुनिक बोर्न परिवार की शेल स्क्रिप्ट दुभाषियों में कई शक्तिशाली विशेषताओं को अनदेखा करने की दशकों पुरानी परंपरा है क्योंकि आप उन्हें हर जगह होने पर भरोसा नहीं कर सकते हैं।

    यह अभी भी आज तक जारी है, वास्तव में: बैश को संस्करण 4 तक साहचर्य सरणियां नहीं मिलीं , लेकिन आपको आश्चर्य हो सकता है कि कितने सिस्टम अभी भी उपयोग में हैं, यह बैश 3 पर आधारित है। Apple अभी भी 2017 में macOS के साथ बैश 3 को जहाज करता है - जाहिरा तौर पर लाइसेंसिंग कारण - और यूनिक्स / लिनक्स सर्वर अक्सर बहुत लंबे समय के लिए उत्पादन में सभी लेकिन अछूते चलते हैं, इसलिए आपके पास एक स्थिर पुरानी प्रणाली अभी भी बैश 3 चल सकती है, जैसे कि सेंटोस 5 बॉक्स। यदि आपके पास इस तरह के सिस्टम आपके वातावरण में हैं, तो आप शेल स्क्रिप्ट्स में साहचर्य सरणियों का उपयोग नहीं कर सकते हैं जो उन पर चलना है।

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

    यदि आपकी समस्या का उत्तर है, "तो बस बैश 4 स्थापित करें," या ksh93, या जो भी हो, तो "पर्ल" या पायथन या रूबी को स्थापित करने के बजाय "बस" क्यों नहीं? यह कई मामलों में अस्वीकार्य है; चूक की बात।

  2. बॉर्न परिवार शेल स्क्रिप्टिंग भाषाओं में से कोई भी मॉड्यूल का समर्थन नहीं करता है ।

    निकटतम आप एक शेल स्क्रिप्ट में एक मॉड्यूल सिस्टम में आ सकते हैं .- कमांड है - sourceअधिक आधुनिक बॉर्न शेल वेरिएंट में उर्फ - जो एक उचित मॉड्यूल सिस्टम के सापेक्ष कई स्तरों पर विफल रहता है, जिनमें से सबसे बुनियादी नाम स्थान है

    प्रोग्रामिंग भाषा के बावजूद, मानव समझ तब शुरू होती है जब किसी बड़े समग्र कार्यक्रम में कोई भी फ़ाइल कुछ हज़ार लाइनों से अधिक होती है। बहुत से कार्यक्रमों को हम कई फाइलों में विभाजित करते हैं, ताकि हम उनकी सामग्री को एक वाक्य या दो पर अधिक से अधिक सार कर सकें। फ़ाइल A कमांड लाइन पार्सर है, फ़ाइल B नेटवर्क I / O पंप है, फ़ाइल C लाइब्रेरी Z और बाकी प्रोग्राम के बीच का शिम है, आदि जब आपकी एकल फाइल को एक ही प्रोग्राम में असेंबल करने का एकमात्र तरीका पाठ्य समावेश है। , आप इस बात की एक सीमा रख सकते हैं कि आपके कार्यक्रम कितने बड़े हो सकते हैं।

    तुलना के लिए, यह ऐसा होगा जैसे कि सी प्रोग्रामिंग भाषा में कोई लिंकर नहीं था, केवल #includeबयान। इस तरह की सी-लाइट बोली को कीवर्ड की आवश्यकता नहीं होगी जैसे कि externया static। उन विशेषताओं में विद्यमानता की अनुमति होती है।

  3. POSIX एकल शेल स्क्रिप्ट फ़ंक्शन के लिए चर को स्कोप करने के तरीके को परिभाषित नहीं करता है , एक फ़ाइल के लिए बहुत कम।

    यह प्रभावी रूप से सभी चर को वैश्विक बनाता है , जो फिर से प्रतिरूपकता और संरचना को नुकसान पहुंचाता है।

    POSIX गोले में निश्चित रूप से और कम से कम - बाद में इसके समाधान हैं bash, लेकिन यह आपको ऊपर बिंदु 1 पर वापस लाता है।ksh93zsh

    आप GNU ऑटोकॉन्फ मैक्रो लेखन पर स्टाइल गाइड में इसका प्रभाव देख सकते हैं, जहां वे अनुशंसा करते हैं कि आप स्वयं मैक्रो के नाम के साथ चर नाम उपसर्ग करें, जो बहुत लंबे समय तक वेरिएबल नामों को शुद्ध रूप से समीपता से टक्कर की संभावना को कम करने के लिए अग्रणी करते हैं। शून्य।

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

  4. शेल प्रोग्रामिंग भाषाओं में कोई मानक पुस्तकालय नहीं है।

    यह तर्क करना संभव है कि एक शेल स्क्रिप्टिंग भाषा की मानक लाइब्रेरी की सामग्री है PATH, लेकिन यह सिर्फ इतना कहती है कि परिणाम के कुछ भी प्राप्त करने के लिए, एक शेल स्क्रिप्ट को दूसरे पूरे कार्यक्रम के लिए कॉल करना होगा, शायद एक और अधिक शक्तिशाली भाषा में लिखा गया है। से शुरू।

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

    यहां तक कि तथ्य यह है कि सबसे शेल स्क्रिप्ट बाहरी प्रोग्राम आमतौर पर सी में लिखे पर भरोसा करते हैं कुछ भी उपयोगी किया पाने के लिए अनदेखी, वहाँ उन सभी की भूमि के ऊपर है pipe()fork()exec()कॉल जंजीरों। अन्य OSes पर IPC और लॉन्च करने की प्रक्रिया की तुलना में यह पैटर्न यूनिक्स पर काफी कुशल है , लेकिन यहां यह प्रभावी रूप से प्रतिस्थापित कर रहा है कि आप एक अन्य स्क्रिप्टिंग भाषा में एक सबरूटीन कॉल के साथ क्या करेंगे , जो अभी भी अधिक कुशल है। यह शेल स्क्रिप्ट निष्पादन गति की ऊपरी सीमा पर एक गंभीर टोपी लगाता है।

  5. शेल स्क्रिप्ट में समानांतर निष्पादन के माध्यम से अपने प्रदर्शन को बढ़ाने की क्षमता बहुत कम होती है।

    बॉर्न के गोले हैं &, waitऔर इसके लिए पाइपलाइन, लेकिन यह मुख्य रूप से केवल कई कार्यक्रमों की रचना के लिए उपयोगी है, सीपीयू या आई / एस समानांतरता को प्राप्त करने के लिए नहीं। आप पूरी तरह से शेल स्क्रिप्टिंग के साथ कोर को पेग या संतृप्त करने में सक्षम होने की संभावना नहीं रखते हैं , और यदि आप ऐसा करते हैं, तो आप शायद अन्य भाषाओं में बहुत अधिक प्रदर्शन प्राप्त कर सकते हैं।

    विशेष रूप से पाइपलाइन समानांतर निष्पादन के माध्यम से प्रदर्शन को बढ़ाने के कमजोर तरीके हैं। यह केवल दो कार्यक्रमों को समानांतर में चलने देता है, और दोनों में से एक को संभवतः I / O पर या किसी भी समय किसी अन्य बिंदु से अवरुद्ध किया जाएगा ।

    इसके चारों ओर बाद के तरीके हैं, जैसे कि xargs -Pऔर जीएनयूparallel , लेकिन यह सिर्फ ऊपर 4 बिंदु तक जाता है।

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

  6. शेल स्क्रिप्टिंग भाषाओं में संकेत या संदर्भ नहीं होते हैं ।

    यह आपको अन्य प्रोग्रामिंग भाषाओं में आसानी से किए गए चीजों का एक समूह बनाने से रोकता है।

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

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

    उन्नत डेटा संरचनाएं संकेत और संदर्भ के लिए केवल एक उपयोग हैं। कर रहे हैं उनके लिए अन्य अनुप्रयोगों के ढेर , जो केवल आसानी से एक बॉर्न परिवार खोल पटकथा भाषा में नहीं किया जा सकता है।

मैं आगे और आगे बढ़ सकता था, लेकिन मुझे लगता है कि आप यहाँ बिंदु प्राप्त कर रहे हैं। सीधे शब्दों में कहें, यूनिक्स प्रकार प्रणालियों के लिए कई और अधिक शक्तिशाली प्रोग्रामिंग भाषाएं हैं।

यह एक बहुत बड़ा फायदा है, जो कुछ मामलों में भाषा की औसत दर्जे की क्षतिपूर्ति कर सकता है।

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

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

तो, क्या ऐसी कोई सीमा है कि इस तरह के कार्यक्रम कितने जटिल हो सकते हैं?

तकनीकी रूप से बोलना, नहीं, जैसा कि आपका ट्यूरिंग-पूर्णता अवलोकन बताता है।

लेकिन यह वही बात नहीं है जो यह कहती है कि मनमाने ढंग से-बड़ी शेल स्क्रिप्ट लिखना सुखद है, डिबग करना आसान है, या निष्पादित करने के लिए तेज़ है।

क्या शुद्ध बैश में एक फाइल कंप्रेसर / डिकम्प्रेसर लिखना संभव है?

"शुद्ध" बैश, बिना किसी कॉल के चीजों को बाहर PATH? संभवत: कंप्रेसर का उपयोग करने योग्य है echoऔर हेक्स एस्केप सीक्वेंस हैं, लेकिन ऐसा करना काफी दर्दनाक होगा। शेल में बाइनरी डेटा को संभालने में असमर्थता के कारण डिकम्प्रेसर उस तरह से लिखना असंभव हो सकता है । आप odबाइनरी डेटा को टेक्स्ट फॉर्मेट में ट्रांसलेट करने के लिए और डेटा को हैंडल करने के शेल के मूल तरीके के लिए कॉल करना समाप्त करेंगे ।

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

और यही बात है। यदि आपको तेजी से दौड़ने के लिए एक कार्यक्रम की आवश्यकता है, या यदि उसे दूसरों से उधार लेने की शक्ति के बजाय अपने आप में शक्तिशाली होने की आवश्यकता है, तो आप इसे शेल में नहीं लिखते हैं।

एक साधारण वीडियो गेम?

यहां शेल्ट इन शेल है । इस तरह के अन्य खेल उपलब्ध हैं, अगर आप देखते हैं।

केवल बहुत सीमित डीबगिंग उपकरण हैं

मैं बड़ी संख्या में प्रोग्रामिंग का समर्थन करने के लिए आवश्यक सुविधाओं की सूची में लगभग 20 वें स्थान पर डिबगिंग टूल सपोर्ट डालूंगा। प्रोग्रामर की एक पूरी बहुत उचित डिबगर्स की तुलना में printf()डिबगिंग पर बहुत अधिक निर्भर करती है , भाषा की परवाह किए बिना।

शेल में, आपके पास echoऔर set -x, जो एक साथ कई बड़ी समस्याओं को दूर करने के लिए पर्याप्त हैं।


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

@SamWatkins: मैंने आपके उत्तर को संबोधित करने के लिए ऊपर 5 बिंदु अपडेट किए हैं। हालांकि, मैं भी साझा-स्मृति समानता में निहित कई समस्याओं से बचने के लिए अलग-अलग प्रक्रियाओं के बीच संदेश-गुजरने का प्रशंसक हूं, मैं यहां जो बिंदु बना रहा था वह प्रदर्शन में वृद्धि के बारे में है, रचनाशीलता के बारे में नहीं और इस तरह, और वह अक्सर साझा-मेमोरी समानता की आवश्यकता होती है।
वॉरेन यंग

शैल स्क्रिप्ट प्रोटोटाइप के लिए अच्छे हैं - लेकिन अंततः एक परियोजना को एक उचित प्रोग्रामिंग भाषा में स्थानांतरित करना चाहिए, फिर आदर्श रूप से संकलित भाषा। फिर चरम मामलों की विधानसभा में, जैसे आप FFmpeg प्रोजेक्ट के साथ देखेंगे। Cmake ऑटोटॉल्स का क्या होना चाहिए इसका एक अच्छा उदाहरण है - C में लिखा गया है और इसके लिए पर्ल या टेक्सिनफो या M4 की आवश्यकता नहीं है। यह वास्तव में शर्मनाक है कि ऑटोटॉल्स 30 साल बाद wikipedia.org/wiki/GNU_Build_System#Criticism
स्टीवन पेनी

9

हम कहीं भी चल सकते हैं या तैर सकते हैं, इसलिए हम साइकिल, कार, ट्रेन, नाव, विमान और अन्य वाहनों से क्यों परेशान हैं? निश्चित रूप से, चलना या तैरना थकाऊ हो सकता है, लेकिन किसी भी अतिरिक्त उपकरण की आवश्यकता नहीं होने में एक बड़ा फायदा है।

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

इसके अलावा बैश अपने पर्यावरण के साथ बातचीत के बहुत कम तरीके हैं। यह प्रक्रियाएं चला सकता है, यह कुछ सरल प्रकार के फ़ाइल एक्सेस (रीडायरेक्शन के माध्यम से) कर सकता है, और इसके बारे में है। बैश में क्लाइंट-साइड नेटवर्किंग क्लाइंट भी है। बैश नल बाइट्स को आसानी से पर्याप्त ( printf \\0) उत्सर्जित कर सकता है, लेकिन इसके इनपुट में शून्य बाइट्स को पार्स नहीं करता है, जो द्विआधारी डेटा को पढ़ने के लिए बीमार बनाता है। बैश सीधे अन्य काम नहीं कर सकता: इसके लिए बाहरी कार्यक्रमों को कॉल करना होगा। और यह ठीक है: गोले बाहरी कार्यक्रमों को चलाने के प्राथमिक उद्देश्य के लिए डिज़ाइन किए गए हैं! शैल कार्यक्रमों को एक साथ संयोजित करने के लिए गोंद भाषा है। लेकिन अगर आप एक बाहरी कार्यक्रम चला रहे हैं, तो इसका मतलब है कि उस कार्यक्रम को उपलब्ध होना है - और फिर आप पोर्टेबिलिटी के लाभ को कम करते हैं:)।

बैश में किसी भी प्रकार की विशेषता नहीं है जो इसके अलावा, मजबूत कार्यक्रमों को लिखना आसान बनाता है set -e। इसमें (उपयोगी) प्रकार, नाम स्थान, मॉड्यूल या नेस्टेड डेटा संरचना नहीं है। कीड़े प्रोग्रामिंग में नंबर एक कठिनाई हैं; बग-मुक्त प्रोग्राम लिखने में आसानी हमेशा किसी भाषा को चुनने में निर्णायक कारक नहीं होती है, बैश उस गिनती पर खराब रैंक करता है। बैश भी कार्यक्रमों के संयोजन के अलावा अन्य चीजों को करते समय खराब प्रदर्शन करते हैं।

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

कंपाइलर की आवश्यकता पोर्टेबिलिटी के लिए कोई समस्या नहीं है। कंपाइलर डेवलपर्स की मशीन पर चलता है। एक दुभाषिया या तीसरे पक्ष के पुस्तकालयों की आवश्यकता एक समस्या हो सकती है, लेकिन लिनक्स के तहत यह वितरण पैकेज के माध्यम से एक हल की गई समस्या है, और विंडोज, एंड्रॉइड और आईओएस के तहत, लोग आमतौर पर अपने आवेदन पैकेज में तीसरे पक्ष के घटकों को बंडल करते हैं। तो जिस तरह की पोर्टेबिलिटी की चिंता आपके मन में है, वह रन-ऑफ-द-मिल अनुप्रयोगों के लिए व्यावहारिक चिंता नहीं है।

मेरा जवाब बैश के अलावा गोले पर भी लागू होता है। कुछ विवरण शेल से शेल तक भिन्न होते हैं लेकिन सामान्य विचार समान होता है।


1
मेरा मानना ​​है कि पोर्टेबिलिटी के मिथक के बारे में अक्सर बात की गई है, निश्चित रूप से मैं उस विशेष आइटम को नकारात्मक के रूप में उपयोग नहीं करूंगा क्योंकि यह जावा सहित अन्य भाषाओं में भी लागू होता है। यहां तक ​​कि विंडोज़ सर्वर बनाम * निक्स सर्वर पर चलने वाले पीएचपी में कुछ छोटे अंतर होते हैं जिनके बारे में आपको हमेशा पता होना चाहिए, क्या आपको विंडोज़ सर्वर पर कुछ भी चलाने के लिए पर्याप्त मूर्ख होना चाहिए, अर्थात। बहुत सारी चीज़ें एंड्रॉइड या आईओएस पर नहीं चलती हैं, इसलिए यह सुनिश्चित नहीं है कि यह एक वैध टिप्पणी कैसे हो सकती है।
छिपकली

7

बड़े कार्यक्रमों के लिए शेल स्क्रिप्ट का उपयोग न करने के कुछ कारण, मेरे सिर के ठीक ऊपर:

  • अधिकांश कार्य बाहरी कमांड को बंद करके किया जाता है, जो धीमा है। इसके विपरीत, पर्ल जैसी प्रोग्रामिंग भाषाएं आंतरिक रूप से mkdirया इसके बराबर कर सकती हैं grep
  • सी लाइब्रेरी तक पहुंचने, या डायरेक्ट सिस्टम कॉल करने का कोई आसान तरीका नहीं है, जिसका मतलब है कि उदाहरण के लिए वीडियो गेम बनाना मुश्किल होगा
  • उचित प्रोग्रामिंग भाषाओं में जटिल डेटा संरचनाओं के लिए बेहतर समर्थन है। हालांकि बैश में ऐरे और एसोसिएटिव एरे हैं, लेकिन मैं एक लिंक की गई सूची या एक पेड़ के बारे में नहीं सोचना चाहता।
  • शेल को कमांड को प्रोसेस करने के लिए बनाया जाता है जो यदि टेक्स्ट से बना हो। बाइनरी डेटा (यानी, एनयूएल बाइट्स (मूल्य शून्य के साथ बाइट्स) वाले चर) को संभालना असंभव है। शेल पर थोड़ा निर्भर करता है, zshकुछ समर्थन है। ऐसा इसलिए भी है क्योंकि बाहरी कार्यक्रमों के लिए इंटरफ़ेस ज्यादातर पाठ-आधारित है, और \0एक विभाजक के रूप में उपयोग किया जाता है।
  • बाहरी आदेशों के कारण, कोड और डेटा के बीच अलगाव थोड़ा मुश्किल है। गवाह सभी परेशानी होती है जब (यानी जब चल रहे एक अन्य सुरक्षा के लिए डेटा के हवाले से bash -c ...या ssh -c ...)

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