জাভা এবং সি # অ্যারে বাউন্ডস এবং পয়েন্টার ডিरेফেন্সগুলি পরীক্ষা করে মেমরির সুরক্ষা সরবরাহ করে।
জাতি পরিস্থিতি এবং অচলাবস্থার সম্ভাবনা রোধ করতে কোন পদ্ধতি প্রোগ্রামিং ভাষায় প্রয়োগ করা যেতে পারে?
জাভা এবং সি # অ্যারে বাউন্ডস এবং পয়েন্টার ডিरेফেন্সগুলি পরীক্ষা করে মেমরির সুরক্ষা সরবরাহ করে।
জাতি পরিস্থিতি এবং অচলাবস্থার সম্ভাবনা রোধ করতে কোন পদ্ধতি প্রোগ্রামিং ভাষায় প্রয়োগ করা যেতে পারে?
উত্তর:
রেসগুলি ঘটে যখন আপনার কাছে কোনও বস্তুর একযোগে আলিয়াসিং হয় এবং কমপক্ষে, এলিয়াসগুলির মধ্যে একটিতে মিউটেশন হয়।
সুতরাং, দৌড় প্রতিরোধের জন্য, আপনাকে এই শর্তগুলির এক বা একাধিকটি অসত্য করা দরকার।
বিভিন্ন পদ্ধতি বিভিন্ন দিককে মোকাবেলা করে। কার্যকরী প্রোগ্রামিং অপরিবর্তনশীলতার উপর জোর দেয় যা পরিবর্তনকে সরিয়ে দেয়। লকিং / পরমাণু যুগপততা সরিয়ে দেয়। অ্যাফাইন প্রকারগুলি এলিয়াসিং সরিয়ে দেয় (মরিচা পরিবর্তনীয় আলিয়াজিং অপসারণ করে)। অভিনেতার মডেলগুলি সাধারণত এলিয়াসিং সরিয়ে দেয়।
আপনি যে পদক্ষেপগুলি এলিয়াস করতে পারেন তা সীমাবদ্ধ করতে পারেন যাতে উপরের শর্তগুলি এড়ানো নিশ্চিত করা আরও সহজ। চ্যানেল এবং / অথবা বার্তা পাস করার শৈলীগুলি এখানে আসে You আপনি স্বেচ্ছাসেবী মেমরিটি উপস্থাপন করতে পারবেন না, কেবল একটি চ্যানেল বা সারির শেষ যা জাতি থেকে মুক্ত থাকার ব্যবস্থা করা হয়েছে। সাধারণত যুগপততা অর্থাৎ লক বা পরমাণু এড়িয়ে।
এই বিভিন্ন প্রক্রিয়াটির ক্ষয়ক্ষতি হ'ল তারা যে প্রোগ্রামগুলিকে লিখতে পারেন তা সীমাবদ্ধ করে। সীমাবদ্ধতা যত ত্রুটিযুক্ত, প্রোগ্রামগুলি তত কম। সুতরাং কোনও এলিয়াসিং বা কোনও মিউটেবিলিটি কাজ করে না, এবং এর পক্ষে যুক্তি করা সহজ তবে খুব সীমিত।
যে কারণে মরিচা এমন আলোড়ন সৃষ্টি করছে। এটি একটি ইঞ্জিনিয়ারিং ভাষা (একাডেমিকের বিপরীতে) যা এলিয়াসিং এবং মিউটিবিলিটি সমর্থন করে তবে সংকলকটি পরীক্ষা করে দেখুন যে তারা একসাথে ঘটে না। আদর্শ না হলেও, এটি তার পূর্বসূরিদের অনেকের চেয়ে বৃহত্তর প্রোগ্রামগুলিকে নিরাপদে লিখিত হতে দেয়।
জাভা এবং সি # অ্যারে বাউন্ডস এবং পয়েন্টার ডিरेফেন্সগুলি পরীক্ষা করে মেমরির সুরক্ষা সরবরাহ করে।
সি # এবং জাভা এটি কী করে তা নিয়ে প্রথমে চিন্তা করা গুরুত্বপূর্ণ। তারা রূপান্তর কি করে তা করতে অনির্ধারিত সংজ্ঞায়িত আচরণ মধ্যে C অথবা সি ++ এ আচরণ: প্রোগ্রাম ক্র্যাশ করলে । নাল ডিসেরেন্স এবং অ্যারে সূচক ব্যতিক্রমগুলি কখনই সঠিক সি # বা জাভা প্রোগ্রামে ধরা উচিত নয় ; তাদের প্রথম স্থানে না ঘটানো উচিত কারণ প্রোগ্রামটিতে সেই ত্রুটি থাকা উচিত নয়।
তবে এটাই কি আমি মনে করি না যে আপনি আপনার প্রশ্নের দ্বারা কী বোঝাতে চেয়েছেন! আমরা খুব সহজেই একটি "ডেডলক নিরাপদ" রানটাইম লিখতে পারি যা পর্যায়ক্রমে পরীক্ষা করে দেখা হয় যে এন থ্রেডগুলি পরস্পর অপেক্ষায় রয়েছে কিনা এবং যদি তা ঘটে তবে প্রোগ্রামটি বন্ধ করে দেয় তবে আমি মনে করি না এটি আপনাকে সন্তুষ্ট করবে।
জাতি পরিস্থিতি এবং অচলাবস্থার সম্ভাবনা রোধ করতে কোন পদ্ধতি প্রোগ্রামিং ভাষায় প্রয়োগ করা যেতে পারে?
আপনার প্রশ্নটির সাথে আমরা পরবর্তী সমস্যার মুখোমুখি হ'ল ডেডলকগুলির বিপরীতে "বর্ণের পরিস্থিতি" সনাক্ত করা কঠিন। মনে রাখবেন, থ্রেড সুরক্ষার পরে আমরা যা করছি তা দৌড়াদৌড়ি বাদ দিচ্ছে না । আমরা যা করছি তার পরে প্রোগ্রামটি সঠিক করে দিচ্ছে কেই দৌড়ে জিতুক না কেন ! প্রতিযোগিতার শর্ত নিয়ে সমস্যাটি এমন নয় যে দুটি থ্রেড একটি অনির্ধারিত ক্রমে চলছে এবং আমরা জানি না কে প্রথমে শেষ করতে চলেছে। জাতিদের শর্তগুলির সাথে সমস্যাটি হ'ল ডেভেলপাররা ভুলে যান যে থ্রেডগুলি সমাপ্তির কিছু আদেশ সম্ভব এবং সম্ভাবনার জন্য অ্যাকাউন্ট করতে ব্যর্থ।
সুতরাং আপনার প্রশ্নটি মূলত এটিকে ফুটিয়ে তোলে "এমন কোনও উপায় আছে যে কোনও প্রোগ্রামিং ভাষা নিশ্চিত করতে পারে যে আমার প্রোগ্রামটি সঠিক?" এবং এই প্রশ্নের উত্তরটি বাস্তবে, না no
এখন পর্যন্ত আমি কেবল আপনার প্রশ্নের সমালোচনা করেছি। আমাকে এখানে গিয়ারগুলি স্যুইচ করার চেষ্টা করুন এবং আপনার প্রশ্নের স্পিরিটটি সম্বোধন করুন। ভাষা ডিজাইনাররা এমন অনেকগুলি পছন্দ করতে পারে যা মাল্টিথ্রেডিংয়ের সাথে আমরা যে ভয়াবহ পরিস্থিতিটি কমাতে পারি তা হ্রাস করতে পারে?
পরিস্থিতি আসলেই ভয়াবহ! মাল্টিথ্রেডেড কোড সঠিকভাবে পাওয়া, বিশেষত দুর্বল মেমরি মডেলের আর্কিটেকচারে, খুব, খুব কঠিন। কেন এটি কঠিন তা নিয়ে চিন্তা করা শিক্ষামূলক:
সুতরাং ভাষা ডিজাইনাররা বিষয়গুলিকে আরও উন্নত করতে পারে তার একটি স্পষ্ট উপায় রয়েছে। আধুনিক প্রসেসরের পারফরম্যান্সের জয় ত্যাগ করুন । সমস্ত প্রোগ্রাম, এমনকি বহু-থ্রেডযুক্তগুলি তৈরি করুন একটি অত্যন্ত শক্তিশালী মেমরি মডেল রয়েছে। এটি মাল্টিথ্রেডেড প্রোগ্রামগুলিকে অনেকগুলি, বহুগুণ ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়, যা বহুগুণিত প্রোগ্রাম প্রথম স্থানে রাখার কারণের বিরুদ্ধে সরাসরি কাজ করে: উন্নত পারফরম্যান্সের জন্য।
এমনকি মেমরির মডেলটি বাদ দিয়ে, মাল্টিথ্রেডিং শক্ত করার অন্যান্য কারণও রয়েছে:
এই শেষ পয়েন্ট আরও ব্যাখ্যা বহন করে। "কম্পোজেবল" দ্বারা আমি নিম্নলিখিতটি বোঝাতে চাইছি:
মনে করুন আমরা একটি ডাবল প্রদত্ত কোন int গণনা করতে চাই। আমরা গণনার সঠিক প্রয়োগ লিখি:
int F(double x) { correct implementation here }
মনে করুন আমরা কোনও স্ট্রিং গণনা করতে চাই:
string G(int y) { correct implementation here }
এখন আমরা যদি একটি স্ট্রিং একটি ডাবল দেওয়া গণনা করতে চান:
double d = whatever;
string r = G(F(d));
জি এবং এফ আরও জটিল সমস্যার সঠিক সমাধানে রচিত হতে পারে ।
কিন্তু অচলাবস্থার কারণে লকগুলির এই সম্পত্তি নেই। L1, L2 ক্রমানুসারে লক নেয় এমন একটি সঠিক পদ্ধতি এম 1 এবং একটি সঠিক পদ্ধতি এম 2 যা লকটি L2, L1 অনুসারে নিয়ে যায়, উভয়ই একটি ভুল প্রোগ্রাম তৈরি না করে একই প্রোগ্রামে ব্যবহার করা যাবে না। লকগুলি এটিকে তৈরি করে যাতে আপনি "প্রতিটি পৃথক পদ্ধতি সঠিক, তাই পুরো জিনিসটি সঠিক" না বলতে পারেন।
সুতরাং, ভাষা ডিজাইনার হিসাবে আমরা কী করতে পারি?
প্রথমে সেখানে যাবেন না। এক প্রোগ্রামে একাধিক থ্রোড কন্ট্রোল করা একটি খারাপ ধারণা, এবং থ্রেডের মধ্যে মেমরি ভাগ করে নেওয়া একটি খারাপ ধারণা, সুতরাং এটিকে ভাষা বা রানটাইমটিকে প্রথমে রাখবেন না।
এটি দৃশ্যত একটি অ-স্টার্টার।
আসুন তাহলে আমাদের দৃষ্টি নিবদ্ধ করা আরও মৌলিক প্রশ্নের দিকে: কেন আমাদের প্রথম একাধিক থ্রেড রয়েছে? দুটি প্রধান কারণ রয়েছে এবং এগুলি খুব আলাদা হলেও তা প্রায়শই একই জিনিসটিতে জড়িয়ে পড়ে। তারা বিবাদযুক্ত কারণ তারা উভয়ই বিলম্বিতা পরিচালনার বিষয়ে।
খারাপ ধারণা। পরিবর্তে, করোটাইনগুলির মাধ্যমে একক থ্রেডযুক্ত অ্যাসিক্রোনাই ব্যবহার করুন। সি # এটি সুন্দর করে না। জাভা, এত ভাল না। তবে ভাষা ডিজাইনারদের বর্তমান ক্রপটি থ্রেডিং সমস্যা সমাধানে সহায়তা করার এটি প্রধান উপায়। await
C # অপারেটর (এফ # অ্যাসিঙ্ক্রোনাস কর্মপ্রবাহ এবং অন্যান্য পূর্বে শিল্প দ্বারা অনুপ্রাণিত) এবং আরো আরো ভাষায় অন্তর্ভূক্ত করা হচ্ছে।
ভাষা ডিজাইনাররা ভাষার বৈশিষ্ট্যগুলি তৈরি করতে সাহায্য করতে পারেন যা সমান্তরালতার সাথে ভালভাবে কাজ করে। উদাহরণস্বরূপ, লিনক কীভাবে স্বাভাবিকভাবে পিনকিতে প্রসারিত হবে সে সম্পর্কে চিন্তা করুন about আপনি যদি কোনও বুদ্ধিমান ব্যক্তি হন এবং আপনি নিজের টিপিএল অপারেশনগুলিকে সিপিইউ-বাউন্ড অপারেশনগুলিতে সীমাবদ্ধ করেন যা অত্যন্ত সমান্তরাল এবং মেমরিটি ভাগ না করে তবে আপনি এখানে বড় জয় পেতে পারেন।
আমরা আর কি করতে পারি?
সি # আপনাকে কোনও লকের মধ্যে অপেক্ষা করতে দেয় না, কারণ এটি অচল লকগুলির জন্য একটি রেসিপি। সি # আপনাকে কোনও মান ধরণের লক করতে দেয় না কারণ এটি করা সর্বদা ভুল কাজ; আপনি বাক্সে লক করুন, মান নয়। সি # আপনাকে সতর্ক করে দেয় যদি আপনি একটি উদ্বোধক নাম রাখেন, কারণ উপাধি অর্জন / প্রকাশের শব্দার্থ চাপায় না। আরও অনেকগুলি উপায় রয়েছে যে সংকলকটি সাধারণ সমস্যাগুলি সনাক্ত করতে পারে এবং তাদের প্রতিরোধ করতে পারে।
সি # এবং জাভা আপনাকে কোনও মনিটরের হিসাবে কোনও রেফারেন্স অবজেক্ট ব্যবহার করার অনুমতি দিয়ে বিশাল ডিজাইনের ত্রুটি করেছে। এটি এমন সব ধরণের খারাপ অভ্যাসকে উত্সাহ দেয় যা ডেডলকগুলি ট্র্যাক করা আরও শক্ত করে তোলে এবং এগুলি স্থিতিশীলভাবে প্রতিরোধ করা আরও শক্ত করে তোলে। এবং এটি প্রতিটি বস্তুর শিরোনামে বাইটগুলি অপচয় করে। মনিটরের একটি মনিটরের ক্লাস থেকে নেওয়া উচিত।
এসটিএম একটি সুন্দর ধারণা, এবং আমি হাসকেলে খেলনা প্রয়োগের সাথে চারপাশে অভিনয় করেছি; এটি আপনাকে লক-ভিত্তিক সমাধানগুলি করার চেয়ে সঠিক অংশগুলির থেকে আরও সুন্দরভাবে সঠিক সমাধানগুলি রচনা করতে দেয়। তবে কেন এটি স্কেল করে কাজ করা যায়নি তা জানার জন্য বিশদ সম্পর্কে আমি পর্যাপ্ত পরিমাণে জানি না; জো ডাফিকে পরের বার দেখা হলে তাকে জিজ্ঞাসা করুন।
প্রক্রিয়া ক্যালকুলাস ভিত্তিক ভাষা নিয়ে প্রচুর গবেষণা হয়েছে এবং আমি সেই স্থানটি খুব ভালভাবে বুঝতে পারি না; এটিতে কয়েকটি কাগজপত্র নিজে পড়ার চেষ্টা করুন এবং দেখুন কোনও অন্তর্দৃষ্টি পান কিনা।
মাইক্রোসফ্টে রোজলিনে কাজ করার পরে আমি কভারিটিতে কাজ করেছি এবং আমি যে কাজ করেছি তার মধ্যে একটি হ'ল রোজলিন ব্যবহার করে বিশ্লেষকের সম্মুখ প্রান্তটি পাওয়া। মাইক্রোসফ্ট দ্বারা সরবরাহিত একটি সঠিক লেকিকাল, সিনট্যাকটিক এবং শব্দার্থবিজ্ঞান বিশ্লেষণ করে, আমরা তখন ডিটেক্টরদের রচনার কঠোর পরিশ্রমকে মনোনিবেশ করতে পারি যা সাধারণ মাল্টিথ্রেডিংয়ের সমস্যা খুঁজে পেয়েছিল।
আমাদের কাছে ঘোড়দৌড় এবং অচলাবস্থা এবং এই সমস্ত স্টাফ কেন থাকার একটি মৌলিক কারণ হ'ল আমরা কী করা উচিত তা বলে এমন প্রোগ্রাম লিখছি , এবং দেখা যাচ্ছে যে আমরা সকলেই অত্যাবশ্যক প্রোগ্রামগুলি লেখার জন্য বোকা; কম্পিউটার আপনি যা বলবেন তা করে এবং আমরা এটি ভুল কাজ করতে বলি। অনেক আধুনিক প্রোগ্রামিং ভাষা ঘোষণামূলক প্রোগ্রামিং সম্পর্কে আরও বেশি করে: আপনি কী ফলাফল চান তা বলুন এবং সংকলকটি সেই ফলাফলটি অর্জনের জন্য দক্ষ, নিরাপদ, সঠিক উপায়টি নির্ধারণ করুন। আবার, লিনকিউ সম্পর্কে চিন্তা করুন; আমরা আপনাকে বলতে চাই from c in customers select c.FirstName
, যা একটি অভিপ্রায় প্রকাশ করে । সংকলকটি কোডটি কীভাবে লিখবেন তা নির্ধারণ করুন।
মেশিন লার্নিং অ্যালগরিদমগুলি হ্যান্ড-কোডেড অ্যালগরিদমগুলির চেয়ে কিছু কার্যক্রমে অনেক ভাল, যদিও অবশ্যই অনেকগুলি ট্রেড অফ রয়েছে যার মধ্যে রয়েছে যথার্থতা, প্রশিক্ষণের জন্য সময় নেওয়া, খারাপ প্রশিক্ষণ দ্বারা প্রবর্তিত পক্ষপাতিত্ব ইত্যাদি। তবে সম্ভবত এটি সম্ভবত "হাত দ্বারা" কোড করা একটি দুর্দান্ত অনেকগুলি কাজ শীঘ্রই মেশিন-উত্পাদিত সমাধানগুলিতে কার্যকর হবে। মানুষ যদি কোডটি না লিখছেন তবে তারা বাগ লিখছেন না।
দুঃখিত যে সেখানে কিছুটা দৌড়ঝাঁপ হয়েছিল; এটি একটি বিশাল এবং কঠিন বিষয় এবং 20 বছরের মধ্যে আমি পিএল সম্প্রদায়ের মধ্যে কোনও স্পষ্ট conকমত্য প্রকাশিত হয়নি যা আমি এই সমস্যার জায়গাতে অগ্রগতি অনুসরণ করছি।