একজন দোভাষী কী মেশিন কোড তৈরি করে?


42

আমি সংকলক এবং দোভাষীদের বিষয়গুলি নিবিড়ভাবে অধ্যয়ন করি। আমি আমার বেস বোঝাপড়াটি সঠিক কিনা তা যাচাই করতে চাই, সুতরাং আসুন নিম্নলিখিতগুলি ধরে নেওয়া যাক:

আমার কাছে "ফুবিশ" নামে একটি ভাষা আছে এবং এর কীওয়ার্ডগুলি

<OUTPUT> 'TEXT', <Number_of_Repeats>;

সুতরাং আমি যদি 10 বার কনসোলে মুদ্রণ করতে চাই তবে আমি লিখতাম

OUTPUT 'Hello World', 10;

হ্যালো ওয়ার্ল্ড.ফুবিশ-ফাইল।

এখন আমি আমার পছন্দের ভাষায় একটি দোভাষী লিখছি - এক্ষেত্রে সি #:

using System;

namespace FoobishInterpreter
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            analyseAndTokenize(Hello World.foobish-file)//Pseudocode
            int repeats = Token[1];
            string outputString = Token[0];
            for (var i = 0; i < repeats; i++)
            {
                Console.WriteLine(outputString);
            }
        }
    }
}

খুব সহজেই দোভাষী স্তরে, অনুবাদক স্ক্রিপ্ট-ফাইল ইত্যাদি বিশ্লেষণ করতেন এবং দোভাষীর প্রয়োগের পথে বোকা-ভাষাকে কার্যকর করতেন।

কোনও সংকলক মেশিনের ভাষা তৈরি করতে পারে যা সরাসরি শারীরিক হার্ডওয়্যারটিতে চলে?

সুতরাং কোনও দোভাষী কোনও যন্ত্রের ভাষা তৈরি করে না, তবে কোনও সংকলক কি তার ইনপুটটির জন্য এটি করে?

সংকলক এবং দোভাষী কীভাবে কাজ করেন তা বেসিক উপায়ে আমার কোনও ভুল বুঝাবুঝি আছে?


21
আপনি কি মনে করেন সি # "সংকলক" কী করে? একটি ইঙ্গিত হিসাবে, এটি মেশিন কোড উত্পাদন করে না
ফিলিপ কেন্ডল

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

@ জর্জিও: আপনার মানে, জেআইটির মতো?
রবার্ট হার্ভে

2
@ রবার্টহারভে: আমি জাভা কম্পাইলার (জাভাক) বোঝাতে চেয়েছি: যতদূর আমি জানি এটি জেভিএমের জন্য বাইকোড তৈরি করে। এবং আবার এএফআইকে, জেআইটি পরে (রানটাইমে) কিছু বাইটকোড সংকলন করে যা প্রায়শই স্থানীয় মেশিনের ভাষায় ব্যবহৃত হয়।
জর্জিও

4
একটি সংকলক অর্থ অনুবাদ করা। এটি সমস্ত ধরণের ভাষা নির্গত করতে পারে: সি, সমাবেশ, জাভাস্ক্রিপ্ট, মেশিন কোড।
এসবেন স্কোভ পেডারসেন

উত্তর:


77

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

তবে আজ "সংকলক" এবং "দোভাষী" ব্যবহারের ক্ষেত্রে অনেকগুলি প্রকরণ রয়েছে। উদাহরণস্বরূপ, ভিবি 6 বাইট কোড ( ইন্টারমিডিয়েট ল্যাঙ্গুয়েজের একটি রূপ ) করতে "সংকলন" করে , যা তখন ভিবি রানটাইম দ্বারা "ব্যাখ্যা" করা হয়। সি # তেও অনুরূপ প্রক্রিয়া ঘটে, যা সিআইএল তৈরি করে যা পরে জাস্ট-ইন-টাইম সংকলক (জেআইটি) দ্বারা নির্বাহ করা হয় , যা পুরানো দিনগুলিতে একজন দোভাষী হিসাবে ভাবা হত। আপনি NGen.exe ব্যবহার করে জেআইটির আউটপুটটিকে একটি বাস্তব বাইনারি হিসাবে নির্বাহ করতে সক্ষম করতে পারেন, এর পণ্যটি পুরানো দিনগুলিতে একটি সংকলকের ফলাফল হত ।

সুতরাং আপনার প্রশ্নের উত্তরটি আগে যতটা সহজ ছিল তেমন সোজা নয়।

উইকিপিডিয়ায় আরও পড়ার
সংকলক বনাম দোভাষী


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

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

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

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

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

34

আমি নীচে যে সংক্ষিপ্তসারটি দিচ্ছি তা আমার নিজস্ব কিছু ধারণাগুলির সংযোজন সহ "সংকলক, মূলনীতি, কৌশল এবং সরঞ্জামসমূহ", আহো, লাম, শেঠি, ওলম্যান, (পিয়ারসন আন্তর্জাতিক সংস্করণ, 2007) পৃষ্ঠাগুলি 1, 2 এর উপর ভিত্তি করে।

একটি প্রোগ্রাম প্রক্রিয়াজাতকরণের জন্য দুটি প্রাথমিক পদ্ধতি হ'ল সংকলন এবং ব্যাখ্যা

সংকলন একটি প্রদত্ত ভাষায় ইনপুট হিসাবে উত্স প্রোগ্রাম হিসাবে গ্রহণ করে এবং একটি লক্ষ্য ভাষায় একটি লক্ষ্য প্রোগ্রাম আউটপুট করে।

source program --> | compiler | --> target program

যদি টার্গেট ল্যাঙ্গুয়েজ মেশিন কোড হয় তবে এটি কোনও প্রসেসরের মাধ্যমে সরাসরি চালানো যেতে পারে:

input --> | target program | --> output

সংকলন পুরো ইনপুট প্রোগ্রাম (বা মডিউল) স্ক্যান এবং অনুবাদ জড়িত এবং এটি সম্পাদন জড়িত না।

ব্যাখ্যার উত্স প্রোগ্রাম এবং এর ইনপুট হিসাবে ইনপুট হিসাবে গ্রহণ করে এবং উত্স প্রোগ্রামের আউটপুট উত্পাদন করে

source program, input --> | interpreter | --> output

ব্যাখ্যায় সাধারণত প্রোগ্রামটি একবারে একটি বিবৃতি প্রক্রিয়াকরণ (বিশ্লেষণ এবং সম্পাদন) জড়িত।

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

source program --> | translator | --> intermediate program

এই পদক্ষেপের আউটপুটটি তখন ভার্চুয়াল মেশিন দ্বারা কার্যকর করা হয় (ব্যাখ্যা করা হয়):

intermediate program + input --> | virtual machine | --> output

জিনিসগুলিকে আরও জটিল করার জন্য, জেভিএম বাইট কোডটিকে অন্য ফর্ম্যাটে রূপান্তর করতে রানটাইম-এ কেবল ইন-টাইম সংকলন সম্পাদন করতে পারে, যা পরে কার্যকর করা হয়।

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

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

তবুও, সংকলন এবং ব্যাখ্যা দুটি পৃথক প্রক্রিয়াকরণ যা উপরের চিত্রগুলিতে বর্ণিত হয়েছে,

প্রাথমিক প্রশ্নের উত্তর দিতে।

একটি সংকলক মেশিনের ভাষা তৈরি করতে পারে যা সরাসরি শারীরিক হার্ডওয়্যারটিতে চলে?

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

সুতরাং কোনও দোভাষী কোনও যন্ত্রের ভাষা তৈরি করে না তবে একটি সংকলক এটির ইনপুটটির জন্য এটি করে?

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


7
অন্য কথায়: একটি দোভাষী একটি প্রোগ্রাম পি নেন এবং তার আউটপুট হে উত্পাদন করে, একটি সংকলক পি নেয় এবং একটি প্রোগ্রাম তৈরি করে P ′ যা ওকে আউটপুট করে; দোভাষীদের মধ্যে প্রায়শই উপাদানগুলি অন্তর্ভুক্ত থাকে যা সংকলক হয় (যেমন, বাইকোডে, একটি মধ্যবর্তী উপস্থাপনা, বা জেআইটি মেশিনের নির্দেশাবলী) এবং একইভাবে একটি সংকলক একটি দোভাষী অন্তর্ভুক্ত করতে পারে (উদাহরণস্বরূপ, সংকলন-সময় গণনা মূল্যায়নের জন্য)।
জোন পুরি

"একটি সংকলক একটি দোভাষী অন্তর্ভুক্ত করতে পারে (যেমন, সংকলন-সময় গণনা মূল্যায়নের জন্য)": ভাল পয়েন্ট। আমার ধারণা লিসপ ম্যাক্রোস এবং সি ++ টেমপ্লেটগুলি এইভাবে প্রাক প্রক্রিয়াজাত করা যেতে পারে।
জর্জিও

এমনকি সহজ, সি প্রিপ্রোসেসর সিপিপি নির্দেশাবলী সহ সি উত্স কোডটি প্লেইন সিতে সংকলন করে এবং বুলিয়ান এক্সপ্রেশনগুলির জন্য একটি দোভাষীকে অন্তর্ভুক্ত করে defined A && !defined B
জন পূর্ব

@ জোনপুর্ডি আমি এটির সাথে একমত হব, তবে আমি "শ্রেণীর traditionalতিহ্যবাহী দোভাষী" এমন একটি শ্রেণিও যুক্ত করব, যা সম্ভবত উত্সটির একটি টোকানাইজড সংস্করণ ছাড়িয়ে অন্তর্বর্তী উপস্থাপনা ব্যবহার করে না। উদাহরণগুলি শেল, অনেকগুলি বেসিক, ক্লাসিক লিস্প, ৮.০ এর আগে টিসিএল এবং বিসি হবে।
hobbs

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

22

একটি সংকলক মেশিনের ভাষা তৈরি করবে

নং একটি সংকলক হ'ল একটি প্রোগ্রাম যা এর ইনপুট হিসাবে A এ ভাষায় লিখিত একটি প্রোগ্রাম নেয় এবং এর আউটপুট হিসাবে শব্দ B তে শব্দার্থ সমতুল্য প্রোগ্রাম উত্পাদন করে । ভাষা বি যে কোনও কিছু হতে পারে, এটি মেশিনের ভাষা হতে হবে না।

একটি সংকলক একটি উচ্চ-স্তরের ভাষা থেকে অন্য উচ্চ-স্তরের ভাষায় (যেমন GWT, যা জাভা সংকলন করে ECMAScript), উচ্চ স্তরের ভাষা থেকে নিম্ন স্তরের ভাষাতে (যেমন গাম্বিট, যা স্কিমকে সিতে সংকলন করে), একটি উচ্চ-স্তরের ভাষা থেকে মেশিন কোডে (যেমন জিসিজে, যা জাভা কে দেশীয় কোডে সংকলন করে), নিম্ন স্তরের ভাষা থেকে উচ্চ স্তরের ভাষাতে (যেমন ক্লু, যা জাভা, লুয়া, পার্ল, ইসসিএমএস স্ক্রিপ্ট এবং সাধারণের সাথে সংকলন করে লিস্প), নিম্ন-স্তরের ভাষা থেকে অন্য নিম্ন-স্তরের ভাষাতে (যেমন অ্যান্ড্রয়েড এসডিকে, যা জেভিএমএল বাইটকোড থেকে ডালভিক বাইটকোডকে সংকলন করে) মেশিন কোডে (যেমন সি 1 এক্স সংকলক যা হটস্পটের অংশ, যা জেভিএমএল বাইটকোডকে মেশিন কোডে সংকলন করে), একটি উচ্চ-স্তরের ভাষায় মেশিন কোড (যে কোনও তথাকথিত "ডিকম্পিলার", এমস্ক্রিপ্টেন, যা এলসিভিএম মেশিন কোডকে ইসমাস্ক্রিপ্টে সংকলন করে),নিম্ন-স্তরের ভাষায় মেশিন কোড (যেমন জেপিসিতে JIT সংকলক, যা xV নেটিভ কোডটি JVML বাইকোডে সংকলন করে) এবং নেটিভ কোডে নেটিভ কোড (যেমন পিয়ারপিসিতে JIT সংকলক, যা পাওয়ারপিসির নেটিভ কোডটি x86 নেটিভ কোডে সংকলন করে)।

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

সংকলকগুলির জন্য অনেকগুলি বিশেষ নাম রয়েছে যা বিশেষ কার্য সম্পাদন করে। এগুলি বিশেষত্বযুক্ত নাম হওয়া সত্ত্বেও এগুলি সমস্ত এখনও সংকলক, কেবলমাত্র বিশেষ ধরণের সংকলক:

  • ভাষা হিসাবে ভাষা বি হিসাবে বিমূর্ততার প্রায় একই স্তরের বলে মনে করা হয়, সংকলকটিকে ট্রান্সপ্লেলার বলা যেতে পারে (যেমন একটি রুবি-থেকে-ইসিএমএসক্রিপ্ট-ট্রান্সপ্লেলার বা একটি ইসিএমএস স্ক্রিপ্ট ২০১৫-থেকে-ইসিএমএস স্ক্রিপ্ট ৫-ট্রান্সপ্লার)
  • যদি ভাষা একটি ভাষা চেয়ে বিমূর্ততা একটি নিম্ন স্তরের পর্যায়ে হিসেবে প্রমাণিত হয় বি , কম্পাইলার একটি বলা হতে পারে decompiler (যেমন একটি এক্স 86-মেশিন-কোড টু সি-decompiler)
  • যদি ভাষা একটি == ভাষা বি , কম্পাইলার একটি নামক হতে পারে অপটিমাইজার , obfuscator , অথবা minifier (কম্পাইলার নির্দিষ্ট ফাংশন উপর নির্ভর করে)

সরাসরি শারীরিক হার্ডওয়্যার চালিত যা?

অগত্যা। এটি দোভাষী বা ভিএম-তে চালানো যেতে পারে। এটি আরও একটি ভিন্ন ভাষায় সংকলিত হতে পারে।

সুতরাং কোনও দোভাষী কোনও যন্ত্রের ভাষা তৈরি করে না তবে একটি সংকলক এটির ইনপুটটির জন্য এটি করে?

একজন দোভাষী কোনও কিছুই উত্পাদন করেন না। এটি কেবল প্রোগ্রামটি চালায়।

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


আপনি আগ্রহী হতে পারে:


16

আমি মনে করি আপনার সম্পূর্ণ "সংকলক বনাম দোভাষী" এর ধারণাটি পুরোপুরি বাদ দেওয়া উচিত , কারণ এটি একটি মিথ্যা দ্বৈতত্ত্ব।

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

বাস্তব বিশ্বে একটি বিমূর্ত প্রোগ্রামিং ভাষা দরকারী করার জন্য সম্মিলিত শব্দটি বাস্তবায়ন

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

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

বাস্তবায়ন প্রকল্পগুলির উদাহরণগুলির মধ্যে রয়েছে:

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

... ইত্যাদি।


+1 দেখানোর জন্য যে মধ্যবর্তী প্রতিনিধিত্বের জন্য যেমন নকশাকৃত এনকোডিংগুলি (যেমন জাভা বাইটকোড) এ হার্ডওয়্যার প্রয়োগকরণ থাকতে পারে।
জুলাই 9

7

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

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

একজন দোভাষী আপনার প্রোগ্রামটি যা করা উচিত তা করবে।

এই সংজ্ঞাগুলির সাথে, যে জায়গাগুলিতে এটি अस्पष्ट হয়ে ওঠে সেগুলি হ'ল যেখানে আপনার সংকলক / দোভাষীকে আপনি এটি কীভাবে দেখছেন তার উপর নির্ভর করে বিভিন্ন জিনিস হিসাবে ভাবা যেতে পারে। উদাহরণ হিসেবে বলা যায়, পাইথন আপনার পাইথন কোড লাগে এবং প্রনয়ন একটি কম্পাইল পাইথন বাইটকোড সেটিকে। যদি পাইথন বাইটকোডটি পাইথন বাইটকোড দোভাষী দ্বারা চালিত হয় তবে এটি আপনার প্রোগ্রামটি যা করার কথা ছিল তা করে। তবে বেশিরভাগ পরিস্থিতিতে পাইথন বিকাশকারীরা এই দুটি পদক্ষেপই একটি বড় পদক্ষেপে নিয়েছেন বলে তারা ভাবেন, তাই তারা সিপথন ইন্টারপ্রেটারকে তাদের উত্সকোডের ব্যাখ্যা হিসাবে বিবেচনা করতে পছন্দ করে এবং এটি যে পথটি সংকলিত হয়েছিল তা বাস্তবায়ন বিশদ হিসাবে বিবেচিত হয় । এইভাবে, এটি সমস্ত দৃষ্টিভঙ্গির বিষয়।


5

সংকলক এবং দোভাষীদের মধ্যে একটি সাধারণ ধারণাগত অসম্পূর্ণতা এখানে।

3 টি ভাষা বিবেচনা করুন: প্রোগ্রামিং ভাষা, পি (প্রোগ্রামটি কী লেখা আছে); ডোমেন ভাষা, ডি (চলমান প্রোগ্রামের সাথে কী চলছে); এবং লক্ষ্য ভাষা, টি (কিছু তৃতীয় ভাষা)।

ধারণার দিক থেকে,

  • একটি সংকলক পি তে টি অনুবাদ করে যাতে আপনি টি (ডি) মূল্যায়ন করতে পারেন; যেহেতু

  • একজন দোভাষী সরাসরি পি (ডি) মূল্যায়ন করেন।


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

4
@ রবার্টহারভে এটি শর্তাদির মধ্যে ধারণাগত পার্থক্য পরিবর্তন করে না।
লরেন্স

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

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

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