पहला दुभाषिया पहले दुभाषिया से पहले क्यों लिखा गया था?


72

पहला संकलक 1952 में ग्रेस हॉपर द्वारा लिखा गया था जबकि लिस्प दुभाषिया 1958 में जॉन मैक्कार्थी के छात्र स्टीव रसेल द्वारा लिखा गया था। एक कंपाइलर लिखना एक दुभाषिया की तुलना में बहुत कठिन समस्या की तरह लगता है। यदि ऐसा है, तो पहले इंटरप्रेटर के छह साल पहले पहला संकलक क्यों लिखा गया था?


67
क्योंकि उस समय एक दुभाषिया की तुलना में एक कंपाइलर की अधिक आवश्यकता थी
शाफ़्ट फ्रीक

23
पहला दुभाषिया संकलित करने के लिए? : पी (केवल आंशिक रूप से जीभ में गाल, एक दुभाषिया जटिल है (एक साधारण संकलक की तुलना में अधिक) और मशीन कोड में एक कुशल लिखने के लिए बुरा होगा)
14

4
यदि आप अपने सीपीयू को निर्देशों की व्याख्या के रूप में निष्पादित करते हैं, तो वह तरीका है जो मैं इसे देखता हूं (हालांकि हार्डवेयर के माध्यम से कार्यान्वित किया गया है), तो दावा है कि पहला संकलक पहले संकलक के पास नहीं होने के बाद लिखा गया था। Btw, मुझे पता है कि यह सवाल / जवाब के साथ मदद नहीं करता है। यह सिर्फ एक अलग दृष्टिकोण पर एक दिलचस्प टिप्पणी करने के लिए है।
पेड्रो हेनरिक ए। ओलिवेरा

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

5
वास्तव में, मैंने सुना है कि मैकार्थी का मानना ​​था कि एलआईएसपी कार्यान्वयन योग्य नहीं है। यह रसेल था जिसने महसूस किया कि एलएसीपी मैनुअल ए से मैकार्थी का सार्वभौमिक कार्य एक दुभाषिया था और बी) कार्यान्वयन योग्य था।
जोर्ज डब्ल्यू मित्तग

जवाबों:


97

एक कंपाइलर लिखना एक दुभाषिया की तुलना में बहुत कठिन समस्या की तरह लगता है।

यह आज सच हो सकता है, लेकिन मैं यह तर्क दूंगा कि लगभग 60 साल पहले ऐसा नहीं था। कुछ कारण क्यों:

  • दुभाषिया के साथ, आपको इसे और कार्यक्रम दोनों को स्मृति में रखना होगा। एक ऐसी उम्र में जहाँ 1kb मेमोरी बहुत बड़ी लक्जरी थी, जिसमें रनिंग मेमोरी फुटप्रिंट कम था। और संकलित कार्यक्रम चलाने की तुलना में व्याख्या करने के लिए थोड़ी अधिक स्मृति की आवश्यकता होती है।
  • आधुनिक सीपीयू निर्देशों के विशाल कैटलॉग के साथ बेहद जटिल हैं। इसलिए एक अच्छा संकलक लिखना वास्तव में एक चुनौती है। पुराने CPU ज्यादा सरल थे, इसलिए संकलन भी सरल था।
  • पुरानी भाषाओं की तुलना में आधुनिक भाषाएं अधिक जटिल हैं, इसलिए कंपाइलर भी अधिक जटिल हैं। इस प्रकार पुरानी भाषाओं में सरल संकलक होंगे।

65
और एक संकलक के बिना आपको विधानसभा में दुभाषिया लिखना होगा
शाफ़्ट सनकी

34
पहला संकलक जहां लोग हैं। (जब लोग दुभाषिए होते हैं तो हमें कंप्यूटर की आवश्यकता नहीं होती है)। तब किसी ने संकलित भाषा में एक कंपाइलर लिखने पर विचार किया होगा (केवल वही जो उनके पास था, लेकिन जैसा कि समय ने मेरे मनुष्यों को संकलित किया है)।
ctrl-alt-delor

1
दरअसल .... मैंने हाल ही में पढ़ा कि 60 के दशक की चाँद की उड़ानों में इस्तेमाल किए गए अपोलो गाइडेंस कंप्यूटर में एक दुभाषिया था: विकी एंट्री "... दुभाषिया ने एजीसी को मूल समर्थन से कई और निर्देश दिए थे ..." मुझे लगता है कि यह "दुभाषिया" है की तरह अधिक "स्वीट 16" लिस्प की तरह कुछ की तुलना में वर्ष एप्पल II कंप्यूटर में एम्बेडेड दुभाषिया।
कैलफूल

6
@ratchetfreak और यह था जैसा कि पहले संकलक थे।
RBarryYoung

3
@richard: जब लोग दुभाषिया / परिकलक थे, तो उनकी नौकरी का शीर्षक "कंप्यूटर" कहलाता था। इसलिए जब लोग दुभाषियों थे, तो वे कंप्यूटर थे। मैनहट्टन परियोजना ने हजारों "कंप्यूटर" (वास्तविक नौकरी का शीर्षक, गंभीरता से) नियोजित किया, जिसके लिए परमाणु भौतिकविदों ने मेल द्वारा अपनी गणना को निष्पादित किया। दरअसल, इस परियोजना ने गणितज्ञों को भी नियुक्त किया, जिन्होंने इंजीनियरों से गणना को तोड़ दिया, जिन्होंने भौतिकविदों के सिद्धांतों से गणना को "कंप्यूटर" भेजा।
स्लीपबेटमैन

42

मूल बिंदु यह है कि 1950 के दशक के कंप्यूटिंग हार्डवेयर वातावरण ने इसे ऐसा बना दिया था कि कंप्यूटर के बैच-उन्मुख प्रसंस्करण को देखते हुए केवल एक संकलक को संभव बनाया गया था।

उस समय बेहतर उपयोगकर्ता इंटरफेस मुख्य रूप से पंच कार्ड और टेलेटाइप प्रिंटर तक सीमित थे । 1961 में SAGE प्रणाली कंप्यूटर पर पहली कैथोड-रे ट्यूब (CRT) डिस्प्ले बन गई । इसलिए एक दुभाषिया की संवादात्मक प्रकृति बहुत बाद तक बेहतर या स्वाभाविक नहीं थी।

1950 के दशक के कई कंप्यूटरों ने निर्देशों को लोड करने के लिए फ्रंट पैनल स्विच का उपयोग किया, और आउटपुट केवल लैंप / एल ई डी की पंक्तियाँ थीं, और हॉबीस्ट ने भी 1970 के दशक में फ्रंट-पैनल स्विच और एलईडी का उपयोग किया। हो सकता है कि आप कुख्यात अल्टेयर 8800 से परिचित हों ।

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

जब आईबीएम में जॉन बैकस की अगुवाई वाली टीम ने 1954-57 में फोरट्रान कंपाइलर बनाया, तब मेमोरी लिमिट एक बड़ा कारक था। यह अभिनव संकलक केवल इसलिए सफल रहा क्योंकि यह एक अनुकूलन करने वाला संकलक था

1950 के दशक के अधिकांश कंप्यूटरों में कोई भी ऑपरेटिंग सिस्टम नहीं था , अकेले आधुनिक सुविधाओं जैसे कि डायनेमिक लिंकिंग और वर्चुअल मेमोरी मैनेजमेंट, इसलिए एक दुभाषिया का विचार उस समय भी कट्टरपंथी और अव्यवहारिक था।

परिशिष्ट

1950 के दशक की भाषाएं आदिम थीं। इनमें केवल एक छोटा-सा ऑपरेशन शामिल था, जो अक्सर अंतर्निहित हार्डवेयर के निर्देशों या उनके लक्षित उपयोग की समस्या की परिभाषा से प्रभावित होता है।

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

कंप्यूटर विज्ञान के दृष्टिकोण से, संकलनकर्ता और व्याख्याकार दोनों अनुवादक हैं , और लागू करने के लिए जटिलता में लगभग समान हैं।


क्या समय साझा करने के आगमन से पहले कंप्यूटर टेलेटिप का उपयोग करते थे? मैंने उनसे अपेक्षा की होगी कि वे टेप से प्रिंटर या स्पूल का उपयोग करें। अन्यथा, 1-8 सेकंड के लिए कंप्यूटर को पाठ की प्रत्येक पंक्ति के बाद इंतजार करना होगा 1-8 सेकंड का प्रतिनिधित्व करेगा जो कंप्यूटर हो सकता था - लेकिन ऐसा नहीं था - कुछ उपयोगी कर रहा है।
सुपरकैट

2
@supercat - हाँ, टेलेटाइप्स का उपयोग किया गया था, लेकिन वे "इंटरैक्टिव" से बहुत दूर थे। मैंने जो पहला कंप्यूटर प्रोग्राम किया था, उसमें 18 बिट शब्दों की मेमोरी थी - उनमें से 1K। मेमोरी स्वयं एक घूमने वाला ड्रम था , इसलिए जब आप कंप्यूटर को चालू करते हैं तो आपको तब तक इंतजार करना पड़ता है जब तक कि मेमोरी गति में न आ जाए। इसमें एक टेलेटाइप संलग्न था और आप ए) कीबोर्ड से टाइप किए गए एक चरित्र को पढ़ सकते थे या पेपर टेप रीडर (कंप्यूटर के दृष्टिकोण से दोनों समान थे), बी) "प्रिंटर" के लिए एक चरित्र लिखते हैं "टेलेटाइप का। आह, महान दिन - महान दिन ..! क्या मेरी लकड़ी की लकड़ी है?!?!? :-)
बॉब जार्विस

@ याकूब जार्विस: वह कौन सा साल रहा होगा?
Supercat

1
@supercat - 1973 - लेकिन प्रश्न में कंप्यूटर (शैक्षिक डेटा उत्पादों द्वारा एक EDP-18) तब भी अपेक्षाकृत बुजुर्ग था। फिर भी, यह वही था जो (और 70 के दशक के मध्य में हाई स्कूल में गड़बड़ करने के लिए किसी भी कंप्यूटर के पास होना असामान्य था) इसलिए हमने सोचा कि यह बहुत अद्भुत था। :-)
बॉब जार्विस

2
यह स्वीकार किए गए से बेहतर और पूर्ण उत्तर है।
जिम गैरिसन

12

पहली प्रोग्रामिंग भाषाएं काफी सरल थीं (उदाहरण के लिए कोई पुनरावृत्ति नहीं) और मशीन वास्तुकला के करीब जो स्वयं सरल थी। अनुवाद तो एक सीधी प्रक्रिया था

एक कंपाइलर एक दुभाषिया की तुलना में प्रोग्राम के रूप में सरल था, जिसे प्रोग्राम कोड के लिए डेटा और तालिकाओं दोनों को साथ रखना होगा ताकि सोर्स कोड की व्याख्या की जा सके। और दुभाषिया अधिक जगह लेगा , खुद के लिए, प्रोग्राम सोर्स कोड के लिए और प्रतीकात्मक तालिकाओं के लिए।

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

सच कहें तो कंपाइलर्स के लिए जरूरी सादगी ऐसी थी कि कंपाइलर बहुत अच्छे नहीं थे (कोड ऑप्टिमाइज़ेशन अभी भी शैशवावस्था में था, जब माना जाता था)। हाथ से लिखे मशीन कोड में कम से कम साठ के दशक तक कुछ स्थानों पर कंपाइलर जनरेट कोड की तुलना में अधिक कुशल होने की प्रतिष्ठा थी। यहां तक ​​कि कोड विस्तार अनुपात की एक अवधारणा भी थी , जिसने संकलित कोड के आकार की तुलना बहुत अच्छे प्रोग्रामर के काम से की थी। यह आम तौर पर अधिकांश (सभी?) संकलक के लिए 1 से अधिक था, जिसका अर्थ था धीमी कार्यक्रम, और, अधिक महत्वपूर्ण बात, बड़े कार्यक्रमों को अधिक स्मृति की आवश्यकता होती है। यह अभी भी साठ के दशक में एक मुद्दा था।

कंपाइलर की रुचि प्रोग्रामिंग आसानी में थी, खासकर उन उपयोगकर्ताओं के लिए जो विभिन्न क्षेत्रों में वैज्ञानिकों जैसे कंप्यूटिंग विशेषज्ञों के लिए नहीं थे। यह रुचि कोड प्रदर्शन नहीं था। लेकिन फिर भी, प्रोग्रामर समय को तब एक सस्ता संसाधन माना जाता था। लागत कंप्यूटर के समय में थी, 1975-1980 तक, जब लागत हार्डवेयर से सॉफ्टवेयर में बदल गई। जिसका अर्थ है कि कुछ पेशेवरों द्वारा भी संकलक को गंभीरता से नहीं लिया गया था

कंप्यूटर के समय की बहुत अधिक लागत अभी तक दुभाषियों को अयोग्य घोषित करने का एक और कारण था , इस बिंदु पर कि अधिकांश लोगों के लिए बहुत ही विचार हँसने योग्य होता।

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

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


3
मेरा, कितना बोल्ड है
छत्र

@ छाप उस अनुचित शैली है? मेरा उद्देश्य तथ्यों की सरल गणना की तुलना में स्वतंत्र शैली की अनुमति देते हुए महत्वपूर्ण जानकारी को खोजना आसान बनाना है। मुझे यह स्वीकार करना चाहिए कि यह वास्तव में इस एसई साइट पर बहुत प्रभावी नहीं है।
बबलू

@ अनाम-डाउनवॉटर डाउनवोटिंग बिना व्याख्यात्मक टिप्पणी के पता चलता है कि कोई व्यक्ति मूर्ख हो सकता है। हालांकि, यह नहीं बताता कि कौन है।
बबलू

4

मैं प्रश्न के आधार से असहमत हूं।

Adm। हॉपर का पहला संकलक (A-0) एक लिंकर या एक मैक्रो भाषा की तरह अधिक था। उसने एक टेप पर सबरूटिन संग्रहीत किया (प्रत्येक ने एक नंबर सौंपा) और उसके कार्यक्रमों को सबरूटीन्स और तर्कों की एक सूची के रूप में लिखा जाएगा। कंपाइलर टेप से अनुरोधित सबरूटीन्स की नकल करेगा और उन्हें एक पूर्ण कार्यक्रम में फिर से ऑर्डर करेगा।

उसने "संकलन" शब्द का उपयोग उसी अर्थ में किया, जो कविताओं के संकलन को संकलित करता है: विभिन्न वस्तुओं को एक साथ एक मात्रा में एकत्रित करना।

उस पहले कंपाइलर में एक लेसर या पार्सर नहीं था, जहाँ तक मैं बता सकता हूँ, जो इसे एक आधुनिक कंपाइलर का दूर का पूर्वज बनाता है। बाद में उसने एक और कंपाइलर (B-0, उर्फ ​​FLOW-MATIC) बनाया, और अधिक अंग्रेजी जैसे सिंटैक्स के लक्ष्य के साथ, लेकिन यह 1958 या 1959 तक पूरा नहीं हुआ - लिस्प दुभाषिया के रूप में एक ही समय के आसपास।

इसलिए, मुझे लगता है कि सवाल ही थोड़ा गलत है। ऐसा लगता है कि संकलक और दुभाषिए लगभग एक ही समय में सह-विकसित हुए थे, विचारों के बंटवारे के कारण कोई संदेह नहीं है, जो उन दिनों में कई वैज्ञानिकों को एक ही रेखा के साथ सोच रहा होगा।

यहाँ प्रशंसा पत्र के साथ एक बेहतर जवाब: https://stackoverflow.com/a/7719098/122763


3

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

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

एक समय संदर्भ के रूप में, मैंने 1972 के आसपास फोन कंपनी में प्रोग्रामिंग शुरू की।


2

यदि आप सब कुछ मेमोरी में नहीं रखते हैं, तो संकलित कोड बहुत अधिक त्वरित है। मत भूलो, कि इन समय में फ़ंक्शन संकलित कोड में शामिल हो गए थे। यदि आप संकलन नहीं कर रहे हैं, तो आपको नहीं पता कि आपको किन कार्यों की आवश्यकता होगी। तो, आप फ़ंक्शंस से कॉल कर रहे हैं ... ओह, डिस्क से अभी तक नहीं, हम शुरुआती 50-संबंधों में हैं, लेकिन कार्ड से! रनटाइम में!

बेशक, वर्कअराउंड ढूंढना संभव है, लेकिन वे अभी तक नहीं मिले थे, क्योंकि भाषाएं बहुत सरल थीं और मशीन कोड से इतनी दूर नहीं थीं। और संकलन करना आसान और पर्याप्त था।


1

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

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


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

3
पहला संकलक लिखे जाने से पहले , अधिकांश कार्यक्रम वास्तव में वास्तविक मशीन कोड में लिखे गए थे, न कि असेंबली भाषा (ऑप-कोड mnemonics)।
mctylr

2
@delnan उन सिस्टमों को किलोहर्ट्ज़ में घड़ियों के साथ चलाया गया, इसलिए प्रदर्शन में 3-5 समय की कमी को बर्बाद करना संभवतः हार्डवेयर विफलता (यानी वैक्यूम ट्यूब उड़ा) के कारण सिस्टम के विफल होने से पहले प्रोग्राम को सफलतापूर्वक पूरा करने के बीच का अंतर होगा। अगर मैं सही ढंग से याद करूँ तो 1950 के दशक में हार्डवेयर विफलता एक दैनिक घटना थी।
mctylr

डेलान: मुझे एक दुभाषिया दिखाओ जो एक पाँच निर्देश उपरि के साथ व्याख्या कर सके। और फोर्थ एक व्याख्या की गई भाषा नहीं है, यह एक अपमानजनक :-) है। क्षमा करें, मेरा मतलब है एक लड़ी हुई भाषा। एक कथन की व्याख्या करने के लिए BASIC की तरह कुछ निर्देश के gazillions लेता है।
gnasher729

@gnasher: 1974 में, मैंने केरोनिक्स (अहम, डेटा जनरल नोवा क्लोन) के लिए एक उच्च-प्रदर्शन BASIC दुभाषिया का निर्माण किया, जिसने BASIC स्टेटमेंट को एनकोड करने के लिए एक बाइट-ओरिएंटेड P-code का उपयोग किया। यह 25-50 मशीन निर्देशों के बारे में एक pCode "व्याख्या" करने के लिए ले लिया, उनमें से 10 खुद बाइट लाने के लिए। (मैंने 1969 में एक टोकन आधारित किया था, जो अधिक लिया क्योंकि यह फिर से भावों को फिर से पार्स करने में सक्षम था)। लेकिन यह "gazillions" नहीं था।
इरा बैक्सटर

1

लूपिंग प्रोग्राम की व्याख्या करने से पहले, इसे एक माध्यम में संग्रहित किया जाना चाहिए जिसे बार-बार पढ़ा जा सके। ज्यादातर मामलों में, एकमात्र उपयुक्त माध्यम रैम होगा। चूँकि कोड आमतौर पर छिद्रित कार्ड पर दर्ज किया जाएगा, जो - मानव पठनीय भाषाओं के लिए - काफी हद तक खाली होने की संभावना है, रैम में संग्रहीत होने से पहले कोड पर किसी प्रकार का प्रसंस्करण किया जाना चाहिए। कई मामलों में, छिद्रित-कार्ड टेक्स्ट को एक ऐसे रूप में संसाधित करना जो प्रोसेसर द्वारा प्रत्यक्ष निष्पादन के लिए उपयुक्त है, वास्तव में इसे प्रसंस्करण के रूप में संसाधित करने से अधिक कठिन नहीं है जो एक दुभाषिया के माध्यम से कुशलतापूर्वक नियंत्रित किया जा सकता है।

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


1
डिस्क? Ummmm ... कोई। फीता। बड़े, धीमे, रील-टू-रील टेप। और उनमें से बहुत सारे। मुझे याद है कि ग्रेस मरे होपर द्वारा दिए गए एक व्याख्यान में जाना (मेरे लिए दोगुना दिलचस्प था क्योंकि मैं एक विश्लेषण विश्लेषण प्रमुख था और परिसर में नौसेना ROTC टुकड़ी में एक midshipman था, और CAPT हूपर एक सेवारत नौसेना अधिकारी था)। उसने एक कहानी से संबंधित किया, जहां उसने कहा, वह एक कार्यक्रम के अप्रयुक्त भागों को टेप करने के लिए लिख रही है - उसने इसे "सहायक भंडारण का उपयोग करना" कहा। "लेकिन, उसने कहा," जब तक आईबीएम ने ऐसा ही नहीं किया और वर्चुअल मेमोरी कहा जाता है, तब तक यह विचार नहीं पकड़ा। CAPT हूपर वास्तव में आईबीएम को नापसंद करता है ... :-)
बॉब जार्विस

@ याकूब जार्विस: मैंने उस पहलू पर विचार नहीं किया था, लेकिन वही सामान्य वन-पास डिज़ाइन जो रैम के लिए रेडी-टू-रन कोड को संकलित करने के लिए उपयोग किया जाएगा, टेप ड्राइव के साथ अच्छी तरह से काम कर सकता है; कंपाइलर से आउटपुट टेप में जाएगा, फिर टेप को रिवाइंड किया जाएगा और अनुक्रमिक मेमोरी एड्रेस में पढ़ा जाएगा और सीधे उसी समय मेमोरी में कंपाइलर का कोई भी हिस्सा होने की आवश्यकता के बिना चलाया जाएगा।
सुपरकैट

0

क्योंकि काम करने के लिए दुभाषियों को कंपाइलर की जरूरत होती है।

उपरोक्त कथन वास्तव में सत्य नहीं है। कड़ाई से बोलते हुए, आप कभी भी एक संकलक के साथ बातचीत या अन्यथा उपयोग किए बिना एक दुभाषिया बना सकते हैं। लेकिन ऐसा करने के परिणाम बहुत ज्यादा नहीं दिखेंगे जैसा कि मुझे लगता है कि आप उन शब्दों से मतलब रखते हैं।

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

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

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

इसलिए पहले कंपाइलर लिखे गए थे। संकलक की कल्पना करते समय भी डेटा संरचनाओं की व्याख्या करने का विचार नया नहीं था, लेकिन संकलक "लापता लिंक" थे जो प्रोग्रामर को पाठ से बाहर उन संरचनाओं का निर्माण करने देते थे।


Apple के लिए मूल बेसिक दुभाषिया] [था, जो मैं समझता हूं, मशीन कोड में हाथ से अनुवादित किया गया और मशीन-पठनीय स्रोत-कोड प्रारूप में कभी भी मौजूद नहीं था। मुझे यकीन नहीं है कि आप जो "संकलक" कहेंगे, उसका उपयोग करने के लिए इसका उपयोग किया गया था।
1

@ सुपरकैट: मुझे नहीं पता कि आपके द्वारा बताए गए बेसिक इंटरप्रेटर का उत्पादन कैसे किया गया था, लेकिन मैं दुभाषियों का उत्पादन करने के लिए उपयोग किए जाने वाले कंपाइलरों के बारे में बात नहीं कर रहा हूं । मैं संकलक के बारे में बात कर रहा हूं जो दुभाषियों का हिस्सा हैं । अपने कोड के भाग के रूप में, Apple] [BASIC दुभाषिया को BASIC कोड वाली पाठ फ़ाइलों को पढ़ने और उस पाठ से एक वाक्यविन्यास ट्री बनाने के लिए किसी तरह की आवश्यकता होती है, जिसे वह तब निष्पादित करता है। कोड जो ऐसा करता है वह एक संकलक है; यह मशीन कोड उत्पन्न नहीं करता है, लेकिन यह अभी भी कोड में पढ़ने और इसे दूसरे रूप में अनुवाद करने के कार्य करता है।
स्पूनिएस्ट

विशिष्ट माइक्रो कंप्यूटर बेसिक दुभाषियों को सिंटैक्स ट्री के समान दूर से भी कुछ भी उत्पन्न नहीं होता है। मैं मूल Apple BASIC दुभाषिया (जिसे "पूर्णांक BASIC" कहा जाता है) से परिचित नहीं हूँ, लेकिन Microsoft द्वारा Apple ("Applesoft BASIC"), कमोडोर, और विभिन्न अन्य कंपनियों द्वारा प्रोग्राम पाठ के रूप में लागू किया गया BASIC दुभाषिया दो चीजों को छोड़कर है। : (१) प्रत्येक पंक्ति १६-बिट लाइन संख्या और अगली पंक्ति के १६-बिट पते से पहले थी, और उसके बाद एक शून्य बाइट; (2) प्रत्येक कीवर्ड को एक एकल बाइट के साथ बदल दिया गया था जिसमें उच्च बिट सेट था। इसके अलावा, अभिव्यक्तियों को पार्स किया गया था ...
सुपरकैट

... चरित्र से चरित्र, बाएं से दाएं; A = 1234 जैसा एक स्टेटमेंट रन-टाइम में अंकों 1, 2, 3 और 4 को फ्लोटिंग-पॉइंट नंबर में
बदल देगा

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

-1

एक अन्य कारक: जब पहले संकलक को लिखा गया था कि मशीन के समय की लागत अब की तुलना में बहुत अधिक है। दुभाषिए बहुत अधिक मशीन समय का उपयोग करते हैं।

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