ডায়নামিকালি-টাইপ করা ভাষাগুলি ইউনিক-টাইপযুক্ত
টাইপ সিস্টেমের সাথে তুলনা করা , গতিশীল টাইপিংয়ের কোনও সুবিধা নেই। ডায়নামিক টাইপিং স্ট্যাটিক টাইপিংয়ের একটি বিশেষ কেস - এটি একটি স্ট্যাটিকালি-টাইপড ভাষা যেখানে প্রতিটি ভেরিয়েবলের একই ধরণের থাকে। আপনি জাভাতে একই জিনিস অর্জন করতে পারেন (বিয়োগ সংক্ষিপ্তকরণ) প্রতিটি ভেরিয়েবলকে টাইপযুক্ত করে Objectএবং "অবজেক্ট" মানগুলি টাইপযুক্ত করে Map<String, Object>:
void makeItBark(Object dog) {
Map<String, Object> dogMap = (Map<String, Object>) dog;
Runnable bark = (Runnable) dogMap.get("bark");
bark.run();
}
সুতরাং, এমনকি প্রতিফলন ছাড়াই, আপনি ঠিক প্রায় কোনও স্ট্যাটিক্যালি-টাইপ করা ভাষায় একই শব্দটি অর্জন করতে পারেন, সিনট্যাকটিক সুবিধাটি একপাশে রেখে। আপনি কোনও অতিরিক্ত অভিব্যক্তি শক্তি পাচ্ছেন না; বিপরীতে, আপনার কম অভিব্যক্তিপূর্ণ শক্তি আছে কারণ একটি গতিশীল টাইপড ভাষায়, আপনি নির্দিষ্ট কিছু ক্ষেত্রে ভেরিয়েবল সীমাবদ্ধ করার ক্ষমতা বঞ্চিত হন।
স্থিতিশীল ভাষায় হাঁসের বাকল তৈরি করা
তদুপরি, একটি ভাল স্ট্যাটিক্যালি টাইপ করা ভাষা আপনাকে এমন কোড লিখতে দেয় যা কোনও barkঅপারেশন রয়েছে এমন কোনও ধরণের সাথে কাজ করে। হাসকেলে এটি একটি টাইপ শ্রেণি:
class Barkable a where
bark :: a -> unit
এটি সীমাবদ্ধতা প্রকাশ করে যে কোনও ধরণের aবারকযোগ্য হিসাবে বিবেচিত হওয়ার জন্য, এমন একটি barkফাংশন থাকতে হবে যা সেই ধরণের মান গ্রহণ করে এবং কিছুই ফিরিয়ে দেয় না।
তারপরে আপনি Barkableসীমাবদ্ধতার নিরিখে জেনেরিক ফাংশন লিখতে পারেন :
makeItBark :: Barkable a => a -> unit
makeItBark barker = bark (barker)
এটি বলে যে এটি যে makeItBarkকোনও ধরণের সন্তোষজনক Barkableপ্রয়োজনীয়তার জন্য কাজ করবে । এটি interfaceজাভা বা সি # তে একটির মতো বলে মনে হতে পারে তবে এর একটি বড় সুবিধা রয়েছে - প্রকারগুলিকে কোন ধরণের শ্রেণিগুলি তারা সন্তুষ্ট করে তা নির্দিষ্ট করতে হবে না । আমি বলতে পারি যে টাইপ Duckহয় Barkableযে কোন সময়ে, এমনকি যদি Duckএকটি তৃতীয় পক্ষের টাইপ আমি লিখি নি। প্রকৃতপক্ষে, এতে কোনও ব্যাপার নেই যে লেখক Duckকোনও barkফাংশন লিখেনি - যখন আমি Duckসন্তুষ্ট ভাষায় বলি তখন আমি সত্য ঘটনাটি প্রদান করতে পারি Barkable:
instance Barkable Duck where
bark d = quack (punch (d))
makeItBark (aDuck)
এটি বলছে যে Duckএস বার্ক করতে পারে এবং তাদের ছাল ফাংশন কোয়াক তৈরির আগে হাঁসের খোঁচা দিয়ে প্রয়োগ করা হয় । উপায়টি অতিক্রম করে, আমরা makeItBarkহাঁসের ডাকতে পারি ।
Standard MLএবং OCamlআরও নমনীয় যে আপনি একই ধরণের শ্রেণি একাধিক উপায়ে সন্তুষ্ট করতে পারেন । এই ভাষাগুলিতে আমি বলতে পারি যে প্রচলিত ক্রমগুলি প্রচলিত ক্রম ব্যবহার করে অর্ডার করা যেতে পারে এবং তারপরে ঘুরিয়ে দিয়ে বলতে পারি যে তারা বিভাজ্যতার দ্বারাও অনুগামী হয় (যেমন 10 > 510 কারণ 5 দ্বারা বিভাজ্য)। হাসকেলে আপনি কেবল একবার টাইপ শ্রেণি ইনস্ট্যান্ট করতে পারেন। (এটি হাস্কেলকে স্বয়ংক্রিয়ভাবে জানতে দেয় যে barkহাঁসের দিকে কল করা ঠিক আছে ; এসএমএল বা ওসিএএমএলে আপনাকে কোন bark ফাংশনটি চান তা সম্পর্কে আপনাকে স্পষ্ট করে বলতে হবে , কারণ একাধিকের বেশি থাকতে পারে))
সংক্ষিপ্ত রুপ
অবশ্যই সিনথেটিকাল পার্থক্য রয়েছে। আপনি যে পাইথন কোডটি উপস্থাপন করেছেন তা জাভা সমমানের চেয়ে আমার চেয়ে অনেক বেশি সংক্ষিপ্ত। বাস্তবে, সেই সংক্ষিপ্ততা গতিময় টাইপযুক্ত ভাষার প্রলাপের একটি বড় অংশ। তবে টাইপ অনুমান আপনাকে কোডটি লিখতে দেয় যা স্ট্যাটিক্যালি টাইপ করা ভাষাগুলিতে ঠিক যেমন সংক্ষিপ্ত, প্রতিটি ভেরিয়েবলের প্রকারগুলি স্পষ্টভাবে লেখার জন্য আপনাকে স্বস্তি দিয়ে । স্ট্যাটিক্যালি-টাইপ করা ভাষাটি গতিশীল টাইপিংয়ের জন্য স্থানীয় theালাই এবং মানচিত্রের ম্যানিপুলেশনগুলির (যেমন সি # 's dynamic) এর ভারবসটি মুছে ফেলার জন্য স্থানীয় সমর্থন সরবরাহ করতে পারে ।
সঠিক তবে খারাপ-টাইপ করা প্রোগ্রাম
ন্যায়সঙ্গত হওয়ার জন্য, স্ট্যাটিক টাইপিং অগত্যা কিছু প্রোগ্রামকে নিয়মিত করে দেয় যা প্রযুক্তিগতভাবে সঠিক যা টাইপ চেকার এটি যাচাই করতে পারে না। উদাহরণ স্বরূপ:
if this_variable_is_always_true:
return "some string"
else:
return 6
বেশিরভাগ স্ট্যাটিক্যালি টাইপ করা ভাষাগুলি এই ifবিবৃতিটিকে প্রত্যাখ্যান করবে যদিও অন্য শাখাটি কখনই ঘটবে না। অনুশীলনে এটি মনে হয় যে এই ধরণের কোডটি কেউ ব্যবহার করে না - প্রকারের পরীক্ষকটির জন্য খুব চালাক কিছু সম্ভবত আপনার কোডের ভবিষ্যতের রক্ষণাবেক্ষণকারীদের এবং আপনার পরবর্তী আত্মীয়কে অভিশাপ দেবে। এক্ষেত্রে, কেউ 4 টি ওপেন সোর্স পাইথন প্রকল্পগুলি সফলভাবে হ্যাসকেলে অনুবাদ করেছেন যার অর্থ তারা এমন কিছু করছেন না যা একটি ভাল স্ট্যাটিকাল-টাইপিত ভাষা সংকলন করতে পারে না। আরও কি, সংকলকটি টাইপ-সম্পর্কিত কিছু বাগ খুঁজে পেয়েছিল যা ইউনিট পরীক্ষাগুলি ধরেনি।
ডায়নামিক টাইপিংয়ের জন্য আমি যে শক্তিশালী যুক্তিটি দেখেছি তা হ'ল লিস্পের ম্যাক্রোস, যেহেতু তারা আপনাকে নির্বিচারে ভাষার সিনট্যাক্স প্রসারিত করতে দেয়। যাইহোক, টাইপড র্যাকেট লিস্পের একটি স্ট্যাটিক্যালি টাইপড উপভাষা যা ম্যাক্রোস রয়েছে, সুতরাং এটি স্থির টাইপিং এবং ম্যাক্রোগুলি পারস্পরিক একচেটিয়া নয়, যদিও সম্ভবত একইসাথে প্রয়োগ করা আরও শক্ত।
আপেল এবং কমলা
শেষ অবধি, ভুলে যাবেন না যে ভাষাগুলির মধ্যে কেবল তাদের টাইপ সিস্টেমের চেয়ে বড় পার্থক্য রয়েছে। জাভা 8 এর পূর্বে, জাভাতে কোনও ধরণের কার্যকরী প্রোগ্রামিং করা কার্যত অসম্ভব ছিল; একটি সাধারণ ল্যাম্বডায় বয়লারপ্লেট বেনাম শ্রেণীর কোডের 4 লাইন লাগবে। জাভা সংগ্রহের আক্ষরিক (যেমন [1, 2, 3]) জন্য কোনও সমর্থন নেই support সরঞ্জামাদি (আইডিই, ডিবাগার), গ্রন্থাগারগুলি এবং সম্প্রদায় সমর্থনগুলির গুণমান এবং প্রাপ্যতার মধ্যেও পার্থক্য থাকতে পারে। যখন কেউ জাভা থেকে পাইথন বা রুবিতে বেশি উত্পাদনশীল হওয়ার দাবি করেছেন, তখন বৈশিষ্ট্যটির বৈষম্যটি বিবেচনায় নেওয়া উচিত। সমস্ত ব্যাটারি অন্তর্ভুক্ত , ভাষার কোর এবং টাইপ সিস্টেমের সাথে ভাষার তুলনা করার মধ্যে পার্থক্য রয়েছে ।
makeItBark(collections.namedtuple("Dog", "bark")(lambda x: "woof woof"))। এই যুক্তিটি এমনকি কোনও শ্রেণি নয় , এটি একটি নামবিহীন নাম টিপল। হাঁসের টাইপিং ("যদি এটি ... এর মতো ঘেউ ঘেউ করে ...") আপনাকে মূলত শূন্য বিধিনিষেধ এবং কোনও সিনট্যাকটিক ওভারহেড না দিয়ে অ্যাডহক ইন্টারফেস করতে দেয়। আপনি জাভা জাতীয় ভাষায় এটি করতে পারেন, তবে আপনি প্রচুর অগোছালো প্রতিফলন সহ শেষ করেন। জাভাতে কোনও ফাংশনের জন্য যদি অ্যারেলিস্ট প্রয়োজন হয় এবং আপনি এটি অন্য সংগ্রহের ধরণ দিতে চান তবে আপনি এসএল। অজগর যে এমনকি উপরে আসতে পারে না।