কীভাবে একটি সংকলক নিজেই সংকলন করতে পারে?


168

আমি http://coffeescript.org/ ওয়েবসাইটে কফিস্ক্রিপ্ট নিয়ে গবেষণা করছি এবং এতে লেখাটি রয়েছে

কফিস্ক্রিপ্ট সংকলক নিজেই কফিস্ক্রিপ্টে রচিত

একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?


14
সংকলকটির জন্য অন্য একটি শব্দ যা নিজেই সংকলন করতে পারে তা একটি self-hostingসংকলক। প্রোগ্রামার্স.স্ট্যাক্কেঞ্জেনওয়েজ
কিউ

37
কোনও সংকলক নিজেই সংকলন করতে সক্ষম হবে না কেন?
ব্যবহারকারী 253751

48
সংস্থার কমপক্ষে দুটি অনুলিপি জড়িত রয়েছে। একটি পূর্ব-বিদ্যমান একটি নতুন অনুলিপি সংকলন করে। নতুনটি পুরানোটির মতো বা নাও হতে পারে।
বিডিএসএল

12
আপনি গীত সম্পর্কেও আগ্রহী হতে পারেন: এর উত্স কোডটি অবশ্যই একটি গিট সংগ্রহস্থলে ট্র্যাক করা হয়েছে।
গ্রেগ ডি'অন

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

উত্তর:


219

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

  1. প্রথম কফিস্ক্রিপ্ট সংকলকটি রুবিতে লেখা হয়েছে, কফিস্ক্রিপ্টের সংস্করণ 1 তৈরি করে
  2. সিএস সংকলকটির উত্স কোডটি কফিস্ক্রিপ্ট 1-এ আবার লিখিত হয়েছে
  3. মূল সিএস সংকলক নতুন কোডটি (সিএস 1 এ লিখিত) সংকলকের 2 সংস্করণে সংকলন করে
  4. নতুন ভাষার বৈশিষ্ট্য যুক্ত করতে সংকলক উত্স কোডে পরিবর্তনগুলি করা হয়
  5. দ্বিতীয় সিএস সংকলক (সিএসে প্রথম লেখা) সংশোধিত নতুন উত্স কোডটি সংকলকটির 3 সংস্করণে সংকলন করে
  6. প্রতিটি পুনরাবৃত্তির জন্য 4 এবং 5 পদক্ষেপ পুনরাবৃত্তি করুন

দ্রষ্টব্য: আমি নিশ্চিত নই যে কফিস্ক্রিপ্ট সংস্করণগুলি ঠিক কীভাবে গণনা করা হয়েছে, এটি কেবল একটি উদাহরণ ছিল।

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


5
একটি সংকলক বুটস্ট্র্যাপ করার জন্য অন্যান্য রুটটি হ'ল আপনার ভাষার (একটি উপসেট) জন্য দোভাষী লিখুন।
আরন

অন্য একটি ভাষায় লিখিত সংকলক বা দোভাষীর সাহায্যে বুটস্ট্র্যাপ করার আরও বিকল্প হিসাবে, খুব পুরানো-স্কুল রুটটি সংকলক উত্সকে হস্তান্তর করতে হবে। চক মুর কীভাবে প্রব্লেম-ওরিয়েন্টেড ল্যাঙ্গুয়েজ ( ওয়েব.আরচাইভ.অর্গ / 60607070454521/www.colorforth.com/POL- এর প্রোগ্রামিংয়ের শেষে, 9 ম অধ্যায় "প্রোগ্রামগুলি যেগুলি বুটস্ট্র্যাপ করে" চতুর্থ দোভাষীর জন্য এটি করতে হয় তা চালিয়ে যায়) .htm ), এর আগে দু'বার হাতে হাতে তৈরি করার ভিত্তিতে। কোড এন্ট্রিটি একটি সামনের প্যানেলের মাধ্যমে সম্পন্ন হয় যা বিটগুলির জন্য টগল স্যুইচগুলি দ্বারা নিয়ন্ত্রিত মেমরি ঠিকানার মানগুলির সরাসরি সঞ্চয় করতে দেয়।
জেরেমি ডব্লিউ শেরম্যান

59

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

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

char s[] = {
    '\t',
    '0',
    '\n',
    '}',
    ';',
    '\n',
    '\n',
    '/',
    '*',
    '\n',
    … 213 lines omitted …
    0
};

/*
 * The string s is a representation of the body
 * of this program from '0'
 * to the end.
 */

main()
{
    int i;

    printf("char\ts[] = {\n");
    for(i = 0; s[i]; i++)
        printf("\t%d,\n", s[i]);
    printf("%s", s);
}

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

…
c = next();
if (c != '\\') return c;        /* A normal character */
c = next();
if (c == '\\') return '\\';     /* Two backslashes in the code means one backslash */
if (c == 'r')  return '\r';     /* '\r' is a carriage return */
…

সুতরাং, আমরা উপরের কোডে একটি শর্ত যুক্ত করতে পারি…

if (c == 'n')  return 10;       /* '\n' is a newline */

… এমন একটি সংকলক তৈরি করতে যা জানে যে '\n'ASCII 10 কে প্রতিনিধিত্ব করে 10 মজার বিষয় হল, সেই সংকলকটি এবং এরপরে সংকলিত পরবর্তী সমস্ত সংকলকগণ সেই ম্যাপিংটি "জেনে নিন" তাই সোর্স কোডের পরবর্তী প্রজন্মের মধ্যে আপনি সেই শেষ লাইনে পরিবর্তন করতে পারেন

if (c == 'n')  return '\n';

... এবং এটি সঠিক জিনিস করবে! 10কম্পাইলার থেকে এসেছে এবং আর স্পষ্টভাবে কম্পাইলার এর সোর্স কোড সংজ্ঞায়িত করা প্রয়োজন। 1

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


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


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

9
@ আরতুরো টরেস সানচেজ বিভিন্ন লোকের জন্য বিভিন্ন ব্যাখ্যা ভালভাবে কাজ করে। আমি অন্যান্য উত্তরে যা বলা হয়েছে তা পুনরুক্ত করার লক্ষ্য রাখছি না। বরং, আমি কীভাবে ভাবতে পছন্দ করি তার চেয়ে অন্য উত্তরগুলি উচ্চতর স্তরে কথা বলে find আমি ব্যক্তিগতভাবে কীভাবে একটি একক বৈশিষ্ট্য যুক্ত করা হয় এবং একটি অগভীর ওভারভিউয়ের পরিবর্তে পাঠককে সেই থেকে এক্সট্রাপোলেট করতে দেওয়া পছন্দ করি।
200_সূচী

5
ঠিক আছে, আমি আপনার দৃষ্টিভঙ্গি বুঝতে পারি। এটি ঠিক যে প্রশ্নটি আরও “কম্পাইলার সংকলনের সংকলকটি উপস্থিত না থাকলে একটি সংকলক কীভাবে নিজেকে সংকলন করতে পারে" এবং "বুটস্ট্র্যাপযুক্ত সংকলকটিতে কীভাবে নতুন বৈশিষ্ট্য যুক্ত করা যায়" কম।
আর্টুরো টরেস সানচেজ

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

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

29

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

  1. কফিস্ক্রিপ্ট সংকলক একটি প্রোগ্রাম যা কফিস্ক্রিপ্টে লিখিত প্রোগ্রামগুলি সংকলন করতে পারে।
  2. কফিস্ক্রিপ্ট সংকলক কফি স্ক্রিপ্টে লিখিত একটি প্রোগ্রাম।

আমি নিশ্চিত যে আপনি সম্মত হতে পারবেন যে # 1 এবং # 2 উভয়ই সত্য। এখন, দুটি বিবৃতি দেখুন। আপনি কি দেখতে পাচ্ছেন যে কফিস্ক্রিপ্ট সংকলক কফিস্ক্রিপ্ট সংকলক সংকলন করতে সক্ষম হবেন তা সম্পূর্ণ স্বাভাবিক?

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

একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?

হ্যাঁ, এই বিবৃতিটির অর্থ হ'ল এবং আমি আশা করি যে আপনি কীভাবে বিবৃতিটি সত্য।


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

6
আপনার বক্তব্য 2 অসম্পূর্ণ / অসম্পূর্ণ এবং খুব বিভ্রান্তিকর। যেহেতু প্রথম উত্তরটি বলেছে, প্রথমটি কফি স্ক্রিপ্টে লেখা হয়নি .. এটি তাঁর প্রশ্নের সাথে এত প্রাসঙ্গিক। এবং "কীভাবে একটি সংকলক নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?" আপনি "হ্যাঁ" বলে মনে করেন আমি তাই মনে করি (যদিও আমার মনটি কিছুটা ছোট) তবে আমি দেখতে পাচ্ছি এটি নিজের পরিবর্তে পূর্ববর্তী সংস্করণগুলি সংকলন করতে ব্যবহৃত হয়েছিল। কিন্তু এটি কি নিজেই সংকলন করতে ব্যবহৃত হয়? আমার মনে হয়েছিল এটি অর্থহীন।
বারলপ

2
@ বারলপ: " আজকে কফিস্ক্রিপ্ট সংকলক কফি স্ক্রিপ্টে লেখা একটি প্রোগ্রাম statement " এটি কি আপনাকে এটি আরও ভালভাবে বুঝতে সহায়তা করে? একটি সংকলক হ'ল একটি "প্রোগ্রাম" যা একটি ইনপুট (কোড) কে একটি আউটপুট (প্রোগ্রাম) এ অনুবাদ করে। সুতরাং আপনার যদি ভাষা ফু-র জন্য একটি সংকলক রয়েছে, তবে ভাষা ফু-তে নিজেই একটি ফু-সংকলকের জন্য উত্স কোডটি লিখুন এবং সেই উত্সটি আপনার প্রথম ফু-সংকলককে খাওয়ান, আপনি আউটপুট হিসাবে একটি দ্বিতীয় ফু-সংকলক পাবেন। এটি অনেকগুলি ভাষা দ্বারা সম্পন্ন হয়েছে (উদাহরণস্বরূপ, আমার জানা সমস্ত সি সংকলকগুলি… সি তে লিখিত আছে)।
ডার্কডাস্ট

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

3
@ প্যাব্রামগুলি আপনি এটি কেন অনুমান করেন? আউটপুট এটি তৈরি করতে ব্যবহৃত সংকলকটির সাথে একইরকম হতে পারে। উদাহরণস্বরূপ, আমি জিসিসি 6.1 সংক্ষেপটি জিসিসি 6.1 সহ কম্পাইল করলে আমি জিসিসি 6.1 এর সংকলিত জিসিসি 6.1 এর একটি সংস্করণ পাই। এবং তারপরে আমি যদি জিসিসি 6.1 সংকলন করতে এটি ব্যবহার করি তবে আমি জিসিসি 6.1 এর সাথে সংকলিত জিসিসি 6.1 এর একটি সংস্করণও পেয়েছি, যা অভিন্ন হওয়া উচিত (টাইমস্ট্যাম্পের মতো বিষয় উপেক্ষা করে)।
ব্যবহারকারী 253751

9

একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?

এর অর্থ হ'ল প্রথমত, কিছু বিষয় বিবেচনা করা উচিত। আমাদের চারটি বিষয় লক্ষ্য করা দরকার:

  • যেকোন স্বেচ্ছাসেবী কফস্ক্রিপ্ট প্রোগ্রামের উত্স কোড
  • যেকোন স্বেচ্ছাসেবী কফস্ক্রিপ্ট প্রোগ্রামের (উত্পন্ন) সমাবেশ
  • কফস্ক্রিপ্ট সংকলকটির উত্স কোড
  • কফস্ক্রিপ্ট সংকলকটির (উত্পন্ন) সমাবেশ

এখন, এটা স্পষ্ট হওয়া উচিত যে আপনি যেকোন স্বেচ্ছাসেবী কফস্ক্রিপ্ট প্রোগ্রাম সংকলন করতে এবং তৈরি প্রোগ্রামের জন্য অ্যাসেমব্লিলি তৈরি করতে কোফস্প্রিপ্ট সংকলকটির জেনারেটেড এসেম্বলি - এক্সিকিউটেবল - ব্যবহার করতে পারেন।

এখন, কফস্ক্রিপ্ট সংকলক নিজেই কেবল একটি স্বেচ্ছাচারিত কফস্ক্রিপ্ট প্রোগ্রাম, এবং সুতরাং এটি কফস্ক্রিপ্ট সংকলক দ্বারা সংকলিত হতে পারে।

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

বুটস্ট্র্যাপিং নামক প্রক্রিয়াটি পরিচিত করুন ।

  1. আপনি ইতিমধ্যে বিদ্যমান ভাষায় একটি সংকলক লিখুন (CoffeScript এর ক্ষেত্রে, মূল সংকলকটি রুবিতে লেখা হয়েছিল) যা নতুন ভাষার একটি উপসেট সংকলন করতে পারে
  2. আপনি এমন একটি সংকলক লিখুন যা নতুন ভাষায় নতুন ভাষার একটি উপসেট সংকলন করতে পারে। আপনি কেবল উপরের পদক্ষেপটি সংকলন করতে পারে এমন ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।
  3. দ্বিতীয় ধাপ থেকে সংকলকটি সংকলন করতে আপনি পদক্ষেপ 1 থেকে সংকলকটি ব্যবহার করেন This এটি আপনাকে এমন একটি অ্যাসেমব্লী দেয় যা মূলত নতুন ভাষার একটি উপসেটে লেখা হয়েছিল এবং এটি নতুন ভাষার একটি উপসেট সংকলন করতে সক্ষম।

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

ইচ্ছাকৃত সমস্ত ভাষা বৈশিষ্ট্য সংকলক সহ সংকলিত না হওয়া পর্যন্ত ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন।

whileএবং forস্পষ্টতই কেবল উদাহরণ ছিল, তবে এটি আপনার যে কোনও নতুন ভাষার বৈশিষ্ট্যের জন্য কাজ করে। এবং তারপরে আপনি কফিফ্রিপ্ট এখন অবস্থায় আছেন: সংকলকটি নিজেই সংকলন করে।

সেখানে অনেক সাহিত্য আছে। বিশ্বাসের উপর প্রতিচ্ছবি হ'ল সেই বিষয়ে আগ্রহী একটি ক্লাসিক প্রত্যেকের অন্তত একবার পড়া উচিত।


5
("কফিস্ক্রিপ্ট সংকলক নিজেই কফিস্ক্রিপ্টে রচিত" বাক্যটি সত্য, তবে "একটি সংকলক নিজেই সংকলন করতে পারে" মিথ্যা))
পাব্রাম

4
না, এটি সম্পূর্ণ সত্য। সংকলক নিজেই সংকলন করতে পারেন । এটা ঠিক বোঝা যায় না। বলুন আপনার কাছে এক্সিকিউটেবল রয়েছে যা ভাষার সংস্করণ এক্স সংকলন করতে পারে। আপনি এমন একটি সংকলক লিখেছেন যা সংস্করণ X + 1 সংকলন করতে পারে এবং আপনার সংকলকটির সাথে এটি সংকলন করতে পারে (যা সংস্করণ এক্স)। আপনি এক্সিকিউটেবলের সাথে শেষ করেন যা ভাষার X + 1 সংস্করণ সংকলন করতে পারে। কম্পাইলারটি পুনরায় সংকলন করতে আপনি এখন যেতে পারেন এবং নতুন এক্সিকিউটেবল ব্যবহার করতে পারেন। তবে কি শেষ? আপনি ইতিমধ্যে কার্যকর হতে পারে যা আপনি যা করতে চান তা করে। সংকলকটি কোনও বৈধ প্রোগ্রাম সংকলন করতে পারে , তাই এটি সম্পূর্ণরূপে নিজেই সংকলন করতে পারে!
পলিনোমোম করুন

1
প্রকৃতপক্ষে এটি বেশ কয়েকবার নির্মাণ করা শুনা যায় না, আধুনিক আধুনিক ফ্রিপ্যাসাল মোট 5 বার সংকলকটি তৈরি করে।
প্লাগওয়াশ

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

2
@ প্যাব্রামগুলি 'গুড ইংলিশ' হ'ল এমন ইংরেজি যা উদ্দেশ্যপ্রণোদিত দর্শকদের কাছে এবং লেখক বা স্পিকার যেভাবে পরিকল্পনা করেছিল সেভাবে ধারণাটি স্পষ্টভাবে যোগাযোগ করে। যদি উদ্দেশ্যযুক্ত শ্রোতা প্রোগ্রামার হয় এবং প্রোগ্রামাররা এটি বুঝতে পারে তবে এটির ভাল ইংরেজি। "আলোক উভয় কণা এবং তরঙ্গ হিসাবে বিদ্যমান" বলা মূলত "আলোক উভয় ফোটন এবং তড়িৎ চৌম্বকীয় তরঙ্গ হিসাবে বিদ্যমান" এর সমতুল্য। একজন পদার্থবিদের কাছে তাদের অর্থ আক্ষরিক অর্থে একই জিনিস। এর অর্থ কি আমাদের সর্বদা দীর্ঘ এবং স্পষ্টতর প্রেরণা ব্যবহার করা উচিত? না! কারণ এটি পাঠকে জটিল করে তোলে যখন উদ্দেশ্য ইতিমধ্যে দর্শকদের কাছে অর্থটি পরিষ্কার হয়ে যায়।
ডার্কডেস্ট্রি

7

একটি ছোট কিন্তু গুরুত্বপূর্ণ ব্যাখ্যা

এখানে সংকলক শব্দটি দু'টি ফাইলের সাথে জড়িত রয়েছে over একটি হ'ল একটি এক্সিকিউটেবল যা কোফস্প্রিপ্টে লেখা ইনপুট ফাইল হিসাবে গ্রহণ করে এবং তার আউটপুট ফাইল হিসাবে অন্য নির্বাহযোগ্য, একটি লিঙ্কযোগ্য অবজেক্ট ফাইল, বা একটি ভাগ করা লাইব্রেরি হিসাবে উত্পাদন করে। অন্যটি একটি কফিস্ক্রিপ্ট উত্স ফাইল যা কেবল কফিস্ক্রিপ্ট সংকলনের পদ্ধতি বর্ণনা করতে ঘটে।

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


4
  1. কফিস্ক্রিপ্ট সংকলকটি প্রথম রুবিতে লেখা হয়েছিল।
  2. কফিস্ক্রিপ্ট সংকলকটি তখন কফিস্ক্রিপ্টে আবার লেখা হয়েছিল।

কফিস্ক্রিপ্ট সংকলকের রুবি সংস্করণটি ইতিমধ্যে বিদ্যমান বিধায় এটি কফিস্ক্রিপ্ট সংকলকের কফি স্ক্রিপ্ট সংস্করণ তৈরি করতে ব্যবহৃত হয়েছিল।

এখানে চিত্র বর্ণনা লিখুন এটি একটি স্ব-হোস্টিং সংকলক হিসাবে পরিচিত ।

এটি অত্যন্ত সাধারণ, এবং সাধারণত সেই ভাষার বিকাশ বজায় রাখতে তাদের নিজস্ব ভাষা ব্যবহার করার কোনও লেখকের আকাঙ্ক্ষার ফলস্বরূপ।


3

এটি এখানে সংকলকগুলির বিষয় নয়, তবে ভাষার প্রকাশের বিষয়, কারণ সংকলকটি কেবল কোনও ভাষায় লিখিত একটি প্রোগ্রাম।

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

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

একটি 3 ডি প্রিন্টার প্রায় সর্বজনীন মেশিন। আপনি একটি 3D প্রিন্টার ব্যবহার করে পুরো 3 ডি প্রিন্টার মুদ্রণ করতে পারেন (আপনি এমন টিপ তৈরি করতে পারবেন না যা প্লাস্টিকের গলে যায়)।


আমি লেদযুক্ত উপমাটি পছন্দ করি। লেদাল সাদৃশ্যের বিপরীতে, যদিও প্রথম সংকলক পুনরাবৃত্তির অপূর্ণতাগুলি পরবর্তী সমস্ত সংকলক বরাবর পাশ করা হয়। উদাহরণস্বরূপ, উপরের উত্তরে একটি ফর-লুপ বৈশিষ্ট্য যুক্ত করার উল্লেখ রয়েছে যেখানে মূল সংকলকটি কেবল লুপগুলির সময় ব্যবহার করে। আউটপুট-লুপগুলি বোঝে, তবে বাস্তবায়নটি লুপগুলির সাথে হয়। লুপ প্রয়োগের ক্ষেত্রে যদি আসলটি ত্রুটিযুক্ত বা অকার্যকর হয় তবে তা সর্বদা থাকবে!

@ পদার্থবিজ্ঞান-গণনা এটি কেবল ভুল। দূষিত ত্রুটিগুলির অভাবে একটি সংকলক সংকলন করার সময় সাধারণত প্রচার হয় না।
প্লাগওয়াশ

সমাবেশ অনুবাদ স্থির না হওয়া অবধি সমাবেশের অনুবাদগুলি অবশ্যই পুনরাবৃত্তি থেকে পুনরাবৃত্তিতে রূপান্তরিত হয়। পুরানো বৈশিষ্ট্যগুলি বন্ধ করে দেয় এমন নতুন বৈশিষ্ট্য অন্তর্নিহিত বাস্তবায়ন পরিবর্তন করে না। কিছুক্ষণের জন্য এটি সম্পর্কে চিন্তা করুন।

@ প্লাগওয়াশ কেন থম্পসনের "বিশ্বাসের উপর প্রতিচ্ছবি" দেখুন - ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf

3

প্রবর্তন দ্বারা প্রমাণ

প্ররোচিত পদক্ষেপ

সংকলকটির এন +1 তম সংস্করণটি এক্স-এ লেখা হয়েছে

সুতরাং এটি সংকলকের নবম সংস্করণ (এক্সেও লিখিত) দ্বারা সংকলন করা যায়।

বেস কেস

তবে এক্স-এ লিখিত সংকলকের প্রথম সংস্করণটি অবশ্যই এক্স এর জন্য একটি সংকলক দ্বারা সংকলন করতে হবে যা এক্স ব্যতীত অন্য কোনও ভাষায় রচিত This


1
এক্স ভাষার জন্য খুব প্রথম সংকলক সংকলক খুব সহজেই এক্সে লেখা যেতে পারে that কীভাবে সম্ভব এটি এই প্রথম সংকলকটি ব্যাখ্যা করা যায় । (এক্স ব্যতীত অন্য ভাষায় লিখিত কোনও এক্স দোভাষী দ্বারা)
কাজ

0

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

ক্রস-সংকলকগুলি একটি সিস্টেম থেকে অন্য সিস্টেমে সরানো হয়, ক্রস-ভাষা সংকলকগুলি একটি ভাষার স্পেসিফিকেশনকে অন্য ভাষার স্পেসিফিকেশনে সংকলন করে।

মূলত সংকলন একটি সুনির্দিষ্ট অনুবাদ, এবং স্তরটি সাধারণত ভাষার উচ্চ স্তরের থেকে নিম্ন স্তরের ভাষার হয় তবে অনেকগুলি রূপ রয়েছে।

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

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