2010-12-17 15 views
10

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

उत्तर

6

libbasekit - आईओ के लेखक द्वारा। आप libcoroutine का भी उपयोग कर सकते हैं।

+0

ऐसा लगता है जैसे स्टीव डेकोर्ट ने कई पुस्तकालयों को बनाया है जो वास्तव में मेरे लिए उपयोगी होंगे - धन्यवाद! –

3

एक लाइब्रेरी जो मैं अनुशंसा करता हूं वह libgc, a garbage collector for C है।

आप अपने libgc समकक्षों (जैसे GC_MALLOC) के साथ, malloc के लिए कॉल की जगह realloc, strdup, इत्यादि से उपयोग करें। यह स्टैक, ग्लोबल वैरिएबल, और जीसी-आवंटित ब्लॉक स्कैन करके काम करता है, जो पॉइंटर्स हो सकता है। मान लीजिए या नहीं, यह वास्तव में काफी अच्छा प्रदर्शन करता है (लगभग के बराबर बहुत अच्छाptmalloc, जो डिफ़ॉल्ट (गैर-कचरा एकत्रित) malloc जीएनयू/लिनक्स में कार्यान्वयन) है, और बहुत सारे कार्यक्रम इसका उपयोग करते हैं (Mono सहित और GCJ)। एक नुकसान, हालांकि, यह उन अन्य पुस्तकालयों के साथ अच्छी तरह से खेल नहीं सकता है जिन्हें आप उपयोग करना चाहते हैं, और आपको पर GC_MALLOC के साथ कॉल को प्रतिस्थापित करने के लिए हाथों में से कुछ को फिर से सम्मिलित करना पड़ सकता है।

3

ईमानदारी से - और मुझे पता है कि कुछ लोग इसके लिए मुझसे नफरत करेंगे - लेकिन मैं आपको सी ++ का उपयोग करने की सलाह देता हूं। आपको अपनी परियोजना शुरू करने में सक्षम होने के लिए इसे सीखने के लिए एक आंत को रोकना नहीं है। बस इसे सी की तरह उपयोग करें, लेकिन एक घंटे में आप सीख सकते हैं कि std :: map <> (एक सहयोगी कंटेनर), std :: स्ट्रिंग को आसान टेक्स्टुअल डेटा हैंडलिंग के लिए कैसे उपयोग करें, और std :: vector <> एक आकार बदलने योग्य ढेर के लिए- आवंटित सरणी यदि आप एक अतिरिक्त घंटे या दो बिताना चाहते हैं, तो कक्षाओं में सदस्य कार्यों को रखना सीखें (पॉलिमॉर्फिज्म, आभासी कार्यों आदि के बारे में चिंता न करें), और आपको एक और संगठित कार्यक्रम मिल जाएगा।

+0

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

+1

उन लोगों की बुरी चीजें जो नहीं जानते कि वे किस बारे में बात कर रहे हैं! सी ++ अनिवार्य रूप से अतिरिक्त उपकरणों के साथ सी है; यदि आप उन अतिरिक्त उपकरणों का उपयोग नहीं करते हैं, तो यह सी से भी बदतर नहीं हो सकता है। यदि आप प्रोग्रामिंग भाषा को कार्यान्वित कर रहे हैं तो std :: stack <> कई चीजों के लिए उपयोगी होगा। – Clifford

+0

@ क्लाइफोर्ड: मैं असहमत हूं। निश्चित रूप से सी ++ (लगभग) सी का एक सुपरसेट है, सी कोड सी ++ कोड से बहुत अलग है, हालांकि। सी ++ चीजों को पूरा करने के लिए सी से एक बहुत अलग रास्ता लेता है। एक बार जब आप सी ++ का उपयोग करने का निर्णय लेते हैं, तो आपको सी ++ को हर तरह से जाना चाहिए और सी कोड नहीं लिखना चाहिए और सी ++ से कुछ चीजें उधार लेना चाहिए। मिक्सिंग सी और सी ++ क्रैपी कोड लिखने का एक अच्छा तरीका है। – Fabian

0

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

उपरोक्त लिंक पर कोड सी ++ है, लेकिन एल्गोरिदम स्पष्ट रूप से वर्णित है और आप इसे सी में आसानी से कार्यान्वित कर सकते हैं। फिर सी ++ आईएमओ का उपयोग न करने के लिए कुछ वैध तर्क हैं।

0

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

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

यदि आप पॉज़िक्स प्लेटफ़ॉर्म के लिए विकसित कर रहे हैं तो आप लेक्स और yacc का उपयोग कर सकते हैं। ये उपकरण थोड़े पुराने हैं लेकिन पार्सर्स बनाने के लिए बहुत शक्तिशाली हैं। लेक्स कोड उत्पन्न कर सकता है जो टोकनिंग प्रक्रिया को लागू करता है और yacc एक नीचे-अप पार्सर उत्पन्न कर सकता है।

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

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