ফাংশন কল শব্দার্থক উপস্থাপনের জন্য স্ট্যাক ব্যবহারের বিকল্পগুলি কী?


19

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

যাইহোক, স্ট্যাকটি একটি বাস্তবায়ন বিশদ: কলিং কনভেনশনগুলি বিভিন্ন জিনিস করতে পারে (যেমন x86 ফাস্টকলের ব্যবহার (কিছু) রেজিস্টার, এমআইপিএস এবং অনুসারীরা রেজিস্টার উইন্ডো ব্যবহার করে এবং তাই) এবং অপ্টিমাইজেশনগুলি এমনকি অন্য কিছুও করতে পারে (ইনলাইনিং, ফ্রেম পয়েন্টার বাদ দেওয়া, টেল-কল অপ্টিমাইজেশন ..)।

অবশ্যই, অনেকগুলি মেশিনে সুবিধাজনক স্ট্যাক নির্দেশের উপস্থিতি (ভিভি যেমন জেভিএম এবং সিএলআর, তবে তাদের পুশ / পিওপি ইত্যাদির সাথে x86 এর মতো প্রকৃত মেশিনগুলি) এটি ফাংশন কলগুলির জন্য ব্যবহার করা সুবিধাজনক করে তোলে তবে কিছু ক্ষেত্রে এটি সম্ভব হয় এমনভাবে প্রোগ্রাম করার জন্য যাতে কল স্ট্যাকের প্রয়োজন হয় না (আমি এখানে কন্টিনিয়েশন পাসিং স্টাইল, বা একটি বার্তা পাসিং সিস্টেমে অভিনেতা সম্পর্কে ভাবছি)

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

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

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


ক্লিন একটি গ্রাফ এবং একটি গ্রাফ পুনর্লিখন মেশিন ব্যবহার করে, যা ঘুরে ফিরে তিন স্ট্যাক মেশিন ব্যবহার করে প্রয়োগ করা হয়, তবে সাধারণের চেয়ে আলাদা সামগ্রী সহ।

ভার্চুয়াল মেশিনগুলির জন্য, একটি লিঙ্কযুক্ত তালিকা ব্যবহার করা যেতে পারে। তালিকার প্রতিটি নোড একটি ফ্রেম। যেহেতু হার্ডওয়্যার স্ট্যাকটি ভিএম দ্বারা ব্যবহৃত হয়, তাই এটি ওভারহেড ছাড়াই mesালিতে ফ্রেমের অস্তিত্বের অনুমতি দেয় realloc()
shawnhcorey

উত্তর:


19

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

কল স্ট্যাকের প্রয়োজন নেই এমন ভাষার উদাহরণগুলির জন্য ফরট্রান চতুর্থ (এবং আগের) এবং সিওবিওএল এর প্রাথমিক সংস্করণগুলি দেখুন।

কল-স্ট্যাকের জন্য সরাসরি হার্ডওয়্যার সমর্থন সরবরাহ করে না এমন একটি অত্যন্ত সফল প্রাথমিক কম্পিউটার কম্পিউটারের উদাহরণের জন্য কন্ট্রোল ডেটা 6600 (এবং পূর্ববর্তী কন্ট্রোল ডেটা মেশিনগুলি) দেখুন। কল স্ট্যাক সমর্থন করে না এমন খুব সফল প্রাথমিক মিনিকম্পিউটারের উদাহরণের জন্য পিডিপি -8 দেখুন।

যতদূর আমি জানি, বুড়ো বি 5000 স্ট্যাক মেশিনগুলি হার্ডওয়ার কল স্ট্যাক সহ প্রথম মেশিন ছিল। বি 5000 মেশিনগুলি ALGOL চালানোর জন্য স্থল থেকে তৈরি করা হয়েছিল, যার পুনরাবৃত্তি প্রয়োজন। তাদের মধ্যে প্রথম বর্ণনামূলক-ভিত্তিক স্থাপত্যগুলির মধ্যে একটিও ছিল, যা সক্ষমতার আর্কিটেকচারের ভিত্তি তৈরি করেছিল।

যতদূর আমি জানি, এটি পিডিপি -6 (যা ডিসি -10-তে পরিণত হয়েছিল) কল স্ট্যাক হার্ডওয়্যারকে জনপ্রিয় করে তুলেছিল, যখন এমআইটিতে হ্যাকার সম্প্রদায়টি একটি ডেলিভারি নিয়েছিল এবং আবিষ্কার করেছিল যে পিইউএসজে (পুশ রিটার্ন ঠিকানা এবং জাম্প) অপারেশন দশমিক মুদ্রণ রুটিন 50 টি নির্দেশনা থেকে 10 এ হ্রাস করার অনুমতি দিয়েছে।

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

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

অ্যাবেলসন অ্যান্ড সুসমানের "কম্পিউটার প্রোগ্রামগুলির কাঠামো এবং ব্যাখ্যা" ধারাবাহিকতায় কিছু বিশদে যায়।


2
এটি একটি দুর্দান্ত historicalতিহাসিক অন্তর্দৃষ্টি ছিল, আপনাকে ধন্যবাদ! আমি যখন আমার প্রশ্ন জিজ্ঞাসা করলাম, তখন আমার মনে ক্রমাগত ধারাবাহিকতা ছিল, বিশেষত ধারাবাহিকতা-পাসিং শৈলী (সিপিএস)। সেক্ষেত্রে, একটি স্ট্যাক কেবল অসুবিধাই নয়, তবে সম্ভবত প্রয়োজনও নয়: আপনাকে কোথায় ফিরে আসবে তা মনে করার দরকার নেই, আপনি কার্যকর করার জন্য চালিয়ে যাবেন এমন একটি বিন্দু সরবরাহ করেন। আমি ভাবলাম অন্য স্ট্যাক-কম পন্থাগুলি যেখানে সাধারণ, এবং আপনি কিছু খুব ভাল দিয়েছেন যা সম্পর্কে আমি অবগত নই।
লরেঞ্জো ডিম্যাটé

সামান্যভাবে সম্পর্কিত: আপনি সঠিকভাবে চিহ্নিত করেছেন "যদি ভাষা পুনরাবৃত্তি করার অনুমতি দেয় না"। পুরা-পুনরাবৃত্তি না করে এমন বিশেষ কার্যগুলিতে পুনরাবৃত্তির সাথে ভাষা সম্পর্কে কী বলা যায়? তাদের কি "ডিজাইনের দ্বারা" স্ট্যাকের প্রয়োজন?
লরেঞ্জো ডিম্যাটé

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

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

উদাহরণস্বরূপ, আমার অন্ত্রের অনুভূতিগুলি হ'ল সিপিএসের জন্য কেবল একটি গাছের প্রয়োজন, তবে আমি নিশ্চিত নই, আমি কোথায় জানি তাও জানি না। এজন্যই আমি জিজ্ঞাসা করছি ..
লরেঞ্জো ডিম্যাটé

6

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

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

কল্পনা করুন আপনার অনেকগুলি ক্রিয়া রয়েছে যা প্রত্যেকে একে অপরকে কল করতে পারে। রান-টাইমে প্রতিটি ফাংশনটি অবশ্যই জানতে হবে যখন ফাংশনটি প্রস্থান করবে তখন কোথায় ফিরে আসতে হবে। যদি firstকল হয় secondতবে আপনার কাছে রয়েছে:

second returns to somewhere in first

তারপরে, যদি secondকলগুলি thirdআপনার কাছে থাকে:

third returns to somewhere in second
second returns to somewhere in first

তারপরে, যদি thirdকলগুলি fourthআপনার কাছে থাকে:

fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first

প্রতিটি ফাংশন যেমন বলা হয়, আরও "কোথায় ফিরে" তথ্য অবশ্যই কোথাও সংরক্ষণ করতে হবে।

যদি কোনও ফাংশন ফিরে আসে তবে তার "কোথায় ফিরবেন" তথ্য ব্যবহৃত হয় এবং এর আর প্রয়োজন হয় না। উদাহরণস্বরূপ, যদি fourthআবার কোথাও ফিরে আসে thirdতবে "কোথায় ফিরে আসবেন" তথ্যের পরিমাণ হয়ে যাবে:

third returns to somewhere in second
second returns to somewhere in first

মূলত; "ফাংশন কল শব্দার্থবিজ্ঞান" বোঝায় যে:

  • আপনার অবশ্যই "কোথায় ফিরবেন" তথ্য থাকতে হবে
  • ফাংশনগুলি বলা হয় এবং ফাংশনগুলি ফিরে আসে যখন হ্রাস করা হয় তথ্যের পরিমাণ
  • "কোথায় ফিরে যেতে হবে" তথ্য সংরক্ষণ করা তথ্যগুলির প্রথম অংশটি "কোথায় ফিরে যেতে হবে" তথ্য বাতিল করা হবে the

এটি একটি FILO / LIFO বাফার বা একটি স্ট্যাকের বর্ণনা দেয়।

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

"ফাংশন কল শব্দার্থবিজ্ঞান" বাস্তবায়নের জন্য ধারণাযুক্তভাবে ব্যবহার করা যেতে পারে এমন কোনও অন্যান্য ডেটা স্ট্রাকচারের ক্ষেত্রেও এটি একই প্রযোজ্য - এটি স্ট্যাক হিসাবে ব্যবহৃত হবে (এবং কেবলমাত্র পার্থক্যটি ওয়ার্ড গেমস এবং / বা প্রয়োগের বিবরণ); যতক্ষণ না এটি "ফাংশন কল শব্দার্থক" ভঙ্গ করে। দ্রষ্টব্য: আমি পারলে অন্যান্য ডেটা স্ট্রাকচারের জন্য উদাহরণ সরবরাহ করতাম তবে আমি অন্য কোনও কাঠামোর কথা ভাবতে পারি না যা সামান্য প্রশ্রয়জনক।

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

দ্রষ্টব্য: যে কোনও মুহুর্তে যদি কেবলমাত্র একটি পদ্ধতির প্রার্থনা সক্রিয় হতে পারে; তারপরে আপনি স্থিতিশীলভাবে "কোথায় ফিরে আসবেন" তথ্যের জন্য স্থান বরাদ্দ করতে পারেন। এটি এখনও একটি স্ট্যাক (যেমন FILO / LIFO উপায়ে ব্যবহৃত স্ট্যাটিকালি বরাদ্দ এন্ট্রিগুলির একটি লিঙ্কযুক্ত তালিকা)।

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


সংজ্ঞা অনুসারে, একটি স্ট্যাক হল একটি লাইফো সংগ্রহ: সর্বশেষে, আগে আউট। একটি সারি একটি ফিফোর সংগ্রহ।
জন আর স্ট্রোহম

সুতরাং একটি স্ট্যাক একমাত্র গ্রহণযোগ্য তথ্য কাঠামো? যদি তাই হয় তবে কেন?
লরেঞ্জো ডিম্যাটé

@ জনআর.স্ট্রোহম: স্থির :-)
ব্রেন্ডন

1
পুনরাবৃত্তি (প্রত্যক্ষ বা মিউটাল) ব্যতীত ভাষার জন্য, প্রতিটি পদ্ধতির জন্য স্থিতিশীল-বরাদ্দ করা সম্ভব যা এই পদ্ধতিটি সর্বশেষ বলা হয়েছিল সেই জায়গাটি সনাক্ত করবে। লিঙ্কার যদি এই বিষয়গুলি সম্পর্কে অবগত থাকে, তবে এটি এমন ফ্যাশনে এই জাতীয় পরিবর্তনগুলি বরাদ্দ করতে পারে যা প্রতিটি স্ট্যাটিচ্যালি-সম্ভাব্য সম্পাদনের পথ যদি নেওয়া হয় তবে স্ট্যাকটি কী করবে তার চেয়ে খারাপ কিছু হবে না ।
সুপারক্যাট

4

খেলনা কাঠামোগত ভাষা এক্সওয়াই বাস্তবায়নের জন্য একটি কল-সারি এবং একটি ডেটা স্ট্যাক ব্যবহার করে।

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

সুতরাং আমাদের যদি শীর্ষ উপাদানকে দ্বিগুণ করার জন্য একটি ফাংশন থাকে:

; double dup + ;
// defines 'double' to be composed of 'dup' followed by '+'
// dup duplicates the top element of the data stack
// + pops the top two elements and push their sum

তারপরে রচনাগুলি কার্য করে +এবং dupনিম্নলিখিত স্ট্যাক / সারি টাইপ স্বাক্ষরগুলি রয়েছে:

// X is arbitraty stack, Y is arbitrary queue, ^ is concatenation
+      [X^a^b Y] -> [X^(a + b) Y]
dup    [X^a Y] -> [X^a^a Y]

এবং বিপরীতে, doubleএই মত চেহারা হবে:

double [X Y] -> [X dup^+^Y]

সুতরাং এক অর্থে, এক্সওয়াই স্ট্যাকলেস।


ওহ ধন্যবাদ! আমি এটি খতিয়ে দেখব ... নিশ্চিত না যে এটি ফাংশন কলগুলিতে সত্যিই প্রযোজ্য তবে যাইহোক তা এক
নজরে

1
@ কার্ল দামগার্ড আসমুসেন "শব্দটিকে কাতারের সামনের দিকে রচনা করছে" "সামনের দিকে এগিয়ে যাচ্ছে" এটি কি স্ট্যাক নয়?

@ গেস্টটিট্ট 222222222 আসলে নয়। একটি কলস্ট্যাক স্টোরগুলি পয়েন্টারগুলি ফেরত দেয় এবং যখন ফাংশনটি ফিরে আসে, কলস্ট্যাকটি পপড হয়। এক্সিকিউশন কিউ কেবল ফাংশনগুলিতে পয়েন্টার সঞ্চয় করে এবং পরবর্তী ফাংশনটি সম্পাদন করার সময় এটি এর সংজ্ঞাতে প্রসারিত হয় এবং কিউয়ের সামনের দিকে এগিয়ে যায়। এক্সওয়াই-তে এক্সিকিউশন কিউটি আসলে একটি ডিউক, যেহেতু এমন ক্রিয়াকলাপ রয়েছে যা কার্যকর করা সারিটির পিছনেও কাজ করে।
কার্ল দামগার্ড আসমুসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.