ভাষা ও তার প্রকৃতি, পাশাপাশি আমার ডোমেন এবং এমনকি আমরা যে ভাষাটি ব্যবহার করি তার দ্বারা সি ++ তে এমন ধারণাগুলি প্রয়োগ করা হিসাবে আমি একজন স্বীকৃতভাবে পক্ষপাতদুষ্ট। তবে এই জিনিসগুলি দেওয়া, আমি মনে করি অপরিবর্তনীয় নকশাগুলি হ'ল আকর্ষণীয় দিক, যখন ফাংশনাল প্রোগ্রামিংয়ের সাথে যুক্ত বেশিরভাগ সুবিধাগুলি কাটা, যেমন থ্রেড সুরক্ষা, সিস্টেম সম্পর্কে যুক্তি স্বাচ্ছন্দ্য, ফাংশনগুলির জন্য আরও পুনরায় ব্যবহার (এবং আমরা খুঁজে পেতে পারি) অপ্রীতিকর বিস্ময় ছাড়াই কোনও ক্রমে তাদের একত্রিত করুন) ইত্যাদি etc.
এই সরলবহুল সি ++ উদাহরণটি নিন (সেখানকার কোনও চিত্র প্রসেসিং বিশেষজ্ঞের সামনে নিজেকে বিব্রত করা এড়াতে সরলতার জন্য স্বীকৃতভাবে স্বীকৃত নয়):
// Inputs an image and outputs a new one with the specified size.
Image resized_image(const Image& src, int new_w, int new_h)
{
Image dst(new_w, new_h);
for (int y=0; y < new_h; ++y)
{
for (int x=0; x < new_w; ++x)
dst[y][x] = src.sample(x / (float)new_w, y / (float)new_h);
}
return dst;
}
এই ফাংশনটির বাস্তবায়ন স্থানীয় দুটি (এবং অস্থায়ী) অবস্থাকে দুটি কাউন্টার ভেরিয়েবল এবং অস্থায়ী স্থানীয় চিত্র হিসাবে আউটপুটে রূপান্তরিত করে, এর কোনও বাহ্যিক পার্শ্ব প্রতিক্রিয়া নেই। এটি একটি চিত্র দেয় এবং একটি নতুন চিত্র আউটপুট দেয়। আমরা এটি আমাদের হৃদয়ের সামগ্রীতে মাল্ট্রিথ্রেড করতে পারি। এটি সম্পর্কে तर्क করা সহজ, পুরোপুরি পরীক্ষা করা সহজ। এটি ব্যতিক্রম-নিরাপদ যেহেতু কিছু ছুঁড়ে মারলে, নতুন চিত্রটি স্বয়ংক্রিয়ভাবে ফেলে দেওয়া হবে এবং আমাদের বাহ্যিক পার্শ্ব প্রতিক্রিয়াগুলি ফিরিয়ে আনার বিষয়ে চিন্তা করার দরকার নেই (কথা বলার জন্য কোনও বাহ্যিক চিত্র পরিবর্তিত হচ্ছে না)।
আমি Image
উপরের প্রসঙ্গে সি ++ তে অপরিবর্তনীয় করে, সম্ভবত উপরের ফাংশনটি বাস্তবায়নের জন্য আরও অতিরঞ্জিত করা এবং সম্ভবত কিছুটা কম দক্ষ হিসাবে তৈরি করার চেয়ে সামান্য অর্জন করা এবং সম্ভাব্য অনেক কিছুই হ'তে দেখছি ।
বিশুদ্ধতা
তাই খাঁটি ফাংশন ( বহিরাগত পার্শ্ব প্রতিক্রিয়া মুক্ত) আমার কাছে খুব আকর্ষণীয় এবং আমি সি ++ তে এমনকি টিম সদস্যদের কাছে প্রায়শই তাদের পক্ষ নেওয়ার গুরুত্বের উপরে জোর দিয়েছি। তবে অপরিবর্তনীয় নকশাগুলি, কেবলমাত্র অনুপস্থিত প্রসঙ্গ এবং সংক্ষিপ্তসার প্রয়োগ করা আমার কাছে প্রায় আকর্ষণীয় নয়, ভাষাটির অপরিহার্য প্রকৃতির কারণে, দক্ষতার প্রক্রিয়াতে কিছু স্থানীয় অস্থায়ী বস্তুগুলিকে রূপান্তর করতে সক্ষম হওয়াই প্রায়শই দরকারী এবং কার্যকর (উভয়ই) বিকাশকারী এবং হার্ডওয়্যার জন্য) একটি শুদ্ধ ফাংশন বাস্তবায়ন।
হেফটি স্ট্রাকচারের সস্তা কপি করা
দ্বিতীয় সর্বাধিক দরকারী সম্পত্তিটি আমি খুঁজে পাই সক্ষমতা সহকারে সত্যিকারের বিশাল ডেটা স্ট্রাকচারের অনুলিপি করার অনুলিপি হিসাবে, যখন প্রায়শই তাদের কঠোর ইনপুট / আউটপুট প্রকৃতির ভিত্তিতে ফাংশনগুলি খাঁটি করতে ব্যয় করা হয় তখন তা অপ্রয়োজনীয় হবে। এটি স্ট্যাকের সাথে মাপসই করা ছোট কাঠামো হবে না n't এগুলি Scene
ভিডিও গেমের মতো পুরো, বড় আকারের কাঠামো ।
সেক্ষেত্রে অনুলিপি করা ওভারহেড কার্যকর সমান্তরালতার সুযোগগুলিকে আটকাতে পারে, কারণ পদার্থবিজ্ঞানের সাথে তাল মিলিয়ে একসাথে তাল মিলিয়ে চেষ্টা করার চেষ্টা করা হয়েছে যদি পদার্থবিজ্ঞান একই সাথে আঁকতে চেষ্টা করছে, তবে একই সাথে পদার্থবিদ্যার গভীর রয়েছে প্রয়োগ করা পদার্থবিজ্ঞানের সাথে এক ফ্রেমের আউটপুট দেওয়ার জন্য পুরো গেমের দৃশ্যটি অনুলিপি করা সমান অকার্যকর হতে পারে। তবে, পদার্থবিজ্ঞান যদি এই অর্থে 'বিশুদ্ধ' হয় যে এটি কেবল একটি দৃশ্যের সাথে সংযোজন করেছে এবং পদার্থবিজ্ঞানের প্রয়োগের সাথে একটি নতুন আউটপুট তৈরি করেছে এবং জ্যোতির্বিজ্ঞানের অনুলিপি ওভারহেডের বিনিময়ে এ জাতীয় বিশুদ্ধতা না আসে তবে এটি নিরাপদে সমান্তরালে কাজ করতে পারে একজন অপরটির জন্য অপেক্ষা না করে রেন্ডারার।
সুতরাং সস্তাভাবে আপনার অ্যাপ্লিকেশনের সত্যিকারের বিশাল ডেটা অনুলিপি করার ক্ষমতা এবং প্রসেসিং এবং মেমরির ব্যবহারের সর্বনিম্ন ব্যয় সহ নতুন, সংশোধিত সংস্করণগুলি খাঁটিতা এবং কার্যকর সমান্তরালতার জন্য সত্যই নতুন দরজা খুলে দিতে পারে এবং আমি শিখতে প্রচুর পাঠ খুঁজে পাই কীভাবে অবিরাম ডেটা স্ট্রাকচার প্রয়োগ করা হয় তা থেকে। তবে আমরা এই জাতীয় পাঠগুলি ব্যবহার করে যা কিছু তৈরি করি তা পুরোপুরি অবিচল থাকতে হবে না, বা অপরিবর্তনীয় ইন্টারফেসগুলি সরবরাহ করতে হবে না (এটি কপিরাইট-অন-রাইটিং ব্যবহার করতে পারে, উদাহরণস্বরূপ, বা "নির্মাতা / ক্ষণস্থায়ী"), ময়লা সস্তা হওয়ার ক্ষমতা অর্জনের জন্য আমাদের ফাংশন / সিস্টেমস / পাইপলাইনে সমান্তরালতা এবং বিশুদ্ধতার জন্য আমাদের সন্ধানে মেমরির ব্যবহার এবং মেমরির অ্যাক্সেস দ্বিগুণ না করে কেবল অনুলিপি এবং অনুলিপিটির কেবলমাত্র বিভাগগুলি সংশোধন করা।
অপরিবর্তনীয়তা
অবশেষে অপরিবর্তনীয়তা রয়েছে যা আমি এই তিনটির মধ্যে কমপক্ষে আকর্ষণীয় বিবেচনা করি, তবে এটি লোহার মুষ্টি দিয়ে কার্যকর করতে পারে যখন নির্দিষ্ট বস্তুর নকশাগুলি কোনও বিশুদ্ধ ফাংশনে স্থানীয় অস্থায়ী হিসাবে ব্যবহৃত হয় না এবং পরিবর্তে বিস্তৃত প্রসঙ্গে, একটি মূল্যবান হয় ধরণের "অবজেক্ট-লেভেল পিউরিটি", যেমন সমস্ত পদ্ধতিতে বাহ্যিক পার্শ্ব প্রতিক্রিয়া হয় না (পদ্ধতির তাত্ক্ষণিক স্থানীয় স্কোপের বাইরে আর সদস্য পরিবর্তনকারী হতে পারে না)।
এবং আমি যখন এটিকে সি ++ এর মতো ভাষায় এই তিনটির মধ্যে সবচেয়ে কম আকর্ষণীয় বিবেচনা করি, তবে এটি অবশ্যই তুচ্ছ-অজানা বিষয়গুলির পরীক্ষা ও থ্রেড-সুরক্ষা এবং যুক্তিকে সহজ করে তুলতে পারে। এটি গ্যারান্টি সহ কাজ করার জন্য লোড অফ হতে পারে যে কোনও বস্তুকে তার নির্মাতার বাইরে কোনও অনন্য রাষ্ট্রের সংমিশ্রণ দেওয়া যাবে না, উদাহরণস্বরূপ, এবং আমরা দৃness়তার সাথে ঝুঁকে না পড়ে রেফারেন্স / পয়েন্টার দিয়েও নির্দ্বিধায় এটি পাস করতে পারি- কেবল পুনরাবৃত্তিকারী এবং হ্যান্ডলগুলি এবং যেমন, গ্যারান্টি দেওয়ার সময় (ভাল, কমপক্ষে আমরা ভাষার ভিতরে যতটা পারি) তার মূল বিষয়বস্তুটি পরিবর্তিত হবে না।
তবে আমি এটিকে সর্বনিম্ন আকর্ষণীয় সম্পত্তি হিসাবে দেখি কারণ বেশিরভাগ অবজেক্টগুলিকে আমি অস্থায়ীভাবে, পরিবর্তনীয় আকারে ব্যবহার করার মতো শুভ কার্যকরী (বা এমনকি একটি বিস্তৃত ধারণা যেমন একটি "খাঁটি সিস্টেম") প্রয়োগ করতে পারি যা কোনও বস্তু বা ধারাবাহিক হতে পারে see নিছক কিছু ইনপুট করা এবং অন্য কিছু স্পর্শ না করেই নতুন কিছু আউটপুট দেওয়ার চূড়ান্ত প্রভাবের সাথে কাজ করে) এবং আমি মনে করি যে বহুলাংশে অপরিহার্য ভাষায় চরমপন্থায় নেওয়া অপরিবর্তনীয়তা একটি বরং প্রতি-উত্পাদনশীল লক্ষ্য। আমি কোডবেসের যে অংশগুলিতে এটি সর্বাধিক সাহায্য করে সেখানে অংশের জন্য অল্প পরিমাণে এটি প্রয়োগ করব।
অবশেষে:
[...] দেখে মনে হবে যে ধ্রুবক ডেটা স্ট্রাকচারগুলি এমন পরিস্থিতিতে পরিচালনা করতে পর্যাপ্ত নয় যেখানে একটি থ্রেড পরিবর্তন করে যা অন্য থ্রেডগুলিতে দৃশ্যমান। এর জন্য, দেখে মনে হচ্ছে আমাদের অবশ্যই পরমাণু, রেফারেন্স, সফ্টওয়্যার লেনদেনের মেমরি বা ক্লাসিক লক এবং সিঙ্ক্রোনাইজেশন প্রক্রিয়াগুলির মতো ডিভাইসগুলি ব্যবহার করতে হবে।
স্বাভাবিকভাবে যদি আপনার ডিজাইনটি পরিবর্তনের জন্য (ব্যবহারকারী-শেষ ডিজাইনের অর্থে) একাধিক থ্রেডগুলি ঘটে যাওয়ার সাথে সাথে দৃশ্যমান হওয়ার জন্য ডাকে, আমরা সিঙ্ক্রোনাইজেশনে ফিরে এসেছি বা কমপক্ষে ড্রয়িং বোর্ডের সাথে এটি মোকাবিলার জন্য কয়েকটি অত্যাধিক উপায় নিয়ে কাজ করতে ( ফাংশনাল প্রোগ্রামিংয়ে এই ধরণের সমস্যা মোকাবেলায় বিশেষজ্ঞদের দ্বারা ব্যবহৃত কয়েকটি খুব বিস্তৃত উদাহরণ আমি দেখেছি)।
তবে আমি খুঁজে পেয়েছি, একবার আপনি যদি এই ধরণের অনুলিপি করে সুনির্দিষ্ট কাঠামোগুলির ময়লা সস্তার অংশের আংশিক-সংশোধিত সংস্করণ আউটপুট করার ক্ষমতা পেয়ে যান, যেমন আপনি উদাহরণস্বরূপ অবিরাম ডেটা স্ট্রাকচারের সাথে পাবেন, এটি প্রায়শই প্রচুর দরজা এবং সুযোগ খোলায় যা আপনি করতে পারেন সমান্তরাল পাইপলাইনের কঠোর আই / ও সাজানোর ক্ষেত্রে একে অপরের থেকে সম্পূর্ণ স্বাধীনভাবে চলতে পারে এমন কোডটি সমান্তরাল করার আগে ভাবেননি। এমনকি যদি অ্যালগরিদমের কিছু অংশ প্রকৃতিতে সিরিয়াল হতে থাকে তবে আপনি সেই প্রক্রিয়াকরণটিকে একক থ্রেড থেকে পিছিয়ে দিতে পারেন তবে দেখতে পাবেন যে এই ধারণাগুলির উপর ঝুঁকির দরজা খুব সহজেই খোলা হয়েছে এবং উদ্বেগ ছাড়াই 90% বিশাল কাজের সমান্তরাল, যেমন