मैंने इस सुविधा को मेरी पसंदीदा भाषा ओकैमल में एकीकृत किया है, मुझे पता है कि यह डी में सेक्सी विशेषता है, लेकिन कुछ अनुकूलन को छोड़कर संकलन समय मूल्यांकन के लिए उपयोग केस क्या है? अधिक बेहतर, geeker बेहतर :-)डी के संकलन समय मूल्यांकन के लिए उपयोग केस क्या है
उत्तर
अनुकूलन, एक बड़ा उपयोग मामला है। ctRegex जैसी चीजें अपने रनटाइम संकलित रेगेक्स समकक्ष (आमतौर पर) से बेहतर प्रदर्शन करती हैं। पार्सर जनरेटर भी दिलचस्प हैं (Pegged देखें) और अधिक से अधिक ध्यान प्राप्त करने जा रहे हैं। लोग बस क्या कर सकते हैं में टैप करना शुरू कर रहे हैं।
आप पार्स और (आप, ज़ाहिर है, डी में सी के लिए एक पार्सर लिखने के लिए यह करने के लिए की आवश्यकता होगी) मनमाने ढंग से सी हेडर के लिए एक डी इंटरफेस फ़ाइल का निर्माण करने के mixin(import_c("header.h"))
की तरह कुछ कर सकता है।
प्रारूप स्ट्रिंग के बाद अत्यधिक तेज़ स्ट्रिंग स्वरूपण किया जा सकता है (उदाहरण के लिए, "%0.2f"
) आमतौर पर संकलन समय पर जाना जाता है। आप प्रारूप स्ट्रिंग को पढ़ सकते हैं और केवल सभी प्रकार के अनावश्यक वर्गों को अलग करने के प्रारूप के लिए जरूरी कोड उत्पन्न कर सकते हैं।
vibe.d वास्तव में संकलन समय टेम्पलेटिंग का समर्थन करता है। टेम्पलेट फ़ाइल (जेड/एचएएमएल आधारित) में डी कोड हो सकता है। यह इसे पढ़ता है और डी कोड का एक कस्टम ब्लॉक उत्पन्न करता है (इसके बारे में सोचें "शीर्षक ~" ... ")। मुझे विश्वास नहीं है कि लेखक ने बेंचमार्क किए हैं लेकिन यह अविश्वसनीय रूप से तेज़ होना चाहिए।
आपको उच्च स्तर पर रहते हुए अनिवार्य रूप से विशेष हाथ-अनुकूलित कोड का लाभ प्राप्त होता है। आपके प्रश्न का उत्तर देना मुश्किल है क्योंकि हम नहीं जानते कि इसका क्या उपयोग किया जाएगा। यह मुझे सी ++ टेम्पलेट्स की याद दिलाता है। उनमें से डिजाइनरों ने इसे सक्षम उन्नत मेटाप्रोग्रामिंग तकनीकों की उम्मीद नहीं की थी।
मुझे डी संकलन समय मूल्यांकन में एक महत्वपूर्ण सीमाएं मिली हैं कि सभी स्रोतों को एक फ़ाइल में दिखाना चाहिए जो बहुत शक्तिशाली संकलन समय मूल्यांकन फ़ंक्शन लिखना बहुत कठिन बनाता है, क्योंकि आप तब किसी लाइब्रेरी का उपयोग नहीं कर सकते हैं। आप इसके बारे में कैसे सोचते हैं – bobzhang
यह मूल रूप से वही सीमा है जो सी ++ टेम्पलेट्स का सामना करते हैं। इसके लिए कोई आसान फिक्स नहीं है। कुछ लोग लाइब्रेरी ऑब्जेक्ट फ़ाइलों में स्रोत को एम्बेड करना चाहते हैं ताकि किसी के पास न हो, लेकिन किसी ने अभी तक इसका प्रयास नहीं किया है। – eco
कुछ सुझाव:
- कैसे एक पेग व्याकरण पार्स करने, एक पेग पार्सर कोडांतरण, और उसके बाद का उपयोग कर के बारे में कहा पार्सर, संकलन समय बिल्कुल ? यहां Pegged प्रोजेक्ट है।
- बड़ी स्थैतिक लुकअप टेबल का निर्माण।
- नियमित अभिव्यक्ति के लिए इष्टतम देशी कोड उत्पन्न करना: std.regex.StaticRegex
- परिभाषा फ़ाइल से प्रोटोबफ लागू करना।
- कई फ़ंक्शन, यदि उनके इनपुट संकलन समय पर ज्ञात हैं, तो रनटाइम के बजाय मूल्यांकन किया जा सकता है - सभी फ़ंक्शन के कार्यान्वयन को बदले बिना।
आपके सुझावों के लिए धन्यवाद। मैं डी से परिचित नहीं हूं, अगर संकलन समय मूल्यांकन एक कस्टम परिभाषित डेटा संरचना देता है, तो डी इसे कैसे संभालता है? क्या आप इस पर कुछ प्रकाश डालेंगे? – bobzhang
या अधिक सटीक होने के लिए, संकलन समय मूल्यांकन के फ़ंक्शन बनाने के उपयोग के लिए डी की सीमा क्या है? – bobzhang
यहां [प्रतिबंधों की पूरी सूची] है (http://dlang.org/function.html#interpretation)। – eco
जब mixin
के साथ उपयोग किया जाता है, तो यह लचीलापन का एक बड़ा सौदा प्रदान कर सकता है।
template StructFromFile(string fileName){
string makeStructMembersCode(string[] s){
if(0==s.length){
return null;
}
string memberName=s[0].strip;
return q{
string }~memberName~q{;
}~makeStructMembersCode(s[1..$]);
}
struct StructFromFile{
mixin(makeStructMembersCode(import(fileName).splitLines));
}
}
यह एक struct यह सदस्यों को एक पाठ फ़ाइल की लाइनें हैं कि बनाता है:
निम्न उदाहरण पर विचार करें। अब, कल्पना करें कि आपके पास डेटाबेस में एक टेबल है, और आप उस तालिका से पंक्तियों को स्टोर करने के लिए डी संरचना बनाना चाहते हैं। आप उस शेल स्क्रिप्ट को लिख सकते हैं जो उस तालिका की स्कीमा को पढ़ता है और उसे फ़ाइल में लिखता है, और फिर उस तालिका की पंक्तियों को पकड़ने वाली संरचना को स्वचालित रूप से बनाने के लिए StructFromFile
का उपयोग करें। यदि आप स्कीमा बदलते हैं, तो आपके पास स्ट्रक्चर का कोड नहीं है। हालांकि, आपको पुराने स्कीमा पर निर्भर किसी भी कोड को बदलना है - लेकिन यह एक अच्छी बात है, क्योंकि यह त्रुटियों को संकलित करने के लिए रन-टाइम बग बदलती है।
संभोग, आप गेटटर + सेटर गुणों को जोड़ने और एक्सएमएल डीटीडी और वेब सर्विसेज के लिए इसका उपयोग करने के लिए इस विधि का भी उपयोग कर सकते हैं।
यहां संकलन समय मूल्यांकन का सबसे गीला अनुप्रयोग है, मैं इस बारे में सोच सकता हूं: एक फ़ंक्शन string f(string code)
के रूप में अपनी प्रोग्रामिंग भाषा के लिए एक कंपाइलर लिखें जो आपकी प्रोग्रामिंग भाषा का स्रोत कोड तर्क के रूप में लेता है और डी कोड को थूकता है। तब
mixin(f(import("my_code_file")));
की तरह कुछ अपने main.d
फ़ाइल में लिखें। इस तरह आप डी कंपाइलर और इसके बैकएंड का दुरुपयोग कर सकते हैं ताकि आपके लिए निष्पादन योग्य हो सके। यदि आप चाहते हैं, तो आप एक शेल स्क्रिप्ट (या इसके जैसा कुछ) लिख सकते हैं जो main.d
फ़ाइल बनाता है और उस पर डी कंपाइलर चलाता है। इस तरह आप अपनी भाषा के लिए आधा संकलक प्राप्त करते हैं। कम से कम आपको बैकएंड के बारे में परवाह करने की आवश्यकता नहीं है। ;)
कि से Appart, मैं डी में एक संकलन समय raytracer
क्या आप मतलब है के बारे में पढ़ा है अपने "पसंदीदा प्रोग्रामिंग भाषा OCaml" "में इस सुविधा को एकीकृत"? जब आपने इसके लिए कोई उपयोग नहीं किया है तो आपने ऐसा क्यों किया? – jmg
यह मेरी अन्य परियोजनाओं का दुष्प्रभाव है। जैसा कि मैंने कहा ऑप्टिमाइज़ेशन एक उपयोग केस है। लेकिन मुझे लगता है कि – bobzhang
होना चाहिए इसी तरह का प्रश्न: http://stackoverflow.com/questions/3555456/examples-of-what-ds-templates-can-be-used- –