क्या विभिन्न प्रकार की नौकरियों के लिए स्थिर और गतिशील रूप से टाइप की जाने वाली भाषाओं को विभिन्न उपकरणों के रूप में देखा जा सकता है?


9

हां, इसी तरह के प्रश्न पूछे गए हैं लेकिन हमेशा यह पता लगाने के उद्देश्य से कि 'कौन सा बेहतर है।'

मैं पूछ रहा हूं क्योंकि मैं मुख्य रूप से जावास्क्रिप्ट में एक देव के रूप में आया हूं और वास्तव में सांख्यिकीय रूप से टाइप की गई भाषाओं में लिखने का कोई व्यापक अनुभव नहीं है।

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


5
इसका जवाब है हाँ"। प्रत्येक प्रकार की भाषा - वास्तव में प्रत्येक भाषा - की अपनी ताकत और कमजोरियां हैं और इसलिए दूसरों की तुलना में कुछ कार्यों के लिए बेहतर है।
ChrisF

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

जवाबों:


10

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

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


3
@ एरिक: मुझे यकीन नहीं है कि मैं भी कहूँगा। विकास के दौरान चीजें बदल जाती हैं। आवश्यकताएँ बदल सकती हैं, या आप पाते हैं कि आप एक आवश्यकता को सही ढंग से लागू नहीं कर रहे हैं, और कोड को अपडेट करने की आवश्यकता है। एक चीज़ को बदलने में सक्षम होने और परिणामी संकलक त्रुटियों का उपयोग करने के लिए आपको यह दिखाने के लिए कि जहाँ सब कुछ है जिसे बदलने की आवश्यकता है वह सुविधा और विकास की गति को भारी बढ़ावा देता है जिसे आप उन भाषाओं में खो देते हैं जहां वह तकनीक उपलब्ध नहीं है। यही कारण है कि आप डायनेमिक भाषाओं में विकसित जटिल ऐप्स को नहीं देखते हैं।
मेसन व्हीलर

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

1
@MasonWheeler दो साल और अधिक # सी और जावा की तुलना में मैं बाद में के लिए सौदेबाजी की मैं अब कुछ बातों से असहमत हूँ। जटिल वेब ऐप पूरी तरह से गतिशील भाषाओं के साथ किया जाता है। कंपाइल बनाम रन टाइम व्यर्थ है जब आप तुरंत दिखाई देने वाले बदलाव कर सकते हैं। और मैंने राय विकसित की है कि सभी प्रकार के उपद्रव एक प्रक्रियात्मक भाषा में बहुत अधिक समझ में आता है, क्योंकि यह ओओपी द्वारा संचालित होने वाली भाषा में होता है जहां डेटा को पहली जगह में लगातार हाथों को बदलना नहीं चाहिए।
एरिक रेपेन

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

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

4

जिस तरह से मैं इसे देखता हूं, यदि आप स्वाभाविक रूप से एक टाइप की गई भाषा के भीतर काम कर सकते हैं, तो स्थैतिक टाइपिंग जाने का रास्ता है। सामान्य तौर पर, एक प्रकार की प्रणाली का उद्देश्य आपको अपरिभाषित शब्दार्थ के साथ संचालन करने से रोकना है - जैसे (string) "hello" + (bool) true। सुरक्षा के अतिरिक्त स्तर के होने से आपको इन कार्यों को करने से रोका जा सकता है, आपके कोड में बग को रोकने के लिए एक अच्छा तरीका हो सकता है, यहां तक ​​कि व्यापक इकाई परीक्षणों के बिना भी । यही है, टाइप-सेफ्टी आपके कोड के शब्दार्थ शुद्धता में विश्वास का एक और स्तर प्रदान करता है।

लेकिन सही होने के लिए टाइप सिस्टम बहुत कठिन हैं। मैं नहीं मानता कि वहाँ है इस लेखन के समय में प्रकृति में एक आदर्श प्रकार प्रणाली। ("सही प्रकार प्रणाली" से, मेरा मतलब है कि एक सख्त प्रकार की प्रणाली, जिसमें वर्बोज़ कोड एनोटेशन की आवश्यकता नहीं होती है, जो कोई झूठी-सकारात्मक प्रकार की त्रुटियां उत्पन्न नहीं करती है, और प्रोग्रामर के लिए किस प्रकार की त्रुटियां आसान हैं।) आगे, यह हो सकता है। वास्तव में अच्छे प्रकार के सिस्टम को समझना मुश्किल है जो मौजूद हैं। जब मैं हास्केल सीख रहा था, तो मैं आपको अस्पष्ट कोड त्रुटियों की संख्या नहीं बता सकता जो मुझे लिखने की कोशिश करते समय मिली (जो मेरे लिए थी) सही कोड की तरह। आमतौर पर कोड वास्तव में सही नहीं था (जो कि टाइप सिस्टम के पक्ष में एक बिंदु है), लेकिन इसमें बहुत कुछ हुआसंकलक से त्रुटि संदेशों को समझने के लिए काम करना, ताकि मैं अंतर्निहित समस्याओं को ठीक कर सकूं। OO भाषाओं में, आप अंततः खुद को सोच सकते हैं "यह तर्क इनपुट प्रकार के साथ विपरीत होना चाहिए , न कि सहसंयोजक!", या (अधिक संभावना) टाइपकास्ट के प्रकार से बचने के लिए टाइपिंग सिस्टम की सीमा से भागने के लिए। टाइप सिस्टम आपको लगता है कि तुलना में बहुत पेचीदा हो सकता है।

इसके लायक क्या है, यह मेरी समझ है कि अच्छे प्रकार के सिस्टम के साथ आने में कठिनाई क्या गिलाद ब्राचा को समाचार-पत्र में प्लग करने योग्य टाइप-सिस्टम समर्थन को शामिल करने के लिए प्रेरित करती है।


WRT इकाई परीक्षण, मैं पूरी तरह से सहमत हूं। आप हमेशा लोगों को यह कहते हुए देखते हैं "यदि आपके पास अच्छी इकाई परीक्षण हैं, तो वे आपके लिए टाइप शुद्धता को सत्यापित कर सकते हैं।" यह हमेशा मुझे याद दिलाता है कि पॉल ग्राहम (जो दृढ़ता से मानते हैं कि गतिशील टाइपिंग हमेशा एक अच्छी बात है) का कहना है कि एक भाषा जो आप मैन्युअल रूप से बनाते हैं, इसके लिए संकलक का काम एक त्रुटिपूर्ण भाषा है। Sorta आपको रोकती है और सोचती है ...
Mason Wheeler

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

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

4

वे अलग-अलग उपकरण हैं, लेकिन यह प्रदर्शन से नहीं है। यह सब जटिलता के बारे में है

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

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

नतीजतन, गतिशील भाषाएं आमतौर पर छोटे (मैं बहुत छोटे) कार्यक्रमों के लिए फिट होती हैं जैसे कि गतिशील वेब पेज, वेब ब्राउज़र डीएसएल (ब्राउज़र अनुप्रयोगों के लिए नहीं!) या शेल स्क्रिप्टिंग। सिस्टम प्रोग्राम या किसी अन्य सामान के लिए स्टेटिक भाषाएं बेहतर होती हैं।

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

अधिक जानकारी के लिए यहां देखें: https://softwareengineering.stackexchange.com/a/105417/17428


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

2
@Giorgio खैर, शायद यह है कि मैं स्थैतिक सत्यापन सामान पर आदी हूँ। यह मेरे लिए बहुत प्यारा है, और मैं सचमुच छोटे पैमाने पर भी उनके बिना नहीं रह सकता: पी
Eonil

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

1

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


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

@erik, अरे हाँ, टाइपिंग टाइपिंग और var से अधिक: F # टाइप
इंफ़ेक्शन

-1

यह अब 2015 है, जो बातचीत के लिए कुछ दिलचस्प स्निपेट जोड़ता है:

  1. एंटरप्राइज़ बैकेंड की दुनिया के महत्वपूर्ण भाग जावा (सख्त स्थिर) के बदले में पायथन (गतिशील) का उपयोग करने पर विचार कर रहे हैं या शुरू कर रहे हैं
  2. उद्यम दृश्यपटल दुनिया TypeScipt के आधार पर, AngularJS v2 तरह बातें देख रही है: एक टाइप जावास्क्रिप्ट का विस्तार।

तो बैकएंड लोग सख्त टाइपिंग के अनावश्यक सीधे-जैकेट से थक गए हैं, जबकि फ्रंटेंड लोग गतिशील टाइपिंग की अराजकता से थक गए हैं।

काफी विडंबना है: मुझे आश्चर्य है कि अगर वे बीच में मिलेंगे, या एक-दूसरे को एक समय सीमा पार करने की ध्वनि बूम के साथ पिछले करेंगे ...? ;)


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

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

वास्तव में, मैं नहीं बल्कि एक गरीब जावा एक के बजाय अपने बड़े उद्यम परियोजना पर एक कुशल अजगर टीम है। बस अपनी स्थिति स्पष्ट करने के लिए: मैं ऊपर के जवाब के मूल्यांकन के रूप में पोस्ट किया
कॉर्नेल मेसन

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