প্রথম সি ++ সংকলক সি ++ তে কীভাবে লেখা যেতে পারে?


48

স্ট্রাস্ট্রাপ দাবি করেছে যে সিফ্রন্ট, প্রথম সি ++ সংকলক, সি ++ ( স্ট্রাস্ট্রাপ এফএকিউ ) লেখা হয়েছিল ।

তবে, এটি কীভাবে সম্ভব যে প্রথম সি ++ সংকলকটি সি ++ তে লেখা যায়?

যে কোডটি সংকলকটি তৈরি করে সেগুলিও খুব বেশি সংকলন করা দরকার, এবং এভাবে প্রথম সি ++ সংকলক সি ++ তে লেখা যায় না, পারে কি?


6
en.wikedia.org/wiki/Cfront ইস্যুটি কিছুটা কভার করে।
ক্রিস্টোফার

উত্তর:


57

কীটি এখানেই রয়েছে:

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

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


5
করা যেতে পারে (এবং করা উচিত নয়) আমার প্রিয় গল্পগুলির একটিতে একটি লিঙ্ক অন্তর্ভুক্ত করার জন্য +1।
jwernerny

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

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

3
"সি এর অনেকগুলি উদ্ভাবন (এবং ব্যাপক সুরক্ষা গর্ত) পরিচালিত করেছিল": যতদূর আমি জানি এই কৌশলগুলি কেবল সি তে নয় যে কোনও ভাষায় ব্যবহার করা যেতে পারে তাই অন্য যে কোনও ভাষাতে একই সুরক্ষা গর্ত থাকতে পারে।
জর্জিও

2
@ ডেটলি: এটি এখন তুচ্ছ মনে হচ্ছে, তবে 1983 সালে এটি একটি অভিনব আক্রমণ যা বাস্তবায়নের বৈচিত্র্যের অভাবে কার্যকর হয়েছিল। আমরা তখন বাইনারিগুলির উপর আরও বেশি ভরসা করছিলাম, আংশিক কারণ উত্স থেকে সমস্ত কিছু সংকলন করা এখনকার তুলনায় অনেক বড় অগ্নিপরীক্ষা ছিল।
blrfl

17

এটি বুটস্ট্র্যাপড ছিল। সিফ্রন্টে সি ++ বৈশিষ্ট্য যুক্ত হওয়ার সাথে সাথে সিএফ্রন্ট সেই বৈশিষ্ট্যটি সেই বিন্দু থেকে ব্যবহার করতে পারে (তবে সেই বৈশিষ্ট্যটি বাস্তবায়নের জন্য নয়)। এটি কাজ করেছিল কারণ সিফ্রন্টের সি ++ কোডকে সি কোডে রূপান্তর করার ক্ষমতা ছিল। সুতরাং যদি কোনও নতুন প্ল্যাটফর্ম প্রকাশিত হয়, আপনি সিফ্রন্টকে সি ++ থেকে সিতে রূপান্তর করতে অন্য প্ল্যাটফর্মে সিফ্রন্ট ব্যবহার করতে পারেন, এবং সি থেকে অবজেক্ট কোডে সংকলন শেষ করতে নতুন প্ল্যাটফর্মের সি সংকলকটি ব্যবহার করতে পারেন।


9

আমি মনে করি বিএস এই প্রশ্নের উত্তর দিয়েছে:

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

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

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


1
সুতরাং মূলত যখন আমরা একটি সি ++ প্রোগ্রাম সংকলন করি তখন এটি সি তে রূপান্তরিত হয়, তারপরে এটি সিতে রূপান্তরিত হওয়ার পরে এটি আবার মেশিন কোডে সংকলিত হয়?
পেসারিয়ার

@ পেসারিয়র: মূলত, হ্যাঁ, তবে এখন আমার মনে হয় না।
মাইক ডুনলাভে

আমি আপনার মন্তব্য বেশ বুঝতে পারি না। আপনি কি এখন বোঝাতে চেয়েছেন যে এমন সংকলক রয়েছে যা দ্বিতীয় ধাপটি এড়িয়ে যায় এবং কেবল সি ++ উত্স নিয়ে যায় এবং মেশিন কোডে সংকলন করে?
পেসারিয়ার

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

1
এটি লক্ষণীয় যে, তিনি যে সি +++ নির্মাণ করছিলেন সেটিও এখন ভাষার একটি অংশ ছিল যা এখন বিদ্যমান। এটিতে কোনও টেম্পলেট নেই, নতুন লাইব্রেরি নেই, কেবলমাত্র সি কাস্টিং ব্যবহার করা হয়েছিল এবং যদি আমি সঠিকভাবে স্মরণ করি তবে তার ব্যতিক্রম ছিল না।
21:17

2

কোনও উত্তর এই দিকটি coveredাকা না থাকায় আমি এই উত্তরটি যুক্ত করব।

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

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

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