গতিশীল ভাষাগুলিতে এমন অনেকগুলি 'ঝরঝরে' জিনিস রয়েছে যা কোডের কিছু অংশে ফেলে দেওয়া যেতে পারে যা অন্য প্রোগ্রামার বা নিরীক্ষকের কাছে প্রদত্ত কোডের কিছু অংশের কার্যকারিতা হিসাবে তাত্ক্ষণিকভাবে স্পষ্ট হয় না।
আইআরবি (ইন্টারেক্টিভ রুবি শেল) এ এই ক্রমটি বিবেচনা করুন:
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
আর্গুমেন্ট বা না নেওয়া সংজ্ঞায়িত করা যায় রানটাইম এ সম্পূর্ণরূপে একটি বাক্য গঠন হাইলাইটার বা স্ট্যাটিক বিশ্লেষক পরাজিত)।
এটি বন্ধের সংজ্ঞা দেওয়া হয়েছে এমন পরিবেশে অ্যাক্সেসের দক্ষতার সাথে রুবিতে আরও আকর্ষণীয় হয়ে উঠতে পারে ( ইউটিউব দেখুন: রুশুকনফ ২০১১ থেকে রুবি যুক্তিসঙ্গত রাখছেন জোশুয়া বালানকো)। মাউস দ্য লাক্কি ডগের একটি আরস টেকনিকের মন্তব্য থেকে আমি এই ভিডিওটি সম্পর্কে সচেতন হয়েছি ।
নিম্নলিখিত কোড বিবেচনা করুন:
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: in `qux ': এমডাব্লুএইচএইচডাব্লু! (RuntimeError)
বি.আরবি থেকে: 30: ইন `'
~ / $ রুবি foo.rb
বার
> :)
যাও qux
বি.আরবি: ২০: ইন `বারে: এমডাব্লুএইচএইচএইচএইচবাহ! (RuntimeError)
বি.আরবি থেকে: ২৯: ইন `'
এই কোডে, বন্ধটি সেই সুযোগে শ্রেণিতে নির্ধারিত সমস্ত পদ্ধতি এবং অন্যান্য বাইন্ডিংগুলিতে অ্যাক্সেস করতে সক্ষম হয়েছিল । এটি একটি এলোমেলো পদ্ধতি বেছে নিয়ে একটি ব্যতিক্রম বাড়াতে পুনরায় সংজ্ঞায়িত করেছে। ( এই অবজেক্টটিতে কী কী অ্যাক্সেস রয়েছে সে সম্পর্কে ধারণা পেতে রুবির বাইন্ডিং ক্লাসটি দেখুন )
ভেরিয়েবল, পদ্ধতি, স্বের মান এবং সম্ভবত এই প্রসঙ্গে অ্যাক্সেস করা যায় এমন একটি পুনরুদ্ধারকারী ব্লক সবগুলি বজায় রাখা আছে।
একটি সংক্ষিপ্ত সংস্করণ যা ভেরিয়েবলের পুনঃনির্ধারণ দেখায়:
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
এটি আমি উপরে উল্লিখিত ওপেন ক্লাসের চেয়ে বেশি যা স্থির বিশ্লেষণকে অসম্ভব করে তোলে। উপরে যেটি প্রদর্শিত হয় তা হ'ল একটি বন্ধন যা অন্য কোথাও অতিক্রম করা হয়, এটি তার সাথে সংজ্ঞায়িত পুরো পরিবেশটি বহন করে This এটি প্রথম শ্রেণীর পরিবেশ হিসাবে পরিচিত (যেমন আপনি যখন ফাংশনগুলির কাছাকাছি যেতে পারেন তখন তারা প্রথম শ্রেণির ফাংশন, এটি সেই সময় পরিবেশে উপলব্ধ সমস্ত বাইন্ডিং) ings বন্ধের সুযোগে সংজ্ঞায়িত যে কোনও ভেরিয়েবলকে নতুন করে সংজ্ঞায়িত করা যায়।
ভাল বা খারাপ, রুবি সম্পর্কে অভিযোগ করা বা না করা (এমন কোনও ব্যবহার রয়েছে যেখানে কেউ কোনও পদ্ধতির পরিবেশে আসতে সক্ষম হতে চান ( পার্লে নিরাপদ দেখুন )), "কেন সরকারী প্রকল্পে রুবি কেন সীমাবদ্ধ থাকবে?" প্রশ্ন "উপরে লিঙ্ক করা ভিডিওতে সত্যই উত্তর দেওয়া আছে।
দেত্তয়া আছে:
- রুবি একজনকে যে কোনও বন্ধ থেকে পরিবেশ আহরণ করতে দেয়
- রুবি বন্ধনের সুযোগে সমস্ত বাইন্ডিং ক্যাপচার করে
- রুবি সমস্ত বাঁধাই সরাসরি এবং পরিবর্তনীয় হিসাবে বজায় রাখে
- রুবিতে নতুন বাইন্ডিংসের ছায়া পুরাতন বাইন্ডিং রয়েছে (পরিবেশকে ক্লোনিং করা বা পুনর্নির্মাণকে নিষিদ্ধ করার চেয়ে)
এই চারটি ডিজাইনের পছন্দগুলির প্রভাবের সাথে, কোনও বিট কোড কী করে তা জানা অসম্ভব।
এটি সম্পর্কে আরও অ্যাবস্ট্রাক্ট হেরেসিজ ব্লগে পড়তে পারেন । বিশেষ পোস্টটি স্কিম সম্পর্কিত যেখানে এই জাতীয় বিতর্ক হয়েছিল। (এসও সম্পর্কিত: স্কীম প্রথম শ্রেণীর পরিবেশকে কেন সমর্থন করে না? )
তবে সময়ের সাথে সাথে আমি বুঝতে পেরেছিলাম যে প্রথম শ্রেণীর পরিবেশগুলির সাথে আমার প্রাথমিক ধারণাটির চেয়ে বেশি অসুবিধা এবং কম শক্তি ছিল। এই মুহুর্তে আমি বিশ্বাস করি যে প্রথম-শ্রেণীর পরিবেশগুলি সর্বোত্তমভাবে অকেজো এবং সবচেয়ে খারাপ ক্ষেত্রে।
আমি আশা করি এই বিভাগটি প্রথম শ্রেণীর পরিবেশগুলির বিপদজনক দিকটি দেখায় এবং কেন এটি সরবরাহিত সমাধান থেকে রুবিকে অপসারণ করতে বলা হবে। এটি কেবল নয় যে রুবি একটি গতিশীল ভাষা (যেমন অন্য হিসাবে উত্তর হিসাবে বলা হয়েছে, অন্যান্য প্রকল্পে অন্যান্য গতিশীল ভাষাগুলির অনুমতি দেওয়া হয়েছে), তবে এমন কিছু নির্দিষ্ট সমস্যা রয়েছে যা কিছু গতিশীল ভাষাগুলি নিয়ে তর্ক করতে আরও কঠিন করে তোলে।