আপনি যে বিষয়ে কথা বলছেন তা কাঠামোর চেয়ে কম বাক্য গঠন । আপনার কাছে কেবলমাত্র এমন একটি whenবক্তব্য থাকতে পারে যে কোনও সিস্টেমে একটি সীমাবদ্ধ পরিমাণে যুক্তি কার্যকর করে, তারপরে whenবিবৃতিগুলি কার্যকর করে, তারপরে লুপ করে আবার যুক্তিকে কার্যকর করে, অসীম লুপ অবিরত রেখে।
উদাহরণস্বরূপ উইন্ডোজ প্রোগ্রামিং সাধারণত "ইভেন্ট ভিত্তিক" হয়। একটি বোতামের Clickইভেন্টে সাবস্ক্রাইব করার অর্থ মূলত "ক্লিক করার পরে এটি করুন"। তবে হুডের নীচে যা চলছে তা হ'ল একটি বার্তা প্রক্রিয়াকরণ লুপ। যখন ব্যবহারকারী বোতামটি ক্লিক করেন তখন উইন্ডোজ অ্যাপ্লিকেশনটিতে একটি বার্তা প্রেরণ করে এবং অ্যাপ্লিকেশনটিতে থাকা বার্তা প্রক্রিয়াকরণ লুপ উপযুক্ত ইভেন্ট হ্যান্ডলারটি চালায়।
আপনি যদি ইভেন্টগুলিতে উদাহরণস্বরূপ, সি # ব্যবহার করেন তবে আপনি বার্তা লুপ ব্যতীত এটি করতে পারেন, তবে সীমাবদ্ধতাটি হ'ল আপনাকে সময়ের আগে ইভেন্টটি ঘোষণা করতে হবে, সুতরাং আপনি কোনও আর্টিব্রারি whenস্টেটমেন্ট লিখতে পারবেন না যা কোনও প্রকারের জন্য নজর রাখে অবস্থা. আপনাকে একটি নির্দিষ্ট ইভেন্টের জন্য অপেক্ষা করতে হবে।
ভন নিউম্যান আর্কিটেকচারে এই আচরণটি পেতে আপনাকে এক ধরণের অসীম লুপ চালাতে হবে যা যথাযথভাবে যদি উপযুক্ত কোডটি চালিত করে লুপের মাধ্যমে প্রতিবার সমস্ত শর্ত পরীক্ষা করে। অভ্যন্তরীণভাবে আপনি কেবল if/ thenবা switchবিবৃতিগুলির একটি বড় তালিকা পান । বেশিরভাগ ডেস্কটপ অ্যাপ্লিকেশন এবং ওয়েব প্রোগ্রামাররা যদি এমন কোনও নির্মাণ দেখে বমি করে তবে আপনি উইন্ডোজ ইভেন্টের মডেলের মতো কোনও ধরণের সিনট্যাকটিক চিনির সাথে এটি আবদ্ধ রাখেন তবে এটি কেবল তাত্পর্যপূর্ণ হয় (যদিও এটি হুডের নীচে কী চলছে)।
অন্যদিকে, আপনি যদি এম্বেড থাকা ফার্মওয়্যার বিকাশ, রিয়েল-টাইম এক্সিকিউটিভ বা শিল্প নিয়ন্ত্রকগুলির ক্ষেত্রটি দেখুন তবে প্রোগ্রামিংয়ের এই মডেলটি খুব সাধারণ। উদাহরণস্বরূপ, আপনার যদি রিয়েল-টাইম প্রোগ্রাম থাকে তবে আপনি প্রকাশ করতে চাইতে পারেন:
outputA = input1 && input2
কোডটি বোঝার জন্য সোজা (কারণ এটি ঘোষণামূলক)। যাইহোক, এটি কাজ করতে আপনাকে এটি একটি শক্ত লুপে চালিত করতে হবে। আপনি outputAলুপের মাধ্যমে প্রতিবার পুনরায় মূল্যায়ন করেন । অনেকগুলি ডেস্কটপ বা ওয়েব প্রোগ্রামার এটি পছন্দ করে না কারণ এটি অদক্ষ। তাদের কাছে, আপনার পুনঃমূল্যায়ন outputAকরা উচিত কেবল কখন input1বা input2পরিবর্তন হয়। তারা বরং আরও কিছু দেখতে পাবে যেমন আপনি বর্ণনা করছেন:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
এখন যদি আপনি এটি চান তবে (এবং ব্যক্তিগতভাবে আমি এই ধারণাটি পছন্দ করি না) এবং আপনার লক্ষ্য দক্ষতা, তবে আপনাকে এখনও নিজেকে জিজ্ঞাসা করতে হবে যে প্রসেসরটি হুডের নীচে কী করছে। স্পষ্টতই এখনও কিছু ধরণের লুপ চলছে যা প্রতিবার ইনপুট রাজ্যগুলির সাথে পূর্ববর্তী ইনপুট রাজ্যের সাথে তুলনা করে এবং যখনই কোনও পরিবর্তন হয় উপযুক্ত কোডটি কার্যকর করে। সুতরাং সত্যিই এটি কম দক্ষ এবং এটি পড়া আরও কঠিন এবং বজায় রাখা আরও কঠিন।
অন্যদিকে, যদি input1পরিবর্তনগুলি তাৎপর্যপূর্ণ হয় তখন আপনাকে যে কাজটি করতে হবে, তা হলে আপনার whenধারাটি বোধগম্য হতে পারে। পিএলসি-তে এই জাতীয় নির্দেশকে "রাইজিং এজ ডিটেকশন" বলা হয়। এটি input1লুপের মাধ্যমে সর্বশেষে রাষ্ট্রকে সংরক্ষণ করে , এটিকে এই সময়ের সাথে মানটির সাথে তুলনা করে এবং শেষ রাষ্ট্রটি মিথ্যা ছিল এবং এই রাষ্ট্রটি সত্য হলে যুক্তিটি কার্যকর করে is
আপনার যদি ভন নিউম্যান আর্কিটেকচার না থাকে তবে গেমটি পরিবর্তিত হয়। উদাহরণস্বরূপ আপনি যদি ভিএইচডিএলে কোনও এফপিজিএ প্রোগ্রামিং করছেন , তবে আপনি যখন লিখবেন:
outputA = input1 && input2
(... বা যাই হোক না কেন উপযুক্ত VHDL সিনট্যাক্স হবে) তারপর FPGA আসলে যেমন যে আপ ওয়্যার্ড পরার input1এবং input2একটি এবং গেট ইনপুট ওয়্যার্ড হয়, এবং আউটপুট এবং গেট ওয়্যার্ড হয় outputA। সুতরাং, কোডটি কেবল বোঝা সহজ নয়, এটি অন্যান্য সমস্ত যুক্তির সাথে সমান্তরালে কার্যকর করাও কার্যকর এবং এটি কার্যকর।
আপনি যখন পাঁচটি আইসিসি -61131-3 টির মধ্যে একটিতে প্রোগ্রাম হওয়া পিএলসি বা পিএসি এর মতো শিল্প নিয়ন্ত্রকের কথা বলছেন, সাধারণ ক্ষেত্রে এই ধরণের ব্যবস্থা রয়েছে:
- ইনপুট পড়ুন এবং মেমরিতে সঞ্চয় করুন
- মূল প্রোগ্রাম কার্যকর করুন
- মেমরি থেকে আসল আউটপুটগুলিতে আউটপুট লিখুন
- পদক্ষেপ 1 এ যান
এটি সিস্টেমের আর্কিটেকচারে অন্তর্নির্মিত, সুতরাং আপনি কেবল লিখবেন এমনটি আশা করা যায়:
outputA = input1 && input2
... এবং এটি একটি অবিচ্ছিন্ন লুপে কার্যকর করা হবে।
এই মেশিনগুলিতে বিঘ্নিত রুটিনগুলিও রয়েছে। এগুলি হ'ল whenঅপারেটরটির জন্য হার্ডওয়্যার স্তর সহায়তার মতো । হার্ডওয়্যার ইন্টারাপ্ট একটি বহিস্থিত ইভেন্টে কিছু কোড নির্বাহ একটি উপায়। উদাহরণস্বরূপ, যখন কোনও নেটওয়ার্ক কার্ড বলে যে এটিতে ডেটার অপেক্ষার ব্যবস্থা রয়েছে, তখন প্রসেসরটিকে সাধারণত সেই ডেটাটি তাত্ক্ষণিকভাবে পড়তে হয় অথবা আপনার বাফারের স্থান শেষ হয়ে যায়। যাইহোক, আপনাকে যতটা সময় সত্যিকারের হার্ডওয়্যার বিঘ্নিত করতে হবে, তার জন্য একটি ভাষা কীওয়ার্ড সহ আমি সন্দেহ করি। আপনি সিপিইউ ইনপুট পিনের মধ্যে সীমাবদ্ধ থাকবেন এবং দেখে মনে হচ্ছে আপনি অভ্যন্তরীণ প্রোগ্রামের অবস্থাটি পরীক্ষা করতে চান।
সুতরাং, একটি traditionalতিহ্যবাহী ভাষায় (কোনও টাইট লুপ ছাড়া যে অসীমভাবে চলে) আপনাকে প্রশ্ন জিজ্ঞাসা করতে হবে, "মূল্যায়ন কোডটি কখন চালিত হয়"?
আপনি যদি লিখেন:
when A do
launchNukes()
... এবং ধরে Aনেওয়া একটি নির্বিচারে বুলিয়ান অভিব্যক্তি, কখন আপনি এই অভিব্যক্তিটির পুনরায় মূল্যায়ন করবেন তা কীভাবে জানবেন? একটি নিষ্পাপ বাস্তবায়ন মানে প্রতিটি একক মেমরি লেখার পরে আপনাকে এটি পুনরায় মূল্যায়ন করতে হবে। আপনি মনে করতে পারেন যে আপনি এটিকে সঙ্কুচিত করতে পারেন তবে এটি বিবেচনা করুন:
when systemTime > actionTime do
launchNukes()
লক্ষ্য করুন যে systemTimeসর্বদা পরিবর্তিত হয় (প্রতিবার আপনি এটি পড়বেন, আপনি একটি পৃথক নম্বর পাবেন)। এর অর্থ এই যে আপনার সমস্ত whenঅনুচ্ছেদের শর্তাধীন অংশটি ধারাবাহিকভাবে পুনরায় মূল্যায়ন করতে হবে। এটি প্রায় অসম্ভব (এবং আপনার শর্তসাপেক্ষ প্রকাশের পার্শ্ব প্রতিক্রিয়া হলে কী ঘটে তা কেবল এক সেকেন্ডের জন্য বিবেচনা করুন!)
উপসংহার
আপনি শুধুমাত্র একটি থাকতে পারে whenবিবৃতি একটি অসীম লুপ যে প্রধান প্রোগ্রাম রান প্রায় ভিত্তি করে একটি স্থাপত্যে (যেমন আপনি বর্ণনা করছি), তারপর executes whenবিবৃতি যদি অবস্থার এই লুপ উপর মিথ্যা থেকে সত্যতে গেলেন। এম্বেড এবং শিল্প ডিভাইসগুলিতে এই আর্কিটেকচারটি সাধারণ হলেও সাধারণ উদ্দেশ্য প্রোগ্রামিং ভাষায় এটি সাধারণ নয়।
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...। এছাড়াও: এমএসডিএন.মাইক্রোসফট /en-us/library/dd233249.aspx মূলত আমি গুগল কোড অনুসন্ধান ব্যবহার করে "কখন" অনুসন্ধান করব।