একটি "কার্যকরী ভাষা" ঠিক কী তা নির্ধারণ করা শক্ত - আপনি তালিকাভুক্ত ভাষাগুলির মধ্যে কেবল হাস্কেল খাঁটিভাবে কার্যকরী (অন্যরা সকলেই একরকম সংকর পদ্ধতির অবলম্বন করেছেন)। কিছু নির্দিষ্ট ভাষা বৈশিষ্ট্য রয়েছে যা ফাংশনাল প্রোগ্রামিংয়ের জন্য খুব সহায়ক, এবং রুবি এবং পাইথনের এফপির পক্ষে খুব ভাল পরিবেশ হতে পারে না। গুরুত্ব অনুসারে এখানে আমার ব্যক্তিগত চেকলিস্টটি রয়েছে:
- প্রথম শ্রেণির ফাংশন এবং ক্লোজারগুলি (রুবি, পাইথন এবং আপনি তালিকাভুক্ত সমস্ত অন্যান্য এতে আছে)।
- গ্যারান্টেড টেল-কল অপটিমাইজেশন (এরলং, হাস্কেল, স্কেলা এবং স্কিম এ রয়েছে তবে পাইথন, রুবি বা ক্লোজার (এখনও) নয়।
- ভাষা এবং স্ট্যান্ডার্ড লাইব্রেরিতে অপরিবর্তনীয়তার জন্য সমর্থন (এটি একটি বড় যা আপনার তালিকাভুক্ত সমস্ত "কার্যকরী ভাষা" রয়েছে (স্কিম বাদে) তবে রুবি এবং পাইথন নেই)।
- উল্লেখযোগ্যভাবে স্বচ্ছ (বা খাঁটি) ফাংশনগুলির জন্য ভাষা-স্তরের সমর্থন (যতদূর আমি জানি, কেবল হাস্কেলের কাছে এটি বর্তমানে রয়েছে)।
(1) এর প্রয়োজনীয়তা সুস্পষ্ট হওয়া উচিত - উচ্চ-অর্ডার ফাংশনগুলি প্রথম-শ্রেণীর ফাংশন ছাড়াই চূড়ান্ত। লোকেরা যখন রুপি এবং পাইথনকে এফপির জন্য ভাল ভাষা বলে কথা বলে, তারা সাধারণত এটি সম্পর্কে কথা বলছে। তবে, এই বিশেষ বৈশিষ্ট্যটি প্রয়োজনীয় তবে এফপির পক্ষে কোনও ভাষা ভাল করার পক্ষে যথেষ্ট নয়।
(২) এফপির জন্য যখন থেকে স্কিম উদ্ভাবিত হয়েছিল তখন থেকেই এটি একটি aতিহ্যগত প্রয়োজনীয়তা। টিসিও ব্যতীত, গভীর পুনরাবৃত্তি নিয়ে প্রোগ্রাম করা অসম্ভব, যা এফপির অন্যতম ভিত্তি, কারণ আপনি স্ট্যাক ওভারফ্লো পেয়ে যান। একমাত্র "কার্যকরী" (জনপ্রিয় সংজ্ঞা অনুসারে) যে ভাষাতে এটি নেই তা হ'ল ক্লজিউর (জেভিএমের সীমাবদ্ধতার কারণে), তবে ক্লোজুরে টিসিও অনুকরণ করার জন্য বিভিন্ন ধরণের হ্যাক রয়েছে। (এফওয়াইআই, রুবি টিসিও বাস্তবায়ন-নির্দিষ্ট , তবে পাইথন বিশেষভাবে এটি সমর্থন করে না )) টিসিওর নিশ্চয়তা দেওয়ার কারণ হ'ল যদি এটি বাস্তবায়ন-নির্দিষ্ট হয় তবে গভীর পুনরাবৃত্তির কাজগুলি কিছু বাস্তবায়নের সাথে ভেঙে যায়, সুতরাং আপনি সত্যিই পারবেন না এগুলি ব্যবহার করুন।
(3) আর একটি বড় বিষয় হ'ল আধুনিক ক্রিয়ামূলক ভাষা (বিশেষত হাস্কেল, এরলং, ক্লোজার এবং স্কালা) এর মধ্যে রুবি এবং পাইথন নেই। খুব বেশি বিশদে না গিয়ে, গ্যারান্টেড অপরিবর্তনীয়তা পুরো ক্লাস বাগগুলি সরিয়ে দেয়, বিশেষত সমকালীন পরিস্থিতিতে, এবং ধ্রুবক ডেটা স্ট্রাকচারের মতো ঝরঝরে জিনিসগুলিকে মঞ্জুরি দেয় । ভাষা-স্তরের সমর্থন ছাড়াই এই সুবিধাগুলি গ্রহণ করা খুব কঠিন।
(4) হ'ল আমার পক্ষে খাঁটি-কার্যকরী ভাষা সম্পর্কে (আকর্ষণীয় ভাষার বিপরীতে) সবচেয়ে আকর্ষণীয় বিষয়। নিম্নলিখিত অত্যন্ত সাধারণ রুবি ফাংশন বিবেচনা করুন:
def add(a, b)
a + b
end
এটি খাঁটি ফাংশনের মতো দেখায়, তবে অপারেটর ওভারলোডিংয়ের কারণে এটি প্যারামিটারকে রূপান্তর করতে পারে বা কনসোলটিতে মুদ্রণের মতো পার্শ্ব প্রতিক্রিয়া সৃষ্টি করতে পারে। এর সম্ভাবনা নেই যে +
পার্শ্ব প্রতিক্রিয়া হওয়ার জন্য কেউ অপারেটরটিকে ওভারলোড করবে , তবে ভাষা কোনও গ্যারান্টি দেয় না। (পাইথনের ক্ষেত্রে এটি একই প্রযোজ্য, যদিও এই নির্দিষ্ট উদাহরণের সাথে নাও থাকতে পারে))
বিশুদ্ধভাবে কার্যকরী ভাষায়, অন্যদিকে ভাষা-স্তরের গ্যারান্টি রয়েছে যে কার্যগুলি রেফারেন্টালি স্বচ্ছ। এর অসংখ্য সুবিধা রয়েছে: খাঁটি ফাংশনগুলি সহজেই স্মৃতিচারণ করা যায়; এগুলি যে কোনও ধরণের বিশ্বরাষ্ট্রের উপর নির্ভর না করে সহজেই পরীক্ষা করা যায়; এবং ফাংশনটির মধ্যে মানগুলি সম্মতিমূলক বিষয়গুলি নিয়ে চিন্তা না করেই অলসভাবে বা সমান্তরালে মূল্যায়ন করা যেতে পারে। হাস্কেল এটার পুরো সদ্ব্যবহার করে, তবে অন্যান্য কার্যকরী ভাষা সেগুলি করে কিনা তা সম্পর্কে আমি যথেষ্ট জানি না।
যা যা বলা হচ্ছে, প্রায় কোনও ভাষায় (এমনকি জাভা) এফপি কৌশল ব্যবহার করা সম্ভব। উদাহরণস্বরূপ, গুগলের ম্যাপ্রেডিউস ক্রিয়ামূলক ধারণা দ্বারা অনুপ্রাণিত, তবে যতদূর আমি জানি তারা তাদের বড় প্রকল্পগুলির জন্য কোনও "কার্যকরী" ভাষা ব্যবহার করে না (আমার ধারণা তারা বেশিরভাগ সি ++, জাভা এবং পাইথন ব্যবহার করে)।