সংকলকগণ সমাবেশ কোড কেন উত্পাদন করে?


19

এসেম্বলারের মাধ্যমে অ্যাসেম্বলির ভাষা মেশিনের ভাষায় রূপান্তরিত হয়। কেন একটি সংকলক উচ্চ স্তরের ভাষা সমাবেশে রূপান্তর করবে? এটি কি উচ্চ স্তরের ভাষা থেকে সরাসরি মেশিন কোডে রূপান্তর করতে পারে না?

উত্তর:


22

সংকলকগণ যথাযথ মেশিন কোডের চেয়ে সমাবেশ তৈরির অন্যান্য কারণ হলেন:

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

সমাবেশ ভাষা কেন এত দক্ষ, যদিও এটি ইংরেজিতেও লেখা হয় এবং প্রসেসর কীভাবে এটি বোঝে?
কোডারসাম

3
@ কোডারসাম সমাবেশ একটি আনুষ্ঠানিক ভাষা, প্রাকৃতিক ভাষা নয়। এটি মেশিন ভাষার খুব কাছাকাছি। সুতরাং ট্রান্সলেশন অদক্ষতার পরিচয় দেয় না।
মার্টিন বার্গার

আপনি যখন বলেন, "মেশিন ভাষার খুব কাছে", এর অর্থ কী? আমি সত্যিই এটি নিয়ে বিভ্রান্ত!
কোডারসাম

2
@ কোডারসাম সুনির্দিষ্ট অর্থ জটিল, তবে বীজগণিতের মধ্যে হোমোমর্ফিজমের মতো কিছু। আপনি যখন অনুবাদ করেন, xax সমাবেশে "eax যোগ করুন, # 2" বলুন, আপনি এটি ডিফাইফায় অনুবাদ করতে পারেন (অথবা অপ-কোডটি অন্য যে কোনও কিছু হতে পারে), প্রসঙ্গটি না দেখিয়ে, আর কোনও স্টাফ না যোগ করেই transla সমাবেশের কোনও বিমূর্ততা নেই।
মার্টিন বার্গার

1
"সমাবেশের কোনও বিমূর্ততা নেই" - আমি বলব লেবেলের নামগুলি ইতিমধ্যে একটি বিমূর্ততা (অফসেট থেকে)। এছাড়াও, প্রসঙ্গটি একটি ভূমিকা পালন করে: যেমন সর্বশেষ ঘটনার নির্দেশনার উপর নির্ভর করে add eax,2অনুবাদ করা যেতে পারে 83 c0 02বা এতে অনুবাদ করা যেতে পারে । 66 83 c0 02use16
রুসলান

15

একটি সংকলক সাধারণত উচ্চ-স্তরের কোডটি সরাসরি মেশিন ল্যাঙ্গুয়েজে রূপান্তরিত করে তবে এটি একটি মডুলার উপায়ে তৈরি করা যেতে পারে যাতে একটি ব্যাক-এন্ড মেশিন কোড এবং অন্যান্য সমাবেশ কোড (জিসিসির মতো) নির্গত করে। কোড জেনারেশন পর্যায়ে "কোড" তৈরি করা হয় যা মেশিন কোডের অভ্যন্তরীণ উপস্থাপনা যা মেশিনের ভাষা বা সমাবেশ কোডের মতো ব্যবহারযোগ্য বিন্যাসে রূপান্তর করতে হবে।


তদ্ব্যতীত, যদি উত্সটিতে কিছু সমাবেশ কোড অন্তর্ভুক্ত থাকে তবে সেই ইনলাইন অ্যাসেমব্লিকে যেভাবেই অনুবাদ করার জন্য অবশ্যই কোনও ব্যবস্থা উপলব্ধ থাকতে হবে।
পল এ ক্লেটন 15

সমাবেশ ভাষা কেন এত দক্ষ, যদিও এটি ইংরেজিতেও লেখা হয় এবং প্রসেসর কীভাবে এটি বোঝে?
কোডারসম

1
সমাবেশ ভাষা মেশিন কোডের একটি "ইংরেজি" বর্ণনা।
যুবাল ফিল্মাস

11

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

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


1

এমনকি একই নির্দেশিকা সেট ব্যবহার করা প্ল্যাটফর্মগুলিতে বিভিন্ন স্থান পরিবর্তনযোগ্য অবজেক্ট ফাইল ফর্ম্যাট থাকতে পারে। আমি "a.out" (ইউনিক্সের প্রথম দিকের), ওএমএফ, এমজেড (এমএস-ডস এক্সি), এনই (16-বিট উইন্ডোজ), সিওএফএফ (ইউএনএক্স সিস্টেম ভি), মাচ-ও (ওএস এক্স এবং আইওএস) এবং ইএলএফ (লিনাক্স এবং অন্যান্য), পাশাপাশি এর এক্সকোএফএফ (এআইএক্স), ইসিএফএফ (এসজিআই), এবং সিওএফএফ-ভিত্তিক পোর্টেবল এক্সিকিউটেবল (পিই) 32-বিট উইন্ডোজে রয়েছে। একটি সংকলক যা অ্যাসেম্বলি ভাষা তৈরি করে তার জন্য অবজেক্ট ফাইল ফর্ম্যাটগুলি সম্পর্কে বেশি কিছু জানতে হবে না, এসেম্বেলার এবং লিঙ্কারকে পৃথক প্রক্রিয়াতে সেই জ্ঞানটি আবদ্ধ করতে দেয় allowing

স্ট্যাক ওভারফ্লোতে ওএমএফ এবং সিওএফএফের মধ্যে পার্থক্যও দেখুন ।


1

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

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

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

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

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


1

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

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

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

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

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

কেন ???

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