दृश्य प्रोग्रामिंग उपकरण, वे सीधे एएसटी के साथ काम क्यों नहीं करते हैं?


25

मुझे कई ओपन सोर्स विजुअल प्रोग्रामिंग टूल जैसे ब्लॉकली और फ्रेंड्स, और जीथब में होस्ट किए गए अन्य प्रोजेक्ट मिल गए हैं, लेकिन एब्सट्रैक्ट सिंटैक्स ट्री के साथ सीधे काम करने वाला कोई भी नहीं मिला।

ऐसा क्यों है?

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

उदाहरण के लिए, कोई यह सोच सकता है कि जावास्क्रिप्ट एएसटी विज़ुअलाइज़र से वास्तविक जावास्क्रिपट विज़ुअल प्रोग्रामिंग टूल में बहुत अधिक अंतर नहीं है।

तो मुझे क्या याद आ रही है?


10
एएसटी बहुत ही क्रियात्मक हैं, और प्रोग्रामिंग के लिए बहुत सुविधाजनक नहीं हैं। वे प्रोग्रामर के लिए डिज़ाइन किए गए थे, न कि प्रोग्रामर के लिए।
युवल फिल्मस


1
"सार सिंटैक्स ट्री के साथ सीधे काम" से आपका क्या मतलब है? यकीनन ब्लॉक-आधारित टूल जैसे ब्लॉक को एएसटी संपादित कर रहे हैं: वे किनारों को नेस्टिंग (या स्टैकिंग, यदि आप इसे उस तरह से देखना पसंद करते हैं) का प्रतिनिधित्व करते हैं, और उपयोगकर्ता ट्री को एडिट (ड्रॉप) करके संपादित कर सकते हैं और ड्रॉप कर सकते हैं।
माइकल होमर

यह एक बहुत बड़ा सवाल है कि हम में से कौन कंपाइलर को पसंद करता है। मुझे लगता है कि संक्षिप्त उत्तर है कि यदि आप ऐसा करते हैं और यह उपयोगकर्ता के अनुकूल बना सकता है, लोगों को है जाएगा में उपयोग करें। केवल समस्या यह है, कि एक बड़ा "अगर" है।
मेहरदाद

2
क्या आपने लिस्प में देखा है ? "[यह] इतना नहीं है कि लिस्प में एक अजीब वाक्यविन्यास है क्योंकि लिस्प में कोई वाक्यविन्यास नहीं है। आप पार्स पेड़ों में प्रोग्राम लिखते हैं जो संकलक के भीतर उत्पन्न होते हैं जब अन्य भाषाओं को पार्स किया जाता है। लेकिन ये पार्स ट्री आपके कार्यक्रमों के लिए पूरी तरह से सुलभ हैं। आप उन कार्यक्रमों को लिख सकते हैं जो उन्हें हेरफेर करते हैं। ”
वाइल्डकार्ड

जवाबों:


28

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

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


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

नेस्टेड टाइल वाले ग्रेस कोड का स्क्रीनशॉट

यह कुछ कोड का एएसटी है। रूट एक विधि कॉल नोड है "के लिए ... करते हैं"। उस नोड के कुछ बच्चे हैं, जिनकी शुरुआत "_ .. _" से हुई है, जिनके खुद के दो बच्चे हैं, एक "1" नोड और एक "10" नोड है। स्क्रीन पर जो आता है वह वही होता है जो कंपाइलर बैकेंड प्रक्रिया के बीच में करता है - यह मूल रूप से सिस्टम कैसे काम करता है।

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

यह "स्रोत से नोड-ग्राफ तक की गोल यात्रा भी करेगा और फिर जरूरत पड़ने पर फिर से स्रोत पर वापस जाएगा"। वास्तव में, आप देख सकते हैं कि जब आप नीचे "कोड दृश्य" पर क्लिक करते हैं। यदि आप पाठ को संशोधित करते हैं, तो इसे फिर से पार्स किया जाएगा और परिणामी पेड़ आपको फिर से संपादित करने के लिए प्रदान किया जाएगा, और यदि आप ब्लॉकों को संशोधित करते हैं, तो स्रोत के साथ भी यही होता है।


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


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


6

कम से कम दो कारण:

  1. क्योंकि सोर्स कोड एक बहुत अधिक संक्षिप्त प्रतिनिधित्व है। एक ग्राफ के रूप में एक एएसटी बाहर रखना एक बहुत अधिक दृश्य अचल संपत्ति को ले जाएगा।

    प्रोग्रामर पुरस्कार जितना संभव हो उतना संदर्भ - यानी, एक ही समय में स्क्रीन पर एक ही बार में अधिक से अधिक कोड मौजूद होना। प्रसंग उन्हें जटिलता को बेहतर ढंग से प्रबंधित करने में मदद करता है। (यही कारण है कि कई प्रोग्रामर इन पागल छोटे फोंट और 30 "बड़े स्क्रीन का उपयोग करते हैं।"

    यदि हमने एएसटी को एक ग्राफ या पेड़ के रूप में प्रदर्शित करने की कोशिश की, तो कोड की मात्रा जिसे आप एक स्क्रीन पर फिट कर सकते हैं, जब यह स्रोत कोड के रूप में प्रतिनिधित्व किया जाता है तो बहुत कम होगा। डेवलपर उत्पादकता के लिए यह बहुत बड़ा नुकसान है।

  2. एएसटी कम्पाइलर प्रोग्रामिंग के लिए अभिप्रेत है, प्रोग्रामर द्वारा आसान समझ के लिए नहीं। यदि आपने एक मौजूदा एएसटी प्रतिनिधित्व लिया और इसे नेत्रहीन रूप से प्रदर्शित किया, तो शायद डेवलपर्स के लिए समझना कठिन होगा, क्योंकि एएसटीएस डेवलपर्स के लिए सीखने के लिए आसान नहीं थे।

    इसके विपरीत, स्रोत कोड आमतौर पर है पठनीय / डेवलपर्स द्वारा समझा जा सकता होने के लिए बनाया; यह आमतौर पर स्रोत कोड के लिए एक महत्वपूर्ण डिजाइन मानदंड है, लेकिन एएसटी के लिए नहीं। एएसटी को केवल कंपाइलर लेखकों द्वारा समझने की आवश्यकता है, रोज़ डेवलपर्स द्वारा नहीं।

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

कुछ अतिरिक्त संभावित कारणों से /software//q/119463/34181 भी देखें ।


2
"इसके विपरीत, स्रोत कोड डेवलपर्स द्वारा पठनीय / समझने योग्य होने के लिए डिज़ाइन किया गया है" - जवाबी कार्रवाई: अधिकांश एसोलैंग्स, पर्ल, लिस्प
जॉन ड्वोरक

1
"क्योंकि सोर्स कोड एक बहुत अधिक संक्षिप्त प्रतिनिधित्व है।" "एएसटी भाषा एक दूसरी भाषा डेवलपर्स होगी, जिसे स्रोत भाषा के अलावा सीखना होगा" - ये सभी दृश्य पीएल के खिलाफ तर्क हैं, लेकिन ओपी के बारे में जो भेद है, उसे समझाने में मदद नहीं करता है।
राफेल

"(यही एक कारण है कि कई प्रोग्रामर इन पागल छोटे फोंट का उपयोग करते हैं और 30" स्क्रीन) का उपयोग करते हैं। "" - यदि आपको पर्याप्त संदर्भ देखने के लिए बड़े-गधे की स्क्रीन की आवश्यकता है, तो शायद आप स्पेगेटी-कोडिंग?)
राफेल

1
@ राफेल शायद, लेकिन रिफैक्टिंग की तुलना में इस पर पैसा फेंकना कम प्रयास है!
क्रॉल्टन

3
@JanDvorak, ... लिस्प प्रति एक क्योंकि एएसटी है है भाषा - जो क्या यह अपने अर्थपूर्ण शक्ति देता है, LISP कोड लिखना जो आपके अन्य LISP कोड को फिर से जोड़ देता है, मानक LISP डेटा संरचनाओं को संशोधित करने वाले कोड को लिखना उतना ही आसान है ... जो वास्तव में LISP कोड में लिखे गए हैं । वहाँ एक कारण है कि यह आधी सदी से अधिक समय तक चला है - परिवार का डिज़ाइन असामान्य रूप से अभिव्यंजक है। गो को भाषा और क्रम में गहराई से गिरते हुए इसके एसिंक्स एक्सटेंशन को रखना पड़ा; क्लोजर के लिए, यह सिर्फ एक पुस्तकालय है। यह भी देखें: औसत बीटिंग
चार्ल्स डफी

3

संकलक द्वारा विशिष्ट एएसटी बल्कि जटिल और क्रिया है। निर्देशित ग्राफ़ प्रतिनिधित्व जल्दी से पालन करना काफी कठिन हो जाएगा। लेकिन सीएस के दो बड़े क्षेत्र हैं जहां एएसटी का उपयोग किया जाता है।

  1. लिस्प भाषाओं को वास्तव में एएसटी के रूप में लिखा जाता है। प्रोग्राम स्रोत कोड को सूचियों और सीधे संकलक और / या दुभाषिया द्वारा उपयोग किया जाता है (यह निर्भर करता है कि किस संस्करण का उपयोग किया जा रहा है)।
  2. मॉडलिंग की भाषाएं, जैसे यूएमएल, और कई दृश्य डोमेन विशिष्ट भाषाएं ग्राफिकल नोटेशन का उपयोग करती हैं जो कि सामान्य सामान्य प्रयोजन भाषा एएसटी की तुलना में उच्च स्तर पर अमूर्त वाक्यविन्यास ग्राफ (एएसजी) के प्रभावकारी होते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.