আমি http://coffeescript.org/ ওয়েবসাইটে কফিস্ক্রিপ্ট নিয়ে গবেষণা করছি এবং এতে লেখাটি রয়েছে
কফিস্ক্রিপ্ট সংকলক নিজেই কফিস্ক্রিপ্টে রচিত
একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?
আমি http://coffeescript.org/ ওয়েবসাইটে কফিস্ক্রিপ্ট নিয়ে গবেষণা করছি এবং এতে লেখাটি রয়েছে
কফিস্ক্রিপ্ট সংকলক নিজেই কফিস্ক্রিপ্টে রচিত
একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?
উত্তর:
সংকলকের প্রথম সংস্করণটি নির্দিষ্ট একটি প্রোগ্রামিং ভাষা থেকে মেশিন-উত্পাদিত হতে পারে না; আপনার বিভ্রান্তি বোধগম্য। আরও ভাষা বৈশিষ্ট্য (নতুন ভাষার প্রথম সংস্করণে পুনর্লিখিত উত্স সহ) সংকলকটির পরবর্তী সংস্করণটি প্রথম সংকলক দ্বারা নির্মিত যেতে পারে। সেই সংস্করণটি পরবর্তী সংকলক এবং আরও সংকলন করতে পারে। এখানে একটি উদাহরণ:
দ্রষ্টব্য: আমি নিশ্চিত নই যে কফিস্ক্রিপ্ট সংস্করণগুলি ঠিক কীভাবে গণনা করা হয়েছে, এটি কেবল একটি উদাহরণ ছিল।
এই প্রক্রিয়াটিকে সাধারণত বুটস্ট্র্যাপিং বলা হয় । বুটস্ট্র্যাপিং সংকলকের আর একটি উদাহরণ হ'ল মরিচা ভাষারrustc
জন্য সংকলক ।
ইউনিভার্সিটির অন্যতম প্রবর্তক কেন থম্পসন বিশ্বাসের উপর ভরসা কাগজে রিফ্লেকশনগুলিতে সি সংকলকটি কীভাবে সংকলন করে সে সম্পর্কে একটি আকর্ষণীয় (এবং সহজেই পঠনযোগ্য) একটি ওভারভিউ লিখেছেন। কফিস্ক্রিপ্ট বা অন্য কোনও ভাষাতে অনুরূপ ধারণা প্রয়োগ করা যেতে পারে।
একটি নিজস্ব সংকেত সংকলক সংকলক ধারণাটি একটি কোয়েনের সাথে অস্পষ্টভাবে অনুরূপ : উত্স কোড যা কার্যকর করা হলে আউটপুট হিসাবে মূল উত্স কোড উত্পাদন করে। কফিস্ক্রিপ্ট কুইনের একটি উদাহরণ এখানে । থম্পসন সি কুইনের এই উদাহরণ দিয়েছেন:
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 কাগজে বর্ণিত চক্রান্ত মোচড়টি হ'ল সংকলক যেহেতু এই বিষয়গুলিকে "শেখানো" হতে পারে, তাই এটি সনাক্ত করা কঠিন এমন উপায়ে ট্রোজানযুক্ত এক্সিকিউটেবলগুলি তৈরি করাও ভুল শিক্ষাদান করা যেতে পারে, এবং নাশকতার এই ক্রিয়া অব্যাহত রাখতে পারে কলঙ্কিত সংকলক দ্বারা উত্পাদিত সমস্ত সংকলকগুলিতে।
আপনি ইতিমধ্যে একটি খুব ভাল উত্তর পেয়েছেন, তবে আমি আপনাকে আলাদা দৃষ্টিভঙ্গি দিতে চাই, এটি আশাবাদী আপনার কাছে আলোকিত হবে। প্রথমে দুটি সত্য প্রতিষ্ঠিত করা যাক আমরা দুজনেই একমত হতে পারি:
আমি নিশ্চিত যে আপনি সম্মত হতে পারবেন যে # 1 এবং # 2 উভয়ই সত্য। এখন, দুটি বিবৃতি দেখুন। আপনি কি দেখতে পাচ্ছেন যে কফিস্ক্রিপ্ট সংকলক কফিস্ক্রিপ্ট সংকলক সংকলন করতে সক্ষম হবেন তা সম্পূর্ণ স্বাভাবিক?
সংকলকটি কী সংকলন করে তা যত্ন করে না । যতক্ষণ না এটি কফিস্ক্রিপ্টে লেখা একটি প্রোগ্রাম, এটি এটি সংকলন করতে পারে। এবং কফিস্ক্রিপ্ট সংকলক নিজেই যেমন একটি প্রোগ্রাম হতে পারে। কফিস্ক্রিপ্ট সংকলকটি যত্ন করে না যে এটি কফি স্ক্রিপ্ট সংকলক নিজেই সংকলন করছে। এটি যা কিছু দেখেছে তা হ'ল কিছু কফিস্ক্রিপ্ট কোড। সময়কাল।
একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?
হ্যাঁ, এই বিবৃতিটির অর্থ হ'ল এবং আমি আশা করি যে আপনি কীভাবে বিবৃতিটি সত্য।
একটি সংকলক কীভাবে নিজেই সংকলন করতে পারে, বা এই বিবৃতিটির অর্থ কী?
এর অর্থ হ'ল প্রথমত, কিছু বিষয় বিবেচনা করা উচিত। আমাদের চারটি বিষয় লক্ষ্য করা দরকার:
এখন, এটা স্পষ্ট হওয়া উচিত যে আপনি যেকোন স্বেচ্ছাসেবী কফস্ক্রিপ্ট প্রোগ্রাম সংকলন করতে এবং তৈরি প্রোগ্রামের জন্য অ্যাসেমব্লিলি তৈরি করতে কোফস্প্রিপ্ট সংকলকটির জেনারেটেড এসেম্বলি - এক্সিকিউটেবল - ব্যবহার করতে পারেন।
এখন, কফস্ক্রিপ্ট সংকলক নিজেই কেবল একটি স্বেচ্ছাচারিত কফস্ক্রিপ্ট প্রোগ্রাম, এবং সুতরাং এটি কফস্ক্রিপ্ট সংকলক দ্বারা সংকলিত হতে পারে।
দেখে মনে হচ্ছে আপনার বিভ্রান্তি এ থেকে উদ্ভূত হয়েছে যে আপনি যখন নিজের নিজস্ব নতুন ভাষা তৈরি করেন, তখন আপনার কাছে একটি সংকলক নেই তবে আপনি নিজের সংকলকটি সংকলন করতে ব্যবহার করতে পারেন। এটিকে অবশ্যই মুরগির ডিমের মতো সমস্যা মনে হচ্ছে , তাই না?
বুটস্ট্র্যাপিং নামক প্রক্রিয়াটি পরিচিত করুন ।
এখন আপনাকে নতুন বৈশিষ্ট্য যুক্ত করতে হবে। বলুন আপনি কেবল- while
লুপগুলি প্রয়োগ করেছেন, তবে for
লুপগুলিও চান । এটি কোনও সমস্যা নয়, যেহেতু আপনি কোনও- for
লুপকে এমনভাবে পুনরায় লিখতে পারেন যে এটি একটি while
লুপ। এর অর্থ আপনি কেবলমাত্র while
আপনার সংকলকের উত্স কোডে লুপগুলি ব্যবহার করতে পারেন , যেহেতু আপনার হাতে যে সমাবেশ রয়েছে সেগুলি কেবল সেগুলিই সংকলন করতে পারে। তবে আপনি আপনার সংকলকের অভ্যন্তরে এমন ফাংশন তৈরি করতে পারেন যা for
এটির সাথে বিরতি এবং লুপগুলি সংকলন করতে পারে। তারপরে আপনি যে সমাবেশটি ইতিমধ্যে পেয়েছেন তা ব্যবহার করুন এবং নতুন সংকলক সংস্করণটি সংকলন করুন। এবং এখন আপনার কাছে একটি সংকলকের একটি সমাবেশ রয়েছে যা for
লুপগুলি পার্স এবং সংকলন করতে পারে ! আপনি এখন আপনার সংকলকের উত্স ফাইলে ফিরে যেতে পারেন, এবং যে- while
লুপগুলি চান না-লুপগুলিতে আবার লিখতে পারেন for
।
ইচ্ছাকৃত সমস্ত ভাষা বৈশিষ্ট্য সংকলক সহ সংকলিত না হওয়া পর্যন্ত ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন।
while
এবং for
স্পষ্টতই কেবল উদাহরণ ছিল, তবে এটি আপনার যে কোনও নতুন ভাষার বৈশিষ্ট্যের জন্য কাজ করে। এবং তারপরে আপনি কফিফ্রিপ্ট এখন অবস্থায় আছেন: সংকলকটি নিজেই সংকলন করে।
সেখানে অনেক সাহিত্য আছে। বিশ্বাসের উপর প্রতিচ্ছবি হ'ল সেই বিষয়ে আগ্রহী একটি ক্লাসিক প্রত্যেকের অন্তত একবার পড়া উচিত।
এখানে সংকলক শব্দটি দু'টি ফাইলের সাথে জড়িত রয়েছে over একটি হ'ল একটি এক্সিকিউটেবল যা কোফস্প্রিপ্টে লেখা ইনপুট ফাইল হিসাবে গ্রহণ করে এবং তার আউটপুট ফাইল হিসাবে অন্য নির্বাহযোগ্য, একটি লিঙ্কযোগ্য অবজেক্ট ফাইল, বা একটি ভাগ করা লাইব্রেরি হিসাবে উত্পাদন করে। অন্যটি একটি কফিস্ক্রিপ্ট উত্স ফাইল যা কেবল কফিস্ক্রিপ্ট সংকলনের পদ্ধতি বর্ণনা করতে ঘটে।
আপনি দ্বিতীয়টিতে প্রথম ফাইলটি প্রয়োগ করেন, একটি তৃতীয় উত্পাদন করে যা প্রথম হিসাবে একই সংকলনের কাজ সম্পাদন করতে সক্ষম (সম্ভবত আরও বেশি, দ্বিতীয় ফাইলটি যদি প্রথম দ্বারা প্রয়োগ না করা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে), এবং তাই যদি আপনি প্রথমটিকে প্রতিস্থাপন করতে পারেন তবে তাই ইচ্ছা।
কফিস্ক্রিপ্ট সংকলকের রুবি সংস্করণটি ইতিমধ্যে বিদ্যমান বিধায় এটি কফিস্ক্রিপ্ট সংকলকের কফি স্ক্রিপ্ট সংস্করণ তৈরি করতে ব্যবহৃত হয়েছিল।
এটি একটি স্ব-হোস্টিং সংকলক হিসাবে পরিচিত ।
এটি অত্যন্ত সাধারণ, এবং সাধারণত সেই ভাষার বিকাশ বজায় রাখতে তাদের নিজস্ব ভাষা ব্যবহার করার কোনও লেখকের আকাঙ্ক্ষার ফলস্বরূপ।
এটি এখানে সংকলকগুলির বিষয় নয়, তবে ভাষার প্রকাশের বিষয়, কারণ সংকলকটি কেবল কোনও ভাষায় লিখিত একটি প্রোগ্রাম।
যখন আমরা বলি যে "একটি ভাষা লিখিত / প্রয়োগ করা হয়" তখন আমরা প্রকৃত অর্থে সেই ভাষার জন্য একটি সংকলক বা দোভাষী ব্যবহার করা হয়। এমন প্রোগ্রামিং ভাষা রয়েছে যাতে আপনি প্রোগ্রাম লিখতে পারেন যা ভাষা প্রয়োগ করে (একই ভাষার সংকলক / দোভাষী)। এই ভাষাগুলিকে সর্বজনীন ভাষা বলা হয় ।
এটি বুঝতে সক্ষম হতে একটি ধাতব লেদ সম্পর্কে ভাবুন। এটি ধাতব আকার দেওয়ার জন্য ব্যবহৃত একটি সরঞ্জাম। এটি কেবলমাত্র সেই সরঞ্জামটি ব্যবহার করে এর অংশগুলি তৈরি করে অন্য একটি অভিন্ন সরঞ্জাম তৈরি করা সম্ভব। সুতরাং, সেই সরঞ্জামটি সর্বজনীন মেশিন। অবশ্যই, প্রথমটি অন্য উপায়ে (অন্যান্য সরঞ্জাম) ব্যবহার করে তৈরি করা হয়েছিল এবং সম্ভবত এটি নিম্নমানের ছিল। তবে প্রথমটি উচ্চতর নির্ভুলতার সাথে নতুন তৈরি করতে ব্যবহৃত হয়েছিল।
একটি 3 ডি প্রিন্টার প্রায় সর্বজনীন মেশিন। আপনি একটি 3D প্রিন্টার ব্যবহার করে পুরো 3 ডি প্রিন্টার মুদ্রণ করতে পারেন (আপনি এমন টিপ তৈরি করতে পারবেন না যা প্লাস্টিকের গলে যায়)।
সংকলকটির এন +1 তম সংস্করণটি এক্স-এ লেখা হয়েছে
সুতরাং এটি সংকলকের নবম সংস্করণ (এক্সেও লিখিত) দ্বারা সংকলন করা যায়।
তবে এক্স-এ লিখিত সংকলকের প্রথম সংস্করণটি অবশ্যই এক্স এর জন্য একটি সংকলক দ্বারা সংকলন করতে হবে যা এক্স ব্যতীত অন্য কোনও ভাষায় রচিত This
সংকলকগণ একটি উচ্চ-স্তরের স্পেসিফিকেশন নেয় এবং এটিকে নিম্ন-স্তরের বাস্তবায়নে রূপান্তর করে, যেমন হার্ডওয়্যারে চালানো যেতে পারে। সুতরাং ভাষাটির শব্দার্থকে লক্ষ্যবস্তু করা ছাড়াও নির্দিষ্টকরণের বিন্যাস এবং প্রকৃত সম্পাদনের মধ্যে কোনও সম্পর্ক নেই।
ক্রস-সংকলকগুলি একটি সিস্টেম থেকে অন্য সিস্টেমে সরানো হয়, ক্রস-ভাষা সংকলকগুলি একটি ভাষার স্পেসিফিকেশনকে অন্য ভাষার স্পেসিফিকেশনে সংকলন করে।
মূলত সংকলন একটি সুনির্দিষ্ট অনুবাদ, এবং স্তরটি সাধারণত ভাষার উচ্চ স্তরের থেকে নিম্ন স্তরের ভাষার হয় তবে অনেকগুলি রূপ রয়েছে।
অবশ্যই বুটস্ট্র্যাপিং সংকলকগুলি সবচেয়ে বিভ্রান্তিকর, কারণ তারা যে ভাষায় লেখা রয়েছে তা সংকলন করে boot অনেকগুলি বুটস্ট্র্যাপযুক্ত সংকলক প্রথমে একটি প্রোগ্রামিং ভাষার ন্যূনতম বৈশিষ্ট্যগুলিতে কাজ করে এবং পূর্ববর্তী বৈশিষ্ট্যগুলি ব্যবহার করে নতুন বৈশিষ্ট্যটি প্রকাশিত হওয়া পর্যন্ত অতিরিক্ত জটিল ভাষা বৈশিষ্ট্যগুলি যুক্ত করা হয় add যদি এটি না হয় তবে "সংকলক" এর সেই অংশটি অন্য ভাষায় আগে তৈরি করা দরকার।
self-hosting
সংকলক। প্রোগ্রামার্স.স্ট্যাক্কেঞ্জেনওয়েজ