मैं कहां सीख सकता हूं कि प्रोग्रामिंग भाषा कैसे बनाई जाए?


जवाब 1:

व्यावहारिक रूप से, इसका उत्तर मौजूदा प्रोग्रामिंग भाषा को लेना है, और इसे बदलना है।

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

सामान्य तौर पर, हालांकि, एक नई भाषा बनाना बहुत मुश्किल है, यहां तक ​​कि एक बार जब आप समझ जाते हैं कि किसी भाषा के लिए संकलक फ्रंट एंड को कैसे संशोधित / लिखना है।

पहले समस्या

पहली वास्तविक समस्या यह है कि भाषा को "एक साथ लटका देना" है, लेकिन यह वास्तव में मुझे सिर्फ एक सादा अंग्रेजी विवरण दे रहा है

ट्यूरिंग पूर्णता

यदि कोई भाषा ट्यूरिंग पूर्ण नहीं है, तो मैं इसमें कोई मनमाना कार्यक्रम नहीं लिख पाऊंगा: कुछ ऐसे कार्यक्रम होंगे जिन्हें मैं बस नहीं लिख सकता।

यह एक बड़े समय की समस्या है।

समस्या दूसरी

दूसरी वास्तविक समस्या जिसे आप चलाएंगे उसे लागू करने की आवश्यकता होगी

भाषा क्रम

। सी भाषा के लिए, उदाहरण के लिए, यह वही है जो आम तौर पर crt0.s में होता है; साझा पुस्तकालयों के लिए कभी-कभी एक अलग crt1.s भी होता है।

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

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

समस्या तीसरी

तीसरा वह होगा जिसे कहा जाता है

भाषा बाइंडिंग

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

C में, यह libc है, और यह वास्तव में libc का केवल सिस्टम कॉल भाग है।

इसमें बाकी मानक पुस्तकालय शामिल नहीं हैं - जैसे प्रिंटफ।

सबसे आसान काम सी रनटाइम को लक्षित करना है।

चूंकि किसी ने आपके लिए इसे पहले ही लिखा है, यह आपको सभी मौजूदा पुस्तकालयों तक पहुंच प्रदान करता है, और इसी तरह, वहाँ से बाहर, बिना कुछ के जावा जेएनआई के रैपर के लिए सब कुछ लिखने के लिए।

लेकिन यह वास्तव में "जादू, अजीब सामान" पर निर्भर करता है कि आप क्या करने के लिए भाषा की योजना बनाते हैं। कुछ भाषाएं ऐसा नहीं करती हैं, क्योंकि उनके पास अजीब चीजें हैं जो वे करना चाहते हैं। उदाहरण के लिए,

जाओ

अपना खुद का रनटाइम प्रदान करता है।

बहुत काम है।

मजेदार रूप से, अधिकांश लोग जो नई भाषाएँ करते हैं, उन्हें एहसास नहीं होता है कि कितना काम शामिल है, जब वे बस इसमें शामिल हो रहे हैं, या वे शायद पहली जगह में नहीं मिलेंगे।


जवाब 2:

कंप्यूटर प्रोग्राम की संरचना और व्याख्या

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

आप विभिन्न भाषाओं के इतिहास में खुदाई शुरू करना चाहते हैं - और मैं विशेष रूप से LISP, Smalltalk और Erlang को इंगित करूंगा - अंतर्निहित प्रेरणाओं और डिजाइन दृष्टिकोण पर अच्छी सामग्री तैर रही है।


जवाब 3:

मै सुझाव दूंगा

कंप्यूटर प्रोग्राम की संरचना और व्याख्या

भाषाएं कैसे काम करती हैं, और एक संस्करण या किसी अन्य के बारे में जानने के लिए एक अच्छी जगह के रूप में

C ड्रैगन बुक (संकलक: सिद्धांत, तकनीक और उपकरण)

संकलक डिजाइन और कार्यान्वयन के लिए।

डिज़ाइन बनाना

एक प्रोग्रामिंग भाषा एक और मामला है। विभिन्न भाषाओं की विस्तृत श्रृंखला से परिचित होने में मदद मिलती है।


जवाब 4:

सबसे पहले, क्यों पहचानें। कई नई प्रमुख भाषाएं एक कारण से प्रकट नहीं होती हैं। मैंने एक विशिष्ट परियोजना के लिए एक स्क्रिप्टिंग भाषा लिखी है, लेकिन इसका कोई नाम नहीं है, और 2–3 उपयोगकर्ता हैं (मुझे यकीन नहीं है कि कंपनी ने अब तक इसका कितना उपयोग किया है)। इसका एक विशिष्ट उद्देश्य है, और यह अत्यधिक जटिल नहीं था, और न ही इसे अत्यधिक कुशल बनाया गया था।

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

आसान भागों:

आपको सिंटैक्स को पार्स करने का तरीका सीखने की ज़रूरत है, तार्किक ढेर का ट्रैक रखें, अनुवाद करें और एनकोड करें।

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

कठिन हिस्सा:

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

यह थकाऊ हो सकता है और आपको बहुत सारी शाखाओं और विकल्पों को देखना होगा। विशेष रूप से जैसा कि यह माना जाता है कि आप इसे अपनी सीमा के साथ कई प्रणालियों पर चलाएंगे।

आधुनिक कार्यक्षमता का मिलान। कम आम भाषाओं में से कुछ के लिए भी वहाँ पुस्तकालय हैं। अपनी भाषा को उपयोगी बनाने के लिए इसे उपयोगी कार्यक्षमता, पुस्तकालयों और अधिक के ढेर की आवश्यकता होती है।

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

कोई अपराध का इरादा नहीं है, लेकिन अगर आपके पास कई वर्षों का अनुभव है और यह पता नहीं लगा है, तो मुझे आश्चर्य है कि आपके पास किस प्रकार का अनुभव है, क्योंकि इंजीनियरों के सामने आने वाली कई समस्याएं कंपाइलर के लेखन के सामने आने वाली समस्याओं के विपरीत नहीं हैं।

फाइलों को पार्स करने जैसी सरल सोच भी भाषा के विकास का एक बड़ा हिस्सा है। बड़ा डेटा चीजों को कुशल और तेज बनाने के तरीकों की पहचान करने के बारे में है। उन्नत डेटा संरचनाओं का उपयोग बड़े जटिल प्रसंस्करण को मैप करने और प्रबंधित करने के लिए किया जा सकता है।

यदि आप स्वयं सिखाया जाता है और केवल वेब विकास या प्रोग्रामिंग के समान सरलीकृत भागों में काम कर रहा है, तो मैं सुझाव देता हूं कि यदि आप इस स्तर पर काम करना चाहते हैं, तो आप एक गहरे स्तर पर पहुंच सकते हैं।

यदि आप C या C ++ नहीं जानते हैं, तो मैं सुझाव दूंगा कि आप उनमें से किसी एक में प्रवीण बनें, क्योंकि आप यह समझने से लाभान्वित होंगे कि मेमोरी कैसे काम करती है जब आपके लिए इसका प्रबंधन नहीं होता है, और संकेत जैसे संकेत वास्तव में चीजों को तोड़ने में फर्क कर सकते हैं नीचे और उन्हें एक साथ रखना।


जवाब 5:

पिकअप लीक्स एंड याक पर एक किताब।

लेक्स आप एक इनपुट फ़ाइल पार्स करने के लिए परिभाषित नियमों का उपयोग करता है।

Yacc (फिर भी एक अन्य संकलक संकलक) इनपुट फ़ाइल को टोकन करने के लिए lex को कॉल करेगा और yacc यह निर्धारित करने का प्रयास करेगा कि स्ट्रिंग का क्या अर्थ है।

इन उपकरणों का उपयोग करके, आप अपनी इच्छा के अनुसार कोई भी भाषा लिख ​​सकते हैं और एक अनिवार्य लेखन को समाप्त कर सकते हैं


जवाब 6:

चूंकि प्रश्न पूछता है "कहां?", मैं निम्नलिखित के साथ शुरू करने का सुझाव दूंगा:

  • LtU वेबसाइट - लैम्बडा द अल्टीमेट - (काफी शांत) वेब साइट जो भाषा के विकास पर केंद्रित है
  • पुस्तकें मौजूद हैं: बेंजामिन सी। पियर्स: 9780262162098: Amazon.com: पुस्तकें
  • अल्फ्रेड वी। अहो (अंतर्राष्ट्रीय अर्थव्यवस्था संस्करण) के सिद्धांत, तकनीक और उपकरण 2: अल्फ्रेड वी अहो: 9789332518667: Amazon.com: पुस्तकें
  • डिजाइन, मूल्यांकन और कार्यान्वयन: ब्रूस जे। मैकलेनन: 9780195113068: Amazon.com: पुस्तकें
  • माइकल एल स्कॉट: 9780124104099: Amazon.com: पुस्तकें
  • अपनी खुद की डोमेन-विशिष्ट और सामान्य प्रोग्रामिंग भाषाएँ (व्यावहारिक प्रोग्रामर्स) बनाएँ: टेरेंस पर्र: 9781934356456: Amazon.com: पुस्तकें
  • सॉफ्टवेयर डेवलपमेंट न्यूज़, वीडियो और बुक्स वेब साइट कई तरह के भाषा विकास करते हैं
  • प्रोग्रामिंग लैंग्वेज • आर / प्रोग्रामिंग लैंग्वेजेज

या का पालन करने के लिए एक खुला स्रोत परियोजना चुनें, कांटा, या योगदान करने के लिए। मैं केवल एक अच्छे उदाहरण के बारे में सोच सकता हूं, लेकिन मैं थोड़ा पक्षपाती हूं:

  • xtclang / XVM