2010-10-25 31 views
12

यह सवालमैं प्रोग्रामिंग भाषा को कैसे डिजाइन और कार्यान्वित कर सकता हूं?

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

मैं भी दोनों लेगो RCX और NXT, लेकिन समय के सबसे अधिक ही मैं वास्तव में मेरी रोबोट बनाने कभी नहीं है क्योंकि उनके प्रतिबंधात्मक दृश्य प्रोग्रामिंग वातावरण के लिए कुछ भी करने।

मुझे लगता है कि मैं एनटीएक्स के लिए अपनी प्रोग्रामिंग भाषा तैयार करूंगा क्योंकि पहले से ही बहुत से सामान्य उद्देश्य भाषाएं हैं और एनएफटी मुझे समस्याओं और लक्ष्यों का एक ठोस सेट देता है और उम्मीद है कि साथ खेलने के लिए एक अच्छा सैंडबॉक्स होगा।

अब क्या? मैं कहाँ से प्रारम्भ करूँ? मुझे क्या जानने की ज़रूरत है?

संभव हो तो, मैं अजगर या Clojure में संकलक लिखने चाहते हैं। SDK for the NXT है, लेकिन Assembly language भी है। सबसे अच्छा/आसान मार्ग क्या होगा?

लेगो एनएफटी की एक छोटी सी स्क्रीन, यूएसबी और ब्लूटूथ है, इसमें डिजिटल और एनालॉग, 3 आउटपुट पोर्ट और 2 एआरएम प्रोसेसर, एक मुख्य प्रोसेसर और एक सह प्रोसेसर दोनों 4 सेंसर पोर्ट हैं। http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.html

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

मेरे सिर में मैं पहले से ही इन अवधारणाओं को एकजुट और नमूना कोड के बारे में सोच की कोशिश कर रहा हूँ। मैं एक ढेर के बजाय एक पेड़ के बारे में सोच रहा हूं, जहां कार्यात्मक शाखाएं समानांतर में चल सकती हैं। एक उदाहरण:

# implicit main stack 
5 5 + 
# 10 

# quoted branch or list 
[1 -] 
# 10 [1 -] 

# eval list and recur until false 
loop 
# [9 8 7 6 5 4 3 2 1 0] 

# define stack as a function 
[1 = [1 8 motor] [1 0 motor] if] fn 
# [9 8 7 6 5 4 3 2 1 0] <function> 

# define function as a symbol 
"handle-press" def 
# [9 8 7 6 5 4 3 2 1 0] 

# reactively loop over infinite lazy stack returned by sensor 
# in a parallel branch 
|4 sensor handle-press for| 
# [9 8 7 6 5 4 3 2 1 0] [8 nil nil nil 8 ...] 

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

+0

[एक कंपाइलर लिखना सीखना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler), http://stackoverflow.com/questions/453870/suggestions -for-writing-a-प्रोग्रामिंग-भाषा, http://stackoverflow.com/questions/426239/parsers-and-compilers-for-dummies-where-to-start?lq=1, http://stackoverflow.com/प्रश्न/365,602/बनाने-your-खुद-भाषा? – nawfal

उत्तर

22

अब क्या? मैं कहाँ से प्रारम्भ करूँ? मुझे क्या जानने की ज़रूरत है?

और प्रोग्रामिंग भाषाओं को सीखने के द्वारा प्रारंभ।

कई भाषाओं को सीखने के बाद, कंपाइलर्स पर एक पुस्तक खरीदें। वहां कई हैं। Google मदद करेगा। इससे कोई फर्क नहीं पड़ता कि आप कौन सा खरीदते हैं। आपको कई की आवश्यकता होगी। कई किताबें पढ़ना ठीक है।

एक बार जब आप भाषाएं सीख चुके हैं और कंपाइलर्स पर पढ़ते हैं, तो निम्न कार्य करें।

  1. आपको आवश्यक रन-टाइम लाइब्रेरी बनाएं। उन्हें सी या पायथन या जो भी कुछ उपयुक्त भाषा में लागू करें।

  2. एक बार जब आप है रन-टाइम पुस्तकालयों जो वास्तव में काम करते हैं। वास्तव में पूरी तरह से काम करते हैं। पूरी तरह से। आप सिंटैक्स और लेक्सिकल स्कैनिंग और संकलन के बारे में सोच सकते हैं।वे कठिन समस्याएं हैं, लेकिन आपके रन-टाइम पुस्तकालयों को काम करने के लिए उतना कठिन नहीं है।

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

अपनी भाषा को पहले कुछ करने के लिए प्राप्त करें।

+0

एक स्वयं होस्टेड भाषा लिखने के बारे में क्या? मेजबान भाषा के रनटाइम का उपयोग करने के बारे में क्या? – Pepijn

+0

@Pepijn: "स्वयं होस्टेड भाषा"?आपका मतलब LISP या Forth जैसा है जहां भाषा स्वयं ही लिखी जाती है? आप क्या जानना चाहेंगे? शायद आपको एक और सवाल खोलना चाहिए। सबसे पहले, उन ** विशिष्ट ** चीजों की पहचान करें जिन्हें आप जानना चाहते हैं। फिर उन चीजों के लिए Google। फिर भ्रमित करने वाली किसी चीज को स्पष्ट करने के लिए यहां प्रश्न पूछें। –

+0

आप "1. बिल्ड रन-टाइम पुस्तकालयों" के बारे में अधिक टिप्पणी की जा सकी। मेरे सिर में शब्द "रन-टाइम पुस्तकालय" व्यापक है (भाषा में बनी कुछ भी हो सकता है)। आप किस तरह के रन-टाइम पुस्तकालयों का मतलब है? – Halst

4

सबसे आसान मार्ग concatenative programming language का उपयोग कर रहा है, जैसे Forth, Factor, या एक का अपना डिज़ाइन।

फर्थ दुभाषिया लागू करना बहुत आसान है और कुछ केबी से अधिक लेने की आवश्यकता नहीं है; लेगो डिवाइस के लिए महत्वपूर्ण है। आपको समझने की जरूरत है कि फर्थ दुभाषिया कैसे काम करता है। उदाहरण के लिए, Starting Forth में यह कवर किया गया है।

4

मजेदार भाषा डिज़ाइन के बारे में पुस्तकें पढ़ें!

क्लोजर के लेखक ने क्रिश्चियन क्विनेनेक द्वारा "छोटे टुकड़ों में लिस्प" पुस्तक के बाद अनुशंसा की। Clojure Reading list में कई पुस्तकों को शामिल किया गया है जो क्लोजर भाषा के डिजाइन को शामिल करते हैं।

5

एक कंपाइलर लिखने से डरो मत, जो मौजूदा भाषा में संकलित होता है, और कोड ऑब्जेक्ट नहीं करता है। उदाहरण के लिए, हल्के सी ++ है एक सी ++ -> सी संकलक इस विचार पर आधारित है (हालांकि, सी ++ में एक ही काम करता है कहीं): http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

आप कैसे प्रोग्रामिंग को सुधारने के लिए एक छोटे लेकिन स्मार्ट विचार है, तो यह है एक त्वरित जीत तरीका।

खोज इंजन के साथ एक समान स्थिति है। अगर मैं कहता हूं कि मैं Google से बेहतर कर सकता हूं, तो शायद मैं इसे Google मैशप के साथ कर सकता हूं, जो Google के परिणाम सेट को पुनर्गठित करता है, और मुझे बदलने के लिए दूसरा Google सेट करने के लिए 343 ज़िगाबाइट स्टोरेज खरीदने की आवश्यकता नहीं है 10 से 15 तक के परिणामों की संख्या (दुर्भाग्य से, यह काम नहीं करता है अगर मेरे पास अलग-अलग रैंकिंग या क्रॉलिंग विचार हैं।)

शायद, ट्विटर एक बेहतर उदाहरण है। ट्विटर एपीआई का उपयोग करके अपना खुद का ट्विटर लिखें। (बेशक, केवल तभी आपका विचार ट्विटर के बेस मॉडल में फिट बैठता है।)

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

हमें 1-चरण (स्रोत-> निष्पादन योग्य) और 0-चरण (स्रोत स्क्रिप्ट निष्पादन योग्य) को तोड़ना चाहिए; 3-4 स्तर अभी तक अवलोकन करने के लिए आसान है, और - अगर हम इसे सही करते हैं - यह विकास को और अधिक प्रभावी बना सकता है।

+0

क्या कोई स्थान आपके डेटाफ्लो इंजन के बारे में पढ़ सकता है? क्या यह किसी भी तरह से डिजिटल हार्डवेयर से संबंधित है? वैसे भी, यह मेरे लिए एक दिलचस्प विषय है। – Halst

+0

homeaut.com देखें, और अपने प्रश्नों को ई-मेल करने के लिए स्वतंत्र महसूस करें – ern0