স্ট্যাকের উদ্দেশ্য কী? কেন এটা আমাদের দরকার?


320

তাই আমি আমার সি # .NET অ্যাপ্লিকেশনগুলি ডিবাগ করতে শিখতে এখনই এমএসআইএল শিখছি।

আমি সবসময় ভাবছিলাম: স্ট্যাকের উদ্দেশ্য কী?

শুধু আমার প্রশ্নে প্রসঙ্গে:
কেন মেমরি থেকে স্ট্যাক বা "লোডিং" এ স্থানান্তর হয়? অন্যদিকে, স্ট্যাক থেকে মেমরি বা "স্টোরেজ" এ স্থানান্তর কেন হয়? শুধু তাদের সব স্মৃতিতে রাখা হয় না কেন?

  • এটি দ্রুত কারণ এটি?
  • এটি কি র‌্যাম ভিত্তিক?
  • দক্ষতার জন্য?

আমি সিআইএল কোডগুলি আরও গভীরভাবে বুঝতে সাহায্য করার জন্য এটি উপলব্ধি করার চেষ্টা করছি ।


28
স্ট্যাক মেমোরির একটি অংশ, ঠিক যেমন হিপ মেমোরির আরেকটি অংশ।
কোডসইনচওস

@ কোডিইন চাওস আপনি কি মানের ধরণের বনাম রেফারেন্স প্রকারের বিষয়ে কথা বলছেন? বা আইএল কোডগুলির ক্ষেত্রে এটি কি একই? ... আমি জানি যে স্তূপী স্তূপের চেয়ে কেবল দ্রুত এবং আরও কার্যকর (তবে এটি মান / রেফের ধরণের বিশ্বে হয় যা আমি জানি না যে এখানে একই রকম কিনা?)
জান কার্লো ভাইরে

15
@ কোডইনচাওস - আমি মনে করি যে জ্যানের রেফারেন্সিং স্ট্যাক মেশিন যা আইএল এর বিরুদ্ধে লেখা হয়েছিল, মেমরির অঞ্চলের বিপরীতে যা ফাংশন কল করার সময় স্ট্যাক ফ্রেম গ্রহণ করে। এগুলি দুটি পৃথক স্ট্যাক এবং
জেআইটির

4
এমএসআইএল জ্ঞান আপনাকে কিভাবে নেট অ্যাপ্লিকেশনগুলি ডিবাগ করতে সহায়তা করবে?
পাইওটার পেরাক

1
আধুনিক মেশিনে, কোডের ক্যাচিং আচরণটি একটি পারফরম্যান্স নির্মাতা এবং ব্রেক-ব্রেক। স্মৃতি সর্বত্র। স্ট্যাকটি সাধারণত এখানে থাকে here ধরে নিচ্ছি যে স্ট্যাকটি একটি আসল জিনিস, এবং কেবল কোনও কোডের ক্রিয়াকলাপ প্রকাশের জন্য ব্যবহৃত ধারণা নয়। একটি এমএসআইএল-চলমান প্ল্যাটফর্ম বাস্তবায়নের জন্য, স্ট্যাক ধারণাটি একে একে হার্ডওয়ারের কাছে প্রায় বিটগুলিকে চাপ দেওয়ার দরকার নেই।
মনিকা

উত্তর:


441

আপডেট: আমি এই প্রশ্নটি এত পছন্দ করেছি আমি 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-বিট সিস্টেমে ভার্চুয়াল মেমরি পরিচালনা প্রয়োগ করতে পারে ; একটি গেম মেমরির সাথে ফিট করার চেয়ে বড় হতে পারে কারণ তারা যখন প্রয়োজন হয় তখনই তারা কোডটি ডিস্ক থেকে পৃষ্ঠাতে পারে এবং যখন তাদের নতুন কোড লোড করার প্রয়োজন হয় তখন তা বাতিল করে দিতে পারে।


63
কি দারুন. এটি ঠিক আমি যা খুঁজছিলাম। উত্তর পাওয়ার সর্বোত্তম উপায় হ'ল প্রধান বিকাশকারী নিজে থেকে তার একটি পান। সময়ের জন্য ধন্যবাদ, এবং আমি নিশ্চিত যে এটি প্রত্যেককেই যারা কম্পাইলার এবং এমএসআইএল এর জটিলতা অবাক করে তাদের সহায়তা করবে। ধন্যবাদ এরিক
জান কার্লো ভাইরে

18
এটি একটি দুর্দান্ত উত্তর ছিল। আমি জাভা লোক হওয়া সত্ত্বেও কেন আমি আপনার ব্লগটি পড়ি তা আমাকে মনে করিয়ে দেয়। ;-)
শে

34
@ জানকার্লো ভাইরা: আপনাকে স্বাগতম! আমি লক্ষ করুন যে, আমি একটি প্রিন্সিপাল বিকাশকারী, না প্রধান ডেভেলপার। এই দলে বেশ কয়েকজন ব্যক্তি সেই কাজের শিরোনাম সহ রয়েছেন এবং আমি তাদের মধ্যে সিনিয়রও নই।
এরিক লিপার্ট

17
@ এরিক: আপনি / যখন কখনও প্রেমের কোডিং বন্ধ করেন, আপনার প্রোগ্রামারদের পড়াতে যাওয়া উচিত। মজাদার পাশাপাশি, আপনি ব্যবসায়ের চাপ ছাড়াই একটি হত্যা করতে পারেন। আপনি সেই অঞ্চলে যা পেয়েছেন তা দুর্দান্ত উদ্ভট (এবং দুর্দান্ত ধৈর্য, ​​আমি যুক্ত করতে পারি)। আমি বলি যে প্রাক্তন বিশ্ববিদ্যালয়ের প্রভাষক হিসাবে।
অ্যালান

19
আমি প্রায় 4 টি অনুচ্ছেদে নিজের স্বরে বলছিলাম "এরিকের মতো এটি", 5 তম বা 6 তম মধ্যে আমি "ইয়েপ, স্পষ্টতই এরিক" এ স্নাতক হয়েছি :) আরেকটি সত্যই এবং মহাকাব্যিক উত্তর।
বাইনারি ওয়ারিয়ার 17

86

মনে রাখবেন যে আপনি যখন এমএসআইএল সম্পর্কে কথা বলছেন তখন আপনি ভার্চুয়াল মেশিনের জন্য নির্দেশনার কথা বলছেন । .NET এ ব্যবহৃত ভিএম হ'ল স্ট্যাক ভিত্তিক ভার্চুয়াল মেশিন। রেজিস্টার ভিত্তিক ভিএম এর বিপরীতে, অ্যান্ড্রয়েড অপারেটিং সিস্টেমে ব্যবহৃত ডালভিক ভিএম এর একটি উদাহরণ।

ভিএম-তে থাকা স্ট্যাকটি ভার্চুয়াল, প্রসেসরে চালিত প্রকৃত কোডটিতে ভিএম নির্দেশাবলী অনুবাদ করার জন্য এটি দোভাষীর বা সুনির্দিষ্ট সংকলকের উপর নির্ভর করে। যা নেট নেট প্রায় সবসময়ই একটি চিটকিটে থাকে, এমএসআইএল নির্দেশ সেটটি ডিজিটাল ডিজাইন করা হয়েছিল যেতে যেতে যেতে জিট করার জন্য। উদাহরণস্বরূপ জাভা বাইটকোডের বিপরীতে, এতে নির্দিষ্ট ডেটা ধরণের ক্রিয়াকলাপের জন্য পৃথক নির্দেশ রয়েছে। যা এটি ব্যাখ্যা করার জন্য অনুকূলিত করে তোলে। একটি এমএসআইএল দোভাষী আসলে উপস্থিত থাকলেও এটি নেট নেট মাইক্রো ফ্রেমওয়ার্কে ব্যবহৃত হয়। যা খুব সীমিত সংস্থান সহ প্রসেসরের উপর চলে, মেশিন কোড সঞ্চয় করার জন্য প্রয়োজনীয় র‌্যাম বহন করতে পারে না।

আসল মেশিন কোডের মডেলটি মিশ্রিত রয়েছে, স্ট্যাক এবং রেজিস্ট্রার উভয়ই রয়েছে। জেআইটি কোড অপটিমাইজারের একটি বড় কাজ হ'ল রেজিস্টারগুলিতে স্ট্যাকের মধ্যে রাখা ভেরিয়েবলগুলি সংরক্ষণ করার বিভিন্ন উপায় নিয়ে আসা, ফলে কার্যকরভাবে গতির উন্নতি করা যায়। একটি ডালভিক জিটারের বিপরীত সমস্যা রয়েছে।

মেশিন স্ট্যাক অন্যথায় একটি খুব প্রাথমিক স্টোরেজ সুবিধা যা প্রায় দীর্ঘ সময় ধরে প্রসেসরের ডিজাইনে রয়েছে। এটির রেফারেন্সের খুব ভাল লোকেশন রয়েছে, আধুনিক সিপিইউগুলির একটি খুব গুরুত্বপূর্ণ বৈশিষ্ট্য যা র‌্যাম এটি সরবরাহ করতে পারে এবং পুনরাবৃত্তি সমর্থন করে তার চেয়ে অনেক দ্রুত ডেটা দিয়ে চিবিয়ে দেয়। স্থানীয় নকশাগুলির পক্ষে স্থানীয় কাঠামোগুলি এবং স্কোপ সীমিত করার জন্য স্ট্যাকের সাহায্যে ভাষা নকশা ব্যাপকভাবে প্রভাবিত হয়। স্ট্যাকের সাথে একটি উল্লেখযোগ্য সমস্যা হ'ল এই সাইটের জন্য যার নামকরণ করা হয়েছে।


2
খুব বিশদ ব্যাখ্যার জন্য +1, এবং অন্যান্য সিস্টেম এবং ভাষার তুলনায় অতিরিক্ত DETAILED তুলনা করার জন্য +100 (যদি আমি পারতাম) :)
জান কার্লো ভাইরে

4
ডালভিক কেন রেজিস্টার মেশিন? সিসিন এটির মূলত এআরএম প্রসেসরগুলিকে লক্ষ্য করে। এখন, x86 এর সমান পরিমাণ রেজিস্টার রয়েছে তবে সিআইএসসি হচ্ছে, তাদের মধ্যে মাত্র 4 জন স্থানীয়ভাবে সংরক্ষণ করার জন্য ব্যবহারযোগ্য কারণ বাকীগুলি স্পষ্টভাবে সাধারণ নির্দেশে ব্যবহৃত হয়। অন্যদিকে এআরএম আর্কিটেকচারগুলিতে অনেক বেশি রেজিস্টার রয়েছে যা স্থানীয়দের সংরক্ষণের জন্য ব্যবহার করা যেতে পারে, তাই তারা একটি নিবন্ধভিত্তিক এক্সিকিউশন মডেলকে সহায়তা করে।
জোহানেস রুডল্ফ

1
@ জোহানেস রুডল্ফ এখন প্রায় দুই দশক ধরে এটি সত্য হয়নি। কেবলমাত্র বেশিরভাগ সি ++ সংকলক এখনও 90s এর x86 নির্দেশিকা সেটকে লক্ষ্য করে তার মানে এই নয় যে x86 নিজেই যথেষ্ট দক্ষ। হাসওয়েলের সাধারণ উদ্দেশ্যে পূর্ণসংখ্যার 168 নিবন্ধ এবং 168 জিপি এভিএক্স নিবন্ধ রয়েছে, উদাহরণস্বরূপ - আমি জানি যে কোনও এআরএম সিপিইউর চেয়ে অনেক বেশি। আপনি (আধুনিক) x86 অ্যাসেম্বলি থেকে তাদের সমস্তটি আপনার যে কোনও উপায়ে ব্যবহার করতে পারেন। লেখককে দোষারোপ করুন, আর্কিটেকচার / সিপিইউ নয়। প্রকৃতপক্ষে, মধ্যবর্তী সংকলনটি এত আকর্ষণীয় হওয়ার কারণগুলির মধ্যে একটি - একটি বাইনারি, প্রদত্ত সিপিইউর জন্য সেরা কোড; 90 এর দশকের বয়সের আর্কিটেকচারের সাথে কোনও শোক নেই।
লুয়ান

2
@ জোহানেস রুডল্ফ। নেট জেআইটি সংকলক আসলে নিবন্ধগুলি বেশ ভারী ব্যবহার করে; স্ট্যাকটি বেশিরভাগ ক্ষেত্রে আইএল ভার্চুয়াল মেশিনের বিমূর্ততা, আসলে আপনার সিপিইউতে কোড চালিত কোডটি খুব আলাদা। পদ্ধতি কলগুলি পাস-বাই রেজিস্টার হতে পারে, স্থানীয়দের রেজিস্টারগুলিতে তোলা যেতে পারে ... মেশিন কোডের স্ট্যাকের মূল সুবিধা হ'ল বিচ্ছিন্নতা যা সাবরুটিন কলগুলিতে দেয় - আপনি যদি কোনও স্থানীয় একটি রেজিস্টারে রাখেন তবে একটি ফাংশন কল আসতে পারে আপনি যে মানটি হারাবেন, এবং আপনি সত্যই তা বলতে পারবেন না।
লুয়ান

1
@ রাহুলআরওয়াল উত্পন্ন মেশিন কোড কোনও প্রদত্ত স্থানীয় বা মধ্যবর্তী মানের জন্য স্ট্যাকটি ব্যবহার করতে পারে বা নাও করতে পারে। আইএল, প্রতি যুক্তি ও স্থানীয় স্ট্যাক - কিন্তু মেশিন কোডে, এই না (এটা অনুমোদিত, কিন্তু প্রয়োজন হয় না) সত্য। কিছু জিনিস স্ট্যাকের জন্য দরকারী এবং সেগুলি স্ট্যাকের উপরে রাখা হয়। কিছু জিনিস গাদা করার জন্য দরকারী এবং সেগুলি গাদাতে রাখা হয়। কিছু জিনিস একেবারেই প্রয়োজন হয় না, বা কেবলমাত্র একটি নিবন্ধে কিছু মুহুর্তের প্রয়োজন। কলগুলি সম্পূর্ণভাবে অন্তর্ভুক্ত করা যেতে পারে (ইনলাইনড), বা তাদের যুক্তি নিবন্ধগুলিতে পাস করা যেতে পারে। জেআইটির অনেক স্বাধীনতা রয়েছে।
লুয়ান

20

এ সম্পর্কে একটি খুব আকর্ষণীয় / বিস্তারিত উইকিপিডিয়া নিবন্ধ রয়েছে, স্ট্যাক মেশিনের নির্দেশাবলীগুলির সুবিধাগুলি । আমার এটি সম্পূর্ণরূপে উদ্ধৃত করা দরকার, সুতরাং একটি লিঙ্ক রাখা সহজ। আমি কেবল উপ-শিরোনামগুলি উদ্ধৃত করব

  • খুব কমপ্যাক্ট অবজেক্ট কোড
  • সাধারণ সংকলক / সাধারণ দোভাষী
  • ন্যূনতম প্রসেসরের রাজ্য

-1 @ xanatos আপনি যে শিরোনামগুলি নিয়েছেন তা চেষ্টা ও সংক্ষিপ্ত করতে পারছেন?
টিম লয়েড

@ চিবিটি যদি আমি তাদের সংক্ষিপ্ত বিবরণ দিতে চাই তবে আমি একটি উত্তর দিয়েছি। আমি খুব ভাল লিঙ্কটি উদ্ধার করার চেষ্টা করছিলাম।
xanatos

@ এক্সানটোস আমি আপনার লক্ষ্যগুলি বুঝতে পারি, তবে এত বড় উইকিপিডিয়া নিবন্ধের সাথে একটি লিঙ্ক ভাগ করে নেওয়া দুর্দান্ত উত্তর নয়। শুধু গুগল করে খুঁজে পাওয়া মুশকিল নয়। অন্যদিকে, হান্সের একটি দুর্দান্ত উত্তর রয়েছে।
টিম লয়েড

@ চ্যাবেসিটি প্রথমে অনুসন্ধান না করার ক্ষেত্রে ওপি সম্ভবত অলস ছিল। উত্তরদাতা এখানে একটি ভাল লিঙ্ক দিয়েছেন (এটি বর্ণনা না করে)। দুটি দুষ্টতা একটি ভাল করে :-) এবং আমি হান্সকে উড়িয়ে দেব।
xanatos

গ্রেট লিঙ্কটির জন্য উত্তরদাতাকে এবং @ xanatos +1 এ। আমি অপেক্ষা করছিলাম কারও সম্পূর্ণ সংক্ষিপ্তসার এবং জ্ঞান প্যাকের উত্তর আছে .. হান্স যদি উত্তর না দেয় তবে আমি আপনাকে গৃহীত উত্তর হিসাবে তৈরি করে দিতাম .. এটি কেবল একটি লিঙ্ক ছিল, তাই এটি ছিল না হান্স যারা তার উত্তরে একটি ভাল প্রচেষ্টা রেখেছিল তার পক্ষে মেলা .. :)
জান কার্লো ভাইরে

8

স্ট্যাক প্রশ্নটিতে আরও কিছু যুক্ত করতে। স্ট্যাক ধারণাটি সিপিইউ ডিজাইন থেকে উদ্ভূত যেখানে পাটিগণিত যুক্তি ইউনিট (এএলইউ) এর মেশিন কোড স্ট্যাকের মধ্যে অবস্থিত অপারেণ্ডগুলিতে কাজ করে। উদাহরণস্বরূপ একটি গুণিত অপারেশন স্ট্যাক থেকে দুটি শীর্ষ অপারেন্ড নিতে পারে, তাদের একাধিক করে ফলাফলটি স্ট্যাকের উপরে রেখে দিতে পারে। মেশিন ভাষার সাধারণত স্ট্যাক থেকে অপারেশন যোগ এবং অপসারণ করতে দুটি প্রাথমিক ফাংশন রয়েছে; পুশ এবং পিওপি অনেক সিপিইউয়ের ডিএসপি'র (ডিজিটাল সিগন্যাল প্রসেসর) এবং মেশিন কন্ট্রোলারগুলিতে (যেমন কোনও ওয়াশিং মেশিন নিয়ন্ত্রণ করে) স্ট্যাকটি চিপের মধ্যেই অবস্থিত। এটি ALU- এ দ্রুত অ্যাক্সেস দেয় এবং প্রয়োজনীয় কার্যকারিতা একক চিপে একত্রিত করে।


5

যদি স্ট্যাক / হিপ ধারণাটি অনুসরণ না করা হয় এবং ডেটা এলোমেলো মেমরি লোকেশনে লোড করা হয় বা এলোমেলো মেমরির অবস্থানগুলি থেকে ডেটা সংরক্ষণ করা হয় ... এটি খুব কাঠামোগত এবং নিয়ন্ত্রণহীন হবে।

এই ধারণাগুলি পারফরম্যান্স, মেমরির ব্যবহার ... এবং উন্নততর তথ্যের কাঠামোগত উন্নতির জন্য একটি পূর্বনির্ধারিত কাঠামোর মধ্যে ডেটা সঞ্চয় করতে ব্যবহৃত হয়।


4

ধারাবাহিকতা পাসিং স্টাইল ব্যবহার করে স্ট্যাক ছাড়াই কাজ করা একটি সিস্টেম থাকতে পারেকোডিংয়েরতারপরে কল ফ্রেমগুলি আবর্জনা সংগ্রহ করা হিপগুলিতে বরাদ্দকরণের ধারাবাহিকতায় পরিণত হয় (আবর্জনা সংগ্রহকারীকে কিছু স্ট্যাকের প্রয়োজন হবে)।

অ্যান্ড্রু অ্যাপেলের পুরানো লেখাগুলি দেখুন: ধারাবাহিকতা সহ এবং সংকলন আবর্জনা সংগ্রহের সংকলন স্ট্যাক বরাদ্দের চেয়ে দ্রুততর হতে পারে

(ক্যাশে সমস্যার কারণে তিনি আজ কিছুটা ভুল হতে পারেন)


0

আমি "বাধা" খুঁজছিলাম এবং কেউ এটিকে সুবিধা হিসাবে অন্তর্ভুক্ত করেনি। একটি মাইক্রোকন্ট্রোলার বা অন্য প্রসেসরের বাধা দেয় এমন প্রতিটি ডিভাইসের জন্য, সাধারণত নিবন্ধগুলি থাকে যেগুলি স্ট্যাকের উপরে চাপানো হয়, একটি বিঘ্নিত পরিষেবা রুটিন বলা হয়, এবং এটি করা হয়ে গেলে, রেজিস্টারগুলি স্ট্যাকের বাইরে ফিরে পপ করা হয় এবং যেখানে সেখানে রেখে দেওয়া হয় ছিলেন। তারপরে নির্দেশ পয়েন্টারটি পুনরুদ্ধার করা হয় এবং স্বাভাবিক ক্রিয়াকলাপটি যেখানে ছেড়ে যায় সেখানেই উঠে যায়, প্রায়শই যেন বিঘ্ন কখনও ঘটেনি। স্ট্যাকের সাহায্যে আপনার কাছে বেশ কয়েকটি ডিভাইস থাকতে পারে (তাত্ত্বিকভাবে) একে অপরকে বাধা দিতে পারে, এবং স্ট্যাকের কারণে এটি কেবলমাত্র কাজ করে।

এছাড়াও স্ট্যাক-ভিত্তিক ভাষার একটি পরিবার রয়েছে যাকে বলা হয় কনকনেটেটিভ ভাষা । এগুলি সমস্ত (আমি বিশ্বাস করি) কার্যকরী ভাষা, কারণ স্ট্যাকটি একটি অন্তর্নিহিত প্যারামিটার হ'ল পাস ইন, এবং পরিবর্তিত স্ট্যাক প্রতিটি ফাংশন থেকে অন্তর্ভুক্ত প্রত্যাবর্তন। ফোরথ এবং ফ্যাক্টর উভয়ই (যা দুর্দান্ত) অন্যগুলির সাথে উদাহরণ। স্ক্রিপ্টিং গেমসের জন্য ফ্যাক্টর লুয়ার অনুরূপ ব্যবহৃত হয়েছিল এবং বর্তমানে অ্যাপলে কর্মরত প্রতিভা স্লাভা পেস্তভ লিখেছিলেন। ইউটিউবে তাঁর গুগল টেকটালক আমি কয়েকবার দেখেছি। তিনি বোয়া কন্সট্রাক্টরদের সম্পর্কে কথা বলেন, তবে আমি তার অর্থ কী তা নিশ্চিত নই ;-)।

আমি সত্যিই ভাবি যে বর্তমান কিছু ভিএম এর, যেমন জেভিএম, মাইক্রোসফ্টের সিআইএল, এমনকি যেটি আমি দেখেছি লুয়ার জন্য লেখা হয়েছিল, তাদের কয়েকটি স্ট্যাক-ভিত্তিক ভাষায় রচনা করা উচিত, যাতে আরও বেশি প্ল্যাটফর্মে পোর্টেবল করা যায়। আমি মনে করি যে এই যুক্তিযুক্ত ভাষাগুলি কোনওভাবে ভিএম ক্রিয়েশন কিট এবং বহনযোগ্যতা প্ল্যাটফর্ম হিসাবে তাদের কলগুলি অনুপস্থিত। এএনএসআই সি-তে লিখিত একটি "পোর্টেবল" ফোর্থও রয়েছে, যা আরও সর্বজনীন বহনযোগ্যতার জন্য ব্যবহার করা যেতে পারে। ইমস্প্রিপ্টন বা ওয়েবঅ্যাস্পাবেশন ব্যবহার করে কেউ এটি সংকলন করার চেষ্টা করেছিল?

স্ট্যাক ভিত্তিক ভাষার সাথে কোডের একটি স্টাইল রয়েছে যার নাম শূন্য-পয়েন্ট, কারণ আপনি কেবলমাত্র (কোনও সময়ে) কোনও প্যারামিটার পাস না করে কল করার জন্য ফাংশনগুলি তালিকাভুক্ত করতে পারেন। যদি ফাংশনগুলি একত্রে পুরোপুরি ফিট হয় তবে আপনার কাছে শূন্য-পয়েন্টের সমস্ত কার্যকারিতার তালিকা ছাড়া আর কিছুই থাকবে না এবং এটি আপনার প্রয়োগ (তাত্ত্বিকভাবে)। আপনি যদি ফোরথ বা কারখানার মধ্যে পড়ে থাকেন তবে আপনি কী দেখছেন তা দেখতে পাবেন।

সহজ ওদিক , একটা চমৎকার অনলাইন টিউটোরিয়াল জাভাস্ক্রিপ্ট লেখা, এখানে ছোট নমুনা (নোট "বর্গ বর্গ বর্গ বর্গ" শূন্য দফা শৈলী কলিং একটি উদাহরণ হিসাবে) হল:

: sq dup * ;  ok
2 sq . 4  ok
: ^4 sq sq ;  ok
2 ^4 . 16  ok
: ^8 sq sq sq sq ;  ok
2 ^8 . 65536  ok

এছাড়াও, আপনি যদি ইজি ফোর্থ ওয়েব পৃষ্ঠার উত্সটি দেখুন তবে আপনি নীচের অংশে দেখতে পাবেন এটি খুব মডুলার, প্রায় ৮ টি জাভাস্ক্রিপ্ট ফাইলগুলিতে লিখিত।

আমি প্রায় প্রতিটি ফোর্থ বইয়ের জন্য প্রচুর অর্থ ব্যয় করেছি যে আমি ফোর্থকে একীভূত করার প্রয়াসে হাত পেতে পেরেছিলাম, তবে এখন এটি আরও ভালভাবে আঁকতে শুরু করছি। যারা তাদের পরে আসেন তাদের আমি একটি মাথা তুলে দিতে চাই, আপনি যদি সত্যিই এটি পেতে চান (আমি এটি খুব দেরী করে খুঁজে পেয়েছি), ফিগফোর্থ বইটি পেয়েছি এবং এটি বাস্তবায়ন করি। বাণিজ্যিক ফোরথগুলি সমস্ত জটিল, এবং ফোরথের সবচেয়ে বড় বিষয়টি হ'ল উপর থেকে নীচে পুরো সিস্টেমটি বোঝা সম্ভব। একরকম, ফোর্থ একটি নতুন প্রসেসরের উপর পুরো বিকাশের পরিবেশ প্রয়োগ করে, এবং যদিও প্রয়োজনযেহেতু এটি সমস্ত কিছুতেই সি দিয়ে গেছে বলে মনে হচ্ছে, স্ক্র্যাচ থেকে একটি ফোর্থ লিখতে প্যাসেজের রীতি হিসাবে এটি এখনও কার্যকর। সুতরাং, আপনি যদি এটি করা চয়ন করেন, তবে ফিগারফোর্থ বইটি ব্যবহার করে দেখুন - এটি বিভিন্ন প্রসেসরের বিভিন্ন ক্ষেত্রে একযোগে প্রয়োগ করা বেশ কয়েকটি ফোরথ। একধরনের রোসটা স্টোন অফ ফরথস।

আমাদের কেন স্ট্যাকের দরকার - দক্ষতা, অপ্টিমাইজেশন, শূন্য-পয়েন্ট, বাধা দেওয়ার পরে রেজিস্টার সংরক্ষণ করা এবং পুনরাবৃত্ত আলগোরিদিমগুলির জন্য এটি "সঠিক আকৃতি"।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.