স্থানীয়ভাবে সংকলিত ভাষাগুলিতে কীভাবে আবর্জনা সংগ্রহ কাজ করে?


79

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

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

সংকলিত ভাষাগুলির সাথে এটি কীভাবে কাজ করবে? আমার বোধগম্যতা হল একবার সংকলকটি লক্ষ্য কোডে উত্স কোডটি সংকলন করে - বিশেষত নেটিভ মেশিন কোড - এটি সম্পন্ন হয়। এর কাজ শেষ। সুতরাং সংকলিত প্রোগ্রামটি কীভাবে পাশাপাশি আবর্জনা সংগ্রহ করা যেতে পারে?

"আবর্জনা" অবজেক্টগুলি মুছতে প্রোগ্রামটি চালিত হওয়ার সময় সংকলকটি কি কোনও উপায়ে সিপিইউতে কাজ করে? বা সংকলকটি সংকলিত প্রোগ্রামটির সম্পাদনযোগ্যতে কিছু ন্যূনতম আবর্জনা সংগ্রহকারীকে অন্তর্ভুক্ত করে।

আমি বিশ্বাস করি স্ট্যাক ওভারফ্লোতে এই উত্তর থেকে এই উত্তরের কারণে আমার উত্তরোত্তর বক্তব্যটির আগেরটির চেয়ে বেশি বৈধতা থাকবে :

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

শেষ বিবৃতিটি বোঝায় যে সংকলকটিতে চূড়ান্ত নির্বাহযোগ্য কিছু প্রোগ্রাম অন্তর্ভুক্ত রয়েছে যা প্রোগ্রাম চলাকালীন আবর্জনা সংগ্রহকারী হিসাবে কাজ করে।

পৃষ্ঠার গার্বেজ কালেকশন সম্পর্কে ডি ভাষা ওয়েবসাইট যা স্থানীয়ভাবে কম্পাইল এবং একটি ঐচ্ছিক আবর্জনা সংগ্রাহক রয়েছে - - এছাড়াও প্রজ্ঞান যে কিছু পটভূমি প্রোগ্রাম গার্বেজ কালেকশন বাস্তবায়ন মূল এক্সিকিউটেবল প্রোগ্রাম পাশাপাশি রান বলে মনে হয়।

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

উপরে উল্লিখিত পদ্ধতিটি যদি ব্যবহার করা হয় তবে এটি ঠিক কীভাবে কাজ করবে? সংকলকটি কিছু আবর্জনা সংগ্রহের প্রোগ্রামের একটি অনুলিপি সঞ্চয় করে এবং এটি তৈরি করা প্রতিটি নির্বাহযোগ্যের মধ্যে আটকায়?

নাকি আমি আমার ভাবনায় ত্রুটিযুক্ত? যদি তা হয় তবে সংকলিত ভাষার জন্য আবর্জনা সংগ্রহের বাস্তবায়নের জন্য কোন পদ্ধতি ব্যবহার করা হয় এবং কীভাবে তারা ঠিক কাজ করবে?


1
আমি এটির প্রশংসা করব যদি এই প্রশ্নের ঘনিষ্ঠ ভোটার ঠিক কী ভুল বলতে পারে তবে আমি এটি সংশোধন করতে পারি?
খ্রিস্টান ডিন

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

7
আপনি আবর্জনা সংগ্রাহককে রানটাইম লাইব্রেরির অংশ হিসাবে বিবেচনা করতে পারেন যা ভাষার সমতুল্য প্রয়োগ করে malloc()
বর্মার

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

1
জিসি গতিশীল মেমোরির একটি বৈশিষ্ট্য, দোভাষীর কোনও বৈশিষ্ট্য নয়।
দিমিত্রি গ্রিগরিয়েভ

উত্তর:


52

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

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

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

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

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


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

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

2
@ করসিকা বা বরং, লাইনটি আরও স্বতন্ত্র। এখন আমরা দেখতে পাচ্ছি যে এগুলি ভিন্ন সম্পর্কযুক্ত ধারণা, এবং প্রত্যেকের বিপরীত শব্দ নয়।
Kroltan

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

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

123

সংকলকটি কিছু আবর্জনা সংগ্রহের প্রোগ্রামের একটি অনুলিপি সঞ্চয় করে এবং এটি তৈরি করা প্রতিটি নির্বাহযোগ্যের মধ্যে পেস্ট করে?

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


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

18
সি ++ তে একটি রানটাইম লাইব্রেরিও রয়েছে যা dynamic_castআপনি কোনও জিসি যোগ না করলেও মেক এবং ব্যতিক্রমগুলির মতো কাজ করে।
সেবাস্তিয়ান রেডল

23
রানটাইম লাইব্রেরি অগত্যা প্রতিটি নির্বাহযোগ্য (যা স্ট্যাটিক লিঙ্কিং বলা হয়) এ অনুলিপি করা হয় না এটি কেবলমাত্র উল্লেখ করা যেতে পারে (লাইব্রেরিযুক্ত বাইনারি যাওয়ার পথ) এবং সম্পাদনের সময় অ্যাক্সেস করা যায়: এটি গতিশীল লিঙ্কিং।
mouviciel

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

15
@ মিলিমুজ: হ্যাঁ উদাহরণস্বরূপ, জিসিসিতে, কোডটির এই অংশটি হ'ল crt0.o(যার অর্থ " সি আর আন টি আইমে, খুব বেসিক"), যা প্রতিটি প্রোগ্রামের সাথে যুক্ত হয় (বা কমপক্ষে প্রতিটি প্রোগ্রাম যা স্বতন্ত্র নয় )।
Jörg W Mittag

58

অথবা সংকলকটি সংকলিত প্রোগ্রামের কোডটিতে কিছু ন্যূনতম আবর্জনা সংগ্রহকারীকে অন্তর্ভুক্ত করে।

এটি বলার একটি অদ্ভুত উপায় "সংকলকটি একটি লাইব্রেরির সাথে প্রোগ্রামটিকে লিঙ্ক করে যা আবর্জনা সংগ্রহ করে"। তবে হ্যাঁ, যা ঘটছে।

এটি বিশেষ কিছু নয়: সংকলকরা সাধারণত সংকলিত প্রোগ্রামগুলিতে প্রচুর গ্রন্থাগারকে সংযুক্ত করে; অন্যথায় সংকলিত প্রোগ্রামগুলি স্ক্র্যাচ থেকে অনেক কিছুই পুনরায় বাস্তবায়ন না করে খুব বেশি কিছু করতে পারে না: এমনকি স্ক্রিনে / একটি ফাইল / এমনকি একটি পাঠ্য লেখার জন্য একটি লাইব্রেরি প্রয়োজন।

তবে সম্ভবত জিসি এই অন্যান্য লাইব্রেরি থেকে আলাদা, যা ব্যবহারকারীরা যে স্পষ্টতই এপিআই সরবরাহ করে?

না: বেশিরভাগ ভাষায়, রানটাইম লাইব্রেরিগুলি জিসি ছাড়িয়ে জনসমক্ষে এপিআই ছাড়াই পর্দার পিছনে অনেক কাজ করে do এই তিনটি উদাহরণ বিবেচনা করুন:

  1. ব্যতিক্রম প্রচার এবং স্ট্যাক আনইন্ডিং / ডেস্ট্রাক্টর কলিং।
  2. গতিশীল মেমরি বরাদ্দ (যা সাধারণত কোনও ফাংশন কল করে না, যেমন সি হিসাবে, এমনকি কোনও আবর্জনা সংগ্রহ না থাকলেও)।
  3. গতিশীল ধরণের তথ্যের সন্ধান (ক্যাসেট ইত্যাদির জন্য)।

সুতরাং একটি আবর্জনা সংগ্রহ লাইব্রেরি মোটেও বিশেষ নয় এবং কোনও প্রোগ্রাম সময়ের আগেই সংকলিত হয়েছিল কিনা তার সাথে কোনও প্রাইরির কোনও সম্পর্ক নেই।


এই কিছু তৈরি পয়েন্ট উপর সারগর্ভ প্রস্তাব এবং বলে মনে হচ্ছে না ব্যাখ্যা শীর্ষ উত্তর আগে 3 ঘন্টা পোস্ট
মশা

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

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

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

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

23

সংকলিত ভাষার সাথে কীভাবে এই কাজ করবে?

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

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

আমার বোধগম্যতা হল একবার সংকলকটি লক্ষ্য কোডে উত্স কোডটি সংকলন করে - বিশেষত নেটিভ মেশিন কোড - এটি সম্পন্ন হয়। এর কাজ শেষ।

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


আমি দৃ hand়ভাবে জিসি হ্যান্ডবুকটি পড়ার পরামর্শ দিচ্ছি । উত্তর দেওয়ার জন্য একটি পুরো বইয়ের প্রয়োজন । তার আগে, আবর্জনা সংগ্রহের উইকিপেজ পড়ুন (যা আমি ধরে নিই আপনি নীচে পড়ার আগে পড়েছেন)।

রানটাইম সিস্টেম কম্পাইল ভাষা প্রয়োগের আবর্জনা সংগ্রাহক রয়েছে এবং কম্পাইলার কোড যা উৎপাদিত হয় হইয়া সেই বিশেষ রানটাইম সিস্টেমে। বিশেষত, বরাদ্দ আদিম (মেশিন কোডে সংকলিত যেগুলি) রানটাইম সিস্টেমকে কল করবে (বা পারে)।

সুতরাং সংকলিত প্রোগ্রামটি কীভাবে পাশাপাশি আবর্জনা সংগ্রহ করা যেতে পারে?

রানটাইম সিস্টেমটি ব্যবহার করে (এবং "বন্ধুত্বপূর্ণ" এবং "সাথে সামঞ্জস্যপূর্ণ") মেশিন কোড নির্গত করে by

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

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

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

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

সংকলকটি কিছু আবর্জনা সংগ্রহের প্রোগ্রামের একটি অনুলিপি সঞ্চয় করে এবং এটি তৈরি করা প্রতিটি নির্বাহযোগ্যের মধ্যে আটকায়?

প্রকার, রকম. যাইহোক, রানটাইম সিস্টেম একটি ভাগ গ্রন্থাগার, ইত্যাদি কখনও কখনও (লিনাক্সের এবং একাধিক অন্যান্য POSIX সিস্টেমে) হতে পারে এটা এমনকি একটি স্ক্রিপ্ট ব্যাখ্যাকারী, যেমন প্রেরণ হতে পারে (2) execve একটি সঙ্গে কুঁড়েঘর । অথবা কোনও ইএলএফ দোভাষী, এলফ (5) এবং PT_INTERPইত্যাদি দেখুন

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


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

4
@ কনরাডরুডল্ফ: এটি আপনার "ফর্মাল" এবং "স্পেসিফিকেশন" এর সংজ্ঞার উপর পুরোপুরি নির্ভর করে :-D সেখানে আইএসও / আইসিসি 30170: 2012 রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্পেসিফিকেশন রয়েছে , যা রুবি ১.৮ এবং ১.৯ এর ছেদটির একটি ছোট উপসেট নির্দিষ্ট করে। নেই রুবি ফটকা খেলা সুইট , সীমানা মামলার যে "এক্সিকিউটেবল বৈশিষ্ট" এর একটি ধরনের হিসেবে পরিবেশন উদাহরণ একটি সেট। তারপরে, ডেভিড ফ্লানাগান এবং ইউকিহিরো মাতসুমোটোর রবি প্রোগ্রামিং ভাষা
Jörg ডব্লু মিটাগ

4
এছাড়াও, রুবি ডকুমেন্টেশন । উপর বিষয় আলোচনা রুবি ইস্যু ট্র্যাকার । রুবি-কোর (ইংরেজি) এবং রুবি-ডেভ (জাপানি) মেলিংলিস্টগুলির বিষয়ে আলোচনা। সম্প্রদায়ের সাধারণ জ্ঞানের প্রত্যাশাগুলি (যেমন Array#[]ও (1) সবচেয়ে খারাপ ক্ষেত্রে, Hash#[]ও (1) সবচেয়ে খারাপের ক্ষেত্রে মোড়ক রয়েছে)। এবং শেষ কিন্তু সর্বনিম্ন নয়: ম্যাটজের মস্তিষ্ক।
Jörg ডব্লু মিটাগ

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

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

6

ইতিমধ্যে কিছু ভাল উত্তর রয়েছে তবে আমি এই প্রশ্নের পিছনে কিছু ভুল বোঝাবুঝি পরিষ্কার করতে চাই।

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

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

কোডটি কীভাবে চালাবেন তা বিবেচনা করা উচিত নয়, এটি একই আচরণ করা উচিত। মেমরি বরাদ্দ করা এবং জমানো করা রানটাইমের জন্য একটি কাজ (যেমন ফাইলগুলি খোলার জন্য, সূচনাগুলি শুরু করা ইত্যাদি)। আপনার ভাষায় আপনি কেবল লেখেন new X()বা একইভাবে। ভাষার স্পেসিফিকেশনটি যা ঘটবে তা বলে এবং রানটাইম এটি করে।

কিছু নিখরচায় মেমোরি বরাদ্দ হয়ে যায়, নির্মাতাকে ডেকে আনা হয় ইত্যাদি When যেমন আপনি ইতিমধ্যে রানটাইমটিতে রয়েছেন, যা কোডের একটি দেশীয় টুকরো, দোভাষীর অস্তিত্ব মোটেই গুরুত্বপূর্ণ নয়।

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

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


(*) কমপক্ষে সাধারণ উদ্দেশ্য কোডের বিষয়ে কথা বলার সময়, বুট লোডারগুলি এবং অন্যান্যকে একপাশে রেখে।


ওকামল এবং এসবিসিএল উভয়ই দেশীয় সংকলক। তাই সেখানে হয় "নেটিভ কম্পাইল ভাষা" বাস্তবায়নের।
বেসিল স্টারিনকিভিচ

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

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

পুনঃটুইট 1. বর্ণিত বা সংকলিত ভাষার মতো কোনও জিনিস নেই (যদিও সি এর কমই ব্যাখ্যা করা হয় এবং এলআইএসপি খুব কমই সংকলিত হত, তবে এটি আসলে কোনও ব্যাপার নয়)। ২. বেশিরভাগ সুপরিচিত ভাষার জন্য ব্যাখ্যা, সংকলন এবং মিশ্র বাস্তবায়ন রয়েছে এবং সংকলন বা ব্যাখ্যা ব্যতীত কোন ভাষা নেই।
মার্টিনাস

6
আমি মনে করি আপনার যুক্তিটি অনেক অর্থবোধ করে। কুঁচকে যাওয়ার মূল বিষয় হ'ল আপনি সর্বদা একটি "দেশীয় প্রোগ্রাম" বা "কখনই" চালিত হন না তবে আপনি এটি দেখতে চান। উইন্ডোজে কোনও এক্সই এক্সিকিউটযোগ্য নয়; এটি শুরু করার জন্য একটি লোডার এবং অন্যান্য ওএস বৈশিষ্ট্য প্রয়োজন এবং এটি আংশিকভাবে পাশাপাশি "ব্যাখ্যা করা" হয়। এটি নেট এক্সিকিউটেবলের সাথে আরও সুস্পষ্ট হয়ে ওঠে। java myprogযতটা অথবা কম নেটিভ grep myname /etc/passwdবা ld.so myprogএটা একটি এক্সিকিউটেবল (যাই হোক না কেন তার মানে) যা একটি আর্গুমেন্ট নেয় এবং ডেটার সঙ্গে অপারেশন সঞ্চালিত হয়:।
পিটার এ স্নাইডার

3

বাস্তবায়নগুলির মধ্যে বিশদগুলি পৃথক হয় তবে এর সাথে নিম্নলিখিতগুলির কিছু মিল থাকে:

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

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

জিসি অ্যালগরিদমগুলি 60 এর দশক থেকেই পড়াশোনা করা হয়েছে, এবং এই বিষয়ে বিস্তৃত সাহিত্য রয়েছে। গুগল যদি আপনি আরও তথ্য চান।

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