कई 'स्वच्छ' चीजें हैं जो गतिशील भाषाओं में की जा सकती हैं जिन्हें कोड के कुछ हिस्सों में दूर किया जा सकता है जो किसी अन्य प्रोग्रामर या ऑडिटर को तुरंत दिए गए कोड की कार्यक्षमता के रूप में स्पष्ट नहीं हैं।
इस क्रम को आइआरबी (इंटरेक्टिव रूबी शेल) पर विचार करें:
irb(main):001:0> "bar".foo
NoMethodError: undefined method `foo' for "bar":String
from (irb):1
from /usr/bin/irb:12:in `<main>'
irb(main):002:0> class String
irb(main):003:1> def foo
irb(main):004:2> "foobar!"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> "bar".foo
=> "foobar!"
क्या हुआ वहाँ मैं foo
एक स्ट्रिंग स्थिरांक में विधि को कॉल करने की कोशिश की है । यह विफल रहा। मैंने तब स्ट्रिंग वर्ग खोला और foo
ओ रिटर्न करने की विधि को परिभाषित किया "foobar!"
, और फिर इसे कॉल किया। यह काम किया।
यह एक खुले वर्ग के रूप में जाना जाता है और मुझे हर बार बुरे सपने आते हैं, मैं माणिक में कोड लिखने के बारे में सोचता हूं जिसमें किसी भी तरह की सुरक्षा या अखंडता है। यकीन है कि यह आपको कुछ साफ-सुथरी चीजें करने में काफी तेज है ... लेकिन मैं इसे हर बार बना सकता हूं जब कोई किसी को एक स्ट्रिंग संग्रहीत करता है, तो उसने इसे एक फ़ाइल में संग्रहीत किया, या इसे नेटवर्क पर भेजा। और स्ट्रिंग को पुनर्परिभाषित करने के इस छोटे से कोड में कहीं भी टक किया जा सकता है।
कई अन्य गतिशील भाषाओं में समान चीजें हैं जो की जा सकती हैं। पर्ल के पास टाई :: स्केलर है जो पर्दे के पीछे बदल सकता है कि किसी दिए गए स्केलर कैसे काम करते हैं (यह थोड़ा अधिक स्पष्ट है और एक विशिष्ट कमांड की आवश्यकता होती है जिसे आप देख सकते हैं, लेकिन एक स्केलर जो कहीं और से पारित होता है) एक समस्या हो सकती है। यदि आपके पास पर्ल कुकबुक तक पहुंच है, तो नुस्खा 13.15 देखें - टाई के साथ मैजिक वेरिएबल्स बनाना।
इन चीजों (और अक्सर गतिशील भाषाओं का हिस्सा) के कारण, कोड में सुरक्षा के स्थैतिक विश्लेषण के कई दृष्टिकोण काम नहीं करते हैं। Perl और Undecidability इस मामले को दिखाता है और वाक्यविन्यास हाइलाइटिंग के साथ भी ऐसी तुच्छ समस्याओं को इंगित करता है ( whatever / 25 ; # / ; die "this dies!";
पॉज़ चुनौतियां क्योंकि whatever
इसे तर्क को लेने के लिए परिभाषित किया जा सकता है या रनटाइम को पूरी तरह से सिंटैक्स हाइलाइटर या स्टेटिक बीज़र को हराने के लिए नहीं )।
यह रूबी में पर्यावरण को एक्सेस करने की क्षमता के साथ और भी दिलचस्प हो सकता है कि एक बंद को परिभाषित किया गया था ( यूट्यूब देखें : जोशुआ बल्लांको द्वारा रूबी कॉनसेबल रूबी कांसेबल 2011 से रखते हुए )। मुझे इस वीडियो के बारे में Ars Technica द्वारा माउस TheLuckyDog की टिप्पणी से अवगत कराया गया था ।
निम्नलिखित कोड पर विचार करें:
def mal(&block)
puts ">:)"
block.call
t = block.binding.eval('(self.methods - Object.methods).sample')
block.binding.eval <<-END
def #{t.to_s}
raise 'MWHWAHAW!'
end
END
end
class Foo
def bar
puts "bar"
end
def qux
mal do
puts "qux"
end
end
end
f = Foo.new
f.bar
f.qux
f.bar
f.qux
यह कोड पूरी तरह से दिखाई देता है, लेकिन mal
विधि कहीं और हो सकती है ... और खुली कक्षाओं के साथ, निश्चित रूप से, इसे कहीं और फिर से परिभाषित किया जा सकता है।
इस कोड को चलाना:
~ / $ माणिक foo.rb
बार
> :)
qux
बार
b.rb: 20: `qux 'में: MWHWAHW! (रनटाइम त्रुटि)
b.rb से: 30: `में
~ / $ माणिक foo.rb
बार
> :)
qux
b.rb: 20: `बार 'में: MWHWAHAW! (रनटाइम त्रुटि)
b.rb से: 29: `में
इस कोड में, क्लोजर उस दायरे में कक्षा में परिभाषित सभी तरीकों और अन्य बाइंडिंग तक पहुंचने में सक्षम था । इसने एक यादृच्छिक तरीका चुना और एक अपवाद को बढ़ाने के लिए इसे फिर से परिभाषित किया। ( रूबी में बाइंडिंग क्लास देखें कि इस वस्तु की क्या पहुंच है, इसका अंदाजा लगाने के लिए)
इस संदर्भ में चर, विधियां, स्वयं का मूल्य, और संभवत: एक पुनरावृत्ति अवरोधक, जिसे एक्सेस किया जा सकता है।
एक छोटा संस्करण जो एक चर के पुनर्परिवर्तन को दर्शाता है:
def mal(&block)
block.call
block.binding.eval('a = 43')
end
a = 42
puts a
mal do
puts 1
end
puts a
जब, जब रन का उत्पादन होता है:
42
1
43
यह खुले वर्ग से अधिक है जिसका मैंने ऊपर उल्लेख किया है जो स्थैतिक विश्लेषण को असंभव बनाता है। ऊपर जो दिखाया गया है वह यह है कि एक क्लोजर जो कहीं और से गुजरता है, उसके साथ उस पूरे वातावरण को ले जाता है जिसे वह परिभाषित किया गया था। इसे प्रथम श्रेणी के वातावरण के रूप में जाना जाता है (जैसे ही जब आप कार्यों को पास कर सकते हैं, वे प्रथम श्रेणी के कार्य होते हैं, यह पर्यावरण और उस समय उपलब्ध सभी बाइंडिंग) है। कोई भी वैरिएबल को फिर से परिभाषित कर सकता है जिसे क्लोजर के दायरे में परिभाषित किया गया था।
अच्छा या बुरा, माणिक या नहीं के बारे में शिकायत (वहाँ का उपयोग करता है, जहां एक होगा चाहते हैं एक विधि के वातावरण में प्राप्त करने के लिए सक्षम होने के लिए (देखें सुरक्षित पर्ल में)), "क्यों माणिक होगा के सवाल एक सरकारी परियोजना के लिए में प्रतिबंधित किया जा "ऊपर वर्णित वीडियो में वास्तव में उत्तर दिया गया है।
मान लीजिये:
- रूबी किसी भी बंद से पर्यावरण को निकालने की अनुमति देता है
- रूबी बंद के दायरे में सभी बाइंडिंग को पकड़ लेती है
- रूबी सभी बाइंडिंग को लाइव और म्यूटेबल बनाए रखती है
- रूबी के पास नए बाइंडिंग छाया पुराने बाइंडिंग हैं (बजाय पर्यावरण को क्लोन करने या रिबंडिंग को प्रतिबंधित करने के)
इन चार डिज़ाइन विकल्पों के निहितार्थ के साथ, यह जानना असंभव है कि कोई भी कोड क्या करता है।
इसके बारे में अधिक सार सार ब्लॉग पर पढ़ा जा सकता है । विशेष पद स्कीम के बारे में है जहां इस तरह की बहस थी। (SO पर संबंधित: योजना प्रथम श्रेणी के वातावरण का समर्थन क्यों नहीं करती है? )
समय के साथ, हालांकि, मुझे एहसास हुआ कि मूल रूप से जितना मैंने सोचा था, उससे अधिक कठिन और कम प्रथम श्रेणी के वातावरण के साथ शक्ति थी। इस बिंदु पर मेरा मानना है कि प्रथम श्रेणी का वातावरण सबसे अच्छा बेकार है, और सबसे खराब खतरनाक है।
मुझे उम्मीद है कि यह खंड प्रथम श्रेणी के वातावरण के खतरे के पहलू को दिखाता है और यह क्यों दिया जाएगा कि रूबी को समाधान प्रदान किया जाए। यह न केवल यह है कि रूबी एक गतिशील भाषा है (जैसा कि अन्य उत्तर में कहा गया है, अन्य गतिशील भाषाओं को अन्य परियोजनाओं में अनुमति दी गई है), लेकिन यह विशिष्ट मुद्दे हैं जो कुछ गतिशील भाषाओं को तर्क करने के लिए और भी कठिन बना देते हैं।