पहले संकलक कैसे बनाए गए थे?


70

मुझे हमेशा यह आश्चर्य होता है, और शायद मुझे प्रोग्रामिंग भाषाओं पर एक अच्छे इतिहास के पाठ की आवश्यकता है। लेकिन चूंकि आजकल ज्यादातर कंपाइलर C में बने होते हैं, ऐसे में सबसे पहले कंपाइलर्स (C से पहले AKA) कैसे बनाए गए या सभी भाषाओं की सिर्फ व्याख्या की गई?

कहा जा रहा है कि, मुझे अभी भी समझ में नहीं आया है कि पहली असेंबली लैंग्वेज भी कैसे हुई, मैं समझता हूं कि असेंबली लैंग्वेज क्या है, लेकिन मैं यह नहीं देखता कि उन्हें वेरी असेंबली लैंग्वेज कैसे काम करती है (जैसे, उन्होंने पहली बार कैसे बनाया mov R21बाइनरी समकक्ष के लिए कमांड (जैसे ) या डब्ल्यू / ई सेट?


9
मेरी टीम में एक बार एक हास्यपूर्ण रूप से अयोग्य प्रोग्रामर था, जहां उसने जो भी किया वह C # के बारे में शिकायत थी। हम एक काल्पनिक भाषा का मजाक उड़ाते थे, जिसे उन्होंने क्रंक कहा जाता था। क्रंक के बारे में थोड़ा ज्ञात तथ्य, यह पहली भाषा है जहां कंपाइलर को ALunk भी क्रंक में लिखा गया था। :)
maple_shaft

2
कोई C # के बारे में शिकायत क्यों करेगा? क्या उन्होंने कभी भी स्मॉलटाक या लिस्प का इस्तेमाल नहीं किया है? lol


4
@maple_shaft: निष्पक्ष होने के लिए, सीसीसी में gcc संकलक लिखा जाता है । यदि आपके पास पहले संस्करण को संकलित करने के लिए एक अच्छा क्रॉस कंपाइलर है, तो यह वास्तव में कोई समस्या नहीं है। बेशक, पहला सी संकलक, दूसरी भाषा में लिखा जाना था।
स्कॉट व्हिटलॉक

जवाबों:


89

हा, मैंने ऐसा किया है। कई सीपीयू में सरल, निश्चित आकार के निर्देश होते हैं जो सिर्फ बाइट्स के एक जोड़े हैं। उदाहरण के लिए मोटोरोला 6800 जैसे एक साधारण सीपीयू के लिए, आप इसके सभी निर्देशों को कागज की एक शीट पर फिट कर सकते हैं । प्रत्येक निर्देश में एक दो-बाइट ऑपकोड होगा, जो इसके साथ जुड़ा होगा, और तर्क। आप प्रत्येक निर्देश के ओपेक को देखकर एक प्रोग्राम को हाथ से जोड़ सकते हैं। फिर आप अपने प्रोग्राम को कागज पर लिखेंगे , प्रत्येक निर्देश को उसके संबंधित ओपकोड के साथ लिखेंगे । एक बार जब आप अपना प्रोग्राम लिख चुके होते हैं, तो आप प्रत्येक ओपेक को EPROM के क्रम में जला सकते हैंजो तब आपके प्रोग्राम को स्टोर करेगा। CPU को सही पते पर सही निर्देशों के साथ EPROM तक तार दें, और आपके पास एक सरल कार्य कार्यक्रम है। और अपने अगले प्रश्न का उत्तर देने के लिए, हाँ। यह दर्दनाक था (हमने हाई स्कूल में ऐसा किया)। लेकिन मेरा कहना है कि प्रत्येक चिप को 8-बिट कंप्यूटर में वायरिंग करने और मैन्युअल रूप से एक प्रोग्राम लिखने से मुझे कंप्यूटर आर्किटेक्चर की समझ की गहराई मिली, जिसे मैं किसी अन्य तरीके से प्राप्त नहीं कर सकता था।

अधिक उन्नत चिप्स (जैसे x86) हाथ से कोड के लिए कहीं अधिक कठिन हैं, क्योंकि उनके पास अक्सर चर-लंबाई निर्देश होते हैं। जैसे VLIW / महाकाव्य प्रोसेसर इटेनियम असंभव करने के लिए हाथ से कोड के करीब कुशलतापूर्वक क्योंकि वे निर्देश जो अनुकूलित और उन्नत compilers द्वारा इकट्ठे होते हैं के पैकेट में सौदा कर रहे हैं। नए आर्किटेक्चर के लिए, प्रोग्राम को लगभग हमेशा दूसरे कंप्यूटर पर लिखा और इकट्ठा किया जाता है, फिर नए आर्किटेक्चर में लोड किया जाता है। वास्तव में, इंटेल जैसी फर्मों के लिए जो वास्तव में सीपीयू का निर्माण करते हैं, वे वास्तविक कार्यक्रमों को आर्किटेक्चर पर चला सकते हैं जो उन्हें सिमुलेटर पर चलाने से अभी तक मौजूद नहीं हैं। लेकिन मैं पीछे हटा...

संकलक के रूप में, अपने सबसे सरल पर, वे "कट और पेस्ट" कार्यक्रमों से थोड़ा अधिक हो सकते हैं। आप एक बहुत ही सरल, गैर-अनुकूलन, "उच्च स्तर की भाषा" लिख सकते हैं जो कि पूरे प्रयास के बिना सरल विधानसभा भाषा के निर्देशों को एक साथ जोड़ देता है।

यदि आप संकलक और प्रोग्रामिंग भाषाओं का इतिहास चाहते हैं, तो मैं आपको सुझाव देता हूं कि FORTRAN का इतिहास गोटो ।


27
। । । और जोर से कहो कि "... मैं तुम्हें एक इतिहास में JMP का सुझाव देता हूं ..."
बाइनरी वॉरियर

2
मुझे बहुत खेद है। लेकिन मुझे करना पड़ा। मैने अभी किया। से ...
डेव मार्कल

9
@ क्या आपको पता है कि आपने वेलोसिरैप्टर द्वारा खुद को मौत के घाट उतार दिया है ?
बाइनरी वॉरियर

7
वे "जानते थे" क्योंकि वे उस ऑपरेशन को करने के लिए शाब्दिक रूप से कठोर थे, जब उन्होंने दिए गए निर्देश के लिए 101010100 सिग्नल देखा। उनके पास वास्तव में निर्देश डिकोडिंग निर्देशों के लिए एक ऑन-चिप इकाई है: en.wikipedia.org/wiki/Decoder
डेव मार्कल

7
वर्थ ऐडिंग: एक नई भाषा के लिए संकलक, जब उसी नई भाषा में लिखा जाता है, तो कभी-कभी एक दूसरी भाषा में लिखे गए "प्रोटो-कंपाइलर" के साथ संकलित किया जाता है, जो प्रदर्शन-सही, लेकिन भयानक-अयोग्य कोड का उत्पादन करता है। एक बार संकलित होने के बाद, यह एक यथोचित-तीव्र संकलक का उत्पादन करने के लिए स्वयं पर चलाया जाता है। वॉन न्यूमैन मशीन की तुलना करें। : D
BMDan

54

यही संकलक बूटस्ट्रैपिंग के बारे में है (क्योंकि किसी ने उल्लेख नहीं किया कि यह कैसे =) है।

लक्ष्य प्रोग्रामिंग भाषा में एक कंपाइलर (या असेंबलर) लिखने की प्रक्रिया जिसे संकलित करने का इरादा है। इस तकनीक को लागू करने से एक स्व-होस्टिंग संकलक बनता है।

कई प्रोग्रामिंग भाषाओं के लिए कई कंपाइलर बूटस्ट्रैप किए गए हैं, जिनमें BASIC, ALGOL, C, Pascal, PL / I, Factor, Haskell, Modula-2, Oberon, OCaml, Common Lisp, Scheme, Java, Python, Scala और अधिक के कंपाइलर शामिल हैं। ।

मुर्गी और अंडे की समस्या

यदि भाषा X के लिए एक कंपाइलर प्राप्त करने के लिए भाषा X के लिए एक कंपाइलर की आवश्यकता है (जो भाषा X में लिखा गया है), तो पहला कंपाइलर कैसे लिखा गया? इस चिकन या अंडे की समस्या को हल करने के संभावित तरीकों में शामिल हैं:

  • भाषा में एक्स के लिए एक दुभाषिया या संकलक को लागू करते हुए वाई। निकलस विर्थ ने बताया कि उन्होंने फोर्ट्रान में पहला पास्कल संकलक लिखा था।
  • एक्स के लिए एक और दुभाषिया या संकलक पहले से ही एक और भाषा वाई में लिखा गया है; इस तरह स्कीम को अक्सर बूटस्ट्रैप किया जाता है।
  • संकलक के पहले संस्करण एक्स के एक सबसेट में लिखे गए थे जिसके लिए कुछ अन्य संकलक मौजूद थे; यह जावा, हास्केल और शुरुआती फ्री पास्कल कंपाइलर के कुछ सुपरसेट्स बूटस्ट्रैप्ड हैं।
  • X के लिए कंपाइलर को दूसरे आर्किटेक्चर से संकलित किया जाता है जहाँ X के लिए एक कंपाइलर मौजूद होता है; यह है कि सी के लिए कंपाइलर आमतौर पर अन्य प्लेटफार्मों पर कैसे पोर्ट किए जाते हैं। यह भी प्रारंभिक बूटस्ट्रैप के बाद फ्री पास्कल के लिए इस्तेमाल की जाने वाली विधि है।
  • एक्स में कंपाइलर लिखना; फिर इसे स्रोत से हाथ से संकलित करना (गैर-अनुकूलित तरीके से सबसे अधिक संभावना है) और कोड पर एक अनुकूलित संकलक पाने के लिए। डोनाल्ड नथ ने अपनी WEB साक्षर प्रोग्रामिंग प्रणाली के लिए इसका इस्तेमाल किया ...

अच्छा लिंक जो आपको en.wikipedia.org/wiki/History_of_compiler_writing पर भी ले जाता है । सामान्य तौर पर, मुझे लगता है कि मूल संकलक असेंबली लैंग्वेज ( en.wikipedia.org/wiki/Assembly_langui ) में लिखे गए थे । बाद में बूटस्ट्रैपिंग या सेल्फ-होस्टिंग का विचार आया।
माइकल लेवी

1
+1 फाइनल! अजीब है कि यह केवल तीसरा सबसे उच्च श्रेणी का उत्तर है। हां, बूटस्ट्रैपिंग। इसका जवाब है
एडम रैकिस

15

अंततः सभी कंप्यूटर बाइनरी कोड पर काम करते हैं, जो सीपीयू में फीड होते हैं। ये बाइनरी कोड एक सीपीयू के लिए पूरी तरह से प्राकृतिक हैं, लेकिन मानव के लिए पूरी तरह से बेकार भी हैं। एक कार्यक्रम लिखने के पहले तरीकों में से एक कार्ड में छेद छिद्रण द्वारा किया गया था। छेद की स्थिति एक शब्द के भीतर एक विशेष बिट स्थिति का प्रतिनिधित्व करती है, और छेद की उपस्थिति या अनुपस्थिति को एक शून्य या एक के रूप में व्याख्या की गई थी। इन कार्डों को एक बॉक्स में सही क्रम में रखा गया था, और फिर एक कार्ड रीडर में खिलाया गया, जिसने उन्हें सीपीयू के लिए बाइनरी कोड में प्रभावी रूप से परिवर्तित कर दिया (और यदि आप बॉक्स को गिरा देते हैं तो आपका जीवन प्रभावी रूप से निषिद्ध था)।

जाहिर है बहुत पहले प्रोग्रामर ने एक-एक करके बाइनरी कोड काम किया और उनके पास कार्ड पंच करने की मशीन थी। यह आपके हाथों और घुटनों पर अनिवार्य रूप से असेंबली लैंग्वेज प्रोग्रामिंग है। एक बार आपके पास ऐसा है, तो आप उससे अन्य सभी सामग्री बना सकते हैं: एक साधारण पाठ संपादक, एक असेंबली भाषा संकलक (पाठ असेंबली के बयानों को बाइनरी कोड में बदलने के लिए), एक लिंकर और एक लोडर। और बाकी जैसाकि लोग कहते हैं, इतिहास है।


4
कार्ड से पहले आपके पास पते के लिए स्विच का एक सेट, डेटा शब्द के लिए एक सेट और डेटा लोड करने के लिए एक स्विच था। आपने बाइनरी प्रतिनिधित्व के साथ पता और डेटा स्विच सेट करके प्रत्येक मेमोरी एड्रेस को व्यक्तिगत रूप से प्रोग्राम किया और फिर लोड स्विच को बंद कर दिया। उम्र हो गई लेकिन कार्यक्रम केवल कुछ शब्द लंबा था - बाइट्स का आविष्कार तब नहीं किया गया था।
u

4
... और इससे पहले, आपको इसे फिर से लिखना होगा । मज़ा मज़ा मज़ा!
माइकल के

हां, लेकिन जब आपको ऐसा करना था, तो यह वास्तव में वैसा नहीं था जैसा कि हम एक आधुनिक कंप्यूटर के रूप में सोचते हैं, क्योंकि वॉन न्यूमैन वास्तुकला का अभी तक आविष्कार नहीं हुआ था।
डेव मार्कले

7

थोड़ा गुगली 40 के दशक के अंत से ईडीएसएसी इनिशियल ऑर्डर्स को बदल देता है । चूंकि यह पहला असेम्बलर था, इसलिए इसे मशीन भाषा में कोडित किया गया था।

बाद में आईबीएम 650 के लिए SOAP I और II जैसी अन्य मशीनों के लिए कोडांतरक आए । SOAP I को भी शायद मशीन भाषा में कोडित किया गया था, हालांकि मुझे निश्चित कथन नहीं मिला है।

थोड़ा बाद में फोर्ट्रान (सूत्र अनुवादक), आईबीएम 704 के लिए आया। संभवतः 704 के लिए कोडांतरक में लिखा गया था। 701 के लिए एक शुरुआती कोडर का श्रेय नाथन रोचेस्टर को दिया जाता है ।

यदि आप एक विचार प्राप्त करना चाहते हैं कि मशीन भाषा में कंप्यूटर कैसे प्रोग्राम किया जाए, तो मेरी पसंदीदा साइटों में से एक, हैरी पॉर्टर के रिले कंप्यूटर की जांच करें


पवित्र बकवास, हैरी पोर्टर (लगभग कहा जाता है कि कुम्हार योग्य) homebuilt कंप्यूटर AWESOME है। काश, मैं समझ

1
@ सौरोन: हैरी पोर्टर आपको बताने से बेहतर कुछ नहीं चाहेंगे। उस पृष्ठ से वह एक सुंदर ढंग से तैयार की गई पावरपॉइंट को समझा रहा है। यह सर्किट्री के कुछ बुनियादी ज्ञान को ग्रहण करता है, लेकिन इसे प्राप्त करना बहुत कठिन नहीं है।
माइक डनलैवी

मुझे पता है कि मैं सिर्फ मेसिन ^ _ ^ हूं, भले ही यह बहुत प्रभावशाली मशीन हो और यकीन है कि कई विज़ार्ड घंटे इसमें डाले गए थे :)।

6

प्रत्यक्ष मशीन कोड लिखना संभव है (यदि थकाऊ है)। हो सकता है कि आप प्रोग्राम को एक कागज़ के टुकड़े पर असेंबलर में लिख दें, और फिर आप इसे हाथ से अंकीय मशीन कोड के निर्देशों में बदल दें, जिसे आप मशीन मेमोरी में दर्ज करते हैं। आप कोडांतरक-ऑन-पेपर चरण को भी छोड़ सकते हैं यदि आपने सभी मशीन कोड निर्देशों के संख्यात्मक मानों को याद किया है - उन दिनों में असामान्य नहीं है, तो विश्वास करें या नहीं!

बहुत पहले कंप्यूटरों को सीधे बाइनरी में भौतिक स्विच को चालू करके प्रोग्राम किया गया था। जब प्रोग्रामर (या डेटा एंट्री असिस्टेंट) को कीपैड के माध्यम से हेक्साडेसिमल संख्याओं में कोड दर्ज करने देने के लिए विकसित किया गया तो यह एक महान उत्पादकता सुधार था!

एक सॉफ्टवेयर असेंबलर केवल तब प्रासंगिक हो जाता है जब अधिक मेमोरी उपलब्ध हो जाती है (क्योंकि कोडांतरक कोड कच्चे मशीन कोड की तुलना में अधिक जगह लेता है) और अल्फ़ान्यूमेरिक इनपुट की अनुमति देने के लिए हार्डवेयर विकसित हुआ। इसलिए पहले कोडर मशीन कोड में धाराप्रवाह लोगों द्वारा सीधे लिखे गए थे।

जब आपके पास एक कोडांतरक होता है, तो आप कोडांतरक में उच्च स्तर की भाषा के लिए एक कंपाइलर लिख सकते हैं।

सी के लिए कहानी के कई चरण हैं। पहला C कंपाइलर B (C का पूर्ववर्ती) लिखा गया था जो BCPL में लिखा गया था। BCPL एक बहुत ही सरल भाषा है (उदाहरण के लिए इसमें बिल्कुल भी प्रकार नहीं है), लेकिन फिर भी कच्चे कोडांतरक से एक कदम ऊपर है। इसलिए आप देखते हैं कि कैसे धीरे-धीरे अधिक जटिल भाषाओं का निर्माण सरल भाषाओं में किया जाता है जो सभी तरह से वापस असेंबलर के लिए होता है। और खुद सी आज के मानकों से काफी छोटी और सरल भाषा है।

आज, एक नई भाषा के लिए पहला संकलक अक्सर C में लिखा जाता है, लेकिन जब भाषा एक निश्चित परिपक्वता तक पहुंचती है तो इसे अक्सर "अपने आप में" लिखा जाता है। पहले जावा कंपाइलर को C में लिखा गया था, लेकिन बाद में जावा में फिर से लिखा गया। पहले C # कंपाइलर C ++ में लिखे गए थे, लेकिन हाल ही में इसे C # में फिर से लिखा गया है। पायथन कंपाइलर / दुभाषिया C में लिखा गया है, लेकिन PyPy प्रोजेक्ट इसे Pyon में फिर से लिखने का प्रयास है।

हालांकि यह भाषा में किसी भाषा के लिए संकलक / दुभाषिया लिखना हमेशा संभव नहीं होता है। जावास्क्रिप्ट में लिखा एक जावास्क्रिप्ट दुभाषिया मौजूद है, लेकिन वर्तमान ब्राउज़रों में संकलक / दुभाषियों को अभी भी प्रदर्शन कारणों के लिए C या C ++ में लिखा गया है। जावास्क्रिप्ट में लिखा जावास्क्रिप्ट बस बहुत धीमी है।

लेकिन आपको संकलक के लिए सी को "शुरुआती भाषा" के रूप में उपयोग करने की आवश्यकता नहीं है। पहला F # कंपाइलर OCaml में लिखा गया था, जो कि दूसरी भाषा है जो F # से सबसे अधिक निकटता से संबंधित है। जब कंपाइलर पूरा हो गया था, तो इसे F # में फिर से लिखा गया था। पर्ल 6 के लिए पहली संकलक हास्केल में लिखा गया था (एक शुद्ध कार्यात्मक भाषा बहुत लेकिन अब पर्ल से भिन्न) एक संकलक सी में लिखा जाता है

एक दिलचस्प मामला रस्ट है, जहां ओम्क्लल में पहला कंपाइलर लिखा गया था (अब इसे रस्ट में फिर से लिखा गया है)। यह उल्लेखनीय है क्योंकि OCaml को आमतौर पर Rust की तुलना में उच्च स्तर का माना जाता है, जो एक करीब-से-धातु प्रणाली भाषा है। तो यह हमेशा निम्न-स्तरीय भाषाओं में लागू की जाने वाली उच्च-स्तरीय भाषाएँ नहीं होती हैं, यह दूसरी तरह की भी हो सकती हैं।


3

मान लें कि आप एक नंगे निर्देश सेट के साथ शुरू कर रहे हैं और कुछ नहीं, आप एक न्यूनतम , बमुश्किल कार्यात्मक कोडांतरक या संकलक बनाकर शुरू करेंगे जो एक फ़ाइल लोड कर सकता है, लक्ष्य भाषा का एक न्यूनतम सबसेट पार्स कर सकता है और एक निष्पादन योग्य उत्पन्न कर सकता है फ़ाइल को आउटपुट के रूप में, हेक्स संपादक या समान का उपयोग करके कच्चे मशीन कोड लिखकर।

फिर आप थोड़े अधिक सक्षम कंपाइलर या असेंबलर को लागू करने के लिए उस बमुश्किल कार्यात्मक कंपाइलर या असेंबलर का उपयोग करेंगे जो लक्ष्य भाषा के एक बड़े उपसमूह को पहचान सकते हैं। जब तक आपके पास अंतिम उत्पाद न हो, तब तक कुल्ला, दोहराएं।


2

यह इतना मुश्किल नहीं है, जितना लगता है। बचपन में;) मैंने कुछ x86 डिसएस्पॉएड को ध्यान में रखा।

आप भी इसे विशेष रूप से सीखने की जरूरत नहीं है। यह सिर्फ तब होता है, जब आप ASM में प्रोग्राम करने में सक्षम होते हैं और फिर इंटरएक्टिव डिस्सेम्बलर्स का उपयोग करके थर्ड-पार्टी बाइनरी को ठीक करने की कोशिश करते हैं। या कोड एन्क्रिप्शन के साथ अपनी सुरक्षा लिखते समय।

यानी कभी-कभी आप भाषा से लेकर कोड तक भी बिना किसी आश्चर्य के प्रवास कर रहे होते हैं।


1

पहले कंपाइलर्स को असेंबली लैंग्वेज का उपयोग करके लागू किया गया था। और पहले कोडर बाइनरी में कोडिंग कार्यक्रमों द्वारा लागू किए गए थे ...


यह बहुत पहले नहीं है कि बाइनरी में प्रोग्रामिंग अभी भी एक कौशल है जिसे लोग इस्तेमाल करते थे।

जब मैं एक स्नातक था, तो मुझे एक प्रोग्रामिंग अभ्यास करना याद है जो पीडीपी -8 (मुझे लगता है) मशीन कोड में एक छोटे से कार्यक्रम को लिखने में असफल रहा, इसे फ्रंट पैनल स्विच के माध्यम से दर्ज किया गया, और इसे चलाया। मैं कुछ साल बाद, मैंने खुद को एक 6502 सिस्टम डेवलपमेंट किट खरीदा, जिसमें प्रोग्राम्स दर्ज करने के लिए एक हेक्स कीपैड था ... और 4k बाइट्स रैम।


-3

एक बहुत ही सरल उत्तर मान लीजिए कि हम एक हार्डवार्ड प्रोग्राम लिखते हैं और इसे ROM में संग्रहीत करते हैं। इसे कंपाइलर माना जा सकता है। इसलिए मैं बस इतना कहना चाहता हूं कि पहले कंपाइलर को हार्डवेर किया गया था। जैसे-जैसे तकनीक में सुधार हुआ इन सरल संकलकों का उपयोग उच्च स्तरीय संकलक लिखने के लिए किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.