আপডেট: আমি এই প্রশ্নটি এত পছন্দ করেছি আমি 18 নভেম্বর 2011 এ এটিকে আমার ব্লগের বিষয় হিসাবে তৈরি করেছি । মহান প্রশ্নের জন্য ধন্যবাদ!
আমি সবসময় ভাবছিলাম: স্ট্যাকের উদ্দেশ্য কী?
আমি ধরে নিলাম আপনারা এমএসআইএল ভাষার মূল্যায়ন স্ট্যাক এবং রানটাইমটিতে প্রকৃত প্রতি-থ্রেড স্ট্যাক নয়।
কেন মেমরি থেকে স্ট্যাক বা "লোডিং" এ স্থানান্তর হয়? অন্যদিকে, স্ট্যাক থেকে মেমরি বা "স্টোরেজ" এ স্থানান্তর কেন হয়? শুধু তাদের সব স্মৃতিতে রাখা হয় না কেন?
এমএসআইএল একটি "ভার্চুয়াল মেশিন" ভাষা। সি # সংকলকের মতো সংকলকগুলি সিআইএল উত্পন্ন করে এবং তারপরে রানটাইমের সময় জেআইটি (জাস্ট ইন টাইম) সংকলক নামে পরিচিত আরেকটি সংকলক আইএলকে বাস্তব মেশিন কোডে পরিণত করে যা কার্যকর করতে পারে।
তাহলে প্রথমে "এমএসআইএল মোটেই কেন?" এই প্রশ্নের উত্তর দেওয়া যাক? কেন কেবল সি # সংকলকটি মেশিনের কোডটি লিখবেন না?
কারণ এইভাবে এটি করা সস্তা । মনে করুন আমরা এটি সেভাবে করি নি; মনে করুন প্রতিটি ভাষার নিজস্ব মেশিন কোড জেনারেটর থাকতে হবে। আপনার বিশটি আলাদা ভাষা রয়েছে: সি #, জেএসক্রিপ্ট। নেট , ভিজ্যুয়াল বেসিক, আয়রন পাইথন , এফ # ... এবং ধরুন আপনার দশটি আলাদা প্রসেসর রয়েছে। আপনার কতটি কোড জেনারেটর লিখতে হবে? 20 x 10 = 200 কোড জেনারেটর। এটা অনেক কাজ। এখন ধরুন আপনি একটি নতুন প্রসেসর যুক্ত করতে চান। আপনাকে এর জন্য বিশ বার কোড জেনারেটর লিখতে হবে, প্রতিটি ভাষার জন্য একটি করে।
তদ্ব্যতীত, এটি কঠিন এবং বিপজ্জনক কাজ। চিপগুলির জন্য দক্ষ কোড জেনারেটরগুলি লিখুন যা আপনি বিশেষজ্ঞ নন একটি কঠিন কাজ! সংকলক ডিজাইনাররা তাদের ভাষার শব্দার্থক বিশ্লেষণ বিশেষজ্ঞ, নতুন চিপ সেটগুলির দক্ষ নিবন্ধের বরাদ্দ নয়।
এখন ধরা যাক আমরা এটি সিআইএল উপায়ে করি। আপনার কতটি সিআইএল জেনারেটর লিখতে হবে? প্রতি ভাষা এক। আপনার কতটি জেআইটি সংকলক লিখতে হবে? প্রসেসর প্রতি এক। মোট: 20 + 10 = 30 কোড জেনারেটর। তদুপরি, ভাষা-থেকে-সিআইএল জেনারেটর লিখতে সহজ কারণ সিআইএল একটি সহজ ভাষা, এবং সিআইএল-থেকে-মেশিন-কোড জেনারেটর লিখতেও সহজ কারণ সিআইএল একটি সহজ ভাষা। আমরা সি # এবং ভিবি এর সমস্ত জটিলতা থেকে মুক্তি পেয়েছি এবং একটি সহজ ভাষায় যা সহজেই লিখতে পারা যায় তার কাছে কী নোট এবং "নিম্ন" সমস্ত কিছু everything
একটি মধ্যবর্তী ভাষা থাকার কারণে নাটকীয়ভাবে একটি নতুন ভাষার সংকলক উত্পাদন ব্যয় হ্রাস পায় । এটি একটি নতুন চিপকে নাটকীয়ভাবে সমর্থন করার ব্যয়ও হ্রাস করে। আপনি একটি নতুন চিপ সমর্থন করতে চান, আপনি সেই চিপে কিছু বিশেষজ্ঞ খুঁজে পান এবং তাদের একটি সিআইএল জিটার লিখতে এবং আপনার কাজ শেষ করে; তারপরে আপনি এই চিপগুলিতে সমস্ত ভাষা সমর্থন করেন।
ঠিক আছে, সুতরাং আমরা এমএসআইএল কেন স্থাপন করেছি; কারণ একটি মধ্যবর্তী ভাষা থাকার কারণে খরচ কম হয়। তাহলে কেন ভাষাটি একটি "স্ট্যাক মেশিন"?
কারণ স্ট্যাক মেশিনগুলি ভাষা সংকলক লেখকদের মোকাবেলা করার জন্য ধারণাগতভাবে খুব সহজ। স্ট্যাকগুলি গণনাগুলি বর্ণনা করার জন্য একটি সহজ, সহজেই বোঝা যায় mechanism জেআইটি সংকলক লেখকদের মোকাবেলা করতে স্ট্যাক মেশিনগুলি ধারণামূলকভাবে খুব সহজ easy স্ট্যাক ব্যবহার করা একটি সরল বিমূর্ততা এবং তাই আবার এটি আমাদের ব্যয়কে হ্রাস করে ।
আপনি জিজ্ঞাসা করেছেন "কেন একটি স্ট্যাক সব আছে?" শুধু স্মৃতি থেকে সরাসরি সমস্ত কিছু কেন হয় না? ঠিক আছে, এর সম্পর্কে চিন্তা করা যাক। মনে করুন আপনি এর জন্য সিআইএল কোড উত্পন্ন করতে চান:
int x = A() + B() + C() + 10;
ধরা যাক, আমাদের এমন কনভেনশন রয়েছে যা "যুক্ত", "কল", "স্টোর" এবং আরও সবসময় তাদের যুক্তিগুলি সর্বদা স্ট্যাকের বাইরে নিয়ে যায় এবং তাদের ফলাফলটি (যদি থাকে তবে) স্ট্যাকের উপরে রাখে। এই সি # এর জন্য সিআইএল কোড উত্পন্ন করতে আমরা এই জাতীয় কিছু বলি:
load the address of x // The stack now contains address of x
call A() // The stack contains address of x and result of A()
call B() // Address of x, result of A(), result of B()
add // Address of x, result of A() + B()
call C() // Address of x, result of A() + B(), result of C()
add // Address of x, result of A() + B() + C()
load 10 // Address of x, result of A() + B() + C(), 10
add // Address of x, result of A() + B() + C() + 10
store in address // The result is now stored in x, and the stack is empty.
এখন ধরা যাক আমরা স্ট্যাক ছাড়াই এটি করেছি। আমরা এটি আপনার উপায়ে করব, যেখানে প্রতিটি অপকোড তার অপারেশনগুলির ঠিকানা এবং যেখানে এটির ফলাফল সংরক্ষণ করে তার ঠিকানা গ্রহণ করে :
Allocate temporary store T1 for result of A()
Call A() with the address of T1
Allocate temporary store T2 for result of B()
Call B() with the address of T2
Allocate temporary store T3 for the result of the first addition
Add contents of T1 to T2, then store the result into the address of T3
Allocate temporary store T4 for the result of C()
Call C() with the address of T4
Allocate temporary store T5 for result of the second addition
...
দেখেন কেমন হয়? আমাদের কোডটি বিশাল আকার ধারণ করছে কারণ আমাদের স্পষ্টভাবে সমস্ত অস্থায়ী স্টোরেজ বরাদ্দ করতে হবে যা সাধারণত কনভেনশনের মাধ্যমে কেবল স্ট্যাকের দিকে চলে যায় । সবচেয়ে খারাপ, আমাদের ওপকডগুলি নিজেরাই সমস্ত বিশাল হয়ে উঠছে কারণ তারা এখন তাদের যুক্তি হিসাবে তাদের ফলাফলটি লিখতে চলেছে সেই ঠিকানা এবং প্রতিটি অপারেন্ডের ঠিকানা হিসাবে গ্রহণ করতে হবে। একটি "যুক্ত" নির্দেশনা যা জানে যে এটি দুটি জিনিস স্ট্যাক থেকে সরিয়ে ফেলতে চলেছে এবং একটি জিনিস রাখবে তা একটি একক বাইট হতে পারে। একটি অ্যাড নির্দেশিকা যা দুটি অপরেন্ড ঠিকানা এবং ফলাফলের ঠিকানা গ্রহণ করে তা প্রচুর হতে চলেছে।
আমরা স্ট্যাক-ভিত্তিক অপকড ব্যবহার করি কারণ স্ট্যাকগুলি সাধারণ সমস্যা সমাধান করে । যথা: আমি কিছু অস্থায়ী স্টোরেজ বরাদ্দ করতে চাই, খুব শীঘ্রই এটি ব্যবহার করুন এবং তারপরে আমার কাজ শেষ হয়ে গেলে দ্রুত এ থেকে মুক্তি পান । আমাদের নিষ্পত্তি করার জন্য আমাদের একটি স্ট্যাক রয়েছে এই ধারণাটি তৈরি করে আমরা ওপকডগুলি খুব ছোট এবং কোডটি খুব বিচ্ছিন্ন করতে পারি।
আপডেট: কিছু অতিরিক্ত চিন্তা
ঘটনাক্রমে, (1) ভার্চুয়াল মেশিন নির্দিষ্ট করে, (2) ভিএম ভাষা লক্ষ্য করে সংকলক লেখার, এবং (3) বিভিন্ন হার্ডওয়্যারে ভিএম এর বাস্তবায়ন রচনার এই ব্যয়টি একেবারে নতুন ধারণা নয় । এটি এমএসআইএল, এলএলভিএম, জাভা বাইটকোড বা অন্য কোনও আধুনিক অবকাঠামো দিয়ে উদ্ভূত হয়নি। আমি এই কৌশলটির প্রাথমিকতম বাস্তবায়নটি 1966 সালের পিসোড মেশিনটি সম্পর্কে সচেতন ।
আমি প্রথম এই ধারণার কথা ব্যক্তিগতভাবে শুনেছিলাম যখন আমি শিখেছিলাম কীভাবে ইনফোকম বাস্তবায়নকারীরা এত ভাল বিভিন্ন মেশিনে জোর্ককে চালিত করতে সক্ষম হয়েছিল । তারা জেড- মেশিন নামে একটি ভার্চুয়াল মেশিন নির্দিষ্ট করে এবং তারপরে তাদের গেমগুলি চালাতে চায় এমন সমস্ত হার্ডওয়্যারের জন্য জেড-মেশিন অনুকরণকারী তৈরি করে। এর ফলে অতিরিক্ত সুবিধা হয়েছে যে তারা আদিম 8-বিট সিস্টেমে ভার্চুয়াল মেমরি পরিচালনা প্রয়োগ করতে পারে ; একটি গেম মেমরির সাথে ফিট করার চেয়ে বড় হতে পারে কারণ তারা যখন প্রয়োজন হয় তখনই তারা কোডটি ডিস্ক থেকে পৃষ্ঠাতে পারে এবং যখন তাদের নতুন কোড লোড করার প্রয়োজন হয় তখন তা বাতিল করে দিতে পারে।