गतिशील और स्थिर भाषाओं के बीच वास्तु अंतर


22

स्थैतिक भाषाओं (जैसे सी # या जावा) और गतिशील भाषाओं (जैसे रूबी या पायथन) पर बनाए जाने वाले अनुप्रयोगों को डिजाइन करते समय क्या कोई प्रमुख वास्तु अंतर हैं?

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

इसके अलावा, क्या कोई गतिशील-विशिष्ट डिज़ाइन पैटर्न हैं?


1
जो कुछ भी वास्तु अंतर हैं, वे गतिशील भाषाएं हैं - आयरनरबी और आयरनपीथॉन - .Net की स्थिर भाषाओं की आसानी से प्रशंसा करते हैं।
21

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

जवाबों:


14

आइए कुछ चीजें सीधे करें:

  1. इंटरएक्टिव स्क्रिप्टिंग और स्थिर भाषा परस्पर अनन्य नहीं हैं। F # और Haskell दोनों में REPL इंटरफेस है।
  2. गतिशील भाषा और उच्च प्रदर्शन परस्पर अनन्य नहीं हैं, हालांकि कुछ अनुकूलन हैं। जावास्क्रिप्ट आजकल ज्यादातर ब्राउज़र पर बहुत तेजी से चलता है।
  3. यहां तक ​​कि गतिशील भाषाओं में, आपको अभी भी प्रकारों के बारे में दस्तावेज बनाना, याद रखना और सोचना चाहिए।
  4. प्रकार की लोकप्रियता की बढ़ती लोकप्रियता के कारण, बहुत सी स्थिर भाषाओं को अब बहुत बार टाइप नहीं करना पड़ता है। मजबूत प्रकार के अनुमान के साथ स्थिर भाषाओं में, संकलक यह पता लगाता है कि आपके कोड से प्रकार क्या हैं ताकि अधिकांश समय, और आपको बताए कि क्या आप कभी ऐसा कुछ करते हैं जो प्रकार की परिभाषाओं का उल्लंघन करता है। जहाँ तक वाक्य रचना का सवाल है, यह दोनों दुनिया को सर्वश्रेष्ठ प्रदान करता है।
  5. OOP और डायनेमिक भाषाएँ परस्पर अनन्य नहीं हैं। PHP अब वर्गों और यहां तक ​​कि विरासत का समर्थन करता है।

उन सभी आश्चर्यजनक समानताएं एक तरफ, कुछ व्यावहारिक अंतर हैं जो विकास प्रक्रिया को प्रभावित करते हैं:

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

एक प्रकार का कार्यक्रम भी है जो स्थिर टाइपिंग के बिना कभी नहीं बनाया जा सकता था : सिंगुलैरिटी , एक ओएस बिना हार्डवेयर प्रक्रिया की सीमाएं। यह सी, कुछ सी #, और सी # की एक बोली की एक छोटी राशि में लिखा है, जिसे # कहा जाता है, जो कोड कॉन्ट्रैक्ट का समर्थन करता है।

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

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


क्या विलक्षणता वास्तविक समय में अधिकतम विलंबता गारंटी प्रदान कर सकती है?
Eonil

@ ईऑनिल वास्तव में मेरा क्षेत्र नहीं है, लेकिन मुझे लगता है कि आप पूछ रहे हैं कि क्या यह कठिन वास्तविक समय कर सकता है। मुझे ऐसा नहीं लगता, क्योंकि यह सभी जगह कचरा संग्रहण का उपयोग करता है। जहाँ तक मुझे पता है, एक समय में विलक्षणता को अद्यतन नहीं किया गया है, लेकिन शायद किसी ने वास्तविक समय के कचरा संग्रहकर्ता के साथ कुछ ऐसा ही किया है।
री मियासाका

धन्यवाद। मैं सिर्फ जांच करना चाहता था। मैंने सुना है कि कुछ वास्तविक समय जीसी कार्यान्वयन हैं, लेकिन मैंने नहीं सुना है कि वे उद्योग में व्यावहारिक रूप से कैसे उपयोग किए जाते हैं ...
Eonil

2

एक महत्वपूर्ण वास्तु अंतर है। प्रदर्शन।

आपके हार्डवेयर बजट, अपेक्षित कार्यभार और सेवा स्तर समझौतों के आधार पर, गतिशील भाषा के साथ आवश्यकताओं को पूरा करना संभव नहीं हो सकता है।

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


1

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


1

स्थैतिक भाषाओं (जैसे सी # या जावा) और गतिशील भाषाओं (जैसे रूबी या पायथन) पर बनाए जाने वाले अनुप्रयोगों को डिजाइन करते समय क्या कोई प्रमुख वास्तु अंतर हैं?

नहीं।

गतिशील भाषाओं के लिए फैंसी फ्रेमवर्क लिखना थोड़ा आसान है। लेकिन यह एक अनुप्रयोग बात नहीं है।

कौन सी डिजाइन संभावनाएं हैं जो एक प्रकार के लिए एक अच्छा विकल्प हो सकता है जो दूसरे के लिए एक बुरा है?

कोई नहीं, सच में।

आप किसी भी तरह की भाषा में अच्छी बातें लिख सकते हैं।

क्या कोई उपयोगी सुविधाएँ एक प्रकार से प्राप्त होती हैं जो दूसरे के साथ नहीं होती हैं (डिजाइन और वास्तुकला में, निश्चित रूप से)?

नहीं।

अंतर यह है कि गतिशील भाषाएं "लिखना, चलाना, ठीक करना" हैं। आप प्रयोग कर सकते हैं और जल्दी से ठीक कर सकते हैं।

स्थिर भाषाएं "लिखना, संकलन करना, निर्माण करना, चलाना, ठीक करना" हैं। आप आसानी से प्रयोग नहीं कर सकते।

इसके अलावा, वे अपनी क्षमताओं में लगभग समान हैं।

क्या कोई गतिशील-विशिष्ट डिज़ाइन पैटर्न हैं?

शायद। पायथन eval()और execfile()फ़ंक्शंस - एक तरह से - एक गतिशील भाषा सुविधा को इंगित करना जो एक स्थिर भाषा में संभालना मुश्किल (लेकिन असंभव से दूर) है। यह समान प्रक्रिया स्थान में कोड को संकलित करने और निष्पादित करने के लिए कोड की बहुत अधिक लाइनें होगी।

यह गतिशील-भाषा विशिष्ट नहीं है। यह आसान है।


2
"आप आसानी से प्रयोग नहीं कर सकते।" - सच है, ट्रेडऑफ़ होना यह है कि कंपाइलर आपको त्रुटियों को खोजने में मदद करता है जबकि व्याख्या की गई भाषाओं के साथ जब तक कोई उपयोगकर्ता कोड की उस पंक्ति को निष्पादित नहीं करता तब तक आपको कोई त्रुटि नहीं मिल सकती है।
डग टी।

4
@ डग टी .: "कंपाइलर आपको त्रुटियां खोजने में मदद करता है"। कभी कभी। अक्सर पर्याप्त नहीं। दिलचस्प त्रुटियों को संकलक द्वारा बिल्कुल नहीं पाया जा सकता है। यही इकाई परीक्षण है।
S.Lott

2
@ S। मुझे लगता है कि गतिशील भाषाओं में लिखे गए एपीआई को थोड़ा और प्रलेखन की आवश्यकता होती है। एक स्थिर भाषा में, विधि हस्ताक्षर आपको बताता है कि किस प्रकार के तर्कों की आवश्यकता है। एक गतिशील भाषा में, आप आसानी से नहीं बता सकते हैं - एपीआई प्रलेखन आपको यह बताना है कि ऑब्जेक्ट क्या अपेक्षित हैं।
क्वांटिक

1
@quanticle: यह वास्तव में वास्तु नहीं है, है?
सल।

2
"आप आसानी से प्रयोग नहीं कर सकते।" - एफ # और हास्केल दोनों स्थिर भाषाएं हैं, और उनके पास पूर्णांक हैं, और शायद ही कभी आप एक पहचानकर्ता या अभिव्यक्ति के प्रकार से पूछें।
री मियासका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.