সংকলক-লেখকদের আসলে মেশিন কোডটি 'বোঝার' দরকার? [বন্ধ]


10

একটি বিজোড় প্রশ্ন হতে পারে।

একটি লোক সি ++ সংকলক (বা যে কোনও নন-ভিএম ভাষা) লিখছে: তার কি কাঁচা মেশিনের ভাষা পড়তে / লিখতে সক্ষম হওয়া দরকার? ওটা কিভাবে কাজ করে?

সম্পাদনা: আমি বিশেষত এমন সংকলকগুলি উল্লেখ করছি যা মেশিন কোডে সংকলন করে, অন্য কোনও প্রোগ্রামিং ভাষায় নয়।



1
না। এটি আপনার জানা দরকার নেই, আপনি কেবল অন্ধভাবে, নির্বোধভাবে
এসকে-যুক্তি

1
কফিসক্রিপ্ট জাভাস্ক্রিপ্টে সংকলন করে।
কার্তিক

@ কার্তিক জাভা স্ক্রিপ্ট সংকলিত কফিস্ক্রিপ্ট সংকলকটিতে কি জাভাস্ক্রিপ্ট সংকলক অন্তর্ভুক্ত রয়েছে যা জাভাস্ক্রিপ্ট সংকলিত যা কিছু সংকলন করে? অথবা এটি কেবল জাভাস্ক্রিপ্ট উত্স কোড এবং আরও কিছুর সংকলন করে?
আভিভ কোহন

কফিস্ক্রিপ্ট সংকলক সহজভাবে কফিস্ক্রিপ্টটিকে জাভাস্ক্রিপ্টে রূপান্তর করে। জাভাস্ক্রিপ্ট সংকলিত নয়, এটি ব্রাউজার দ্বারা পরিচালিত হয়। আমি বলতে চেয়েছিলাম যে আপনি একটি সংকলক লিখতে পারেন যা একটি ভাষা অন্য ভাষায় সংকলন করে, তার জন্য আপনাকে মেশিনের ভাষা জানতে হবে না। আরেকটি উদাহরণ হ'ল 'এসপিএল' সংকলক যা শেক্সপিয়র নাটকগুলি সি ++ তে সংকলন করে। shakespearelang.sourceforge.net
কার্তিক

উত্তর:


15

একদম না. আপনার সংকলকটির পরিবর্তে এসেম্বলি কোড নির্গত করা পুরোপুরি সম্ভব (এবং প্রায়শই এমনকি পছন্দসই)। এর পরে এসেমব্লার আসল মেশিন কোড তৈরির যত্ন নেয়।

যাইহোক, ভি-ভিএম বাস্তবায়ন বনাম ভিএম বাস্তবায়ন সম্পর্কিত আপনার পার্থক্য কার্যকর নয়।

  • প্রারম্ভিকদের জন্য, মেশিনের কোডে একটি ভিএম বা প্রাক-সংকলন ব্যবহার কোনও ভাষা বাস্তবায়নের বিভিন্ন উপায়; বেশিরভাগ ক্ষেত্রে কৌশল প্রয়োগ করে কোনও ভাষা প্রয়োগ করা যেতে পারে। আমাকে আসলে একবার C ++ দোভাষী ব্যবহার করতে হয়েছিল ।

  • এছাড়াও, জেভিএম এর মতো অনেক ভিএম-র উভয়েরই একটি বাইনারি মেশিন কোড এবং কিছু এসেম্বলার থাকে, যেমন একটি সাধারণ স্থাপত্যের মতো।

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

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


এবং এলএলভিএমের আর একটি দুর্দান্ত সম্পত্তি হ'ল দক্ষ ব্যাকএন্ড বাস্তবায়নের জন্য একটিকে লক্ষ্য ISA গভীরভাবে বুঝতে হবে না। এটি দুর্দান্ত ঘোষণামূলক, সুতরাং কেউ এটি বুঝতে না চেষ্টা করেও .td ফাইলগুলিতে একটি আইএসএ স্পেসিফিকেশন প্রায় অনুলিপি করে আটকান।
এসকে-লজিক

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

5
@ প্রোগ হ্যাঁ আপনি যদি বিমূর্ততার একটি স্তর তৈরি করেন তবে আপনাকে কেবল নীচের স্তরটি বুঝতে হবে। যদিও সমস্ত স্তরগুলির বুনিয়াদি বোঝাপড়া কার্যকর হয় তবে এটি সত্যিই প্রয়োজনীয় নয়। ট্রানজিস্টার ব্যবহার করার জন্য আপনার কোয়ান্টাম পদার্থবিজ্ঞান বোঝার দরকার নেই। সিপিইউ ব্যবহার করতে আপনাকে চিপ ডিজাইন বুঝতে হবে না। অ্যাসেম্বলি লিখতে আপনাকে মেশিন কোড জানতে হবে না। কোনও ভিএম ইত্যাদি ব্যবহার করার সময় আপনাকে প্ল্যাটফর্মের নির্দেশের সেটটি জানতে হবে না But তবে কাউকে আপনার নীচে those বিমূর্ত স্তরগুলি তৈরি করতে হয়েছিল।
আমন

1
@ এসকে-যুক্তি আমি যা শুনেছি তা থেকে সত্য নয় (কমপক্ষে আপনি যদি ভাল কোড চান তবে)। লোকেদের জন্য যারা আর্চ bac A ব্যাকেন্ড বাস্তবায়ন করেছিল তাদের বেশ কয়েকটি চ্যালেঞ্জ ছিল (একের জন্য স্থানান্তর, লোড-স্টোরের ধরণগুলি ভয়াবহ, ..)। এবং এটি ঘরের বৃহত্তম হাতিটিকে উপেক্ষা করছে : আইএসএর স্মৃতি মডেল এবং আপনার আগ্রহী ভাষাটির মেমরি মডেল You আপনি একটি সংকলকটিতে কাজ করতে পারেন, তবে আপনি স্থাপত্যটি না বুঝে ব্যাকএন্ডে কাজ করতে পারবেন না
ভু

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

9

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

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


এবং যে ব্যক্তিটি সেই সরঞ্জাম বা লাইব্রেরিটি লিখছেন যা মেশিনের ভাষায় প্রকৃত রূপান্তর করে, তাকে কি মেশিনের ভাষা পুরোপুরি বুঝতে হবে, তাই না?
আভিভ কোহন

3
@ প্রোগ্রাম আপনি কি কোনও প্রোগ্রামিং ভাষা সম্পূর্ণরূপে প্রোগ্রাম করার জন্য বুঝতে হবে? না, তবে আপনি সম্ভবত সাব-অনুকূল কোডটি লিখবেন এবং অন্যরা যেভাবে সক্ষম হতে পারে তা আপনি কিছু করতে পারবেন না। আপনি যদি অনুবাদ করে এমন কোনও সংকলক লিখে থাকেন তবে আপনার কি মেশিনের ভাষা সম্পূর্ণরূপে বুঝতে হবে? না, তবে আপনার সংকলকটি সাব-ইস্টিমাল এবং কিছু কিছু করতে অক্ষম হবে।
সুমুরাই 8

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

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

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

3

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

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

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


2

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

একটি সংকলক লেখার তাদের আউটপুট বুঝতে হবে , তবে এটি প্রায়শই মেশিন কোড নয়।

বেশিরভাগ প্রোগ্রামাররা কখনই এমন সংকলক লিখবে না যা মেশিন কোড বা অ্যাসেমব্লিং কোডকে আউটপুট করে তবে কাস্টম সংকলকগুলি অন্যান্য আউটপুট উত্পাদন করতে প্রচুর প্রকল্পে খুব কার্যকর হতে পারে।

ওয়াইএসিসি এমন একটি সংকলক যা মেশিন কোড আউটপুট দেয় না…।


0

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

মেশিন কোডে সি ++ সংকলনের কয়েকটি সূক্ষ্মতা এখানে রইল: (আমার মাথার উপরের অংশে, আমি নিশ্চিত যে আরও অনেক কিছুই আমি ভুলে যাচ্ছি))

  1. কি আকার হবে int ? এখানে "সঠিক" পছন্দটি একটি শিল্প যা মেশিনের প্রাকৃতিক পয়েন্টার আকার, বিভিন্ন আকারের গাণিতিক ক্রিয়াকলাপের জন্য ALU এর কার্যকারিতা এবং মেশিনের জন্য বিদ্যমান সংস্থাগুলি দ্বারা করা পছন্দগুলি উভয়ের উপর নির্ভর করে। যন্ত্রটিতে কি 64৪-বিট পাটিগণিত রয়েছে? যদি তা না হয় তবে 32-বিট সংখ্যার সংযোজন একটি নির্দেশে অনুবাদ করতে হবে যখন while৪-বিট সংখ্যার যোগ করার জন্য .৪-বিট সংখ্যার জন্য কোনও ফাংশন কলে অনুবাদ করা উচিত। মেশিনটিতে কি 8-বিট এবং 16-বিট যুক্ত অপারেশন রয়েছে বা 32-বিট অপস এবং মাস্কিং (উদাহরণস্বরূপ ডিইসি আলফা 21064) আছে তাদের সিমুলেট করতে হবে?

  2. মেশিনে অন্যান্য সংকলক, গ্রন্থাগার এবং ভাষা দ্বারা ব্যবহৃত কলিং কনভেনশন কী? প্যারামিটারগুলি কি স্ট্যাকের উপর ডান থেকে বাম বা বাম থেকে ডান দিকে চাপ দেয়? অন্যরা স্ট্যাকের সময় কিছু প্যারামিটারগুলি কি রেজিস্টারে যায়? Ints এবং বিভিন্ন রেজিস্টার স্পেসে ভাসমান হয়? বরাদ্দকৃত প্যারামিটারগুলিকে ভ্যারাগস কলগুলিতে বিশেষভাবে চিকিত্সা করা দরকার? কোন রেজিস্টারগুলি কলার-সেভড এবং কোনটি কল-সেভড? আপনি কি লিফ-কল অপটিমাইজেশন সম্পাদন করতে পারেন?

  3. মেশিনের প্রতিটি শিফ্ট নির্দেশাবলী কী করে? আপনি যদি 65 বিট দ্বারা 64 বিট পূর্ণসংখ্যার স্থানান্তরিত করতে বলেন তবে ফলাফল কী হবে? (অনেকগুলি মেশিনে ফলাফল 1 বিট বদল করার সমান, অন্যদের কাছে ফলাফল "0" হয়))

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

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