সংকলকগণ স্বয়ংক্রিয়ভাবে deallocations don'tোকান না কেন?


63

সি এর মতো ভাষায়, প্রোগ্রামারটি কল করার জন্য নিখরচায় সন্নিবেশ করানো আশা করে। সংকলক স্বয়ংক্রিয়ভাবে এটি করে না কেন? মানুষ এটি একটি যুক্তিসঙ্গত সময়ে (বাগগুলি উপেক্ষা করে) করেন, সুতরাং এটি অসম্ভব নয়।

সম্পাদনা: ভবিষ্যতের রেফারেন্সের জন্য, এখানে আরও একটি আলোচনা রয়েছে যার একটি আকর্ষণীয় উদাহরণ রয়েছে।


125
এবং এটি, বাচ্চারা, এজন্যই আমরা আপনাকে গণনাযোগ্যতা তত্ত্ব শিখি। ;)
রাফেল

7
এটি কোনও গণ্যমানীয় সমস্যা নয় কারণ মানুষও সব ক্ষেত্রেই সিদ্ধান্ত নিতে পারে না। এটি একটি সম্পূর্ণ সমস্যা; বিলোপ বিবৃতিতে এমন তথ্য রয়েছে যা মুছে ফেলা হলে বিশ্লেষণের মাধ্যমে পুরোপুরি পুনরুদ্ধার করা যায় না যদি না বিশ্লেষণে স্থাপনার পরিবেশ এবং প্রত্যাশিত অপারেশন সম্পর্কিত তথ্য থাকে যা সি উত্স কোডটি ধারণ করে না।
নাট

41
না, এটি একটি গণনার সমস্যা। এটা undecidable কিনা মেমরি একটি প্রদত্ত টুকরা deallocated দিতে হবে। একটি নির্দিষ্ট প্রোগ্রামের জন্য, কোনও ব্যবহারকারী ইনপুট বা অন্যান্য বাহ্যিক হস্তক্ষেপ নয়।
আন্দ্রেজ বাউর

1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে । সমস্ত মন্তব্য যা নির্দিষ্টভাবে প্রশ্নের সমাধান করে না এবং কীভাবে এটি উন্নত করা যেতে পারে তা দৃষ্টিতে মুছে ফেলা হবে।
রাফেল

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

উত্তর:


80

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


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

1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
গিলস

2
ছেলেরা, এর তা গ্রহণ চ্যাট । যা কিছু করে না সরাসরি উত্তর নিজেই এবং কীভাবে উন্নত করা যায় সঙ্গে সম্পর্কযুক্ত মুছে ফেলা হবে।
রাফেল

2
সংকলকগণ প্রচুর আনন্দের সাথে সাধারনত অনস্বীকার্য; আমরা যদি সর্বদা রাইসের উপপাদ্যে আবদ্ধ থাকি তবে আমরা সংকলক বিশ্বে আর কোথাও পেতাম না।
টিখন জেলভিস

3
এটি অপ্রাসঙ্গিক। যদি এটি সমস্ত সংকলকগুলির জন্য অনস্বীকার্য হয় তবে এটি সমস্ত মানুষের পক্ষেও অনস্বীকার্য। তবুও আমরা আশা করি মানুষ free()সঠিকভাবে প্রবেশ করিয়ে দেবে ।
পল ড্রাগার

53

ডেভিড রিচার্বি যথাযথভাবে উল্লেখ করেছেন, সাধারণভাবে সমস্যাটি অনস্বীকার্য। অবজেক্ট লাইভনেস প্রোগ্রামের একটি বৈশ্বিক সম্পত্তি এবং এটি সাধারণত প্রোগ্রামের ইনপুটগুলির উপর নির্ভর করে।

এমনকি সুনির্দিষ্ট গতিশীল আবর্জনা সংগ্রহও একটি অনস্বীকার্য সমস্যা! সমস্ত বাস্তব-জঞ্জাল আবর্জনা সংগ্রহকারী ভবিষ্যতে কোনও বরাদ্দকৃত বস্তুর প্রয়োজন হবে কিনা তা রক্ষণশীলতার সান্নিধ্য হিসাবে ব্যবহারযোগ্যতা ব্যবহার করে। এটি একটি ভাল অনুমান, তবে এটি সত্ত্বেও এটি একটি আনুমানিক।

তবে এটি সাধারণভাবে সত্য। কম্পিউটার বিজ্ঞান ব্যবসায়ের অন্যতম কুখ্যাত কপ-আউটস হ'ল "এটি সাধারণভাবে অসম্ভব, তাই আমরা কিছুই করতে পারি না"। বিপরীতে, এমন অনেকগুলি ঘটনা রয়েছে যেখানে কিছুটা অগ্রসর হওয়া সম্ভব।

রেফারেন্স গণনার উপর ভিত্তি করে বাস্তবায়নগুলি "সংকলক সন্নিবেশ করানো ডিলেটোকেশনগুলি" এর খুব কাছাকাছি যে পার্থক্যটি বলা মুশকিল। LLVM এর স্বয়ংক্রিয় রেফারেন্স কাউন্টিং (ব্যবহৃত উদ্দেশ্য সি এবং সুইফট ) একটি বিখ্যাত উদাহরণ।

অঞ্চলের অনুমান এবং সংকলন-আবর্জনা সংগ্রহ বর্তমান সক্রিয় গবেষণা ক্ষেত্র। এটি এমএল এবং বুধের মতো ঘোষিত ভাষাগুলিতে আরও সহজ হয়ে গেছে যেখানে আপনি কোনও বস্তু তৈরির পরে এটি পরিবর্তন করতে পারবেন না।

এখন মানুষের বিষয় সম্পর্কে, তিনটি প্রধান উপায় রয়েছে যা মানুষ ম্যানুয়ালি বরাদ্দের জীবনকাল পরিচালনা করে:

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

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়। আপনি যদি ঘোষিত বনাম কার্যকরী আলোচনা করতে চান তবে দয়া করে চ্যাট করুন
গিলস

2
এটি এখন পর্যন্ত প্রশ্নের সেরা উত্তর (যা অনেক উত্তর এমনকি সম্বোধন করে না)। আপনি হান্স Boehm এর নেতা কাজ একটি রেফারেন্স যোগ থাকতে পারে conseervative জিসি : en.wikipedia.org/wiki/Boehm_garbage_collector । আর একটি আকর্ষণীয় বিষয় হ'ল ডেটা লাইভনেস (বা বর্ধিত অর্থে উপযোগিতা) একটি বিমূর্ত শব্দার্থবিজ্ঞানের ক্ষেত্রে বা একটি এক্সিকিউশন মডেলের সাথে সংজ্ঞায়িত করা যেতে পারে। তবে বিষয়টি সত্যই বিস্তৃত।
বাবু

29

এটি একটি অসম্পূর্ণতা সমস্যা, একটি সিদ্ধান্তহীন সমস্যা নয়

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

এমন কেস রয়েছে যেখানে বাহ্যিক জ্ঞান হ্রাস বিবৃতি প্লেসমেন্টটি অবহিত করে। এই বিবৃতিগুলি সরিয়ে ফেলা অপারেশনাল লজিকের কিছু অংশ অপসারণের সমতুল্য এবং একটি সংকলককে স্বয়ংক্রিয়ভাবে সেই যুক্তিটি উত্পন্ন করতে বলা যা আপনি কী ভাবছেন তা অনুমান করার জন্য এটি অনুরূপ।

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

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

tl; dr সমস্যা সি উত্স কোডটি বাহ্যিক জ্ঞানের সাথে সংকলক সরবরাহ করে না। সিদ্ধান্তহীনতা ইস্যু নয় কারণ এটি সেখানে প্রক্রিয়াটি ম্যানুয়াল বা স্বয়ংক্রিয় কিনা।


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

23

বর্তমানে, পোস্ট করা উত্তরগুলির কোনওটিই পুরোপুরি সঠিক নয়।

সংকলকগণ স্বয়ংক্রিয়ভাবে deallocations don'tোকান না কেন?

  1. কিছু কর. (আমি পরে ব্যাখ্যা করব।)

  2. তুচ্ছভাবে, আপনি free()প্রোগ্রামটি শেষ হওয়ার আগেই কল করতে পারেন । তবে free()যত তাড়াতাড়ি সম্ভব কল করার জন্য আপনার প্রশ্নের একটি অন্তর্নিহিত প্রয়োজন আছে ।

  3. free()মেমরিটি অ্যাক্সেসযোগ্য হওয়ার সাথে সাথে যে কোনও সি প্রোগ্রামে কখন ফোন করা উচিত তা অনস্বীকার্য, অর্থাত্ সীমাবদ্ধ সময়ে উত্তর সরবরাহকারী কোনও অ্যালগরিদমের ক্ষেত্রে এমন কোনও ঘটনা রয়েছে যা এটি আবৃত করে না। এটি - এবং স্বেচ্ছাসেবী কর্মসূচির অন্যান্য অনেক অনস্বীকার্যতা - হ্যালটিং সমস্যা থেকে প্রমাণিত হতে পারে ।

  4. একটি অনস্বীকার্য সমস্যা সর্বদা কোনও অ্যালগরিদমের দ্বারা সীমাবদ্ধ সময়ে সমাধান করা যায় না, সে কোনও সংকলক বা মানুষ whether

  5. মানুষ সি প্রোগ্রামের একটি সাবসেটে লেখার চেষ্টা করুন যা তাদের অ্যালগোরিদম (নিজেরাই) দ্বারা মেমরির নির্ভুলতার জন্য যাচাই করা যেতে পারে।

  6. কিছু ভাষা সংকলকটিতে # 5 তৈরি করে # 1 অর্জন করে। তারা মেমোরি বরাদ্দের যথেচ্ছ ব্যবহার সহ প্রোগ্রামগুলিকে মঞ্জুরি দেয় না, বরং এগুলির একটি নির্ধারিত উপসেট। ফথ এবং মরিচা দুটি ভাষার উদাহরণ যা সি এর চেয়ে আরও বেশি সীমাবদ্ধ মেমরি বরাদ্দ রয়েছে malloc(), এটি (1) সনাক্ত করতে পারে যে কোনও প্রোগ্রাম তাদের সিদ্ধান্ত গ্রহণযোগ্য সেট (2) এর বাইরে লিখিত হয়েছে কিনা তা স্বয়ংক্রিয়ভাবে সন্নিবেশ করান।


1
আমি বুঝতে পারি জং এটি কী করে। তবে আমি কখনও কোনও ফোর্বের কথা শুনিনি যা এটি করেছিল। তুমি কি বিস্তারিত বলতে পারো?
মিল্টন সিলভা

2
@ মিল্টনসিলভা, চতুর্থ - কমপক্ষে এটির সবচেয়ে মৌলিক, মূল বাস্তবায়ন - এর একটি স্তূপ রয়েছে, একটি গাদা নয়। এটি কল স্ট্যাক পয়েন্টারকে সরানো বরাদ্দ / অবলম্বন করে তোলে, একটি কাজ যা সংকলক সহজেই করতে পারে। ফোরথটি খুব সাধারণ হার্ডওয়্যারকে লক্ষ্য করে তৈরি করা হয়েছিল এবং কখনও কখনও অ-ডায়নামিক মেমরি যা কার্যক্ষম হয়। এটি স্পষ্টতই তুচ্ছ-তুচ্ছ প্রোগ্রামগুলির একটি কার্যকর সমাধান নয়।
পল ড্রাগার

10

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

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


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

১. আমি কখনও বলিনি যে চিন্তাভাবনা মেশিনগুলি অপূর্ণযোগ্য হতে পারে। তারা ইতিমধ্যে অনেক ক্ষেত্রে মানুষের চেয়ে ভাল। ২. কর্মের পূর্বশর্ত হিসাবে পরিপূর্ণতার প্রত্যাশা (এমনকি সম্ভাব্য) একটি অযৌক্তিকতা।
আন্দ্রে সৌজা লেমোস

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

উদ্বেগ, মেশিনগুলির মতো মানুষের মধ্যে সর্বদা বাইরে থেকে আসে ।
আন্দ্রে সৌজা লেমোস

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

9

স্বয়ংক্রিয় মেমরি পরিচালনার অভাব ভাষার বৈশিষ্ট্য।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডিডাব্লিউ

2
এটি (প্রশ্নের সিএস অংশ) প্রশ্নের উত্তর কীভাবে?
রাফেল

6
@ রাফেল কম্পিউটার বিজ্ঞানের অর্থ এই নয় যে আমাদের অস্পষ্ট প্রযুক্তিগত উত্তরগুলি সন্ধান করা উচিত। সংকলকরা এমন অনেকগুলি কাজ করেন যা সাধারণ ক্ষেত্রে অসম্ভব। আমরা যদি স্বয়ংক্রিয় মেমরি পরিচালনা চাই, আমরা এটি বিভিন্ন উপায়ে প্রয়োগ করতে পারি। সি তা করে না, কারণ এটি করার কথা নয়।
জৌনি স্যারন

9

বিষয়টি বেশিরভাগ ক্ষেত্রে aতিহাসিক নিদর্শন, বাস্তবায়নের অসম্ভবতা নয়।

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

আপনি যদি সি ++ 11 বা মরিচের মতো আরও আধুনিক নিম্ন-স্তরের ভাষাগুলি সন্ধান করেন তবে আপনি দেখতে পাবেন যে তারা বেশিরভাগ ক্ষেত্রে পয়েন্টারের ধরণে মেমরির মালিকানা স্পষ্ট করে সমস্যার সমাধান করেছে। সি ++ তে আপনি মেমরি ধরে রাখতে unique_ptr<T>একটি সমতল পরিবর্তে একটি ব্যবহার করবেন এবং প্লেইনটির বিপরীতে যখন অবজেক্টটি স্কোপের শেষে পৌঁছবে তখন স্মৃতিটি মুক্ত হয়ে যায় তা নিশ্চিত করে । প্রোগ্রামার মেমোরিটিকে অন্য থেকে অন্যের হাতে তুলে দিতে পারে তবে মেমরিটিতে কেবল একটিই পয়েন্ট করা যায়। সুতরাং এটি সর্বদা স্পষ্ট যে মেমরিটির মালিক এবং কখন এটি মুক্ত করা দরকার।T*unique_ptr<T>T*unique_ptr<T>unique_ptr<T>

সি ++, পশ্চাদপটে সামঞ্জস্যতার কারণে, এখনও পুরানো স্টাইলের ম্যানুয়াল মেমরি ম্যানেজমেন্ট এবং এইভাবে কোনও এর সুরক্ষা রোধ করার জন্য বাগ বা উপায় তৈরি করার অনুমতি দেয় unique_ptr<T>। মরিচা এমনকি আরও কঠোর কারণ এটি সংকলক ত্রুটির মাধ্যমে মেমরির মালিকানা বিধি প্রয়োগ করে।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
রাফেল

6

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

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

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

আপনি যদি গিগাবাইট র‌্যাম এবং ভার্চুয়াল মেমরির সাথে একটি পিসিতে চালাচ্ছেন তবে অবশ্যই আপনি এটি কখনও লক্ষ্য করবেন না। আপনি যদি আরও সীমিত সংস্থান সহ এমন কোনও সিস্টেমে চালাচ্ছেন (বলুন, একটি এমবেডেড সিস্টেম বা ফোন) তবে এটি গুরুত্ব সহকারে নেওয়া দরকার। এটি কেবল তাত্ত্বিক নয় - .NET কমপ্যাক্ট ফ্রেমওয়ার্ক ব্যবহার করে এবং সি # তে বিকাশ করার সময় আমি ব্যক্তিগতভাবে এই সমস্যাগুলি তৈরি করতে দেখেছি (যেমন ডিভাইসের ধরণের সমস্যার বিপর্যয় ঘটে) N


আপনি তাত্ত্বিকভাবে প্রতিটি বরাদ্দের আগে একটি জিসি চালাতে পারেন।
এড্রিয়ানএন

4
@ অ্যাড্রিয়ানএন তবে বাস্তবে এটি করা হয়নি কারণ এটি মানসিক হবে। গ্রাহামের বিষয়টি এখনও দাঁড়িয়ে আছে: রানটাইমের ক্ষেত্রে বা প্রয়োজনীয় উদ্বৃত্ত মেমরির ক্ষেত্রে জিসিগুলি সর্বদা যথেষ্ট ওভারহেড ব্যয় করে। আপনি এই ভারসাম্যটি চূড়ান্ত উভয়ের দিকেই সামঞ্জস্য করতে পারেন তবে আপনি মৌলিকভাবে ওভারহেড সরাতে পারবেন না।
কনরাড রুডলফ

স্মৃতি মুক্ত হয়ে গেলে "বিলম্ব" হ'ল ভার্চুয়াল-মেমরি সিস্টেমে সীমিত সংস্থান থাকা সিস্টেমের চেয়ে সমস্যা বেশি। পূর্ববর্তী ক্ষেত্রে, কোনও প্রোগ্রামের জন্য 200MB এর তুলনায় 100MB ব্যবহার করা আরও ভাল হতে পারে যদিও সিস্টেমটিতে 200MB উপলব্ধ রয়েছে তবে পরবর্তী ক্ষেত্রে জিসি চালানোর কোনও আগেই প্রয়োজন হবে না যদি না যে কারওর মধ্যে বিলম্ব বেশি গ্রহণযোগ্য হয় would অন্যদের তুলনায় কোডের অংশগুলি।
সুপারক্যাট

আমি এটি দেখতে ব্যর্থ হয়েছি কীভাবে এটি (প্রশ্নের সিএস অংশ) প্রশ্নের উত্তর দেওয়ার চেষ্টা করে।
রাফেল

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

4

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

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

বাস্তব জীবনে, deallocations হ'ল গ্রান্ট ওয়ার্ক বা বয়লারপ্লেট; আমাদের মস্তিষ্কগুলি সেগুলি স্বয়ংক্রিয়ভাবে পূরণ করে এবং এটি সম্পর্কে ক্ষুব্ধ হয় এবং "সংকলক এটি ঠিক তেমন বা আরও ভাল করতে পারে" অনুভূতিটি সত্য। তত্ত্বের ক্ষেত্রে, যদিও এটি হয় না, যদিও ভাগ্যক্রমে অন্যান্য ভাষা আমাদের তত্ত্বের আরও পছন্দ দেয়।


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

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

4

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

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

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


আমি এখানে একটি অবদান দেখতে ব্যর্থ।
বাবু

3

সি এর মতো ভাষায়, প্রোগ্রামারটি কল করার জন্য নিখরচায় সন্নিবেশ করানো আশা করে। সংকলক স্বয়ংক্রিয়ভাবে এটি করে না কেন?

কারণ একটি মেমরি ব্লকের আজীবন প্রোগ্রামারের সিদ্ধান্ত, সংকলকের নয়।

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

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


-1

সি এর মতো ভাষায়, প্রোগ্রামারটি কল করার জন্য নিখরচায় সন্নিবেশ করানো আশা করে। সংকলক স্বয়ংক্রিয়ভাবে এটি করে না কেন?

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

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

যে সমস্ত বস্তুগুলির উদ্দেশ্যযুক্ত ব্যবহার তাদের স্বয়ংক্রিয় সময়কাল প্রদান বন্ধ করে দেয় সেগুলি হ'ল সংক্ষেপে যাদের জীবনকাল সংকলনের সময় নির্ধারণ করা যায় না।

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