2008-12-02 41 views
19

मैं जो सॉफ़्टवेयर बेस विकसित कर रहा हूं, वह उस यूएसीसी की एक हस्ताक्षर राशि का उपयोग करता है जिसे मुझे सौदा करने की आवश्यकता नहीं है। कुछ बार मुझे लगता है कि मुझे कुछ समस्याओं को समझने में मदद मिलेगी लेकिन अधिकांश समय मैं yacc की पूरी अज्ञानता से दूर हो सकता हूं।क्या Yacc अभी भी उद्योग में उपयोग किया जाता है?

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

संपादित करें: प्रतिक्रिया को देखते हुए ज्यादातर यैक सीखने के पक्ष में है, क्या ऐसी ही भाषा है जिसे आप yacc पर अनुशंसा करेंगे?

उत्तर

30

हां, ये टूल सीखने योग्य हैं यदि आपको कभी भी व्याकरण को पार करने वाले कोड को बनाने या संशोधित करने की आवश्यकता है।

कई वर्षों तक व्याकरण को पार्स करने के लिए कोड उत्पन्न करने के लिए वास्तविक तथ्य yacc था, या इसके जीएनयू चचेरे भाई, बाइसन।

हाल ही में मैंने सुना है कि ब्लॉक पर कुछ नए बच्चे हैं, लेकिन सिद्धांत समान है: आप बैकस-नौर फॉर्म (BNF) और yacc में कम या कम प्रारूप में एक घोषणात्मक व्याकरण लिखते हैं/बाइसन/जो कुछ भी आपके लिए कुछ कोड उत्पन्न करता है जो हाथ से लिखने के लिए बेहद कठिन होगा।

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

संपादित करें: अन्य टूल्स के बारे में आपके फॉलोअप प्रश्न को देखते हुए, सीएसी सी ++ परियोजनाओं के लिए वाईएसी/बिसन कोर्स सबसे अच्छा है, क्योंकि वे सी कोड उत्पन्न करते हैं। अन्य भाषाओं के लिए समान उपकरण हैं। सभी व्याकरण समकक्ष नहीं हैं, और कुछ पार्सर जनरेटर केवल एक निश्चित जटिलता के व्याकरण को ग्रोक कर सकते हैं। तो आपको एक ऐसा टूल ढूंढना पड़ सकता है जो आपके व्याकरण को पार्स कर सके। http://en.wikipedia.org/wiki/Comparison_of_parser_generators

+0

बिल के साथ पूरी तरह से सहमत हैं - अवरोही पार्सर्स विकास विरासत का महत्वपूर्ण हिस्सा हैं जो भूल गए हैं। – stephbu

6

मुझे इसका उपयोग करने वाली नई परियोजनाओं के बारे में पता नहीं है, लेकिन मैं सात अलग रखरखाव नौकरियों में शामिल हूं जो कॉन्फ़िगरेशन फ़ाइलों को संसाधित करने के लिए लेक्स और yacc का उपयोग करते हैं।

मेरे लिए कोई एक्सएमएल नहीं, कोई-सर-ईई :-)।

server = "mercury" { 
    ip = "172.3.5.13" 
    gateway = "172.3.5.1" 
} 
server = "venus" { 
    ip = "172.3.5.21" 
    gateway = "172.3.5.1" 
} 

और, हाँ, मुझे पता है आप कर सकते हैं कि XML के साथ है, लेकिन: जब से वे की तरह बेहतर श्रेणीबद्ध संरचनाओं की अनुमति देने के

लेक्स/याक का उपयोग कर समाधान key=val लाइनों के पुराने विन्यास फाइल से एक कदम कर रहे हैं ये मुख्य रूप से सी में लिखे गए विरासत अनुप्रयोग हैं और ईमानदार होने के लिए, मैं शायद नई (गैर-जावा) नौकरियों के लिए लेक्स/yacc का उपयोग भी करूंगा।

ऐसा इसलिए है क्योंकि मैं सबसे बड़ी नई व्हिज-बैंग तकनीक प्रदान करने के बजाय समय और बजट पर सॉफ़्टवेयर वितरित करना पसंद करता हूं - मेरे ग्राहक मेरी शिक्षा के लिए भुगतान नहीं करेंगे, वे परिणाम पहले और सबसे महत्वपूर्ण चाहते हैं और मैं पहले ही लेक्स/yacc और इसे जल्दी से करने के लिए सभी टेम्पलेट कोड है।

+4

मैं मानता हूं कि ऊपर की तरह व्याकरण कॉन्फ़िगरेशन फ़ाइलों के लिए बेहतर हैं, लेकिन आपके द्वारा दावा किए जाने के कारण नहीं। सीखने का समय नहीं है एक भयानक कारण है। एक बेहतर कारण यह है कि एक्सएमएल कॉन्फ़िगरेशन फाइल वास्तव में बदसूरत, सूजन और लोगों के बजाय कार्यक्रमों द्वारा प्रसंस्करण के लिए उपयुक्त हैं। –

+4

सीखने के लिए समय नहीं होने के साथ ऐसा करने के लिए कुछ भी नहीं है। जैसा कि सभी व्यावसायिक निर्णयों के साथ, एक लागत-लाभ विश्लेषण है - एक पूरी तरह से तेज़ तरीका होने पर धीमे (मेरे लिए) करने का एक नया तरीका क्यों सीखें? मैं एक व्यवसाय चलाता हूं, शैक्षिक संस्थान नहीं। परिवार के साथ नि: शुल्क समय बेहतर खर्च किया जाता है। – paxdiablo

2

मैं उन परियोजनाओं पर काम करता हूं जो Yacc का उपयोग करते हैं। नया कोड नहीं - लेकिन वे नए थे, वे अभी भी वाईएसीसी या करीबी रिश्तेदार (बाइसन, बाईक, ...) का उपयोग करेंगे।

हाँ, मैं इसे के रूप में मूल्य सीखने के संबंध में यदि आप सी

में काम करते हैं इसके अलावा ANTLR, या अन्य अधिक आधुनिक पार्सर जनरेटर सीखने पर विचार करें।लेकिन Yacc का ज्ञान आपको अच्छी स्थिति में खड़ा करेगा - यह आपको किसी भी अन्य समान टूल को सीखने में मदद करेगा, क्योंकि बहुत से बुनियादी सिद्धांत समान हैं।

3

अंगूठे का एक सामान्य नियम: कोड लंबे समय तक रहता है, इसलिए उस कोड में उपयोग की जाने वाली तकनीकें भी लंबे समय तक चलती हैं। आपके द्वारा उल्लिखित कोडबेस को प्रतिस्थापित करने में काफी समय लगेगा (इसे बनाने में 15 साल लग गए ...), जो बदले में यह दर्शाता है कि यह अभी भी 5, 10, या अधिक वर्षों में होगा। (यहां तक ​​कि एक मौका भी है कि इस जवाब को पढ़ने वाले व्यक्ति इस पर काम कर रहे हैं!)

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

Yacc इन तकनीकों में से एक है: आप शायद इसे फिर से चलाने जा रहे हैं, यह मुश्किल नहीं है, और यह मुश्किल नहीं है, और जिन सिद्धांतों को आप सीखेंगे वे पार्सर कन्स्ट्रक्टर के पूरे परिवार पर लागू होंगे।

+0

मैं आपके द्वारा किए जा रहे पहले दो बिंदुओं को समझता हूं (संभावना है कि SW अभी भी आसपास होगा और yacc में बंपिंग करेगा) लेकिन कंपनी वर्तमान उत्पाद को फेंक रही है और स्क्रैच से शुरू कर रही है, इसलिए वास्तव में मेरे लिए लागू नहीं होती है :) – hhafez

2

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

+0

मेरी अगली भूमिका जावा भूमिका होगी, मुझे जैक्स/जैवैक – hhafez

+0

पर एक नज़र डालेंगी, यह उस भाषा का वर्णन करने के लिए उपयोग किए जाने वाले व्याकरण के प्रकार के लिए उपयुक्त उपकरण चुनने के लिए निवेश किया गया समय * अच्छा * है। सीयूपी एलएएलआर एंटर एलएल * जावासीसी एलएल (के) और कुछ लेक्सर्स और पार्सर्स बेहतर या बदतर काम करते हैं। हम सीयूपी + जेएलएक्स के साथ गए लेकिन यह सब भाषा के नीचे है। – Draemon

2

मुझे अन्य पार्सिंग सिस्टम के साथ इसकी तुलना करने का मौका नहीं मिला है, लेकिन मैं अपने स्वयं के अनुभव के आधार पर और इसके बड़े और सक्रिय उपयोगकर्ता आधार के साथ निश्चित रूप से ANTLR की अनुशंसा कर सकता हूं।

एएनटीएलआर के लिए एक और प्लस प्वाइंट ANTLRWorks: The ANTLR GUI Development Environment है जो आपके व्याकरण को विकसित और डिबग करने के दौरान एक बड़ी मदद है। मुझे अभी तक एक और पार्सिंग सिस्टम देखना है जो इस तरह के आईडीई द्वारा समर्थित है।

+0

एएनटीएलआर में ज्यादातर वाईएसीसी के समान वाक्यविन्यास है लेकिन इसका उपयोग जावा के साथ भी किया जाता है। सिद्धांत एक ही हैं। – boutta

3

PEGs नई गर्मी है, लेकिन अभी भी परियोजनाओं का एक टन है जो yacc या टूल्स का उपयोग yacc से अधिक आधुनिक है। मैं एक नई परियोजना पर फहराऊंगा जिसने yacc का उपयोग करना चुना है, लेकिन मौजूदा परियोजनाओं के लिए एक और आधुनिक उपकरण पर पोर्टिंग करना समझ में नहीं आता है। यह yacc के साथ एक उपयोगी कौशल के साथ किसी न किसी परिचितता बनाता है।

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

1

हम शिपिंग उत्पादों के लिए मेरी कंपनी में नया yacc कोड लिख रहे हैं। हां, यह सामान अभी भी उपयोग किया जाता है।

संबंधित मुद्दे