প্রারম্ভিক এবং দেরী বাধ্যতামূলক কি?


77

আমি তাড়াতাড়ি এবং দেরীতে আবদ্ধ হওয়ার বিষয়ে শুনছি, তবে তারা কী তা আমি বুঝতে পারি না। আমি নীচের ব্যাখ্যাটি পেয়েছি যা আমি বুঝতে পারি না:

প্রারম্ভিক বাঁধাই বলতে ডিজাইনের সময় ভেরিয়েবলগুলিতে মূল্য নির্ধারণকে বোঝায় যেখানে দেরীতে বাইন্ডিং চলমান সময় চলকগুলিতে মান নির্ধারণকে বোঝায়।

কেউ দয়া করে দুটি ধরণের বাঁধাই সংজ্ঞা দিতে এবং তাদের তুলনা করতে পারেন?


1
রান টাইম বনাম সময় সংকলন।
বার্লোপ

এখানে এই বিষয়ে একটি ভাল পঠন করা হয়েছে: en.wikibooks.org/wiki/Intrication_to_Programming_Languages/…
জে এলস্টন

উত্তর:


84

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

প্রকারভেদ

দেরীতে বাইন্ডিং : রান-টাইমের সময় চলকটি প্রয়োগ না করা পর্যন্ত টাইপটি অজানা ; সাধারণত অ্যাসাইনমেন্টের মাধ্যমে তবে একটি ধরণের বাধ্য করার অন্যান্য উপায়ও রয়েছে; গতিশীলভাবে টাইপ করা ভাষাগুলি এটিকে অন্তর্নিহিত বৈশিষ্ট্য হিসাবে ডাকে, তবে অনেকগুলি স্ট্যাটিকভাবে টাইপ করা ভাষায় দেরী বন্ধন অর্জনের কিছু পদ্ধতি রয়েছে

প্রায়শই [বিশেষ] গতিশীল প্রকার, অন্তঃসংশোধন / প্রতিবিম্ব, পতাকা এবং সংকলক বিকল্পগুলি ব্যবহার করে বা ভার্চুয়াল পদ্ধতিগুলির মাধ্যমে bণ গ্রহণ এবং গতিশীল প্রেরণের প্রসারিত করে প্রয়োগ করা হয়

প্রারম্ভিক বাঁধাই : টাইপ পরিচিত সামনে পরিবর্তনশীল রান সময়ে কর্তৃত্বপূর্ণ করা হয়, সাধারণত একটি স্ট্যাটিক, ঘোষণামূলক উপায়ে

প্রায়শই স্ট্যান্ডার্ড আদিম ধরণের ব্যবহার করে প্রয়োগ করা হয়

ক্রিয়াকলাপ

স্ট্যাটিক প্রেরণ : পরিচিত, নির্দিষ্ট ফাংশন বা সংকলনের সময় সাবরুটিন; এটি দ্ব্যর্থহীন এবং স্বাক্ষরের সাথে মিলে

স্ট্যাটিক ফাংশন হিসাবে প্রয়োগ; কোনও পদ্ধতির একই স্বাক্ষর থাকতে পারে না

গতিশীল প্রেরণ : সংকলনের সময় কোনও নির্দিষ্ট কার্য বা সাবরুটিন নয়; মৃত্যুদন্ড কার্যকর করার সময় প্রসঙ্গে নির্ধারিত। "গতিশীল প্রেরণের জন্য" দুটি পৃথক পন্থা রয়েছে, উপযুক্ত ফাংশন বাস্তবায়ন নির্বাচন করতে কোন প্রাসঙ্গিক তথ্য ব্যবহৃত হয় তা দ্বারা আলাদা।

ইন একক [ গতিশীল ] প্রেরণ , শুধুমাত্র উদাহরণ হিসেবে বলা যায় ধরণ উপযুক্ত ফাংশন বাস্তবায়ন নির্ধারণ করতে ব্যবহৃত হয়। স্ট্যাটিকালি-টাইপ করা ভাষায়, অনুশীলনের অর্থ এর অর্থ হ'ল উদাহরণটি টাইপ সিদ্ধান্ত নেয় যে পরিবর্তনশীলটি ঘোষিত / নির্ধারিত হওয়ার সময় নির্দেশিত রেফারেন্স নির্বিশেষে কোন পদ্ধতি প্রয়োগ করা হয়। যেহেতু কেবলমাত্র একটি একক প্রকার - অবজেক্ট দৃষ্টান্তের ধরণ - যথাযথ বাস্তবায়ন অনুমান করতে ব্যবহৃত হয়, এই পদ্ধতির নামটিকে "একক প্রেরণ" বলা হয়।

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

ভার্চুয়াল বা বিমূর্ত ফাংশন হিসাবে প্রয়োগ করা; অন্যান্য ক্লুগুলির মধ্যে ওভাররাইড, লুকানো বা ছায়াময় পদ্ধতি রয়েছে include

এনবি: পদ্ধতি ওভারলোডিংয়ে গতিশীল প্রেরণের জড়িত কিনা তা ভাষা-নির্দিষ্ট। উদাহরণস্বরূপ, জাভাতে, ওভারলোডেড পদ্ধতিগুলি স্থিতিশীলভাবে প্রেরণ করা হয়।

মানগুলি

অলস লোডিং : অবজেক্ট ইনিশিয়ালাইজেশন কৌশল যা প্রয়োজন অবধি মূল্য কার্যভারতাকে স্থগিত করে ; কোনও অবজেক্টকে মূলত বৈধ তবে জেনেশুনে অসম্পূর্ণ অবস্থায় থাকতে দেয় এবং ডেটা লোড করার আগে ডেটা প্রয়োজন না হওয়া পর্যন্ত অপেক্ষা করতে দেয়; বড় ডেটাসেট লোড করার জন্য বা বাহ্যিক সংস্থাগুলির জন্য অপেক্ষা করার জন্য প্রায়শই বিশেষত কার্যকর বলে মনে হয়

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

আগ্রহী লোড হচ্ছে : অবজেক্ট ইনিশিয়ালাইজেশন কৌশল যা অবিলম্বে সমস্ত মান অ্যাসাইনমেন্ট সম্পাদন করে যাতে নিজেকে বৈধ অবস্থায় থাকার আগে বিবেচনা করার আগে সমস্ত ডেটা সম্পূর্ণ হওয়ার প্রয়োজন হয়।

কনস্ট্রাক্টর কল বা ইনিশিয়ালেশনের সময়, যেমন যত তাড়াতাড়ি সম্ভব তাদের সমস্ত পরিচিত ডেটা সহ একটি যৌগিক অবজেক্ট সরবরাহ করে প্রায়শই প্রয়োগ করা হয়

ডেটা বাইন্ডিং : প্রায়শই দুটি সুসংগত তথ্য স্ট্রিমের মধ্যে একটি সক্রিয় লিঙ্ক বা মানচিত্র তৈরি করা জড়িত যাতে একটিতে পরিবর্তন অন্য এবং এর বিপরীতে প্রতিফলিত হয়; সামঞ্জস্যপূর্ণ হওয়ার জন্য তাদের প্রায়শই একটি সাধারণ বেস টাইপ বা ইন্টারফেস থাকতে হয়

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


সম্পাদনা দ্রষ্টব্য: কীভাবে এগুলি প্রায়শই ঘটে তার উদাহরণ প্রদানের জন্য শেষ বড় সম্পাদনা। নির্দিষ্ট কোড উদাহরণগুলি পুরোপুরি বাস্তবায়ন / রানটাইম / প্ল্যাটফর্মের উপর নির্ভর করে


2
এই উত্তরটি অবজেক্ট-ওরিয়েন্টেড ভাষাগুলির কাছে খুব নির্দিষ্ট বলে মনে হচ্ছে।
জ্যাক 19

27

কিছু যে কম্পাইলার দ্বারা সিদ্ধান্ত নেওয়া হয় যখন কম্পাইল পড়ুন যাবে তাড়াতাড়ি / কম্পাইল সময় বাঁধাই এবং কিছু যে সিদ্ধান্ত হবে রানটাইম বলা হয় দেরী / রানটাইম বাঁধাই।

উদাহরণ স্বরূপ,

মেথড ওভারলোডিং এবং মেথড ওভাররাইডিং

1) মেথডে ওভারলোডিংয়ে আপনার পদ্ধতিগুলিতে কলগুলি সংকলক দ্বারা এই অর্থে সিদ্ধান্ত নেওয়া হয় যে কোন ফাংশনটি ডাকা হবে তা সংকলনের সময় আপনার সংকলক দ্বারা সিদ্ধান্ত নেওয়া হয়েছে। অতএব প্রাথমিকভাবে বাঁধা হচ্ছে ।

2) মেথড ওভাররাইডে, রিন্টটাইমে সিদ্ধান্ত নেওয়া হয় কোন পদ্ধতিটি ডাকা হবে। সুতরাং এটি লেট বাইন্ডিং হিসাবে প্রকাশিত হয়

এটি সহজ এবং সহজেই বজায় রাখার চেষ্টা করেছিল। আশাকরি এটা সাহায্য করবে.


9

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

class A
{
public:
    void f() {}
    virtual void g() {}
};

class B : public A
{
    void f() {}
    virtual void g() {}
};

int main()
{
    A* a = new B;
    a->f();
    a->g();
}

এই উদাহরণে, a->f()আসলে কল করবে void A::f(), কারণ এটি শুরুর দিকে (বা স্থিতিশীল) আবদ্ধ, এবং তাই রানটাইম প্রোগ্রামটি মনে করে যে এটি কেবল একটি Aটাইপ ভেরিয়েবলের পয়েন্টার , যেখানে a->g()প্রকৃতপক্ষে কল করবে void B::g()কারণ সংকলকটি দেখা g()ভার্চুয়াল, দেখতে কোডটিকে ইনজেকশন দেয় রানটাইমে কল করার জন্য সঠিক ফাংশনের ঠিকানাটি আপ করুন।


1
"রানটাইম"? আপনি সি ++ এর কথা বলছেন। সি ++ সরাসরি মেশিন কোডে সংকলন করে, ভার্চুয়াল পদ্ধতিগুলি সমাধান করার জন্য এটি রানটাইমের প্রয়োজন হয় না।
টিডামার্স

3
@tdammers সি ++ আসলে একটি রান টাইম লাইব্রেরি প্রয়োজন, যদিও ভার্চুয়াল কলগুলির জন্য নয়। আপনি মনোযোগ দিয়ে পড়ুন, তাহলে আপনি লক্ষ্য করবেন যে এই উত্তর কম্পাইলার বলেছেন "কোড উদ্বুদ্ধ সঠিক ফাংশন [...] এর ঠিকানা সন্ধান করার রানটাইম"।

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

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

1
@ টেডামার্স এবং "রানটাইম" বলতে আমার বোঝায় "রানটাইম এ প্রোগ্রাম"। স্পষ্টতই C ++ পরিচালিত নয়। তবে যেহেতু আপনি আমাকে দেখিয়েছেন এটি বিভ্রান্তির কারণ হতে পারে, তাই আমি এটিকে পুরো শব্দটিতে পরিবর্তন করছি।
ইয়াম মার্কোভিচ

5

আপনি যদি ফাংশন পয়েন্টারগুলির সাথে পরিচিত হন তবে এটি উদাহরণ হতে পারে। সংজ্ঞায়িত ফাংশনগুলি প্রাথমিক বাঁধাই বলা যেতে পারে। আপনি যদি ফাংশন পয়েন্টার ব্যবহার করেন তবে এর দেরীতে বাইন্ডিং।

  int add(int x,int y)
  {
    return x+y;
  }
  int sub(int x,int y)
  {
      return x-y;
  }


    int main()
    {
     //get user choice
     int(*fp)(int,int);
     //if add
      fp=add;
     //else if sub
     fp=sub;
     cout<<fp(2,2);
    }

এখানে ফাংশনগুলি অ্যাড এবং সাব ফাংশনগুলি রয়েছে (এর ঠিকানাটি সংকলন টাইম-লিঙ্কারে সংযুক্ত করা হয়)

তবে ফাংশন পয়েন্টারটি দেরীতে আবদ্ধ হয় এফপি ব্যবহারকারীদের পছন্দের উপর নির্ভর করে [রানটাইমের সময়] অ্যাড বা সাব কল করতে পারে।


3

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

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

রুবিতে দেরী বন্ধন প্রদর্শন করার একটি উদাহরণ:

a = 1 # a is an integer at this point
a.succ # asking for its successor is valid

class A
  def method_a
    # some code
  end
end

a = A.new
a.method_a # this is also valid
a.succ # this is not valid


class A # we can re-open the class and add a method
  def succ
    # some more code
  end
end
a.succ # now this is valid

উপরের ক্রিয়াগুলির ক্রমটি জাভা জাতীয় ভাষায় সম্ভব নয় যেখানে সমস্ত ধরণের রান সময় স্থির থাকে।


1

আপনাকে একাডেমিক সংজ্ঞা দেওয়ার পরিবর্তে আমি আপনাকে ভিবিএ ব্যবহার করে বাস্তব বিশ্বের উদাহরণ ব্যবহার করে কিছু পার্থক্য দেখানোর চেষ্টা করব:

প্রাথমিক বাঁধাই:

Dim x As FileSystemObject
Set x = New FileSystemObject
Debug.Print x.GetSpecialFolder(0)

এই একটি রেফারেন্স দরকার এ "মাইক্রোসফট স্ক্রিপ্টিং রানটাইম" উপাদানের সেট হওয়ার নকশা সময় । এটির সুবিধা রয়েছে যে আপনি ইতিমধ্যে সংকলনের সময় একটি ত্রুটি বার্তা পেয়েছেন যখন আপনার কাছে টাইপ টাইপ করা হয় FileSystemObjectবা পদ্ধতির নাম GetSpecialFolder

দেরীতে বাঁধাই

Dim x As Object
Set x = CreateObject("Scripting.FileSystemObject")
Debug.Print x.GetSpecialFolder(0)

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

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


-2

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

এই আলো দ্বারা, ভাষা পরিবেশে বাইন্ডিংয়ের বেশিরভাগ ধরণের সংকলন সময় বা লিংক সময়ে কম বেশি কম তাড়াতাড়ি হয়।

প্রতিটি ধরণের খরচ এবং সুবিধা রয়েছে।


বাঁধাইয়ের এই সংজ্ঞাটির জন্য আপনি কি কোনও রেফারেন্স সাইট করতে পারেন? ইন্টারনেট ঠিকানাগুলি "বাইন্ডিং" হিসাবে সমাধান করার কথা আমি শুনিনি, যদিও যেহেতু বাঁধাই নামগুলি সমাধান করার কাজ, আমি মনে করি কেউ কেউ যুক্তি দেখিয়েছে যে প্রাথমিক / দেরিতে বাইন্ডিংয়ের ধারণাটি ইউএসআরিকে ইন্টারনেটের ঠিকানায় সমাধান করার ক্ষেত্রে প্রয়োগ করা যেতে পারে। তবে এটি কোনও সাধারণ ব্যাখ্যা নয় এবং প্রাথমিক / দেরিতে বাইন্ডিংয়ের ধারণাটি সেই সময়ের পূর্বাভাস দেয় যেখানে কম্পিউটারগুলি সাধারণত ইন্টারনেটে সংযুক্ত ছিল।
জে এলস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.