डी (प्रोग्रामिंग भाषा): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Short description|Multi-paradigm system programming language}}
'''डी,''' जिसे डीलैंग के नाम से भी जाना जाता है, [[डिजिटल मंगल|डिजिटल मार्स]] पर [[वाल्टर ब्राइट]] द्वारा बनाई गई और 2001 में जारी की गई [[बहु-प्रतिमान प्रोग्रामिंग भाषा|बहु-प्रतिमान प्रणाली प्रोग्रामिंग भाषा]] है। [[आंद्रेई अलेक्जेंड्रेस्कु]] 2007 में डिजाइन और विकास के प्रयास में सम्मिलित हुए। चूंकि इसकी प्रारंभ -C++, D की री-इंजीनियरिंग के रूप में हुई थी। यह पूरी तरह से  एक अलग भाषा है- डी की विशेषताओं को C++ के विचारों पर सुव्यवस्थित और विस्तारित माना जा सकता है,<ref>{{Cite web |title=सी ++ प्रोग्रामर्स के लिए डी में प्रोग्रामिंग - डी प्रोग्रामिंग लैंग्वेज|url=https://dlang.org/articles/cpptod.html |access-date=2022-04-05 |website=dlang.org}}</ref> चूँकि डी अन्य उच्च-स्तरीय प्रोग्रामिंग भाषाओं, विशेष रूप से जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), [[रूबी (प्रोग्रामिंग भाषा)]], सी शार्प (प्रोग्रामिंग भाषा) और एफिल (प्रोग्रामिंग भाषा) से भी प्रेरणा लेता है।
{{About||अन्य प्रोग्रामिंग भाषाओं का नाम डी|डी (बहुविकल्पी)#कंप्यूटिंग|अन्य उपयोग|डी (बहुविकल्पी)}}
<!-- {{cleanup |reason=This article is all over the place, the history section is pre-empted by content in the features section, which rambles and I suspect spends most of it's space/time discussing programming metaparadigms, instead of delivering a focussed, encyclopedia-like summary and overview of what a thing is, in this case D, the programming language. I think this could be alleviated by stealing the historical information from the features section, and putting that into the history section where it belongs, which could be placed above the features section so that the reader has the information they need up front.|date=November 2021}} -->


{{Infobox programming language
डी आधुनिक [[गतिशील प्रोग्रामिंग भाषा]] और [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक प्रोग्रामिंग भाषाओं]] की [[अभिव्यंजक शक्ति (कंप्यूटर विज्ञान)]] के साथ [[संकलित भाषा]]ओं के प्रदर्शन और सुरक्षा को जोड़ती है।<ref>{{Cite web |title=कार्यात्मक प्रोग्रामिंग - डलंग टूर|url=https://tour.dlang.org/tour/en/gems/functional-programming |access-date=2022-04-05 |website=tour.dlang.org}}</ref> [[प्रोग्रामिंग मुहावरा]] डी कोड सामान्यतः समतुल्य C++ कोड जितना तेज़ होता है, उतना छोटा भी होता है।<ref name="short" /> समग्र रूप से भाषा [[स्मृति सुरक्षा|मेमोरी सुरक्षित]] नहीं है।<ref>{{cite web |url=https://news.ycombinator.com/item?id=12391370 |date=August 30, 2016 |title=पर: डी पर अफवाहें: वाल्टर ब्राइट के साथ एक साक्षात्कार|website=Hacker News}} "It's close, and we're working to close the remaining gaps."</ref> लेकिन इसमें वैकल्पिक विशेषताओं को सम्मिलित किया गया है जो या तो सबसेट या पूरे कार्यक्रम की मेमोरी सुरक्षा की गारंटी के लिए डिज़ाइन की गई हैं।<ref>{{cite web |url=https://dlang.org/spec/memory-safe-d.html |title=मेमोरी-सेफ-डी-स्पेक|publisher=D Language Foundation}}</ref>
| name = D programming language
| logo = D Programming Language logo.svg
| logo size = 120px
| paradigm = [[Multi-paradigm programming language|Multi-paradigm]]: [[functional programming|functional]], [[imperative programming|imperative]], [[object-oriented programming|object-oriented]]
| released = {{start date and age|df=y|2001|12|08}}<ref name="D1 changelog1" />
| designer = [[Walter Bright]], [[Andrei Alexandrescu]] (since 2007)
| developer = [[D Language Foundation]]
| typing = [[Inferred typing|Inferred]], [[static typing|static]], [[strong typing|strong]]
| implementations = [https://github.com/dlang/dmd DMD] ([[reference implementation]]), [https://gcc.gnu.org/ GCC],
[https://gdcproject.org/ GDC],
[https://github.com/ldc-developers/ldc LDC], [https://github.com/SDC-Developers/SDC SDC]
| dialects =
| influenced = [[Genie (programming language)|Genie]], MiniD, [[Qore (programming language)|Qore]], [[Swift (programming language)|Swift]],<ref name="Swift - Getting the location of a caller">{{cite web |url=https://developer.apple.com/swift/blog/?id=15 |title=Building assert() in Swift, Part 2: __FILE__ and __LINE__ |access-date=25 September 2014}}</ref> [[Vala (programming language)|Vala]], [[C++11]], [[C++14]], [[C++17]], [[C++20]], [[Go (programming language)|Go]], [[C Sharp (programming language)|C#]], and others.
| license = [[Boost Software License|Boost]]<ref name="D-frontend-license" /><ref name="boost-backend">{{cite web |url=https://forum.dlang.org/post/oc8acc$1ei9$1@digitalmars.com |title=dmd Backend converted to Boost License |date=7 April 2017 |access-date=9 April 2017}}</ref><ref>{{cite web |url=http://dlang.org/faq.html |title=D 2.0 FAQ |access-date=11 August 2015}}</ref>
                        <!--GDC: [[GNU General Public License#Version 3|GPLv3+]];<br />
                            LDC: GPLv2+, partially [[BSD licenses|BSD]]
                        -->| website = {{URL|//dlang.org}}
| wikibooks = D Programming
| caption =
| file_ext = .d<ref>{{cite web |url= https://fileinfo.com/extension/d |title=D Programming Language - Fileinfo.com |access-date=15 November 2020}} {{citation needed|date=September 2020}}</ref><ref>{{cite web |url= https://dlang.org/dmd-windows.html |title=D Programming Language - dlang.org |access-date=15 November 2020}} {{citation needed|date=September 2020}}</ref><!-- DO NOT ADD .di HERE. It is not part of the language, it is part of the implementation. -->
| latest release version = {{wikidata|property|reference|edit|P348}}
| latest release date    = {{start date and age|{{wikidata|qualifier|P348|P577}}}}
| प्रभावित_द्वारा = [[सी (प्रोग्रामिंग भाषा)]], [[सी ++]], सी शार्प (प्रोग्रामिंग भाषा)|सी#, [[एफिल (प्रोग्रामिंग भाषा)]],<ref>{{cite book |last1=Alexandrescu |first1=Andrei |title=डी प्रोग्रामिंग भाषा|url=https://archive.org/details/dprogramminglang00alex |url-access=limited |date=2010 |publisher=Addison-Wesley |location=Upper Saddle River, New Jersey |isbn=978-0321635365 |page=[https://archive.org/details/dprogramminglang00alex/page/n341 314] |edition=First}}</ref> [[जावा (प्रोग्रामिंग भाषा)]], [[पायथन (प्रोग्रामिंग भाषा)]]
| ऑपरेटिंग_सिस्टम = फ्रीबीएसडी, [[लिनक्स]], मैकओएस, [[माइक्रोसॉफ़्ट विंडोज़]]
}}


D, जिसे डीलैंग के नाम से भी जाना जाता है, [[डिजिटल मंगल|डिजिटल मार्स]] पर [[वाल्टर ब्राइट]] द्वारा बनाई गई और 2001 में जारी की गई [[बहु-प्रतिमान प्रोग्रामिंग भाषा|बहु-प्रतिमान प्रणाली प्रोग्रामिंग भाषा]] है। [[आंद्रेई अलेक्जेंड्रेस्कु]] 2007 में डिजाइन और विकास के प्रयास में शामिल हुए। हालांकि इसकी प्रारंभ -C++, D की री-इंजीनियरिंग के रूप में हुई थी। एक पूरी तरह से अलग भाषा है- D की विशेषताओं को C++ के विचारों पर सुव्यवस्थित और विस्तारित माना जा सकता है,<ref>{{Cite web |title=सी ++ प्रोग्रामर्स के लिए डी में प्रोग्रामिंग - डी प्रोग्रामिंग लैंग्वेज|url=https://dlang.org/articles/cpptod.html |access-date=2022-04-05 |website=dlang.org}}</ref> हालाँकि D अन्य उच्च-स्तरीय प्रोग्रामिंग भाषाओं, विशेष रूप से जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), [[रूबी (प्रोग्रामिंग भाषा)]], सी शार्प (प्रोग्रामिंग भाषा) और एफिल (प्रोग्रामिंग भाषा) से भी प्रेरणा लेता है।
सामान्य प्रकारों के लिए टाइप अनुमान, [[कचरा संग्रह (कंप्यूटर विज्ञान)|स्वचालित मेमोरी प्रबंधन (कंप्यूटर विज्ञान)]] और [[सिंटैक्टिक चीनी|सिंटैक्टिक सुगर]] तेजी से सॉफ़्टवेयर विकास की अनुमति देती है, जबकि [[सीमा जाँच|अनुबंध द्वारा जांच]] और डिज़ाइन को रनटाइम पर पहले बग ढूंढते हैं, और [[समवर्ती (कंप्यूटर विज्ञान)]] -जागरूक [[प्रकार प्रणाली]] संकलन समय पर बग पकड़ती है।<ref>Archived at [https://ghostarchive.org/varchive/youtube/20211211/RlVpPstLPEc Ghostarchive]{{cbignore}} and the [https://web.archive.org/web/20101025114033/http://www.youtube.com//watch?v=RlVpPstLPEc Wayback Machine]{{cbignore}}: {{Cite AV media |url=https://www.youtube.com/watch?v=RlVpPstLPEc |title=Three Cool Things About D |date=2 August 2010 |people=Andrei Alexandrescu}}{{cbignore}}</ref>
 
डी आधुनिक [[गतिशील प्रोग्रामिंग भाषा]] और [[कार्यात्मक प्रोग्रामिंग|कार्यात्मक प्रोग्रामिंग भाषाओं]] की [[अभिव्यंजक शक्ति (कंप्यूटर विज्ञान)]] के साथ [[संकलित भाषा]]ओं के प्रदर्शन और सुरक्षा को जोड़ती है।<ref>{{Cite web |title=कार्यात्मक प्रोग्रामिंग - डलंग टूर|url=https://tour.dlang.org/tour/en/gems/functional-programming |access-date=2022-04-05 |website=tour.dlang.org}}</ref> [[प्रोग्रामिंग मुहावरा]] डी कोड सामान्यतः समतुल्य C++ कोड जितना तेज़ होता है, जबकि छोटा भी होता है।<ref name="short" />  समग्र रूप से भाषा [[स्मृति सुरक्षा|मेमोरी सुरक्षा]] नहीं है।<ref>{{cite web |url=https://news.ycombinator.com/item?id=12391370 |date=August 30, 2016 |title=पर: डी पर अफवाहें: वाल्टर ब्राइट के साथ एक साक्षात्कार|website=Hacker News}} "It's close, and we're working to close the remaining gaps."</ref> लेकिन इसमें वैकल्पिक विशेषताओं को शामिल किया गया है जो या तो सबसेट या पूरे कार्यक्रम की मेमोरी सुरक्षा की गारंटी के लिए डिज़ाइन की गई हैं।<ref>{{cite web |url=https://dlang.org/spec/memory-safe-d.html |title=मेमोरी-सेफ-डी-स्पेक|publisher=D Language Foundation}}</ref>
 
सामान्य प्रकारों के लिए टाइप अनुमान, [[कचरा संग्रह (कंप्यूटर विज्ञान)|स्वचालित मेमोरी प्रबंधन (कंप्यूटर विज्ञान)]] और [[सिंटैक्टिक चीनी]] तेजी से सॉफ़्टवेयर विकास की अनुमति देती है, जबकि [[सीमा जाँच|अनुबंध द्वारा जांच]] और डिज़ाइन को रनटाइम पर पहले बग ढूंढते हैं, और एक [[समवर्ती (कंप्यूटर विज्ञान)]] -जागरूक [[प्रकार प्रणाली]] संकलन समय पर बग पकड़ती है।<ref>Archived at [https://ghostarchive.org/varchive/youtube/20211211/RlVpPstLPEc Ghostarchive]{{cbignore}} and the [https://web.archive.org/web/20101025114033/http://www.youtube.com//watch?v=RlVpPstLPEc Wayback Machine]{{cbignore}}: {{Cite AV media |url=https://www.youtube.com/watch?v=RlVpPstLPEc |title=Three Cool Things About D |date=2 August 2010 |people=Andrei Alexandrescu}}{{cbignore}}</ref>






== विशेषताएं ==
== विशेषताएं ==
डी को पूरी तरह से सैद्धांतिक परिप्रेक्ष्य के बजाय व्यावहारिक C++ उपयोग से सीखे गए पाठों के साथ डिजाइन किया गया था। हालाँकि भाषा कई C (प्रोग्रामिंग भाषा) और C++ अवधारणाओं का उपयोग करती है, यह कुछ लक्ष्यों को प्राप्त करने के लिए कुछ को त्याग देती है, या विभिन्न दृष्टिकोणों (और [[वाक्य - विन्यास]]) का उपयोग करती है। इस प्रकार, यह सामान्य रूप से C और C++  [[स्रोत-कोड संगतता|स्रोत-कोड]] के साथ स्रोत संगत नहीं है (न ही इसका लक्ष्य है) (इन भाषाओं से कुछ सरल कोड बेस भाग्य से डी के साथ काम कर सकते हैं, या कुछ [[में porting|में पोर्टिंग]] की आवश्यकता होती है)। हालांकि, डी को इसके डिजाइन में इस नियम से विवश किया गया है कि कोई भी कोड जो सी और डी दोनों में वैध था, उसी तरह व्यवहार करना चाहिए।
डी को पूरी तरह से सैद्धांतिक परिप्रेक्ष्य के अतिरिक्त व्यावहारिक C++ उपयोग से सीखे गए पाठों के साथ डिजाइन किया गया था। चूँकि भाषा कई C (प्रोग्रामिंग भाषा) और C++ अवधारणाओं का उपयोग करती है, यह कुछ लक्ष्यों को प्राप्त करने के लिए कुछ को त्याग देती है, या विभिन्न दृष्टिकोणों (और [[वाक्य - विन्यास]]) का उपयोग करती है। इस प्रकार, यह सामान्य रूप से C और C++  [[स्रोत-कोड संगतता|स्रोत-कोड]] के साथ स्रोत संगत नहीं है (न ही इसका लक्ष्य है) (इन भाषाओं से कुछ सरल कोड बेस भाग्य से डी के साथ काम कर सकते हैं, या कुछ [[में porting|में पोर्टिंग]] की आवश्यकता होती है)। चूंकि, डी को इसके डिजाइन में इस नियम से विवश किया गया है कि कोई भी कोड जो सी और डी दोनों में वैध था, उसी तरह व्यवहार करना चाहिए।
 
D ने C++ से पहले कुछ विशेषताएं प्राप्त कीं, जैसे कि [[क्लोजर (कंप्यूटर साइंस)]], अनाम फ़ंक्शंस, कंपाइल-टाइम फ़ंक्शन निष्पादन, रेंज, बिल्ट-इन कंटेनर इटरेशन कॉन्सेप्ट और टाइप इंट्रेंस। D अनुबंध, इकाई परीक्षण, सच्चे [[मॉड्यूल (प्रोग्रामिंग)]], कचरा संग्रह, प्रथम श्रेणी ऑब्जेक्ट [[सरणी डेटा प्रकार]], साहचर्य सरणियों, [[गतिशील सरणी]], [[सरणी टुकड़ा करना]], नेस्टेड कार्यों, [[आलसी मूल्यांकन]], स्कॉप्ड (स्थगित) कोड निष्पादन द्वारा डिजाइन को लागू करके C ++ की कार्यक्षमता को जोड़ता है। एक पुन: इंजीनियर टेम्पलेट सिंटैक्स। C++ [[एकाधिक वंशानुक्रम]] को जावा-स्टाइल सिंगल इनहेरिटेंस द्वारा इंटरफेस और [[mixin|मिक्सिन]] के साथ बदल दिया गया था। दूसरी ओर, डी की घोषणा, कथन और अभिव्यक्ति सिंटैक्स सी ++ के साथ निकटता से मेल खाता है।
 
D [[इनलाइन असेंबलर]] सहित [[निम्न-स्तरीय प्रोग्रामिंग भाषा|निम्न-स्तरीय प्रोग्रामिंग]] करने की C++ की क्षमता को निरंतर रखता है, जो Java (प्रोग्रामिंग भाषा) और C Sharp (प्रोग्रामिंग भाषा) जैसी डी और एप्लिकेशन भाषाओं के बीच के अंतर को दर्शाता है। इनलाइन असेंबलर प्रोग्रामर को मानक डी कोड के भीतर मशीन-विशिष्ट असेंबली भाषा में प्रवेश करने देता है, सिस्टम प्रोग्रामर द्वारा केंद्रीय प्रसंस्करण इकाई की निम्न-स्तरीय सुविधाओं तक पहुंचने के लिए उपयोग की जाने वाली एक विधि प्रोग्राम चलाने के लिए आवश्यक होती है जो सीधे अंतर्निहित [[संगणक धातु सामग्री]] के साथ इंटरफेस करती है, जैसे [[ऑपरेटिंग सिस्टम]] और [[डिवाइस ड्राइवर]], साथ ही उच्च-प्रदर्शन कोड लिखना (अर्थात वेक्टर एक्सटेंशन, [[SIMD]] का उपयोग करना) जो कि संकलक द्वारा स्वचालित रूप से उत्पन्न करना कठिन है।


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


D में, टेक्स्ट कैरेक्टर स्ट्रिंग केवल वर्णों की सरणियाँ हैं, और D में सरणियाँ C ++ के विपरीत सीमा-जांच की जाती हैं।<ref>{{cite web |url=https://digitalmars.com/d/1.0/cppstrings.html |title=डी स्ट्रिंग्स बनाम सी ++ स्ट्रिंग्स|publisher=Digital Mars |date=2012 }}</ref> स्ट्रिंग हैंडलिंग के लिए विशिष्ट ऑपरेटर मौजूद हैं, जो गणितीय सहसंबंधों से दृष्टिगत रूप से भिन्न हैं। डी के पास जटिल और काल्पनिक संख्याओं के लिए प्रथम श्रेणी के प्रकार हैं, और ऐसे प्रकारों से जुड़े भावों का कुशलता से मूल्यांकन करता है।<ref>{{cite web|date=2012|title=डी कॉम्प्लेक्स प्रकार और सी ++ एसटीडी :: जटिल|url=https://digitalmars.com/d/1.0/cppcomplex.html|url-status=live|access-date=4 November 2021|website=[[Digital Mars]]|archive-url=https://web.archive.org/web/20080113085617/http://www.digitalmars.com:80/d/1.0/cppcomplex.html |archive-date=13 January 2008 }}</ref>
डी [[इनलाइन असेंबलर]] सहित  [[निम्न-स्तरीय प्रोग्रामिंग भाषा|लेवल  प्रोग्रामिंग]] करने की C++ की क्षमता को निरंतर रखता है, जो जावा (प्रोग्रामिंग भाषा) और सी शार्प (प्रोग्रामिंग भाषा) जैसी डी और एप्लिकेशन भाषाओं के बीच के अंतर को दर्शाता है। इनलाइन असेंबलर प्रोग्रामर को मानक डी कोड के अन्दर मशीन-विशिष्ट असेंबली भाषा में प्रवेश करने देता है, सिस्टम प्रोग्रामर द्वारा केंद्रीय प्रसंस्करण इकाई की निम्न-स्तरीय सुविधाओं तक पहुंचने के लिए उपयोग की जाने वाली एक विधि प्रोग्राम चलाने के लिए आवश्यक होती है जो सीधे अंतर्निहित [[संगणक धातु सामग्री]] के साथ इंटरफेस करती है, जैसे [[ऑपरेटिंग सिस्टम]] और [[डिवाइस ड्राइवर]], साथ ही उच्च-प्रदर्शन कोड लिखना (अर्थात वेक्टर एक्सटेंशन, [[SIMD]] का उपयोग करना) जो कि संकलक द्वारा स्वचालित रूप से उत्पन्न करना कठिन है।


डी [[समारोह अधिभार|फ़ंक्शन ओवरलोडिंग]] और [[ऑपरेटर ओवरलोडिंग]] के साथ-साथ गतिशील सरणी और डिफ़ॉल्ट रूप से सहयोगी सरणी का समर्थन करता है। प्रतीकों (कार्यों, वेरिएबल, वर्गों) को किसी भी क्रम में घोषित किया जा सकता है - [[आगे की घोषणा|आगे की घोषणाओं]] की आवश्यकता नहीं है। इसी प्रकार आयात लगभग किसी भी क्रम में किया जा सकता है, और यहां तक ​​​​कि सीमा भी किया जा सकता है (अर्थात् किसी फ़ंक्शन, कक्षा [[अध्याय परीक्षा]] के अंदर कुछ मॉड्यूल या इसका भाग आयात करें)। डी में प्रलेखन टिप्पणियों के लिए अंतर्निहित समर्थन है, जिससे स्वचालित [[प्रलेखन जनरेटर]] की अनुमति मिलती है।


=== [[प्रोग्रामिंग प्रतिमान]] ===
डी में, टेक्स्ट कैरेक्टर स्ट्रिंग केवल वर्णों की सरणियाँ हैं, और डी में सरणियाँ C ++ के विपरीत सीमा-जांच की जाती हैं।<ref>{{cite web |url=https://digitalmars.com/d/1.0/cppstrings.html |title=डी स्ट्रिंग्स बनाम सी ++ स्ट्रिंग्स|publisher=Digital Mars |date=2012 }}</ref> स्ट्रिंग हैंडलिंग के लिए विशिष्ट ऑपरेटर उपस्थित हैं, जो गणितीय सहसंबंधों से दृष्टिगत रूप से भिन्न हैं। डी के पास जटिल और काल्पनिक संख्याओं के लिए प्रथम श्रेणी के प्रकार हैं, और ऐसे प्रकारों से जुड़े भावों का कुशलता से मूल्यांकन करता है।<ref>{{cite web|date=2012|title=डी कॉम्प्लेक्स प्रकार और सी ++ एसटीडी :: जटिल|url=https://digitalmars.com/d/1.0/cppcomplex.html|url-status=live|access-date=4 November 2021|website=[[Digital Mars]]|archive-url=https://web.archive.org/web/20080113085617/http://www.digitalmars.com:80/d/1.0/cppcomplex.html |archive-date=13 January 2008 }}</ref>
=== प्रोग्रामिंग प्रतिमान ===
डी पांच मुख्य प्रोग्रामिंग प्रतिमानों का समर्थन करता है:
डी पांच मुख्य प्रोग्रामिंग प्रतिमानों का समर्थन करता है:
* [[समवर्ती प्रोग्रामिंग भाषा]] ([[अभिनेता मॉडल]])
* [[समवर्ती प्रोग्रामिंग भाषा]] ([[अभिनेता मॉडल]])
Line 59: Line 26:


====अनिवार्य ====
====अनिवार्य ====
डी में अनिवार्य प्रोग्रामिंग लगभग सी के समान है। फ़ंक्शंस, डेटा, स्टेटमेंट्स, डिक्लेरेशन और एक्सप्रेशन ठीक वैसे ही काम करते हैं जैसे वे सी में करते हैं, और सी रनटाइम लाइब्रेरी को सीधे एक्सेस किया जा सकता है। दूसरी ओर, अनिवार्य प्रोग्रामिंग के क्षेत्र में डी और सी के बीच कुछ उल्लेखनीय अंतरों में डी का <code>foreach</code> लूप निर्माण शामिल है, जो एक संग्रह पर लूपिंग की अनुमति देता है, और नेस्टेड फ़ंक्शंस, जो ऐसे फ़ंक्शंस हैं जो दूसरे के अंदर घोषित किए जाते हैं और संलग्न फ़ंक्शन के [[स्थानीय चर]] तक पहुंच सकते हैं।
डी में अनिवार्य प्रोग्रामिंग लगभग सी के समान है। फ़ंक्शंस, डेटा, स्टेटमेंट्स, डिक्लेरेशन और एक्सप्रेशन ठीक वैसे ही काम करते हैं जैसे वह सी में करते हैं, और सी रनटाइम लाइब्रेरी को सीधे एक्सेस किया जा सकता है। दूसरी ओर, अनिवार्य प्रोग्रामिंग के क्षेत्र में डी और सी के बीच कुछ उल्लेखनीय अंतरों में डी का <code>foreach</code> लूप निर्माण सम्मिलित है, जो एक संग्रह पर लूपिंग की अनुमति देता है, और नेस्टेड फ़ंक्शंस, जो ऐसे फ़ंक्शंस हैं जो दूसरे के अंदर घोषित किए जाते हैं और संलग्न फ़ंक्शन के [[स्थानीय चर|स्थानीय वेरिएबल]] तक पहुंच सकते हैं।<syntaxhighlight lang="d">
    import std.stdio;
import std.stdio;
 
void main() {
    int multiplier = 10;
    int scaled(int x) { return x * multiplier; }


     void main() {
     foreach (i; 0 .. 10) {
    int multiplier = 10;
        writefln("Hello, world %d! scaled = %d", i, scaled(i));
    int scaled(int x) { return x * multiplier; }
    }
}
    foreach (i; 0 .. 10) {
</syntaxhighlight>
        writefln("Hello, world %d! scaled = %d", i, scaled(i));
    }
}


==== वस्तु-उन्मुख ====
==== वस्तु-उन्मुख ====
डी में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एकल वंशानुक्रम पदानुक्रम पर आधारित है, जिसमें क्लास ऑब्जेक्ट से प्राप्त सभी वर्ग हैं। डी एकाधिक वंशानुक्रम का समर्थन नहीं करता है; इसके बजाय, यह जावा-शैली [[इंटरफ़ेस (जावा)]] का उपयोग करता है, जो C++ के शुद्ध सार वर्गों और मिश्रणों से तुलनीय है, जो विरासत पदानुक्रम से सामान्य कार्यक्षमता को अलग करता है। डी इंटरफेस में स्थिर और अंतिम (गैर-आभासी) विधियों को परिभाषित करने की भी अनुमति देता है।
डी में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एकल वंशानुक्रम पदानुक्रम पर आधारित है, जिसमें क्लास ऑब्जेक्ट से प्राप्त सभी वर्ग हैं। डी एकाधिक वंशानुक्रम का समर्थन नहीं करता है; इसके अतिरिक्त, यह जावा-शैली [[इंटरफ़ेस (जावा)]] का उपयोग करता है, जो C++ के शुद्ध सार वर्गों और मिश्रणों से तुलनीय है, जो विरासत पदानुक्रम से सामान्य कार्यक्षमता को अलग करता है। डी इंटरफेस में स्थिर और अंतिम (गैर-आभासी) विधियों को परिभाषित करने की भी अनुमति देता है।


डी में इंटरफेस और इनहेरिटेंस रिटर्न प्रकार के ओवरराइड तरीकों के लिए [[सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)]] का समर्थन करते हैं।
डी में इंटरफेस और इनहेरिटेंस रिटर्न प्रकार के ओवरराइड विधियों के लिए [[सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)]] का समर्थन करते हैं।


डी प्रकार अग्रेषण, साथ ही वैकल्पिक कस्टम [[गतिशील प्रेषण]] का समर्थन करता है।
डी प्रकार अग्रेषण, साथ ही वैकल्पिक कस्टम [[गतिशील प्रेषण]] का समर्थन करता है।


डी में कक्षाएं (और इंटरफेस) में [[वर्ग अपरिवर्तनीय]] हो सकते हैं जो अनुबंध पद्धति द्वारा डिजाइन के अनुसार सार्वजनिक तरीकों में प्रवेश से पहले और बाद में स्वचालित रूप से चेक किए जाते हैं।
डी में कक्षाएं (और इंटरफेस) में [[वर्ग अपरिवर्तनीय]] हो सकते हैं जो अनुबंध पद्धति द्वारा डिजाइन के अनुसार सार्वजनिक विधियों में प्रवेश से पहले और बाद में स्वचालित रूप से चेक किए जाते हैं।


जेनेरिक कोड या स्वचालित कोड जनरेशन (आमतौर पर संकलन-समय तकनीकों का उपयोग करके) की सुविधा के लिए कक्षाओं (और structs) के कई दृष्टिकोण को संकलन समय (<code>type traits</code>) का उपयोग करके [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)|(प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] का एक रूप) और रन टाइम (RTTI / <code>TypeInfo</code>) पर स्वचालित रूप से आत्मनिरीक्षण किया जा सकता है।  
जेनेरिक कोड या स्वचालित कोड जनरेशन (सामान्यतः संकलन-समय तकनीकों का उपयोग करके) की सुविधा के लिए कक्षाओं (और structs) के कई दृष्टिकोण को संकलन समय (<code>type traits</code>) का उपयोग करके [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)|(प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] का एक रूप) और रन टाइम (RTTI / <code>TypeInfo</code>) पर स्वचालित रूप से आत्मनिरीक्षण किया जा सकता है।  


==== कार्यात्मक ====
==== कार्यात्मक ====
डी कार्यात्मक प्रोग्रामिंग सुविधाओं जैसे फ़ंक्शन शाब्दिक, क्लोजर, पुनरावर्ती-अपरिवर्तनीय वस्तुओं और उच्च-क्रम के कार्यों के उपयोग का समर्थन करता है। अनाम कार्यों के लिए दो सिंटैक्स हैं, जिनमें एक बहु-विवरण प्रपत्र और एक "आशुलिपि" एकल-अभिव्यक्ति संकेतन शामिल है:<ref name="short">{{cite web |title=भाव|url=http://dlang.org/expression.html#Lambda |publisher=Digital Mars |access-date=27 December 2012}}</ref>
डी कार्यात्मक प्रोग्रामिंग सुविधाओं जैसे फ़ंक्शन शाब्दिक, क्लोजर, पुनरावर्ती-अपरिवर्तनीय वस्तुओं और उच्च-क्रम के कार्यों के उपयोग का समर्थन करता है। अस्पष्ट कार्यों के लिए दो सिंटैक्स हैं, जिनमें बहु-विवरण प्रपत्र और "आशुलिपि" एकल-अभिव्यक्ति संकेतन सम्मिलित है:<ref name="short">{{cite web |title=भाव|url=http://dlang.org/expression.html#Lambda |publisher=Digital Mars |access-date=27 December 2012}}</ref><syntaxhighlight lang="d">
 
int function(int) g;
int function(int) g;
g = (x) { return x * x; }; // longhand
g = (x) { return x * x; }; // longhand
g = (x) => x * x;          // shorthand
g = (x) => x * x;          // shorthand
</syntaxhighlight>फंक्शन लिटरल के लिए दो बिल्ट-इन प्रकार हैं, <code>function</code>, जो केवल स्टैक-आवंटित फ़ंक्शन के लिए एक सूचक है, और <code>delegate</code>, जिसमें आसपास के वातावरण के लिए एक संकेतक भी सम्मिलित है। अज्ञात फ़ंक्शन के साथ प्रकार अनुमान का उपयोग किया जा सकता है, जिस स्थिति में संकलक एक<code>delegate</code> बनाता है जब तक कि यह सिद्ध न हो जाए कि पर्यावरण सूचक आवश्यक नहीं है। इसी तरह, क्लोजर को लागू करने के लिए, कंपाइलर केवल आवश्यक होने पर स्थानीय वेरिएबल को हीप पर रखता है (उदाहरण के लिए, यदि क्लोजर किसी अन्य फ़ंक्शन द्वारा वापस किया जाता है, और उस फ़ंक्शन के सीमा से बाहर निकलता है)। प्रकार के अनुमान का उपयोग करते समय, संकलक<code>pure</code> तथा <code>nothrow</code> जैसे गुणों को फ़ंक्शन के प्रकार में भी जोड़ देगा, यदि यह सिद्ध कर सकता है कि वह लागू होते हैं।


फंक्शन लिटरल के लिए दो बिल्ट-इन प्रकार हैं, <code>function</code>, जो केवल स्टैक-आवंटित फ़ंक्शन के लिए एक सूचक है, और <code>delegate</code>, जिसमें आसपास के वातावरण के लिए एक संकेतक भी शामिल है। अज्ञात फ़ंक्शन के साथ प्रकार अनुमान का उपयोग किया जा सकता है, जिस स्थिति में संकलक एक<code>delegate</code> बनाता है जब तक कि यह साबित न हो जाए कि एक पर्यावरण सूचक आवश्यक नहीं है। इसी तरह, एक क्लोजर को लागू करने के लिए, कंपाइलर केवल आवश्यक होने पर स्थानीय चर को हीप पर रखता है (उदाहरण के लिए, यदि एक क्लोजर किसी अन्य फ़ंक्शन द्वारा वापस किया जाता है, और उस फ़ंक्शन के दायरे से बाहर निकलता है)। प्रकार के अनुमान का उपयोग करते समय, संकलक<code>pure</code> तथा <code>nothrow</code> जैसे गुणों को फ़ंक्शन के प्रकार में भी जोड़ देगा, अगर यह सिद्ध कर सकता है कि वे लागू होते हैं।
अन्य कार्यात्मक विशेषताएं जैसे कि [[करी|करीइंग]] और सामान्य उच्च-क्रम फ़ंक्शन जैसे मानचित्र (उच्च-क्रम फ़ंक्शन), [[फ़िल्टर (उच्च-क्रम फ़ंक्शन)]], और फोल्ड (उच्च-क्रम फ़ंक्शन) मानक लाइब्रेरी मॉड्यूल <code>std.functional</code> और <code>std.algorithm</code>के माध्यम से उपलब्ध हैं।<syntaxhighlight lang="d">
 
अन्य कार्यात्मक विशेषताएं जैसे कि [[करी|करीइंग]] और सामान्य उच्च-क्रम फ़ंक्शन जैसे मानचित्र (उच्च-क्रम फ़ंक्शन), [[फ़िल्टर (उच्च-क्रम फ़ंक्शन)]], और फोल्ड (उच्च-क्रम फ़ंक्शन) मानक लाइब्रेरी मॉड्यूल <code>std.functional</code> और <code>std.algorithm</code>के माध्यम से उपलब्ध हैं।
 
<syntax light lang=D>
 
import std.stdio, std.algorithm, std.range;
import std.stdio, std.algorithm, std.range;


void main()
void main()
{
{
     int [] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
     int[] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
     int [] a2 = [6, 7, 8, 9];
     int[] a2 = [6, 7, 8, 9];


     // शुद्ध कार्य के अंदर से पहुंच की अनुमति देने के लिए अपरिवर्तनीय होना चाहिए
     // must be immutable to allow access from inside a pure function
     अपरिवर्तनीय धुरी = 5;
     immutable pivot = 5;


     int mySum(int a, int b) प्योर नोट्रो // प्योर फंक्शन
     int mySum(int a, int b) pure nothrow // pure function
     {
     {
         अगर (बी <= धुरी) // संदर्भ संलग्न करने के दायरे में
         if (b <= pivot) // ref to enclosing-scope
             वापसी ए + बी;
             return a + b;
         वरना
         else
             वापसी ए;
             return a;
     }
     }


     // एक प्रतिनिधि पास करना (बंद करना)
     // passing a delegate (closure)
     ऑटो परिणाम = कम करें! mySum (श्रृंखला (a1, a2));
     auto result = reduce!mySum(chain(a1, a2));
     लेख (परिणाम:, परिणाम); // परिणाम: 15
     writeln("Result: ", result); // Result: 15


     // एक प्रतिनिधि शाब्दिक पास करना
     // passing a delegate literal
     परिणाम = कम करें! ((, बी) => (बी <= धुरी)? + बी: ) (श्रृंखला (ए 1, ए 2));
     result = reduce!((a, b) => (b <= pivot) ? a + b : a)(chain(a1, a2));
     लेख (परिणाम:, परिणाम); // परिणाम: 15
     writeln("Result: ", result); // Result: 15
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
वैकल्पिक रूप से, उपरोक्त फ़ंक्शन रचनाओं को अधिक प्राकृतिक बाएँ से दाएँ पढ़ने के लिए यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स (UFCS) का उपयोग करके व्यक्त किया जा सकता है:<syntaxhighlight lang="d">
वैकल्पिक रूप से, उपरोक्त फ़ंक्शन रचनाओं को अधिक प्राकृतिक बाएँ से दाएँ पढ़ने के लिए यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स (UFCS) का उपयोग करके व्यक्त किया जा सकता है:
  auto result = a1.chain(a2).reduce!mySum();
 
     writeln("Result: ", result);
<वाक्यविन्यास प्रकाश लैंग = डी>
    स्वतः परिणाम = a1.चेन(a2).reduce!mySum();
     लेख (परिणाम:, परिणाम);


     परिणाम = a1.चेन (ए 2)। कम करें! ((, बी) => (बी <= पिवट)? + बी: ) ();
     result = a1.chain(a2).reduce!((a, b) => (b <= pivot) ? a + b : a)();
     लेख (परिणाम:, परिणाम);
     writeln("Result: ", result);
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== समानांतरवाद ====
==== समानांतरवाद ====
लाइब्रेरी में समानांतर प्रोग्रामिंग अवधारणाओं को लागू किया जाता है, और संकलक से अतिरिक्त समर्थन की आवश्यकता नहीं होती है। हालांकि डी टाइप सिस्टम और कंपाइलर सुनिश्चित करते हैं कि डेटा शेयरिंग का पता लगाया जा सकता है और पारदर्शी रूप से प्रबंधित किया जा सकता है।
लाइब्रेरी में समानांतर प्रोग्रामिंग अवधारणाओं को लागू किया जाता है, और संकलक से अतिरिक्त समर्थन की आवश्यकता नहीं होती है। चूंकि डी टाइप सिस्टम और कंपाइलर सुनिश्चित करते हैं कि डेटा शेयरिंग का पता लगाया जा सकता है और पारदर्शी रूप से प्रबंधित किया जा सकता है।<syntaxhighlight lang="d">
import std.stdio : writeln;
import std.range : iota;
import std.parallelism : parallel;


<वाक्यविन्यास प्रकाश लैंग = डी>
void main()
आयात std.stdio : writeln;
आयात एसटीडी.रेंज: आईओटीए;
आयात std.parallelism : समानांतर;
 
शून्य मुख्य ()
{
{
     foreach (i; iota(11).समानांतर) {
     foreach (i; iota(11).parallel) {
         // foreach लूप की बॉडी को प्रत्येक i के समानांतर निष्पादित किया जाता है
         // The body of the foreach loop is executed in parallel for each i
         लेख (प्रसंस्करण, मैं);
         writeln("processing ", i);
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight><code>iota(11).parallel</code> यूएफसीएस का उपयोग करके <code>std.parallelism.parallel(iota(11))</code>के बराबर है।
 
<code>iota(11).parallel</code> यूएफसीएस का उपयोग करके <code>std.parallelism.parallel(iota(11))</code>के बराबर है।
 
वही मॉड्यूल <code>taskPool</code> का भी सपोर्ट करता है जिसका उपयोग समांतर कार्यों के गतिशील निर्माण के साथ-साथ मानचित्र-फ़िल्टर-कम करने और श्रेणियों (और सरणी) पर फोल्ड स्टाइल ऑपरेशंस के लिए किया जा सकता है, जो कार्यात्मक संचालन के साथ संयुक्त होने पर उपयोगी होता है। <code>std.algorithm.map</code> एक सरणी के बजाय एक आलसी मूल्यांकित सीमा देता है। इस तरह, तत्वों की गणना प्रत्येक कार्यकर्ता कार्य द्वारा स्वचालित रूप से समानांतर में की जाती है।


<वाक्यविन्यास प्रकाश लैंग = डी>
वही मॉड्यूल <code>taskPool</code> का भी सपोर्ट करता है जिसका उपयोग समांतर कार्यों के गतिशील निर्माण के साथ-साथ मानचित्र-फ़िल्टर-कम करने और श्रेणियों (और सरणी) पर फोल्ड स्टाइल ऑपरेशंस के लिए किया जा सकता है, जो कार्यात्मक संचालन के साथ संयुक्त होने पर उपयोगी होता है। <code>std.algorithm.map</code> सरणी के अतिरिक्त एक शिथिल मूल्यांकित सीमा देता है। इस तरह, तत्वों की गणना प्रत्येक कार्यकर्ता कार्य द्वारा स्वचालित रूप से समानांतर में की जाती है।<syntaxhighlight lang="d">
आयात std.stdio: writeln;
import std.stdio : writeln;
आयात std.algorithm: मानचित्र;
import std.algorithm : map;
आयात एसटीडी.रेंज: आईओटीए;
import std.range : iota;
आयात std.parallelism: टास्कपूल;
import std.parallelism : taskPool;


/* Intel i7-3930X और gdc 9.3.0 पर:
/* On Intel i7-3930X and gdc 9.3.0:
  * 5140ms std.algorithm.reduce का उपयोग कर
  * 5140ms using std.algorithm.reduce
  * 888ms std.parallelism.taskPool.reduce का उपयोग कर
  * 888ms using std.parallelism.taskPool.reduce
  *
  *
  * AMD थ्रेडिपर 2950X, और gdc 9.3.0 पर:
  * On AMD Threadripper 2950X, and gdc 9.3.0:
  * 2864ms std.algorithm.reduce का उपयोग कर
  * 2864ms using std.algorithm.reduce
  * 95ms std.parallelism.taskPool.reduce का उपयोग कर
  * 95ms using std.parallelism.taskPool.reduce
  */
  */
शून्य मुख्य ()
void main()
{
{
   ऑटो अंक = आईओटीए (1.0, 1_000_000_000.0);
   auto nums = iota(1.0, 1_000_000_000.0);


   ऑटो एक्स = टास्कपूल। कम करें! + बी (
   auto x = taskPool.reduce!"a + b"(
       0.0, नक्शा! 1.0 / (* ) (अंक)
       0.0, map!"1.0 / (a * a)"(nums)
   );
   );


   लेख (योग: , x);
   writeln("Sum: ", x);
}
</syntaxhighlight>
</वाक्यविन्यास हाइलाइट>


==== समवर्ती ====
==== समवर्ती ====
संगामिति लाइब्रेरी में पूरी तरह से लागू है, और इसे संकलक से समर्थन की आवश्यकता नहीं है। समवर्ती कोड लिखने के वैकल्पिक कार्यान्वयन और पद्धतियां संभव हैं। डी टाइपिंग सिस्टम का उपयोग मेमोरी सुरक्षा सुनिश्चित करने में सहायता करता है।
संगामिति लाइब्रेरी में पूरी तरह से लागू है, और इसे संकलक से समर्थन की आवश्यकता नहीं है। समवर्ती कोड लिखने के वैकल्पिक कार्यान्वयन और पद्धतियां संभव हैं। डी टाइपिंग सिस्टम का उपयोग मेमोरी सुरक्षा सुनिश्चित करने में सहायता करता है।<syntaxhighlight lang="d">
import std.stdio, std.concurrency, std.variant;


<वाक्यविन्यास प्रकाश लैंग = डी>
void foo()
आयात std.stdio, std.concurrency, std.variant;
 
शून्य फू ()
{
{
     बूल कॉन्ट = सच;
     bool cont = true;


     जबकि (जारी)
     while (cont)
     {
     {
         प्राप्त करें (//प्रतिनिधियों का उपयोग संदेश प्रकार से मिलान करने के लिए किया जाता है।
         receive( // Delegates are used to match the message type.
             (इंट संदेश) => राइटलन (इंट प्राप्त:, संदेश),
             (int msg) => writeln("int received: ", msg),
             (समय प्रेषक) { जारी = असत्य; प्रेषक.भेजें (-1); },
             (Tid sender) { cont = false; sender.send(-1); },
             (वैरिएंट वी) => राइटलन (हुह?) // वेरिएंट किसी भी प्रकार से मेल खाता है
             (Variant v) => writeln("huh?") // Variant matches any type
         );
         );
     }
     }
}
}


शून्य मुख्य ()
void main()
{
{
     ऑटो टिड = स्पॉन (और फू); // एक नया थ्रेड चल रहा है फू ()
     auto tid = spawn(&foo); // spawn a new thread running foo()


     foreach (i; 0 .. 10)
     foreach (i; 0 .. 10)
         tid.send (i); // कुछ पूर्णांक भेजें
         tid.send(i);   // send some integers


     tid.send (1.0f); // फ्लोट भेजें
     tid.send(1.0f);   // send a float
     tid.send (हैलो); // एक स्ट्रिंग भेजें
     tid.send("hello"); // send a string
     tid.send (यह Tid); // एक संरचना भेजें (टिड)
     tid.send(thisTid); // send a struct (Tid)


     प्राप्त करें ((int x) => राइटलन (मुख्य धागा प्राप्त संदेश: x));
     receive((int x) => writeln("Main thread received message: ", x));
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== मेटाप्रोग्रामिंग ====
==== मेटाप्रोग्रामिंग ====
मेटाप्रोग्रामिंग को टेम्प्लेट, कंपाइल-टाइम फंक्शन एक्ज़ीक्यूशन, [[टपल|टपलस]] और स्ट्रिंग मिक्सिन्स के माध्यम से समर्थित किया जाता है। निम्नलिखित उदाहरण डी के संकलन-समय की कुछ विशेषताओं को प्रदर्शित करते हैं।
मेटाप्रोग्रामिंग को टेम्प्लेट, कंपाइल-टाइम फंक्शन एक्ज़ीक्यूशन, [[टपल|टपलस]] और स्ट्रिंग मिक्सिन्स के माध्यम से समर्थित किया जाता है। निम्नलिखित उदाहरण डी के संकलन-समय की कुछ विशेषताओं को प्रदर्शित करते हैं।


टेम्पलेट्स के लिए C++ कार्यात्मक शैली की तुलना में D में टेम्पलेट अधिक अनिवार्य शैली में लिखे जा सकते हैं। यह एक नियमित कार्य है जो किसी संख्या के भाज्य की गणना करता है:
टेम्पलेट्स के लिए C++ कार्यात्मक शैली की तुलना में डी में टेम्पलेट अधिक अनिवार्य शैली में लिखे जा सकते हैं। यह एक नियमित कार्य है जो किसी संख्या के भाज्य की गणना करता है:<syntaxhighlight lang="d">
 
ulong factorial(ulong n) {
<वाक्यविन्यास प्रकाश लैंग = डी>
     if (n < 2)
उलॉन्ग [[कारख़ाने का]] (उलोंग एन) {
         return 1;
     अगर (एन <2)
     else
         वापसी 1;
         return n * factorial(n-1);
     वरना
         रिटर्न एन * फैक्टोरियल (एन -1);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>यहाँ,  <code>static if</code> का उपयोग, डी का संकलन-समय सशर्त निर्माण, एक टेम्पलेट बनाने के लिए प्रदर्शित किया जाता है जो उपरोक्त फ़ंक्शन के समान कोड का उपयोग करके समान गणना करता है:<syntaxhighlight lang="d">
 
template Factorial(ulong n) {
यहाँ,  <code>static if</code> का उपयोग, डी का संकलन-समय सशर्त निर्माण, एक टेम्पलेट बनाने के लिए प्रदर्शित किया जाता है जो उपरोक्त फ़ंक्शन के समान कोड का उपयोग करके समान गणना करता है:
     static if (n < 2)
 
         enum Factorial = 1;
<वाक्यविन्यास प्रकाश लैंग = डी>
     else
टेम्प्लेट फैक्टोरियल (उलॉन्ग एन) {
         enum Factorial = n * Factorial!(n-1);
     स्थिर अगर (एन <2)
         एनम फैक्टोरियल = 1;
     वरना
         एनम क्रमगुणित = n * क्रमगुणित! (n-1);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>निम्नलिखित दो उदाहरणों में, ऊपर परिभाषित टेम्पलेट और फ़ंक्शन का उपयोग फैक्टोरियल की गणना करने के लिए किया जाता है। स्थिरांक के प्रकारों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि असाइनमेंट के दाईं ओर से कंपाइलर प्रकार का अनुमान है:<syntaxhighlight lang="d">
 
enum fact_7 = Factorial!(7);
निम्नलिखित दो उदाहरणों में, ऊपर परिभाषित टेम्पलेट और फ़ंक्शन का उपयोग फैक्टोरियल की गणना करने के लिए किया जाता है। स्थिरांक के प्रकारों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि असाइनमेंट के दाईं ओर से कंपाइलर प्रकार का अनुमान है:
</syntaxhighlight>यह संकलन-समय फ़ंक्शन निष्पादन (सीटीएफई) का उदाहरण है। साधारण कार्यों का उपयोग निरंतर, संकलन-समय के भावों में किया जा सकता है, लेकिन वह कुछ मानदंडों को पूरा करते हों:<syntaxhighlight lang="d">
 
enum fact_9 = factorial(9);
<वाक्यविन्यास प्रकाश लैंग = डी>
</syntaxhighlight><code>std.string.format</code> E> फ़ंक्शन प्रिंटफ करता है<code>printf</code>-जैसे डेटा स्वरूपण (सीटीएफई के माध्यम से संकलन-समय पर भी), और संदेश [[निर्देश (प्रोग्रामिंग)]] संकलन समय पर परिणाम प्रदर्शित करता है:<syntaxhighlight lang="d">
एनम तथ्य_7 = क्रमगुणित! (7);
import std.string : format;
</वाक्यविन्यास हाइलाइट>
pragma(msg, format("7! = %s", fact_7));
 
pragma(msg, format("9! = %s", fact_9));
यह संकलन-समय फ़ंक्शन निष्पादन (सीटीएफई) का एक उदाहरण है। साधारण कार्यों का उपयोग निरंतर, संकलन-समय के भावों में किया जा सकता है, लेकिन वे कुछ मानदंडों को पूरा करते हों:
</syntaxhighlight>स्ट्रिंग मिश्रण, संकलन-समय फ़ंक्शन निष्पादन के साथ संयुक्त, संकलन समय पर स्ट्रिंग ऑपरेशंस का उपयोग करके डी कोड की पीढ़ी के लिए अनुमति देता है। इसका उपयोग [[डोमेन-विशिष्ट भाषा]]ओं को पार्स करने के लिए किया जा सकता है, जिसे प्रोग्राम के भाग के रूप में संकलित किया जाएगा:<syntaxhighlight lang="d">
 
import FooToD; // hypothetical module which contains a function that parses Foo source code
<वाक्यविन्यास प्रकाश लैंग = डी>
               // and returns equivalent D code
एनम fact_9 = फैक्टोरियल (9);
void main() {
</वाक्यविन्यास हाइलाइट> <code>std.string.format</code> > फ़ंक्शन प्रिंटफ करता है<code>printf</code>-जैसे डेटा स्वरूपण (सीटीएफई के माध्यम से संकलन-समय पर भी), और संदेश [[निर्देश (प्रोग्रामिंग)]] संकलन समय पर परिणाम प्रदर्शित करता है:
     mixin(fooToD(import("example.foo")));
 
<वाक्यविन्यास प्रकाश लैंग = डी>
आयात std.string : प्रारूप;
प्रागमा (संदेश, प्रारूप (7! =% s, fact_7));
प्राग्मा (संदेश, प्रारूप (9! =% s, fact_9));
</वाक्यविन्यास हाइलाइट>
 
स्ट्रिंग मिश्रण, संकलन-समय फ़ंक्शन निष्पादन के साथ संयुक्त, संकलन समय पर स्ट्रिंग ऑपरेशंस का उपयोग करके डी कोड की पीढ़ी के लिए अनुमति देता है। इसका उपयोग [[डोमेन-विशिष्ट भाषा]]ओं को पार्स करने के लिए किया जा सकता है, जिसे प्रोग्राम के भाग के रूप में संकलित किया जाएगा:
 
<वाक्यविन्यास प्रकाश लैंग = डी>
आयात फूटोड; // काल्पनिक मॉड्यूल जिसमें एक फ़ंक्शन होता है जो फू स्रोत कोड को पार्स करता है
               // और समकक्ष डी कोड लौटाता है
शून्य मुख्य () {
     मिक्सिन (fooToD (आयात (उदाहरण। फू)));
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


यदि मेमोरी लेआउट पर अधिक नियंत्रण और बेहतर प्रदर्शन की आवश्यकता होती है, तो ऑपरेटर ओवरलोडिंग का उपयोग करके स्पष्ट मेमोरी प्रबंधन संभव है <code>new</code> तथा <code>delete</code>, C (प्रोग्रामिंग लैंग्वेज) के [[malloc|मॉलोक]] को सीधे कॉल करके, या कस्टम एलोकेटर स्कीमों को लागू करके (यानी फ़ॉलबैक के साथ स्टैक पर, RAII स्टाइल एलोकेशन, रेफरेंस काउंटिंग, शेयर्ड रेफरेंस काउंटिंग)। कचरा संग्रह को नियंत्रित किया जा सकता है: प्रोग्रामर मेमोरी रेंज को कलेक्टर द्वारा देखे जाने से जोड़ और बाहर कर सकते हैं, कलेक्टर को अक्षम और सक्षम कर सकते हैं और या तो एक पीढ़ीगत या पूर्ण संग्रह चक्र को बाध्य कर सकते हैं।<ref>{{cite web |title=एसटीडी.जीसी|url=http://www.digitalmars.com/d/1.0/phobos/std_gc.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=6 July 2010}}</ref> जब किसी प्रोग्राम में गारबेज संग्रह अपर्याप्त होता है तो मैनुअल विभिन्न अत्यधिक अनुकूलित मेमोरी प्रबंधन योजनाओं को लागू करने के कई उदाहरण देता है।<ref>{{cite web |url=http://dlang.org/memory.html |title=स्मृति प्रबंधन|publisher=Digital Mars |work=D Programming Language 2.0 |access-date=17 February 2012}}</ref>
यदि मेमोरी लेआउट पर अधिक नियंत्रण और उत्तम प्रदर्शन की आवश्यकता हो, तो C (प्रोग्रामिंग लैंग्वेज) के [[malloc|मॉलोक]] को सीधे कॉल करके, या कस्टम एलोकेटर स्कीमों (अर्थात् फ़ॉलबैक के साथ स्टैक पर, RAII स्टाइल एलोकेशन, रेफरेंस काउंटिंग, शेयर्ड रेफरेंस काउंटिंग) को लागू करके ऑपरेटर ओवरलोडिंग  <code>new</code> तथा <code>delete</code> का उपयोग करके स्पष्ट मेमोरी प्रबंधन संभव होता है। गार्बेज संग्रह को नियंत्रित किया जा सकता है: प्रोग्रामर मेमोरी रेंज को कलेक्टर द्वारा देखे जाने से जोड़ और बाहर कर सकते हैं, कलेक्टर को अक्षम और सक्षम कर सकते हैं और या तो एक पीढ़ीगत या पूर्ण संग्रह चक्र को बाध्य कर सकते हैं।<ref>{{cite web |title=एसटीडी.जीसी|url=http://www.digitalmars.com/d/1.0/phobos/std_gc.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=6 July 2010}}</ref> जब किसी प्रोग्राम में गारबेज संग्रह अपर्याप्त होता है तो मैनुअल विभिन्न अत्यधिक अनुकूलित मेमोरी प्रबंधन योजनाओं को लागू करने के कई उदाहरण देता है।<ref>{{cite web |url=http://dlang.org/memory.html |title=स्मृति प्रबंधन|publisher=Digital Mars |work=D Programming Language 2.0 |access-date=17 February 2012}}</ref>


फ़ंक्शन में, <code>struct</code> के उदाहरण डिफ़ॉल्ट रूप से स्टैक पर आवंटित किए जाते हैं, जबकि डिफ़ॉल्ट रूप से स्टैक पर आवंटित <code>class</code> के उदाहरण (स्टैक पर होने वाले वर्ग उदाहरण के संदर्भ में)। हालाँकि इसे कक्षाओं के लिए बदला जा सकता है, उदाहरण के लिए मानक लाइब्रेरी टेम्पलेट <code>std.typecons.scoped</code> का  प्रयोग करके, या स्ट्रक्चर्स के लिए <code>new</code> का उपयोग करके और मूल्य-आधारित चर के बजाय पॉइंटर को असाइन करके।<ref name="dlang.org">{{cite web |title=अपने रास्ते जाओ (भाग एक: ढेर)|url=https://dlang.org/blog/2017/07/07/go-your-own-way-part-one-the-stack/ |website=The D Blog |date=7 July 2017 |access-date=2020-05-07}}</ref>
फ़ंक्शन में, <code>struct</code> के उदाहरण डिफ़ॉल्ट रूप से स्टैक पर आवंटित किए जाते हैं, जबकि डिफ़ॉल्ट रूप से स्टैक पर आवंटित <code>class</code> के उदाहरण (स्टैक पर होने वाले वर्ग उदाहरण के संदर्भ में)। चूँकि इसे कक्षाओं के लिए बदला जा सकता है, उदाहरण के लिए मानक लाइब्रेरी टेम्पलेट <code>std.typecons.scoped</code> का  प्रयोग करके, या स्ट्रक्चर्स के लिए <code>new</code> का उपयोग करके और मूल्य-आधारित वेरिएबल के अतिरिक्त पॉइंटर को असाइन करके।<ref name="dlang.org">{{cite web |title=अपने रास्ते जाओ (भाग एक: ढेर)|url=https://dlang.org/blog/2017/07/07/go-your-own-way-part-one-the-stack/ |website=The D Blog |date=7 July 2017 |access-date=2020-05-07}}</ref>


कार्यों में, स्टैक पर स्थिर सरणियाँ (ज्ञात आकार की) आवंटित की जाती हैं। गतिशील सरणियों के लिए, कोई उपयोग कर सकता है <code>core.stdc.stdlib.alloca</code> फ़ंक्शन (के समान <code>alloca</code> सी में), स्टैक पर मेमोरी आवंटित करने के लिए। एक स्लाइस के माध्यम से लौटाए गए पॉइंटर को एक (टाइप किए गए) डायनेमिक एरे में इस्तेमाल किया जा सकता है (हालांकि रीसाइज़िंग एरे, जिसमें एपेंडिंग शामिल है, से बचा जाना चाहिए; और स्पष्ट कारणों से उन्हें फ़ंक्शन से वापस नहीं किया जाना चाहिए)।<ref name="dlang.org" />
कार्यों में, स्टैक पर स्थिर सरणियाँ (ज्ञात आकार की) आवंटित की जाती हैं। गतिशील सरणियों के लिए, कोई उपयोग कर सकता है <code>core.stdc.stdlib.alloca</code> फ़ंक्शन (के समान <code>alloca</code> सी में), स्टैक पर मेमोरी आवंटित करने के लिए। एक स्लाइस के माध्यम से लौटाए गए पॉइंटर को (टाइप किए गए) डायनेमिक एरे में उपयोग किया जा सकता है (चूंकि रीसाइज़िंग एरे, जिसमें एपेंडिंग सम्मिलित है, से बचा जाना चाहिए; और स्पष्ट कारणों से उन्हें फ़ंक्शन से वापस नहीं किया जाना चाहिए)।<ref name="dlang.org" />


एक <code>scope</code> कीवर्ड का उपयोग कोड के कुछ हिस्सों को एनोटेट करने के लिए किया जा सकता है, लेकिन यह दर्शाने के लिए चर और वर्ग/संरचनाएं भी हो सकती हैं कि उन्हें स्कोप से बाहर निकलने पर तुरंत नष्ट कर दिया जाना चाहिए (विनाशक कहा जाता है)। जो कुछ भी स्मृति को हटा दिया गया है वह भी कार्यान्वयन और वर्ग-बनाम-संरचना के अंतर पर निर्भर करता है।<ref>{{cite web |title=गुण - डी प्रोग्रामिंग भाषा|url=https://dlang.org/spec/attribute.html#scope |website=dlang.org |access-date=2020-05-07}}</ref>
<code>scope</code> कीवर्ड का उपयोग कोड के कुछ भागों को एनोटेट करने के लिए किया जा सकता है, लेकिन यह दर्शाने के लिए वेरिएबल और वर्ग/संरचनाएं भी हो सकती हैं कि उन्हें स्कोप से बाहर निकलने पर तुरंत नष्ट कर दिया जाना चाहिए (विनाशक कहा जाता है)। जो कुछ भी मेमोरी को हटा दिया गया है वह भी कार्यान्वयन और वर्ग-बनाम-संरचना के अंतर पर निर्भर करता है।<ref>{{cite web |title=गुण - डी प्रोग्रामिंग भाषा|url=https://dlang.org/spec/attribute.html#scope |website=dlang.org |access-date=2020-05-07}}</ref>


<code>std.experimental.allocator</code> विशेष उपयोग के मामलों के लिए कस्टम उच्च प्रदर्शन आवंटक बनाने के लिए एक मॉड्यूलर और कंपोज़ेबल एलोकेटर टेम्प्लेट शामिल हैं।<ref>{{cite web |title=std.experimental.allocator - D प्रोग्रामिंग लैंग्वेज|url=https://dlang.org/phobos/std_experimental_allocator.html |website=dlang.org |access-date=2020-05-07}}</ref>
<code>std.experimental.allocator</code> विशेष उपयोग की स्थितियों के लिए कस्टम उच्च प्रदर्शन आवंटक बनाने के लिए एक मॉड्यूलर और कंपोज़ेबल एलोकेटर टेम्प्लेट सम्मिलित हैं।<ref>{{cite web |title=std.experimental.allocator - D प्रोग्रामिंग लैंग्वेज|url=https://dlang.org/phobos/std_experimental_allocator.html |website=dlang.org |access-date=2020-05-07}}</ref>




=== सेफडी ===
=== सेफडी ===
सेफडी<ref name="SafeD">{{cite web |title=सेफडी-डी प्रोग्रामिंग लैंग्वेज|url=http://dlang.org/safed.html |author=Bartosz Milewski |access-date=17 July 2014}}</ref> डी के सबसेट को दिया गया नाम है जिसे मेमोरी सुरक्षित होने की गारंटी दी जा सकती है (कोई मेमोरी नहीं लिखता है जिसे आवंटित नहीं किया गया है या जिसे पुनर्नवीनीकरण किया गया है)। <code>@safe</code> चिह्नित कार्यों को संकलित समय पर जांचा जाता है ताकि यह सुनिश्चित किया जा सके कि वे ऐसी किसी भी सुविधा का उपयोग नहीं करते हैं जिसके परिणामस्वरूप मेमोरी का भ्रष्टाचार हो सकता है, जैसे कि सूचक अंकगणितीय और अनियंत्रित कास्ट, और किसी भी अन्य फ़ंक्शन को भी <code>@safe</code> या <code>@trusted</code> के रूप में चिह्नित किया जाना चाहिए। कार्यों को उन मामलों के लिए <code>@trusted</code> के रूप में चिह्नित किया जा सकता है जहां संकलक SafeD में अक्षम सुविधा के सुरक्षित उपयोग और स्मृति भ्रष्टाचार के संभावित मामले के बीच अंतर नहीं कर सकता है।<ref>{{cite web |title=डी में @ट्रस्टेड कोड कैसे लिखें|url=https://dlang.org/blog/2016/09/28/how-to-write-trusted-code-in-d/ |author=Steven Schveighoffer |date=28 September 2016 |access-date=4 January 2018}}</ref>
सेफडी<ref name="SafeD">{{cite web |title=सेफडी-डी प्रोग्रामिंग लैंग्वेज|url=http://dlang.org/safed.html |author=Bartosz Milewski |access-date=17 July 2014}}</ref> डी के सबसेट को दिया गया नाम है जिसे मेमोरी सुरक्षित होने की गारंटी दी जा सकती है (कोई मेमोरी नहीं लिखता है जिसे आवंटित नहीं किया गया है या जिसे पुनर्नवीनीकरण किया गया है)। <code>@safe</code> चिह्नित कार्यों को संकलित समय पर जांचा जाता है जिससे यह सुनिश्चित किया जा सके कि वह ऐसी किसी भी सुविधा का उपयोग नहीं करते हैं जिसके परिणामस्वरूप मेमोरी का करप्शन हो सकता है, जैसे कि सूचक अंकगणितीय और अनियंत्रित कास्ट, और किसी भी अन्य फ़ंक्शन को भी <code>@safe</code> या <code>@trusted</code> के रूप में चिह्नित किया जाना चाहिए। कार्यों को उन स्थितियों के लिए <code>@trusted</code> के रूप में चिह्नित किया जा सकता है जहां संकलक SafeD में अक्षम सुविधा के सुरक्षित उपयोग और मेमोरी करप्शन के संभावित स्थितियों के बीच अंतर नहीं कर सकता है।<ref>{{cite web |title=डी में @ट्रस्टेड कोड कैसे लिखें|url=https://dlang.org/blog/2016/09/28/how-to-write-trusted-code-in-d/ |author=Steven Schveighoffer |date=28 September 2016 |access-date=4 January 2018}}</ref>




==== स्कोप आजीवन सुरक्षा ====
==== स्कोप आजीवन सुरक्षा ====
प्रारंभ में DIP1000 के बैनर तले<ref>{{Cite web|url=https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1000.md|title=स्कोप्ड पॉइंटर्स|website=[[GitHub]]|date=3 April 2020}}</ref> और DIP25<ref>{{Cite web|url=https://wiki.dlang.org/DIP25|title=मोहरबंद संदर्भ}}</ref> (अब भाषा विनिर्देश का हिस्सा है<ref>{{Cite web|url=https://dlang.org/spec/function.html#return-scope-parameters|title=डी भाषा विशिष्टता: कार्य - रिटर्न स्कोप पैरामीटर्स}}</ref>), डी डेटा के जीवनकाल को शामिल करने वाले कुछ गलत निर्माणों के विरुद्ध सुरक्षा प्रदान करता है।
प्रारंभ में DIP1000 के बैनरों के नीचे<ref>{{Cite web|url=https://github.com/dlang/DIPs/blob/master/DIPs/other/DIP1000.md|title=स्कोप्ड पॉइंटर्स|website=[[GitHub]]|date=3 April 2020}}</ref> और DIP25<ref>{{Cite web|url=https://wiki.dlang.org/DIP25|title=मोहरबंद संदर्भ}}</ref> (अब भाषा विनिर्देश का भाग है<ref>{{Cite web|url=https://dlang.org/spec/function.html#return-scope-parameters|title=डी भाषा विशिष्टता: कार्य - रिटर्न स्कोप पैरामीटर्स}}</ref>), डी डेटा के जीवनकाल को सम्मिलित करने वाले कुछ गलत निर्माणों के विरुद्ध सुरक्षा प्रदान करता है।


मौजूदा तंत्र मुख्य रूप से फ़ंक्शन मापदंडों और स्टैक मेमोरी से निपटते हैं, हालांकि यह प्रोग्रामिंग भाषा के नेतृत्व की एक घोषित महत्वाकांक्षा है जो डी प्रोग्रामिंग भाषा के भीतर जीवनकाल का अधिक संपूर्ण उपचार प्रदान करता है।<ref>{{Cite web|url=https://dlang.org/blog/2019/07/15/ownership-and-borrowing-in-d/|title=डी में स्वामित्व और उधार|date=15 July 2019}}</ref> (रस्ट (प्रोग्रामिंग भाषा) के विचारों से प्रभावित)।
वर्तमान तंत्र मुख्य रूप से फ़ंक्शन मापदंडों और स्टैक मेमोरी क  वर्णन करते हैं, चूंकि यह प्रोग्रामिंग भाषा के नेतृत्व की एक घोषित महत्वाकांक्षा है जो डी प्रोग्रामिंग भाषा के अन्दर जीवनकाल का अधिक संपूर्ण उपचार प्रदान करता है।<ref>{{Cite web|url=https://dlang.org/blog/2019/07/15/ownership-and-borrowing-in-d/|title=डी में स्वामित्व और उधार|date=15 July 2019}}</ref> (रस्ट (प्रोग्रामिंग भाषा) के विचारों से प्रभावित)।


==== कार्य की आजीवन सुरक्षा ====
==== कार्य की आजीवन सुरक्षा ====
@Safe कोड के भीतर, एक [[संदर्भ प्रकार]] से जुड़े असाइनमेंट का जीवनकाल यह सुनिश्चित करने के लिए चेक किया जाता है कि असाइनी का जीवनकाल असाइन किए गए से अधिक लंबा है।
@Safe कोड के अन्दर, एक [[संदर्भ प्रकार]] से जुड़े असाइनमेंट का जीवनकाल यह सुनिश्चित करने के लिए चेक किया जाता है कि असाइनी का जीवनकाल असाइन किए गए से अधिक लंबा है।<syntaxhighlight lang="d">
 
@safe void test()
उदाहरण के लिए:
<वाक्यविन्यास प्रकाश लैंग = डी>
@ सुरक्षित शून्य परीक्षण ()
{
{
     इंट टीएमपी = 0; // # 1
     int tmp = 0; // #1
     इंट * रेड; // # 2
     int* rad;   // #2
     रेड = &tmp; // यदि #1 और #2 की घोषणाओं का क्रम उलट दिया जाता है, तो यह विफल हो जाता है।
     rad = &tmp; // If the order of the declarations of #1 and #2 is reversed, this fails.
     {
     {
    इंट खराब = 45; // लाइफटाइम ऑफ बैड केवल उस दायरे तक विस्तारित होता है जिसमें इसे परिभाषित किया गया है।
    int bad = 45; // Lifetime of "bad" only extends to the scope in which it is defined.
         *राद = बुरा; // यह कोषेर है।
         *rad = bad;   // This is kosher.
         रेड = और खराब; // रेड का जीवनकाल बुरा से अधिक है, इसलिए यह कोषेर बिल्कुल नहीं है।
         rad = &bad;   // Lifetime of rad longer than bad, hence this is not kosher at all.
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== फ़ंक्शन पैरामीटर लाइफ़टाइम एनोटेशन @safe कोड ==== के भीतर
== @Safe कोड के आन्तरिक फ़ंक्शन पैरामीटर लाइफ़टाइम एनोटेशन ==
जब फ़ंक्शन पैरामीटर पर लागू किया जाता है जो या तो सूचक प्रकार या संदर्भ के होते हैं, तो कीवर्ड रिटर्न और स्कोप आजीवन और उस पैरामीटर के उपयोग को बाधित करते हैं।
जब फ़ंक्शन पैरामीटर पर लागू किया जाता है जो या तो सूचक प्रकार या संदर्भ के होते हैं, तो कीवर्ड रिटर्न और स्कोप आजीवन और उस पैरामीटर के उपयोग को बाधित करते हैं।


Line 325: Line 250:
|-
|-
|''वापसी''
|''वापसी''
|पैरामीटर वापस किया जा सकता है या पहले पैरामीटर में कॉपी किया जा सकता है, लेकिन अन्यथा फ़ंक्शन से नहीं निकलता है। ऐसी प्रतियों के लिए आवश्यक है कि वे उस तर्क (ओं) से अधिक न हों जिनसे वे प्राप्त किए गए थे। बिना संदर्भ वाले पैरामीटर के लिए अनदेखा किया गया
|पैरामीटर वापस किया जा सकता है या पहले पैरामीटर में कॉपी किया जा सकता है, लेकिन अन्यथा फ़ंक्शन से नहीं निकलता है। ऐसी प्रतियों के लिए आवश्यक है कि वह उस तर्क (ओं) से अधिक न हों जिनसे वह प्राप्त किए गए थे। बिना संदर्भ वाले पैरामीटर के लिए अनदेखा किया गया
|}
|}
एक व्याख्यात्मक उदाहरण नीचे दिया गया है।<syntaxhighlight lang= D >
एक व्याख्यात्मक उदाहरण नीचे दिया गया है।<syntaxhighlight lang="d">
@सुरक्षित:
@safe:


इंट * जीपी;
int* gp;
शून्य थोरिन (दायरा int*);
void thorin(scope int*);
शून्य ग्लोइन (इंट *);
void gloin(int*);
int * बालिन (रिटर्न स्कोप int * p, स्कोप int * q, int * r)
int* balin(return scope int* p, scope int* q, int* r)
{
{
     जीपी = पी; // त्रुटि, p वैश्विक gp से बच जाता है
     gp = p; // error, p escapes to global gp
     जीपी = क्यू; // त्रुटि, q वैश्विक gp से बच जाता है
     gp = q; // error, q escapes to global gp
     जीपी = आर; // ठीक है
     gp = r; // ok


     थोरिन (पी); // ठीक है, p थोरिन से नहीं बचता ()
     thorin(p); // ok, p does not escape thorin()
     थोरिन (क्यू); // ठीक है
     thorin(q); // ok
     थोरिन (आर); // ठीक है
     thorin(r); // ok


     ग्लिन (पी); // त्रुटि, ग्लोइन () पी से बच जाता है
     gloin(p); // error, gloin() escapes p
     ग्लिन (क्यू); // त्रुटि, ग्लोइन () q से बच जाता है
     gloin(q); // error, gloin() escapes q
     ग्लिन (आर); // ठीक है कि ग्लोइन () आर से बच जाता है
     gloin(r); // ok that gloin() escapes r


     वापसी पी; // ठीक है
     return p; // ok
     वापसी क्ष; // त्रुटि, 'गुंजाइश' वापस नहीं कर सकता क्यू
     return q; // error, cannot return 'scope' q
     वापसी आर; // ठीक है
     return r; // ok
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
===अन्य प्रणालियों के साथ सहभागिता===
=== अन्य प्रणालियों के साथ सहभागिता ===
C (प्रोग्रामिंग लैंग्वेज) का [[अनुप्रयोग बाइनरी इंटरफ़ेस]] (ABI) समर्थित है, साथ ही C के सभी मूलभूत और व्युत्पन्न प्रकार, उपस्थिता C कोड और लाइब्रेरी तक सीधी पहुँच को सक्षम करते हैं। डी [[भाषा बंधन]] कई लोकप्रिय सी लाइब्रेरी के लिए उपलब्ध है। इसके अतिरिक्त, C का मानक [[पुस्तकालय (कंप्यूटर विज्ञान)|लाइब्रेरी (कंप्यूटर विज्ञान)]] मानक डी का भाग है।
C (प्रोग्रामिंग लैंग्वेज) का [[अनुप्रयोग बाइनरी इंटरफ़ेस]] | एप्लिकेशन बाइनरी इंटरफ़ेस (ABI) समर्थित है, साथ ही C के सभी मूलभूत और व्युत्पन्न प्रकार, मौजूदा C कोड और पुस्तकालयों तक सीधी पहुँच को सक्षम करते हैं। डी [[भाषा बंधन]] कई लोकप्रिय सी लाइब्रेरी के लिए उपलब्ध है। इसके अतिरिक्त, सी का मानक [[पुस्तकालय (कंप्यूटर विज्ञान)]] मानक डी का हिस्सा है।


Microsoft Windows पर, D [[घटक वस्तु मॉडल]] (COM) कोड तक पहुँच सकता है।
माइक्रोसॉफ्ट विंडोज पर, D [[घटक वस्तु मॉडल]] (COM) कोड तक पहुँच सकता है।


जब तक स्मृति प्रबंधन का ठीक से ध्यान रखा जाता है, तब तक कई अन्य भाषाओं को एक ही बाइनरी में डी के साथ मिलाया जा सकता है। उदाहरण के लिए, जीडीसी कंपाइलर सी, सी ++, और अन्य समर्थित भाषा कोडों को आपस में जोड़ने की अनुमति देता है। डी कोड (फ़ंक्शंस) को सी, सी ++, पास्कल एबीआई का उपयोग करने के रूप में भी चिह्नित किया जा सकता है, और इस प्रकार [[कॉलबैक (कंप्यूटर प्रोग्रामिंग)]] के रूप में इन भाषाओं में लिखे गए पुस्तकालयों को पास किया जा सकता है। इसी तरह इन भाषाओं में लिखे कोड के बीच डेटा को दोनों तरह से इंटरचेंज किया जा सकता है। यह आमतौर पर आदिम प्रकारों, पॉइंटर्स, सरणियों के कुछ रूपों, यूनियन प्रकार, स्ट्रक्चर्स और केवल कुछ प्रकार के फ़ंक्शन पॉइंटर्स के उपयोग को प्रतिबंधित करता है।
जब तक मेमोरी प्रबंधन का ठीक से ध्यान रखा जाता है, तब तक कई अन्य भाषाओं को एक ही बाइनरी में डी के साथ मिलाया जा सकता है। उदाहरण के लिए, जीडीसी कंपाइलर सी, C ++, और अन्य समर्थित भाषा कोडों को आपस में जोड़ने की अनुमति देता है। डी कोड (फ़ंक्शंस) को सी, C ++, पास्कल एबीआई का उपयोग करने के रूप में भी चिह्नित किया जा सकता है, और इस प्रकार [[कॉलबैक (कंप्यूटर प्रोग्रामिंग)]] के रूप में इन भाषाओं में लिखे गए लाइब्रेरी को पास किया जा सकता है। इसी तरह इन भाषाओं में लिखे कोड के बीच डेटा को दोनों तरह से इंटरचेंज किया जा सकता है। यह सामान्यतः प्राचीन प्रकारों, पॉइंटर्स, सरणियों के कुछ रूपों, यूनियन प्रकार, स्ट्रक्चर्स और केवल कुछ प्रकार के फ़ंक्शन पॉइंटर्स के उपयोग को प्रतिबंधित करता है।


चूंकि कई अन्य प्रोग्रामिंग भाषाएं अक्सर एक्सटेंशन लिखने या भाषाओं के दुभाषिया चलाने के लिए सी एपीआई प्रदान करती हैं, डी मानक सी बाइंडिंग (पतली डी इंटरफ़ेस फ़ाइल के साथ) का उपयोग करके सीधे इन भाषाओं के साथ इंटरफेस कर सकता है। उदाहरण के लिए, पायथन (प्रोग्रामिंग लैंग्वेज) जैसी भाषाओं के लिए द्वि-दिशात्मक बाइंडिंग हैं,<ref>{{cite web |title=पीवाईडी|website=[[GitHub]] |url=https://github.com/ariovistus/pyd |access-date=2020-05-07 |date=7 May 2020}}</ref> [[लुआ (प्रोग्रामिंग भाषा)]]<ref>{{cite web |last1=Parker |first1=Mike |title=डब पर पैकेज परित्यक्त-लुआ|url=https://code.dlang.org/packages/derelict-lua |website=DUB Package Registry |access-date=2020-05-07}}</ref><ref>{{cite web |last1=Parker |first1=Mike |title=डब पर पैकेज बाइंडबीसी-लुआ|url=https://code.dlang.org/packages/bindbc-lua |website=DUB Package Registry |access-date=2020-05-07}}</ref> और अन्य भाषाओं, अक्सर संकलन-समय कोड पीढ़ी और संकलन-समय प्रकार प्रतिबिंब विधियों का उपयोग करते हुए।
चूंकि कई अन्य प्रोग्रामिंग भाषाएं अधिकांश एक्सटेंशन लिखने या भाषाओं के इंटरप्रेटर चलाने के लिए सी एपीआई प्रदान करती हैं, डी मानक C बाइंडिंग (पतली डी इंटरफ़ेस फ़ाइल के साथ) का उपयोग करके सीधे इन भाषाओं के साथ इंटरफेस कर सकता है। उदाहरण के लिए, पायथन (प्रोग्रामिंग लैंग्वेज) जैसी भाषाओं के लिए द्वि-दिशात्मक बाइंडिंग हैं,<ref>{{cite web |title=पीवाईडी|website=[[GitHub]] |url=https://github.com/ariovistus/pyd |access-date=2020-05-07 |date=7 May 2020}}</ref> [[लुआ (प्रोग्रामिंग भाषा)]]<ref>{{cite web |last1=Parker |first1=Mike |title=डब पर पैकेज परित्यक्त-लुआ|url=https://code.dlang.org/packages/derelict-lua |website=DUB Package Registry |access-date=2020-05-07}}</ref><ref>{{cite web |last1=Parker |first1=Mike |title=डब पर पैकेज बाइंडबीसी-लुआ|url=https://code.dlang.org/packages/bindbc-lua |website=DUB Package Registry |access-date=2020-05-07}}</ref> और अन्य भाषाओं, अधिकांश संकलन-समय कोड पीढ़ी और संकलन-समय प्रकार प्रतिबिंब विधियों का उपयोग करते हुए।
====C ++ कोड के साथ सहभागिता====
डी सी ++ कोड के साथ इंटरऑपरेशन के लिए एक अनुमोदित लेकिन यथार्थवादी दृष्टिकोण लेता है।<ref>{{Cite web|url=https://dlang.org/spec/cpp_interface.htm|title=C++ के लिए इंटरफेसिंग}}</ref> डी कोड के रूप में चिह्नित के लिए <code>extern(C++)</code>, निम्नलिखित विशेषताएं निर्दिष्ट हैं:
*मैंगलिंग सम्मेलनों का नाम लक्ष्य पर C ++ के उन लोगों से मेल खाना चाहिए।
*फंक्शन कॉल्स के लिए, एबीआई समतुल्य होगा।
*वीटेबल को सिंगल इनहेरिटेंस (डी भाषा विनिर्देश द्वारा समर्थित एकमात्र स्तर) तक मिलान किया जाएगा।
C++ नेमस्पेस सिंटैक्स के माध्यम से उपयोग किए जाते हैं <code>extern(C++, namespace)</code> जहां नेमस्पेस C ++ नेमस्पेस का नाम है।
===सी++ इंटरऑपरेशन का एक उदाहरण===


==== सी ++ कोड के साथ सहभागिता ====
==== C ++ पक्ष ====
डी सी ++ कोड के साथ इंटरऑपरेशन के लिए एक अनुमोदित लेकिन यथार्थवादी दृष्टिकोण लेता है।<ref>{{Cite web|url=https://dlang.org/spec/cpp_interface.htm|title=C++ के लिए इंटरफेसिंग}}</ref>
<syntaxhighlight lang="d">
डी कोड के रूप में चिह्नित के लिए <code>extern(C++)</code>, निम्नलिखित विशेषताएं निर्दिष्ट हैं:
#include <iostream>
 
using namespace std;
* मैंगलिंग सम्मेलनों का नाम लक्ष्य पर सी ++ के उन लोगों से मेल खाना चाहिए।
class Base
* फंक्शन कॉल्स के लिए, एबीआई समतुल्य होगा।
* वीटेबल को सिंगल इनहेरिटेंस (डी भाषा विनिर्देश द्वारा समर्थित एकमात्र स्तर) तक मिलान किया जाएगा।
 
C++ नेमस्पेस सिंटैक्स के माध्यम से उपयोग किए जाते हैं <code>extern(C++, namespace)</code> जहां नेमस्पेस सी ++ नेमस्पेस का नाम है।
 
=== सी++ इंटरऑपरेशन का एक उदाहरण ===
सी ++ पक्ष
<वाक्यविन्यास प्रकाश लैंग = सी ++>
#शामिल <iostream>
नेमस्पेस एसटीडी का उपयोग करना;
वर्ग आधार
{
{
     जनता:
     public:
         आभासी शून्य Print3i (int a, int b, int c) = 0;
         virtual void print3i(int a, int b, int c) = 0;
};
};


वर्ग व्युत्पन्न: सार्वजनिक आधार
class Derived : public Base
{
{
     जनता:
     public:
         इंट फील्ड;
         int field;
         व्युत्पन्न (पूर्णांक फ़ील्ड): फ़ील्ड (फ़ील्ड) {}
         Derived(int field) : field(field) {}


         शून्य प्रिंट 3i (इंट ए, इंट बी, इंट सी)
         void print3i(int a, int b, int c)
         {
         {
             cout << a = << a << endl;
             cout << "a = " << a << endl;
             cout << b = << b << endl;
             cout << "b = " << b << endl;
             cout << c = << c << endl;
             cout << "c = " << c << endl;
         }
         }


         इंट मुल (इंट फैक्टर);
         int mul(int factor);
};
};


int व्युत्पन्न :: मूल (int कारक)
int Derived::mul(int factor)
{
{
     वापसी क्षेत्र * कारक;
     return field * factor;
}
}


व्युत्पन्न * createInstance (int i)
Derived *createInstance(int i)
{
{
     वापसी नई व्युत्पन्न (i);
     return new Derived(i);
}
}


शून्य डिलीट इंस्टेंस (व्युत्पन्न * और डी)
void deleteInstance(Derived *&d)
{
{
     डी हटाएं;
     delete d;
     डी = 0;
     d = 0;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


डी पक्ष
===== डी पक्ष =====
<वाक्यविन्यास प्रकाश लैंग = डी>
<syntaxhighlight lang="d">
बाहरी (सी ++)
extern(C++)
{
{
     सार वर्ग आधार
     abstract class Base
     {
     {
         शून्य प्रिंट 3i (इंट ए, इंट बी, इंट सी);
         void print3i(int a, int b, int c);
     }
     }


     वर्ग व्युत्पन्न: आधार
     class Derived : Base
     {
     {
         इंट फील्ड;
         int field;
         @ इसे अक्षम करें ();
         @disable this();
         ओवरराइड शून्य प्रिंट 3i (इंट ए, इंट बी, इंट सी);
         override void print3i(int a, int b, int c);
         अंतिम इंट मुल (इंट फैक्टर);
         final int mul(int factor);
     }
     }


     व्युत्पन्न createInstance (int i);
     Derived createInstance(int i);
     शून्य हटाएं इंस्टेंस (रेफरी व्युत्पन्न डी);
     void deleteInstance(ref Derived d);
}
}


शून्य मुख्य ()
void main()
{
{
     आयात std.stdio;
     import std.stdio;


     ऑटो डी 1 = क्रिएट इंस्टेंस (5);
     auto d1 = createInstance(5);
     राइटलन (d1.field);
     writeln(d1.field);
     राइटलन (d1.mul (4));
     writeln(d1.mul(4));


     बेस बी 1 = डी 1;
     Base b1 = d1;
     b1.print3i (1, 2, 3);
     b1.print3i(1, 2, 3);


     डिलीट इंस्टेंस (डी 1);
     deleteInstance(d1);
     जोर दें (डी 1 शून्य है);
     assert(d1 is null);


     ऑटो डी 2 = क्रिएट इंस्टेंस (42);
     auto d2 = createInstance(42);
     राइटलन (d2.field);
     writeln(d2.field);


     डिलीट इंस्टेंस (डी 2);
     deleteInstance(d2);
     जोर दें (डी 2 शून्य है);
     assert(d2 is null);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


=== बेहतर सी ===
===बेटर सी===
D प्रोग्रामिंग लैंग्वेज का एक आधिकारिक उपसमुच्चय है जिसे जाना जाता है{{nowrap|Better C}}.<ref name=":0">{{Cite web|url=https://dlang.org/spec/betterc.html|title=बेहतर सी}}</ref> यह उपसमुच्चय सी के अलावा अन्य रनटाइम पुस्तकालयों के उपयोग की आवश्यकता वाले डी सुविधाओं तक पहुंच को प्रतिबंधित करता है।
डी प्रोग्रामिंग लैंग्वेज का एक आधिकारिक उपसमुच्चय है जिसे {{nowrap|Better C}} जाना जाता है.<ref name=":0">{{Cite web|url=https://dlang.org/spec/betterc.html|title=बेहतर सी}}</ref> यह उपसमुच्चय C के अतिरिक्त अन्य रनटाइम लाइब्रेरी के उपयोग की आवश्यकता वाले डी सुविधाओं तक पहुंच को प्रतिबंधित करता है।


DMD और LDC पर कंपाइलर फ़्लैग -betterC और GDC पर -fno-druntime के माध्यम से सक्षम, {{nowrap|Better C}} केवल एक ही ध्वज (और डी के अलावा लिंक किए गए कोड) के तहत संकलित डी कोड में कॉल कर सकते हैं लेकिन कोड बिना संकलित किए गए हैं {{nowrap|Better C}} विकल्प इसके साथ संकलित कोड में कॉल कर सकता है: हालांकि, सी और डी कैसे जोर देते हैं, इस अंतर के कारण थोड़ा अलग व्यवहार होगा।
DMD और LDC पर कंपाइलर फ़्लैग -betterC और GDC पर -fno-druntime के माध्यम से सक्षम, {{nowrap|Better C}} केवल एक ही ध्वज (और डी के अतिरिक्त लिंक किए गए कोड) के अनुसार संकलित डी कोड में कॉल कर सकते हैं लेकिन कोड बिना संकलित किए गए हैं {{nowrap|Better C}} विकल्प इसके साथ संकलित कोड में कॉल कर सकता है: चूंकि, C और डी कैसे जोर देते हैं, इस अंतर के कारण कुछ अलग व्यवहार होगा।
 
== बेहतर सी == में शामिल विशेषताएं
* संकलन-समय सुविधाओं का अप्रतिबंधित उपयोग (उदाहरण के लिए, डी की गतिशील आवंटन सुविधाओं का उपयोग डी डेटा को पूर्व-आवंटित करने के लिए संकलन समय पर किया जा सकता है)
* पूर्ण मेटाप्रोग्रामिंग सुविधाएं
* नेस्टेड फ़ंक्शंस, नेस्टेड स्ट्रक्चर्स, डेलीगेट्स और लैम्ब्डा
* सदस्य कार्य, निर्माता, विध्वंसक, ऑपरेटिंग ओवरलोडिंग, आदि।
* पूर्ण मॉड्यूल प्रणाली
* ऐरे स्लाइसिंग, और एरे बाउंड चेकिंग
* राय
*{{not a typo|scope(exit)}}* स्मृति सुरक्षा सुरक्षा
* सी ++ के साथ इंटरफेसिंग
* COM क्लासेस और C++ क्लासेस
* मुखर विफलताओं को सी रनटाइम लाइब्रेरी के लिए निर्देशित किया जाता है
* तार के साथ स्विच करें
* अंतिम स्विच
* यूनिटटेस्ट ब्लॉक
* प्रिंटफ प्रारूप सत्यापन


====== बेटर सी में सम्मिलित विशेषताएं ======
*संकलन-समय सुविधाओं का अप्रतिबंधित उपयोग (उदाहरण के लिए, डी की गतिशील आवंटन सुविधाओं का उपयोग डी डेटा को पूर्व-आवंटित करने के लिए संकलन समय पर किया जा सकता है)
*पूर्ण मेटाप्रोग्रामिंग सुविधाएं
*नेस्टेड फ़ंक्शंस, नेस्टेड स्ट्रक्चर्स, डेलीगेट्स और लैम्ब्डा
* सदस्य कार्य, निर्माता, डिस्ट्रॉयर, ऑपरेटिंग ओवरलोडिंग, आदि।
*पूर्ण मॉड्यूल प्रणाली
*ऐरे स्लाइसिंग, और एरे बाउंड चेकिंग
*राय
*{{not a typo|scope(exit)}}* मेमोरी सुरक्षा सुरक्षा
*C ++ के साथ इंटरफेसिंग
*COM क्लासेस और C++ क्लासेस
*मुखर विफलताओं को सी रनटाइम लाइब्रेरी के लिए निर्देशित किया जाता है
*तार के साथ स्विच करें
*अंतिम स्विच
*यूनिटटेस्ट ब्लॉक
*प्रिंटफ प्रारूप सत्यापन
==== सुविधाओं को बेटर सी से बाहर रखा गया है
==== सुविधाओं को बेटर सी से बाहर रखा गया है
* कचरा संग्रहण
*गार्बेज संग्रहण
* टाइपइन्फो और मॉड्यूलइन्फो
*टाइपइन्फो और मॉड्यूलइन्फो
* बिल्ट-इन थ्रेडिंग (उदा. <code>core.thread</code>)
*बिल्ट-इन थ्रेडिंग (उदा. <code>core.thread</code>)
* गतिशील सरणियाँ (हालांकि स्थिर सरणियों के स्लाइस काम करते हैं) और साहचर्य सरणियाँ
*गतिशील सरणियाँ (चूंकि स्थिर सरणियों के स्लाइस काम करते हैं) और साहचर्य सरणियाँ
* अपवाद
*अपवाद
* सिंक्रनाइज़ और <code>core.sync</code>
*सिंक्रनाइज़ और <code>core.sync</code>
* स्टेटिक मॉड्यूल कंस्ट्रक्टर या डिस्ट्रक्टर
*स्टेटिक मॉड्यूल कंस्ट्रक्टर या डिस्ट्रक्टर
 
==इतिहास==
== इतिहास ==
वाल्टर ब्राइट ने 1999 में एक नई भाषा पर काम करना प्रारंभ किया। डी को पहली बार दिसंबर 2001 में रिलीज़ किया गया था<ref name="D1 changelog1">{{cite web |title=डी चेंज लॉग टू नवंबर 7 2005|url=http://www.digitalmars.com/d/1.0/changelog1.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=1 December 2011}}</ref> और जनवरी 2007 में संस्करण 1.0 पर पहुंच गया।<ref name="D1 changelog2">{{cite web |title=डी चेंज लॉग|url=http://www.digitalmars.com/d/1.0/changelog2.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=11 January 2012}}</ref> भाषा का पहला संस्करण (D1) C ++ के समान अनिवार्य, वस्तु उन्मुख और मेटाप्रोग्रामिंग प्रतिमानों पर केंद्रित था,<ref>{{cite web |title=पहचान|url=http://www.digitalmars.com/d/1.0/ |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=1 December 2011}}</ref>  
वाल्टर ब्राइट ने 1999 में एक नई भाषा पर काम करना शुरू किया। डी को पहली बार दिसंबर 2001 में रिलीज़ किया गया था<ref name="D1 changelog1">{{cite web |title=डी चेंज लॉग टू नवंबर 7 2005|url=http://www.digitalmars.com/d/1.0/changelog1.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=1 December 2011}}</ref> और जनवरी 2007 में संस्करण 1.0 पर पहुंच गया।<ref name="D1 changelog2">{{cite web |title=डी चेंज लॉग|url=http://www.digitalmars.com/d/1.0/changelog2.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=11 January 2012}}</ref> भाषा का पहला संस्करण (D1) अनिवार्य, वस्तु उन्मुख और मेटाप्रोग्रामिंग प्रतिमानों पर केंद्रित था,<ref>{{cite web |title=पहचान|url=http://www.digitalmars.com/d/1.0/ |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=1 December 2011}}</ref> सी ++ के समान।
 
डी समुदाय के कुछ सदस्यों ने फोबोस, डी के आधिकारिक रनटाइम पुस्तकालय और [[मानक पुस्तकालय]] से असंतुष्ट होकर टैंगो नामक एक वैकल्पिक रनटाइम और मानक पुस्तकालय बनाया। पहली सार्वजनिक टैंगो घोषणा डी 1.0 के जारी होने के कुछ दिनों के भीतर हुई।<ref>{{cite web |title=एक नए पुस्तकालय की घोषणा|url=http://forum.dlang.org/post/en9ou4$23hr$1@digitaldaemon.com |access-date=15 February 2012}}</ref> टैंगो ने ओओपी और उच्च प्रतिरूपकता को अपनाते हुए एक अलग प्रोग्रामिंग शैली अपनाई। समुदाय के नेतृत्व वाली परियोजना होने के नाते, टैंगो योगदान के लिए अधिक खुला था, जिसने इसे आधिकारिक मानक पुस्तकालय की तुलना में तेजी से प्रगति करने की अनुमति दी। उस समय, अलग-अलग रनटाइम सपोर्ट एपीआई (कचरा कलेक्टर, थ्रेडिंग सपोर्ट, आदि) के कारण टैंगो और फोबोस असंगत थे। इससे एक ही परियोजना में दोनों पुस्तकालयों का उपयोग करना असंभव हो गया। दो पुस्तकालयों के अस्तित्व, दोनों व्यापक रूप से उपयोग में हैं, ने कुछ पैकेजों के कारण फोबोस और अन्य द्वारा टैंगो का उपयोग करने के कारण महत्वपूर्ण विवाद को जन्म दिया है।<ref>{{cite web |title=Wiki4D: स्टैंडर्ड लिब|url=http://www.prowiki.org/wiki4d/wiki.cgi?StandardLib |access-date=6 July 2010}}</ref>
जून 2007 में, D2 का पहला संस्करण जारी किया गया था।<ref name="D2 changelog">{{cite web |title=लॉग बदलें - डी प्रोग्रामिंग भाषा|url=https://dlang.org/changelog/ |work=D Programming Language 2.0 |publisher=D Language Foundation |access-date=22 November 2020}}</ref> D2 के विकास की शुरुआत ने D1 के स्थिरीकरण का संकेत दिया। भाषा के पहले संस्करण को रखरखाव में रखा गया है, केवल सुधार और कार्यान्वयन बगफिक्स प्राप्त कर रहा है। D2 ने अपनी पहली प्रायोगिक [[स्थिरांक-शुद्धता]] के साथ शुरुआत करते हुए, भाषा में ब्रेकिंग बदलाव पेश किए। D2 ने बाद में [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]], [[शुद्ध कार्य]], और कार्यात्मक और समवर्ती प्रोग्रामिंग प्रतिमानों के लिए समर्थन जैसी कई अन्य भाषा सुविधाओं को जोड़ा। D2 ने मानक पुस्तकालय से रनटाइम को अलग करके मानक पुस्तकालय की समस्याओं को भी हल किया। फरवरी 2012 में डी2 टैंगो बंदरगाह के पूरा होने की घोषणा की गई थी।<ref>{{cite web |title=D2 के लिए टैंगो: पोर्ट किए गए सभी उपयोगकर्ता मॉड्यूल|url=http://forum.dlang.org/post/jgagrl$1ta5$1@digitalmars.com |access-date=16 February 2012}}</ref>
12 जून 2010 को आंद्रेई अलेक्सांद्रेस्कू की पुस्तक द डी प्रोग्रामिंग लैंग्वेज के विमोचन ने डी2 के स्थिरीकरण को चिह्नित किया, जिसे आज आमतौर पर केवल डी के रूप में संदर्भित किया जाता है।
 
जनवरी 2011 में, डी विकास एक बगट्रैकर / पैच-सबमिशन आधार से गिटहब तक चला गया। इससे संकलक, रनटाइम और मानक पुस्तकालय में योगदान में उल्लेखनीय वृद्धि हुई है।<ref>{{cite web |title=पुन: GitHub या dsource?|url=http://forum.dlang.org/post/iv524m$98r$1@digitalmars.com |author=Walter Bright |access-date=15 February 2012}}</ref>
दिसंबर 2011 में, आंद्रेई अलेक्जेंड्रेस्कू ने घोषणा की कि डी1, भाषा का पहला संस्करण, 31 दिसंबर 2012 को बंद कर दिया जाएगा।<ref>{{cite web |title=D1 को 31 दिसंबर, 2012 को बंद कर दिया जाएगा|url=http://forum.dlang.org/post/jc0ic5$18bv$2@digitalmars.com |author=Andrei Alexandrescu |access-date=31 January 2014}}</ref> अंतिम D1 रिलीज़, D v1.076, 31 दिसंबर 2012 को थी।<ref name="D1 changelog">{{cite web |title=डी चेंज लॉग|url=http://www.digitalmars.com/d/1.0/changelog.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=31 January 2014}}</ref>
आधिकारिक डी कंपाइलर के लिए कोड, वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर, मूल रूप से एक कस्टम [[सॉफ़्टवेयर लाइसेंस]] के तहत जारी किया गया था, जो उपलब्ध स्रोत के रूप में योग्य है लेकिन ओपन सोर्स परिभाषा के अनुरूप नहीं है।<ref name="D-backend-license">{{cite web |url=https://github.com/dlang/dmd/blob/master/src/backendlicense.txt|title=backendlicense.txt|publisher=GitHub |work=DMD source code |access-date=5 March 2012 |archive-url=https://archive.today/20161022202138/https://github.com/dlang/dmd/blob/master/src/backendlicense.txt|archive-date=22 October 2016 |url-status=dead }}</ref> 2014 में, कंपाइलर कंपाइलर#फ्रंट एंड|फ्रंट-एंड [[सॉफ्टवेयर लाइसेंसिंग]] था|[[बूस्ट सॉफ्टवेयर लाइसेंस]] के तहत [[खुला स्रोत सॉफ्टवेयर]] के रूप में फिर से लाइसेंस दिया गया।<ref name="D-frontend-license">{{cite web |url=http://forum.dlang.org/post/lndgp4$hiq$1@digitalmars.com |title=डीएमडी फ्रंट एंड अब बूस्ट लाइसेंस पर स्विच हो गया है|access-date=9 September 2014}}</ref> इस पुन: लाइसेंस कोड ने बैक-एंड को बाहर कर दिया, जिसे आंशिक रूप से [[NortonLifeLock]] पर विकसित किया गया था। 7 अप्रैल 2017 को, सिमेंटेक द्वारा बैक-एंड को भी फिर से लाइसेंस देने की अनुमति देने के बाद, पूरे कंपाइलर को बूस्ट लाइसेंस के तहत उपलब्ध कराया गया था।<ref name="boost-backend">{{cite web |url=https://forum.dlang.org/post/oc8acc$1ei9$1@digitalmars.com |title=dmd बैकएंड को बूस्ट लाइसेंस में बदला गया|date=7 April 2017 |access-date=9 April 2017}}</ref><ref>{{cite web |url=https://www.reddit.com/r/programming/comments/82cgp/new_release_of_the_d_programming_language_now/c082539 |title=वाल्टर ब्राइट द्वारा रेडिट टिप्पणी|date=5 March 2009 |access-date=9 September 2014}}</ref><ref>[http://www.linux-magazin.de/NEWS/D-Compiler-unter-freier-Lizenz D-Compiler-unter-freier-Lizenz] on linux-magazin.de (2017, in German)</ref><ref>[https://github.com/dlang/dmd/pull/6680 switch backend to Boost License #6680] from Walter Bright on [[github.com]]</ref> 21 जून 2017 को, D भाषा को GCC में शामिल करने के लिए स्वीकार किया गया।<ref>[https://gcc.gnu.org/ml/gcc/2017-06/msg00111.html D Language accepted for inclusion in GCC]</ref>


डी समुदाय के कुछ सदस्यों ने फोबोस, डी के आधिकारिक रनटाइम लाइब्रेरी और [[मानक पुस्तकालय|मानक लाइब्रेरी]] से असंतुष्ट होकर टैंगो नामक वैकल्पिक रनटाइम और मानक लाइब्रेरी बनाया। पहली सार्वजनिक टैंगो घोषणा डी 1.0 के जारी होने के कुछ दिनों के अन्दर हुई।<ref>{{cite web |title=एक नए पुस्तकालय की घोषणा|url=http://forum.dlang.org/post/en9ou4$23hr$1@digitaldaemon.com |access-date=15 February 2012}}</ref> टैंगो ने ओओपी और उच्च प्रतिरूपकता को अपनाते हुए एक अलग प्रोग्रामिंग शैली अपनाई। समुदाय के नेतृत्व वाली परियोजना होने के संबंध में, टैंगो योगदान के लिए अधिक खुला था, जिसने इसे आधिकारिक मानक लाइब्रेरी की तुलना में तेजी से प्रगति करने की अनुमति दी। उस समय, अलग-अलग रनटाइम सपोर्ट एपीआई (गार्बेज कलेक्टर, थ्रेडिंग सपोर्ट, आदि) के कारण टैंगो और फोबोस असंगत थे। इससे एक ही परियोजना में दोनों लाइब्रेरी का उपयोग करना असंभव हो गया। दो लाइब्रेरी के अस्तित्व, दोनों व्यापक रूप से उपयोग में हैं, ने कुछ पैकेजों के कारण फोबोस और अन्य द्वारा टैंगो का उपयोग करने के कारण महत्वपूर्ण विवाद को जन्म दिया है।<ref>{{cite web |title=Wiki4D: स्टैंडर्ड लिब|url=http://www.prowiki.org/wiki4d/wiki.cgi?StandardLib |access-date=6 July 2010}}</ref> जून 2007 में, D2 का पहला संस्करण जारी किया गया था।<ref name="D2 changelog">{{cite web |title=लॉग बदलें - डी प्रोग्रामिंग भाषा|url=https://dlang.org/changelog/ |work=D Programming Language 2.0 |publisher=D Language Foundation |access-date=22 November 2020}}</ref> D2 के विकास की प्रारंभ ने D1 के स्थिरीकरण का संकेत दिया। भाषा के पहले संस्करण को रखरखाव में रखा गया है, केवल सुधार और कार्यान्वयन बगफिक्स प्राप्त कर रहा है। D2 ने अपनी पहली प्रायोगिक [[स्थिरांक-शुद्धता]] के साथ प्रारंभ करते हुए, भाषा में ब्रेकिंग बदलाव प्रस्तुत किए। D2 ने बाद में [[क्लोजर (कंप्यूटर प्रोग्रामिंग)]], [[शुद्ध कार्य]], और कार्यात्मक और समवर्ती प्रोग्रामिंग प्रतिमानों के लिए समर्थन जैसी कई अन्य भाषा सुविधाओं को जोड़ा। D2 ने मानक लाइब्रेरी से रनटाइम को अलग करके मानक लाइब्रेरी की समस्याओं का भी समाधान किया। फरवरी 2012 में डी2 टैंगो पोर्ट के पूरा होने की घोषणा की गई थी।<ref>{{cite web |title=D2 के लिए टैंगो: पोर्ट किए गए सभी उपयोगकर्ता मॉड्यूल|url=http://forum.dlang.org/post/jgagrl$1ta5$1@digitalmars.com |access-date=16 February 2012}}</ref> 12 जून 2010 को आंद्रेई अलेक्सांद्रेस्कू की पुस्तक द डी प्रोग्रामिंग लैंग्वेज के विमोचन ने डी2 के स्थिरीकरण को चिह्नित किया, जिसे आज सामान्यतः केवल डी के रूप में संदर्भित किया जाता है।


== कार्यान्वयन ==
जनवरी 2011 में, डी विकास एक बगट्रैकर / पैच-सबमिशन आधार से गिटहब तक चला गया। इससे संकलक, रनटाइम और मानक लाइब्रेरी में योगदान में उल्लेखनीय वृद्धि हुई है।<ref>{{cite web |title=पुन: GitHub या dsource?|url=http://forum.dlang.org/post/iv524m$98r$1@digitalmars.com |author=Walter Bright |access-date=15 February 2012}}</ref> दिसंबर 2011 में, आंद्रेई अलेक्जेंड्रेस्कू ने घोषणा की कि डी1, भाषा का पहला संस्करण, 31 दिसंबर 2012 को बंद कर दिया जाएगा।<ref>{{cite web |title=D1 को 31 दिसंबर, 2012 को बंद कर दिया जाएगा|url=http://forum.dlang.org/post/jc0ic5$18bv$2@digitalmars.com |author=Andrei Alexandrescu |access-date=31 January 2014}}</ref> अंतिम D1 रिलीज़, D v1.076, 31 दिसंबर 2012 को थी।<ref name="D1 changelog">{{cite web |title=डी चेंज लॉग|url=http://www.digitalmars.com/d/1.0/changelog.html |work=D Programming Language 1.0 |publisher=Digital Mars |access-date=31 January 2014}}</ref> आधिकारिक डी कंपाइलर के लिए कोड, वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर, मूल रूप से  कस्टम [[सॉफ़्टवेयर लाइसेंस]] के अनुसार जारी किया गया था, जो उपलब्ध स्रोत के रूप में योग्य है लेकिन ओपन सोर्स परिभाषा के अनुरूप नहीं है।<ref name="D-backend-license">{{cite web |url=https://github.com/dlang/dmd/blob/master/src/backendlicense.txt|title=backendlicense.txt|publisher=GitHub |work=DMD source code |access-date=5 March 2012 |archive-url=https://archive.today/20161022202138/https://github.com/dlang/dmd/blob/master/src/backendlicense.txt|archive-date=22 October 2016 |url-status=dead }}</ref> 2014 में, कंपाइलर कंपाइलर फ्रंट-एंड [[सॉफ्टवेयर लाइसेंसिंग]] था | [[बूस्ट सॉफ्टवेयर लाइसेंस]] के अनुसार [[खुला स्रोत सॉफ्टवेयर|ओपन सोर्स सॉफ्टवेयर]] के रूप में फिर से लाइसेंस दिया गया।<ref name="D-frontend-license">{{cite web |url=http://forum.dlang.org/post/lndgp4$hiq$1@digitalmars.com |title=डीएमडी फ्रंट एंड अब बूस्ट लाइसेंस पर स्विच हो गया है|access-date=9 September 2014}}</ref> इस पुन: लाइसेंस कोड ने बैक-एंड को बाहर कर दिया, जिसे आंशिक रूप से [[NortonLifeLock|नॉर्टनलाइफ लॉक]] पर विकसित किया गया था। 7 अप्रैल 2017 को, सिमेंटेक द्वारा बैक-एंड को भी फिर से लाइसेंस देने की अनुमति देने के बाद, पूरे कंपाइलर को बूस्ट लाइसेंस के अनुसार उपलब्ध कराया गया था।<ref name="boost-backend">{{cite web |url=https://forum.dlang.org/post/oc8acc$1ei9$1@digitalmars.com |title=dmd बैकएंड को बूस्ट लाइसेंस में बदला गया|date=7 April 2017 |access-date=9 April 2017}}</ref><ref>{{cite web |url=https://www.reddit.com/r/programming/comments/82cgp/new_release_of_the_d_programming_language_now/c082539 |title=वाल्टर ब्राइट द्वारा रेडिट टिप्पणी|date=5 March 2009 |access-date=9 September 2014}}</ref><ref>[http://www.linux-magazin.de/NEWS/D-Compiler-unter-freier-Lizenz D-Compiler-unter-freier-Lizenz] on linux-magazin.de (2017, in German)</ref><ref>[https://github.com/dlang/dmd/pull/6680 switch backend to Boost License #6680] from Walter Bright on [[github.com]]</ref> 21 जून 2017 को, डी भाषा को GCC में सम्मिलित करने के लिए स्वीकार किया गया।<ref>[https://gcc.gnu.org/ml/gcc/2017-06/msg00111.html D Language accepted for inclusion in GCC]</ref>
==कार्यान्वयन==
कुशल निष्पादन के लिए अधिकांश वर्तमान डी कार्यान्वयन [[संकलक]] सीधे [[मशीन कोड]] में।
कुशल निष्पादन के लिए अधिकांश वर्तमान डी कार्यान्वयन [[संकलक]] सीधे [[मशीन कोड]] में।


उत्पादन के लिए तैयार संकलक:
उत्पादन के लिए तैयार संकलक:
*डीएमडी - वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर आधिकारिक डी कंपाइलर है; बूस्ट सॉफ्टवेयर लाइसेंस के अनुसार ओपन सोर्स<ref name="D-frontend-license" /><ref name="boost-backend" /> कंपाइलर्स के बीच अनुकूलता में सुधार करने के लिए डीएमडी फ्रंटेंड को जीडीसी (अब जीसीसी में) और एलडीसी द्वारा साझा किया जाता है। प्रारंभ में दृश्यपटल C++ में लिखा गया था, लेकिन अब इसका अधिकांश भाग डी में ही (सेल्फ-होस्टिंग) लिखा गया है। बैकएंड और मशीन कोड ऑप्टिमाइज़र सिमेंटेक कंपाइलर पर आधारित हैं। सबसे पहले यह केवल 32-बिट x86 का समर्थन करता था, वाल्टर ब्राइट द्वारा 64-बिट amd64 और पावरपीसी के लिए समर्थन जोड़ा गया था। बाद में बैकएंड और लगभग पूरे कंपाइलर को पूर्ण सेल्फ-होस्टिंग के लिए C++ से D में पोर्ट किया गया।
*जीसीसी - जीएनयू कंपाइलर संग्रह, विलय जीडीसी<ref>{{cite web|url=https://gdcproject.org/ |title=जीडीसी }}</ref> 29 अक्टूबर 2018 को जीसीसी 9 में।<ref>{{cite web |title=GCC 9 रिलीज़ सीरीज़ - परिवर्तन, नई सुविधाएँ और सुधार - GNU प्रोजेक्ट - फ़्री सॉफ़्टवेयर फ़ाउंडेशन (FSF)|url=https://gcc.gnu.org/gcc-9/changes.html#d |website=gcc.gnu.org |access-date=2020-05-07}}</ref> Linux और macOS पर 32-बिट x86 पर GCC 3.3 और GCC 3.4 पर आधारित GCC के साथ GDC का पहला कार्यशील संस्करण<ref>{{cite web |title=जीसीसी के लिए एक और फ्रंट एंड|url=https://forum.dlang.org/post/c3mnst$2htg$1@digitaldaemon.com |website=forum.dlang.org |access-date=2020-05-07}}</ref> 22 मार्च 2004 को जारी किया गया था। तब से जीडीसी ने फ्रंटएंड और भाषा विनिर्देश के लिए अपस्ट्रीम डीएमडी कोड को ट्रैक करते समय अतिरिक्त प्लेटफॉर्म, उत्तम प्रदर्शन और फिक्स्ड बग के लिए समर्थन प्राप्त किया है।<ref>{{Cite web|url=https://gcc.gnu.org/gcc-9/changes.html|title=GCC 9 रिलीज़ सीरीज़ में बदलाव, नई सुविधाएं और समाधान}}</ref>
* LDC - DMD फ्रंट-एंड पर आधारित कंपाइलर जो [[LLVM]] को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। पहला रिलीज़-क्वालिटी संस्करण 9 जनवरी 2009 को प्रकाशित हुआ था।<ref>{{cite web |url=https://github.com/ldc-developers/ldc |title=GitHub पर LLVM D कंपाइलर प्रोजेक्ट|website=[[GitHub]] |access-date=19 August 2016}}</ref> यह संस्करण 2.0 का समर्थन करता है।<ref>{{cite web |url=http://www.dsource.org/projects/ldc/wiki/BuildInstructionsPhobosDruntimeTrunk |title=BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac|access-date=11 August 2015}}</ref>
टॉय और प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर:
*{{not a typo|.NET}} के लिये डी कंपाइलर - डी प्रोग्रामिंग लैंग्वेज 2.0 कंपाइलर के लिए बैक-एंड।<ref>{{cite web |title=कोडप्लेक्स पर डी.नेट परियोजना|url=http://dnet.codeplex.com/ |access-date=3 July 2010}}</ref><ref>{{cite web |title=D.NET कम्पाइलर के लिए स्रोत अब उपलब्ध है|url=http://www.infoq.com/news/2009/05/D-Source |publisher=InfoQ |access-date=6 July 2010 |author=Jonathan Allen |date=15 May 2009}}</ref> यह कोड को मशीन कोड के अतिरिक्त [[सामान्य मध्यवर्ती भाषा]] (CIL) बायटेकोड में संकलित करता है। CIL को तब [[सामान्य भाषा अवसंरचना]] (CLI) [[आभासी मशीन]] के माध्यम से चलाया जा सकता है। परियोजना को वर्षों में अद्यतन नहीं किया गया है और लेखक ने संकेत दिया है कि परियोजना अब सक्रिय नहीं है।
*एसडीसी - स्टूपिड डी कंपाइलर कस्टम फ्रंट-एंड और एलएलवीएम को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। यह डी में लिखा गया है और डी की संकलन-समय सुविधाओं को सुरुचिपूर्ण ढंग से संभालने के लिए प्रतीक संकल्प को संभालने के लिए शेड्यूलर का उपयोग करता है। यह कंपाइलर वर्तमान में भाषा के सीमित उपसमूह का समर्थन करता है।<ref>Archived at [https://ghostarchive.org/varchive/youtube/20211211/AhR4PSExnqk Ghostarchive]{{cbignore}} and the [https://web.archive.org/web/20150326150804/https://www.youtube.com/watch?v=AhR4PSExnqk Wayback Machine]{{cbignore}}: {{cite web |title=DConf 2014: SDC, a D Compiler as a Library by Amaury Sechet |website = [[YouTube]]|url=https://www.youtube.com/watch?v=AhR4PSExnqk |access-date=8 January 2014}}{{cbignore}}</ref><ref>{{cite web |title=डेडलनिक्स / एसडीसी|website=[[GitHub]] |url=https://github.com/डेडलनिक्स / एसडीसी|access-date=8 January 2014}}</ref>
उपरोक्त कंपाइलर्स और टूलचेन्स का उपयोग करके, x[[86]], [[amd64]], [[AArch64]], [[PowerPC]], [[MIPS64]], [[DEC Alpha]], [[m68k]], [[Sparc]], [[s390]], [[WebAssembly|वेबअसेंबली]] सहित कई अलग-अलग आर्किटेक्चर को लक्षित करने के लिए डी प्रोग्राम को संकलित करना संभव है। प्राथमिक समर्थित ऑपरेटिंग सिस्टम [[खिड़कियाँ]] और लिनक्स हैं, लेकिन विभिन्न कंपाइलर [[Mac OS X]], फ्रीबीएसडी, [[नेटबीएसडी]], एआई[[ऐक्स]], सोलारिस (ऑपरेटिंग सिस्टम) और एंड्रॉइड (ऑपरेटिंग सिस्टम) का भी समर्थन करते हैं, या तो होस्ट या लक्ष्य के रूप में, या दोनों . वेब असेंबली लक्ष्य (LDC और LLVM के माध्यम से समर्थित) किसी भी वेब असेंबली वातावरण में काम कर सकता है, जैसे आधुनिक वेब ब्राउज़र ([[Google Chrome|गूगल क्रोम]], [[Mozilla Firefox|मोजिल्ला फायरफॉक्स]], [[Microsoft Edge|माइक्रोसॉफ्ट एड्ज]], [[Apple Safari|एप्पल सफारी]]), या समर्पित Wasm वर्चुअल मशीन।
==विकास उपकरण==
भाषा के लिए [[वाक्य - विन्यास पर प्रकाश डालना]] और आंशिक [[बुद्धिमान कोड पूर्णता]] का समर्थन करने [[विम (पाठ संपादक)]] एकीकृत विकास वातावरण (IDEs) में [[SlickEdit|स्लिकएडिट]], [[Emacs|एमएसीएस]], Vim (टेक्स्ट एडिटर), [[SciTE]], [[Smultron|स्मल्ट्रोन]], ज़ीउस,<ref>{{cite web |url=http://www.prowiki.org/wiki4d/wiki.cgi?EditorSupport/ZeusForWindows |title=Wiki4D: EditorSupport/ZeusForWindows|access-date=11 August 2015}}</ref> और [[गेनी]] सम्मिलित हैं।<ref>{{cite web |title=Wiki4D: संपादक समर्थन|url=http://www.prowiki.org/wiki4d/wiki.cgi?EditorSupport |access-date=3 July 2010}}</ref>
*Dexed (पूर्व में सह-संपादित),<ref>{{cite web |title=बेसिल.बी / डेक्स्ड|url=https://gitlab.com/basile.b/dexed |website=GitLab |access-date=2020-04-29 |language=en}}</ref> [[वस्तु पास्कल]] में लिखा गया डी केंद्रित ग्राफिकल आईडीई
*मोनो-डी<ref>{{cite web |title=मोनो-डी - डी विकी|url=https://wiki.dlang.org/Mono-D |website=wiki.dlang.org |access-date=2020-04-30}}</ref> मुख्य रूप से C Sharp में लिखे गए [[MonoDevelop|मोनोडेवलप]] / ज़ामरीन स्टूडियो पर आधारित सुविधा संपन्न क्रॉस-प्लेटफ़ॉर्म डी केंद्रित ग्राफ़िकल IDE है।<ref>{{cite web |url=http://mono-d.sourceforge.net/ |title=मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट|access-date=11 August 2015}}</ref>
*डी के लिए एक्लिप्स (सॉफ्टवेयर) प्लग-इन में डीडीटी<ref>{{cite web |url=https://code.google.com/p/ddt/ |title=Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015}}</ref> और डिसेंट (मृत परियोजना) सम्मिलित हैं।<ref>{{cite web |url=http://dsource.org/projects/चढ़ाई|title=चढ़ाई|access-date=11 August 2015}}</ref>
*विजुअल स्टूडियो इंटीग्रेशन विजुअलडी द्वारा प्रदान किया जाता है।<ref>{{cite web |url=https://rainers.github.io/visuald/visuald/StartPage.html |title=विजुअल डी - डी प्रोग्रामिंग लैंग्वेज|access-date=11 August 2015}}</ref><ref>{{cite web |last1=Schuetze |first1=Rainer |title=रेनर्स/विज़ुअल: विजुअल डी - डी प्रोग्रामिंग लैंग्वेज के लिए विजुअल स्टूडियो एक्सटेंशन|url=https://github.com/rainers/visuald |website=github.com |access-date=2020-04-30 |date=17 April 2020}}</ref>
*Dlang-Vscode जैसे एक्सटेंशन के साथ [[विजुअल स्टूडियो कोड]] इंटीग्रेशन<ref>{{cite web |url=https://github.com/dlang-vscode/dlang-vscode|title=dlang-vscode|website=[[GitHub]] |access-date=21 December 2016}}</ref> या कोड-डी।<ref>{{cite web |url=https://github.com/Pure-D/कोड-डी|title=कोड-डी|website=[[GitHub]] |access-date=21 December 2016}}</ref>
*[[टेक्स्टमैट]] के लिए एक बंडल उपलब्ध है, और कोड:: ब्लॉक आईडीई में भाषा के लिए आंशिक समर्थन सम्मिलित है। चूँकि, मानक IDE सुविधाएँ जैसे कि [[कोड पूर्णता]] या [[रिफैक्टरिंग]] अभी तक उपलब्ध नहीं हैं, चूँकि वह कोड:: ब्लॉक में आंशिक रूप से काम करते हैं (D की C से समानता के कारण)।
*Xcode के लिए [[Xcode 3]] प्लगइन D, D-आधारित परियोजनाओं और विकास को सक्षम बनाता है।<ref>{{cite web |url=http://michelf.com/projects/d-for-xcode/ |title=मिशेल फोर्टिन - एक्सकोड के लिए डी|access-date=11 August 2015}}</ref>
*के[[डेवलप]] (साथ ही इसका पाठ संपादक बैकएंड, केट) स्वत: पूर्णता प्लगइन उपलब्ध है।<ref>{{cite web |url=https://github.com/डेव1डे/स्नो|title=डेव1डे/स्नो|work=GitHub |access-date=11 August 2015}}</ref>
विंडोज के लिए ओपन-सोर्स सॉफ्टवेयर डी आईडीई उपस्थित हैं, कुछ डी में लिखे गए हैं, जैसे पोसीडॉन,<ref>{{cite web |url=http://dsource.org/projects/Poseidon|title=Poseidon|access-date=11 August 2015}}</ref> डी-आईडीई,<ref>{{cite web |url=http://d-ide.sourceforge.net/ |title=मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट|access-date=11 August 2015}}</ref> तथा अल्लुर डिजाइनर।<ref>{{cite web |url=http://www.dprogramming.com/entice.php |title=एन्टिस डिज़ाइनर - Dprogramming.com - D प्रोग्रामिंग लैंग्वेज|access-date=11 August 2015}}</ref> डी अनुप्रयोगों को किसी भी C/C++ डिबगर का उपयोग करके डीबग किया जा सकता है, जैसे GNU डीबगर या WinDbg, चूंकि विभिन्न D-विशिष्ट भाषा सुविधाओं के लिए समर्थन अत्यंत सीमित है। विंडोज़ पर, डी प्रोग्राम [https://web.archive.org/web/20070224161328/http://ddbg.mainia.de/ Ddbg], या माइक्रोसॉफ्ट डीबगिंग टूल्स ([[विनडीबीजी]] और विजुअल स्टूडियो) का उपयोग करके डीबग किया जा सकता है। [http://dsource.org/projects/cv2pdb cv2pdb] का उपयोग करके डिबग जानकारी को रूपांतरित किया। Linux के लिए [http://zerobugs.codeplex.com/ ZeroBUGS] डीबगर में डी भाषा के लिए प्रयोगात्मक समर्थन है। डीडीबीजी का उपयोग विभिन्न आईडीई या कमांड लाइन से किया जा सकता है; ZeroBUGS का अपना [[ग्राफिकल यूज़र इंटरफ़ेस]] (GUI) है।


* डीएमडी - वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर आधिकारिक डी कंपाइलर है; बूस्ट सॉफ्टवेयर लाइसेंस के तहत ओपन सोर्स।<ref name="D-frontend-license" /><ref name="boost-backend" />कंपाइलर्स के बीच अनुकूलता में सुधार करने के लिए डीएमडी फ्रंटेंड को जीडीसी (अब जीसीसी में) और एलडीसी द्वारा साझा किया जाता है। प्रारंभ में दृश्यपटल C++ में लिखा गया था, लेकिन अब इसका अधिकांश भाग D में ही (सेल्फ-होस्टिंग) लिखा गया है। बैकएंड और मशीन कोड ऑप्टिमाइज़र सिमेंटेक कंपाइलर पर आधारित हैं। सबसे पहले यह केवल 32-बिट x86 का समर्थन करता था, वाल्टर ब्राइट द्वारा 64-बिट amd64 और पावरपीसी के लिए समर्थन जोड़ा गया था। बाद में बैकएंड और लगभग पूरे कंपाइलर को पूर्ण सेल्फ-होस्टिंग के लिए C++ से D में पोर्ट किया गया।
डस्टमाइट डी स्रोत कोड को कम करने के लिए शक्तिशाली उपकरण है, जो संकलक या परीक्षण मुद्दों को खोजने में उपयोगी है।<ref>{{cite web | url=https://github.com/CyberShadow/DustMite/wiki |title=डस्टमाइट क्या है?|website=[[GitHub]] |access-date=2020-04-29 |language=en}}</ref> डब लोकप्रिय पैकेज है और डी अनुप्रयोगों और लाइब्रेरी के लिए प्रबंधक का निर्माण करता है, और इसे अधिकांश आईडीई समर्थन में एकीकृत किया जाता है।<ref>{{cite web |url=https://github.com/dlang/dub |title=dlang/डब: डी के लिए पैकेज और निर्माण प्रबंधन प्रणाली|website=[[GitHub]] |access-date=2020-04-29 |language=en}}</ref>
* जीसीसी - जीएनयू कंपाइलर संग्रह, विलय जीडीसी<ref>{{cite web|url=https://gdcproject.org/ |title=जीडीसी }}</ref> 29 अक्टूबर 2018 को जीसीसी 9 में।<ref>{{cite web |title=GCC 9 रिलीज़ सीरीज़ - परिवर्तन, नई सुविधाएँ और सुधार - GNU प्रोजेक्ट - फ़्री सॉफ़्टवेयर फ़ाउंडेशन (FSF)|url=https://gcc.gnu.org/gcc-9/changes.html#d |website=gcc.gnu.org |access-date=2020-05-07}}</ref> Linux और macOS पर 32-बिट x86 पर GCC 3.3 और GCC 3.4 पर आधारित GCC के साथ GDC का पहला कार्यशील संस्करण<ref>{{cite web |title=जीसीसी के लिए एक और फ्रंट एंड|url=https://forum.dlang.org/post/c3mnst$2htg$1@digitaldaemon.com |website=forum.dlang.org |access-date=2020-05-07}}</ref> 22 मार्च 2004 को जारी किया गया था। तब से जीडीसी ने फ्रंटएंड और भाषा विनिर्देश के लिए अपस्ट्रीम डीएमडी कोड को ट्रैक करते समय अतिरिक्त प्लेटफॉर्म, बेहतर प्रदर्शन और फिक्स्ड बग के लिए समर्थन प्राप्त किया है।<ref>{{Cite web|url=https://gcc.gnu.org/gcc-9/changes.html|title=GCC 9 रिलीज़ सीरीज़ में बदलाव, नई सुविधाएं और समाधान}}</ref>
==उदाहरण==
* LDC - DMD फ्रंट-एंड पर आधारित एक कंपाइलर जो [[LLVM]] को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। पहला रिलीज़-क्वालिटी संस्करण 9 जनवरी 2009 को प्रकाशित हुआ था।<ref>{{cite web |url=https://github.com/ldc-developers/ldc |title=GitHub पर LLVM D कंपाइलर प्रोजेक्ट|website=[[GitHub]] |access-date=19 August 2016}}</ref> यह संस्करण 2.0 का समर्थन करता है।<ref>{{cite web |url=http://www.dsource.org/projects/ldc/wiki/BuildInstructionsPhobosDruntimeTrunk |title=BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac|access-date=11 August 2015}}</ref>
===उदाहरण 1===
खिलौना और प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर:
यह उदाहरण प्रोग्राम अपने कमांड लाइन तर्कों को प्रिंट करता है। <code>main</code> E> फ़ंक्शन डी प्रोग्राम का प्रवेश बिंदु है, और <code>args</code> कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की एक सरणी है। ए <code>string</code> डी में वर्णों की सरणी है, जिसका प्रतिनिधित्व <code>immutable(char)[]द्वारा किया जाता है</code><syntaxhighlight lang="d" line="1">
* डी कंपाइलर के लिए {{not a typo|.NET}}- डी प्रोग्रामिंग लैंग्वेज 2.0 कंपाइलर के लिए बैक-एंड।<ref>{{cite web |title=कोडप्लेक्स पर डी.नेट परियोजना|url=http://dnet.codeplex.com/ |access-date=3 July 2010}}</ref><ref>{{cite web |title=D.NET कम्पाइलर के लिए स्रोत अब उपलब्ध है|url=http://www.infoq.com/news/2009/05/D-Source |publisher=InfoQ |access-date=6 July 2010 |author=Jonathan Allen |date=15 May 2009}}</ref> यह कोड को मशीन कोड के बजाय [[सामान्य मध्यवर्ती भाषा]] (CIL) बायटेकोड में संकलित करता है। CIL को तब [[सामान्य भाषा अवसंरचना]] (CLI) [[आभासी मशीन]] के माध्यम से चलाया जा सकता है। परियोजना को वर्षों में अद्यतन नहीं किया गया है और लेखक ने संकेत दिया है कि परियोजना अब सक्रिय नहीं है।
import std.stdio: writefln;
* एसडीसी - स्टूपिड डी कंपाइलर एक कस्टम फ्रंट-एंड और एलएलवीएम को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। यह डी में लिखा गया है और डी की संकलन-समय सुविधाओं को सुरुचिपूर्ण ढंग से संभालने के लिए प्रतीक संकल्प को संभालने के लिए शेड्यूलर का उपयोग करता है। यह कंपाइलर वर्तमान में भाषा के सीमित उपसमूह का समर्थन करता है।<ref>Archived at [https://ghostarchive.org/varchive/youtube/20211211/AhR4PSExnqk Ghostarchive]{{cbignore}} and the [https://web.archive.org/web/20150326150804/https://www.youtube.com/watch?v=AhR4PSExnqk Wayback Machine]{{cbignore}}: {{cite web |title=DConf 2014: SDC, a D Compiler as a Library by Amaury Sechet |website = [[YouTube]]|url=https://www.youtube.com/watch?v=AhR4PSExnqk |access-date=8 January 2014}}{{cbignore}}</ref><ref>{{cite web |title=डेडलनिक्स / एसडीसी|website=[[GitHub]] |url=https://github.com/डेडलनिक्स / एसडीसी|access-date=8 January 2014}}</ref>
उपरोक्त कंपाइलर्स और टूलचेन्स का उपयोग करके, x[[86]], [[amd64]], [[AArch64]], [[PowerPC]], [[MIPS64]], [[DEC Alpha]], [[m68k]], [[Sparc]], [[s390]], [[WebAssembly]] सहित कई अलग-अलग आर्किटेक्चर को लक्षित करने के लिए D प्रोग्राम को संकलित करना संभव है। प्राथमिक समर्थित ऑपरेटिंग सिस्टम [[खिड़कियाँ]] और लिनक्स हैं, लेकिन विभिन्न कंपाइलर [[Mac OS X]], फ्रीबीएसडी, [[नेटबीएसडी]], एआई[[ऐक्स]], सोलारिस (ऑपरेटिंग सिस्टम) | सोलारिस/ओपनसोलारिस और एंड्रॉइड (ऑपरेटिंग सिस्टम) का भी समर्थन करते हैं, या तो मेजबान या लक्ष्य के रूप में, या दोनों . WebAssembly लक्ष्य (LDC और LLVM के माध्यम से समर्थित) किसी भी WebAssembly वातावरण में काम कर सकता है, जैसे आधुनिक वेब ब्राउज़र ([[Google Chrome]], [[Mozilla Firefox]], [[Microsoft Edge]], [[Apple Safari]]), या समर्पित Wasm वर्चुअल मशीन।
 
== विकास उपकरण ==
भाषा के लिए [[वाक्य - विन्यास पर प्रकाश डालना]] और आंशिक [[बुद्धिमान कोड पूर्णता]] का समर्थन करने [[विम (पाठ संपादक)]] एकीकृत विकास वातावरण (IDEs) में शामिल हैं [[SlickEdit]], [[Emacs]], Vim (टेक्स्ट एडिटर), [[SciTE]], [[Smultron]], Zeus,<ref>{{cite web |url=http://www.prowiki.org/wiki4d/wiki.cgi?EditorSupport/ZeusForWindows |title=Wiki4D: EditorSupport/ZeusForWindows|access-date=11 August 2015}}</ref> और [[गेनी]] दूसरों के बीच में।<ref>{{cite web |title=Wiki4D: संपादक समर्थन|url=http://www.prowiki.org/wiki4d/wiki.cgi?EditorSupport |access-date=3 July 2010}}</ref>
* Dexed (पूर्व में सह-संपादित),<ref>{{cite web |title=बेसिल.बी / डेक्स्ड|url=https://gitlab.com/basile.b/dexed |website=GitLab |access-date=2020-04-29 |language=en}}</ref> [[वस्तु पास्कल]] में लिखा गया एक डी केंद्रित ग्राफिकल आईडीई
* मोनो-डी<ref>{{cite web |title=मोनो-डी - डी विकी|url=https://wiki.dlang.org/Mono-D |website=wiki.dlang.org |access-date=2020-04-30}}</ref> मुख्य रूप से C Sharp में लिखे गए [[MonoDevelop]] / Xamarin Studio पर आधारित एक सुविधा संपन्न क्रॉस-प्लेटफ़ॉर्म D केंद्रित ग्राफ़िकल IDE है।<ref>{{cite web |url=http://mono-d.sourceforge.net/ |title=मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट|access-date=11 August 2015}}</ref>
* डी के लिए एक्लिप्स (सॉफ्टवेयर) प्लग-इन में डीडीटी शामिल है<ref>{{cite web |url=https://code.google.com/p/ddt/ |title=Google प्रोजेक्ट होस्टिंग|access-date=11 August 2015}}</ref> और वंश (मृत परियोजना)।<ref>{{cite web |url=http://dsource.org/projects/चढ़ाई|title=चढ़ाई|access-date=11 August 2015}}</ref>
* विजुअल स्टूडियो इंटीग्रेशन विजुअलडी द्वारा प्रदान किया जाता है।<ref>{{cite web |url=https://rainers.github.io/visuald/visuald/StartPage.html |title=विजुअल डी - डी प्रोग्रामिंग लैंग्वेज|access-date=11 August 2015}}</ref><ref>{{cite web |last1=Schuetze |first1=Rainer |title=रेनर्स/विज़ुअल: विजुअल डी - डी प्रोग्रामिंग लैंग्वेज के लिए विजुअल स्टूडियो एक्सटेंशन|url=https://github.com/rainers/visuald |website=github.com |access-date=2020-04-30 |date=17 April 2020}}</ref>
* Dlang-Vscode जैसे एक्सटेंशन के साथ [[विजुअल स्टूडियो कोड]] इंटीग्रेशन<ref>{{cite web |url=https://github.com/dlang-vscode/dlang-vscode|title=dlang-vscode|website=[[GitHub]] |access-date=21 December 2016}}</ref> या कोड-डी।<ref>{{cite web |url=https://github.com/Pure-D/कोड-डी|title=कोड-डी|website=[[GitHub]] |access-date=21 December 2016}}</ref>
* [[टेक्स्टमैट]] के लिए एक बंडल उपलब्ध है, और कोड :: ब्लॉक आईडीई में भाषा के लिए आंशिक समर्थन शामिल है। हालाँकि, मानक IDE सुविधाएँ जैसे कि [[कोड पूर्णता]] या [[रिफैक्टरिंग]] अभी तक उपलब्ध नहीं हैं, हालाँकि वे कोड :: ब्लॉक में आंशिक रूप से काम करते हैं (D की C से समानता के कारण)।
* Xcode के लिए [[Xcode 3]] प्लगइन D, D-आधारित परियोजनाओं और विकास को सक्षम बनाता है।<ref>{{cite web |url=http://michelf.com/projects/d-for-xcode/ |title=मिशेल फोर्टिन - एक्सकोड के लिए डी|access-date=11 August 2015}}</ref>
* के[[डेवलप]] (साथ ही इसका पाठ संपादक बैकएंड, केट) स्वत: पूर्णता प्लगइन उपलब्ध है।<ref>{{cite web |url=https://github.com/डेव1डे/स्नो|title=डेव1डे/स्नो|work=GitHub |access-date=11 August 2015}}</ref>
विंडोज के लिए ओपन-सोर्स सॉफ्टवेयर डी आईडीई मौजूद हैं, कुछ डी में लिखे गए हैं, जैसे पोसीडॉन,<ref>{{cite web |url=http://dsource.org/projects/Poseidon|title=Poseidon|access-date=11 August 2015}}</ref> डी-आईडीई,<ref>{{cite web |url=http://d-ide.sourceforge.net/ |title=मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट|access-date=11 August 2015}}</ref> तथा लुभाना डिजाइनर।<ref>{{cite web |url=http://www.dprogramming.com/entice.php |title=एन्टिस डिज़ाइनर - Dprogramming.com - D प्रोग्रामिंग लैंग्वेज|access-date=11 August 2015}}</ref>
D अनुप्रयोगों को किसी भी C/C++ डिबगर का उपयोग करके डीबग किया जा सकता है, जैसे GNU डीबगर या WinDbg, हालांकि विभिन्न D-विशिष्ट भाषा सुविधाओं के लिए समर्थन अत्यंत सीमित है। विंडोज़ पर, डी प्रोग्राम [https://web.archive.org/web/20070224161328/http://ddbg.mainia.de/ Ddbg], या माइक्रोसॉफ्ट डीबगिंग टूल्स ([[विनडीबीजी]] और विजुअल स्टूडियो) का उपयोग करके डीबग किया जा सकता है। [http://dsource.org/projects/cv2pdb cv2pdb] का उपयोग करके डिबग जानकारी को रूपांतरित किया। Linux के लिए [http://zerobugs.codeplex.com/ ZeroBUGS] डीबगर में D भाषा के लिए प्रयोगात्मक समर्थन है। डीडीबीजी का उपयोग विभिन्न आईडीई या कमांड लाइन से किया जा सकता है; ZeroBUGS का अपना [[ग्राफिकल यूज़र इंटरफ़ेस]] (GUI) है।
 
डस्टमाइट डी स्रोत कोड को कम करने के लिए एक शक्तिशाली उपकरण है, जो संकलक या परीक्षण मुद्दों को खोजने में उपयोगी है।<ref>{{cite web | url=https://github.com/CyberShadow/DustMite/wiki |title=डस्टमाइट क्या है?|website=[[GitHub]] |access-date=2020-04-29 |language=en}}</ref>
डब एक लोकप्रिय पैकेज है और डी अनुप्रयोगों और पुस्तकालयों के लिए प्रबंधक का निर्माण करता है, और इसे अक्सर आईडीई समर्थन में एकीकृत किया जाता है।<ref>{{cite web |url=https://github.com/dlang/dub |title=dlang/डब: डी के लिए पैकेज और निर्माण प्रबंधन प्रणाली|website=[[GitHub]] |access-date=2020-04-29 |language=en}}</ref>
 
 
== उदाहरण ==
{{original research|section|date=September 2020}}
 
 
=== उदाहरण 1 ===
यह उदाहरण प्रोग्राम अपने कमांड लाइन तर्कों को प्रिंट करता है। <code>main</code> > फ़ंक्शन डी प्रोग्राम का प्रवेश बिंदु है, और <code>args</code> कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की एक सरणी है। ए <code>string</code> डी में वर्णों की एक सरणी है, जिसका प्रतिनिधित्व किया जाता है <code>immutable(char)[]</code>.


<वाक्यविन्यास हाइलाइट लैंग = डी लाइन हाइलाइट = 3,5>
void main(string[] args) {
आयात std.stdio: writefln;
     foreach (i, arg; args)
 
         writefln("args[%d] = '%s'", i, arg);
शून्य मुख्य (स्ट्रिंग [] तर्क) {
     foreach (i, आर्ग; आर्ग)
         राइटफ्लन (आर्ग्स [% d] = '% s', आई, आर्ग);
}
}
</वाक्यविन्यास हाइलाइट> <code>foreach</code> e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस मामले में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है (<code>i</code>) और मान (<code>arg</code>) सरणी से <code>args</code>. अनुक्रमणिका <code>i</code> और मूल्य <code>arg</code> उनके प्रकार सरणी के प्रकार से अनुमानित हैं <code>args</code>.
</syntaxhighlight><code>foreach</code> e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस स्थितियों में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है (<code>i</code>) और मान (<code>arg</code>) सरणी से <code>args</code>. अनुक्रमणिका <code>i</code> और मूल्य <code>arg</code> उनके <code>args</code>प्रकार सरणी के प्रकार से अनुमानित हैं
===उदाहरण 2===
निम्नलिखित एक छोटे कार्यक्रम में कई डी क्षमताओं और डी डिजाइन ट्रेड-ऑफ दिखाता है। यह नामित टेक्स्ट फ़ाइल की पंक्तियों पर पुनरावृत्त करता है <code>words.txt</code>, जिसमें प्रत्येक पंक्ति पर एक अलग शब्द होता है, और उन सभी शब्दों को प्रिंट करता है जो दूसरे शब्दों के विपर्यय हैं।<syntaxhighlight lang="d" line="1">
import std.stdio, std.algorithm, std.range, std.string;


=== उदाहरण 2 ===
void main() {
निम्नलिखित एक छोटे कार्यक्रम में कई डी क्षमताओं और डी डिजाइन ट्रेड-ऑफ दिखाता है। यह नामित टेक्स्ट फ़ाइल की पंक्तियों पर पुनरावृत्त करता है <code>words.txt</code>, जिसमें प्रत्येक पंक्ति पर एक अलग शब्द होता है, और उन सभी शब्दों को प्रिंट करता है जो दूसरे शब्दों के विपर्यय हैं।
    dstring[] [dstring] signature2words;


<वाक्यविन्यास लैंग = डी लाइन हाइलाइट = 4,6,8,9,10,13,15>
     foreach (dchar[] w; lines(File("words.txt"))) {
आयात std.stdio, std.algorithm, std.range, std.string;
 
शून्य मुख्य () {
    डीस्ट्रिंग [] [डीस्ट्रिंग] हस्ताक्षर 2 शब्द;
 
     foreach (dchar[] w; लाइनें (फ़ाइल (शब्द। txt))) {
         w = w.chomp().toLower();
         w = w.chomp().toLower();
         अपरिवर्तनीय हस्ताक्षर = w.dup.sort().release().idup;
         immutable signature = w.dup.sort().release().idup;
         हस्ताक्षर2शब्द [हस्ताक्षर] ~= w.idup;
         signature2words[signature] ~= w.idup;
     }
     }


     foreach (शब्द; हस्ताक्षर 2 शब्द) {
     foreach (words; signature2words) {
         अगर (शब्दों की लंबाई> 1) {
         if (words.length > 1) {
             राइटलन (शब्द। जॉइन ());
             writeln(words.join(" "));
         }
         }
     }
     }
}</syntaxhighlight>
}
</syntaxhighlight>
# <code>signature2words</code> अंतर्निहित साहचर्य सरणी है जो डीस्ट्रिंग (32-बिट / चार) कीज़ को डीस्ट्रिंग्स की सरणियों से मैप करता है। यह पायथन (प्रोग्रामिंग भाषा) में <code>defaultdict(list)</code> के समान है।
# <code>lines(File())</code> न्यू लाइन के साथ आलसी रूप से लाइनें उत्पन्न करता है। इसके बाद साहचर्य सरणी मानों के लिए उपयोग की जाने वाली स्ट्रिंग प्राप्त करने के लिए <code>idup</code> के साथ कॉपी किया जाना चाहिए (<code>idup</code> सरणियों की संपत्ति सरणी का अपरिवर्तनीय डुप्लिकेट लौटाती है, जो कि आवश्यक है क्योंकि <code>dstring</code> प्रकार वास्तविक में  <code>immutable(dchar)[]</code>) अपरिवर्तनीय है. अंतर्निहित साहचर्य सरणियों को अपरिवर्तनीय कुंजियों की आवश्यकता होती है।
# <code>~=</code> E> ऑपरेटर सहयोगी गतिशील सरणी के मानों में नया स्ट्रिंग जोड़ता है।
# <code>toLower</code>, <code>join</code> तथा <code>chomp</code> स्ट्रिंग फ़ंक्शंस हैं जो डी विधि सिंटैक्स के साथ उपयोग करने की अनुमति देता है। ऐसे कार्यों के नाम अधिकांश पायथन स्ट्रिंग विधियों के समान होते हैं। <code>toLower</code> e> स्ट्रिंग को लोअर केस में कनवर्ट करता है, <code>join("&nbsp;")</code> स्ट्रिंग्स की एक सरणी को एक स्ट्रिंग में विभाजक के रूप में सिंगल स्पेस का उपयोग करके जोड़ता है, और <code>chomp</code> स्ट्रिंग के अंत से एक नई लाइन को हटा देता है यदि कोई उपस्थित है तो स्ट्रिंग के अंत से नई पंक्ति निकालता है। <code>w.dup.sort().release().idup</code> अधिक पठनीय है, लेकिन उदाहरण के लिए <code>release(sort(w.dup)).idup</code> के बराबर है। इस सुविधा को यूएफसीएस (यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स) कहा जाता है, और किसी भी अंतर्निहित या तृतीय पक्ष पैकेज प्रकारों को विधि-जैसी कार्यक्षमता के साथ विस्तारित करने की अनुमति देता है। इस तरह कोड लिखने की शैली को अधिकांश [[पाइपलाइन (यूनिक्स)]] या [[धाराप्रवाह इंटरफ़ेस]] के रूप में संदर्भित किया जाता है (विशेष रूप से जब उपयोग की जाने वाली वस्तुओं को आलसी रूप से गणना की जाती है, उदाहरण के लिए इटरेटर/श्रेणियां)
# <code>sort</code> एक std.algorithm फ़ंक्शन है जो जगह में सरणी को सॉर्ट करता है, शब्दों के लिए अद्वितीय हस्ताक्षर बनाता है जो एक दूसरे के विपर्यय हैं। <code>release()</code> के वापसी मूल्य पर विधि <code>sort()</code> कोड को एकल अभिव्यक्ति के रूप में रखना आसान है।
# दूसरा <code>foreach</code> साहचर्य सरणी के मूल्यों पर पुनरावृत्ति करता है, यह <code>words</code>के प्रकार का अनुमान लगाने में सक्षम है
# <code>signature</code> अपरिवर्तनीय वेरिएबल को समर्पण किया गया है, इसका प्रकार यह अनुमानित है।
# [[यूटीएफ-32|UTF]][[यूटीएफ-32|-32]] <code>dchar[]</code> का उपयोग सामान्यतः [[UTF-8]] <code>char[]</code> के अतिरिक्त किया जाता है अन्यथा <code>sort()</code> इसे सॉर्ट करने से मना कर देता है। केवल UTF-8 का उपयोग करके इस प्रोग्राम को लिखने के अधिक प्रभावी विधियाँ हैं।


# <code>signature2words</code> एक अंतर्निहित साहचर्य सरणी है जो स्ट्रिंग्स की सरणी के लिए स्ट्रिंग (32-बिट / चार) कुंजियों को मैप करती है। यह उसके जैसा है <code>defaultdict(list)</code> पायथन (प्रोग्रामिंग भाषा) में।
== उपयोग करता है ==
# <code>lines(File())</code> न्यूलाइन के साथ आलसी रूप से लाइनें उत्पन्न करता है। इसके बाद इसे कॉपी करना होगा <code>idup</code> सहयोगी सरणी मानों के लिए उपयोग की जाने वाली स्ट्रिंग प्राप्त करने के लिए (the <code>idup</code> सरणियों की संपत्ति सरणी का एक अपरिवर्तनीय डुप्लिकेट लौटाती है, जो कि आवश्यक है <code>dstring</code> प्रकार वास्तव में है <code>immutable(dchar)[]</code>). अंतर्निहित साहचर्य सरणियों को अपरिवर्तनीय कुंजियों की आवश्यकता होती है।
परियोजनाओं के लिए डी प्रोग्रामिंग भाषा का उपयोग करने वाले उल्लेखनीय संगठनों में [[Facebook|फेसबुक]],<ref>{{cite web |title=अंडर द हुड: ताना, एक तेज सी और सी ++ प्रीप्रोसेसर|date=28 March 2014 |url=https://code.facebook.com/posts/476987592402291/under-the-hood-warp-a-fast-c-and-c-preprocessor/ |access-date=4 January 2018}}</ref> ईबे,<ref>{{cite web |title=डी में तेज़ कमांड लाइन उपकरण|date=24 May 2017 |url=https://dlang.org/blog/2017/05/24/faster-command-line-tools-in-d/ |access-date=4 January 2018}}</ref> और [[Netflix|नेटफ्लिक्स]]<ref>{{cite web |title=पेश है वेक्टरफ्लो|date=2 August 2017 |url=https://medium.com/@NetflixTechBlog/introducing-vectorflow-fe10d7f126b8 |access-date=4 January 2018}}</ref> सम्मिलत हैं।
# <code>~=</code> ई> ऑपरेटर सहयोगी गतिशील सरणी के मानों में एक नई स्ट्रिंग जोड़ता है।
# <code>toLower</code>, <code>join</code> तथा <code>chomp</code> स्ट्रिंग फ़ंक्शंस हैं जो डी एक विधि सिंटैक्स के साथ उपयोग करने की अनुमति देता है। ऐसे कार्यों के नाम अक्सर पायथन स्ट्रिंग विधियों के समान होते हैं। <code>toLower</code> e> एक स्ट्रिंग को लोअर केस में कनवर्ट करता है, <code>join("&nbsp;")</code> विभाजक के रूप में एकल स्थान का उपयोग करके स्ट्रिंग्स की एक सरणी को एक स्ट्रिंग में जोड़ता है, और <code>chomp</code> यदि कोई मौजूद है तो स्ट्रिंग के अंत से एक नई पंक्ति निकालता है। <code>w.dup.sort().release().idup</code> e> अधिक पठनीय है, लेकिन इसके बराबर है <code>release(sort(w.dup)).idup</code> उदाहरण के लिए। इस सुविधा को यूएफसीएस (यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स) कहा जाता है, और किसी भी अंतर्निहित या तृतीय पक्ष पैकेज प्रकारों को विधि-जैसी कार्यक्षमता के साथ विस्तारित करने की अनुमति देता है। इस तरह कोड लिखने की शैली को अक्सर [[पाइपलाइन (यूनिक्स)]] के रूप में संदर्भित किया जाता है (विशेष रूप से जब उपयोग की जाने वाली वस्तुओं को आलसी रूप से गणना की जाती है, उदाहरण के लिए इटरेटर/श्रेणियां) या [[धाराप्रवाह इंटरफ़ेस]]
# <code>sort</code> e> एक std.algorithm फ़ंक्शन है जो जगह में सरणी को सॉर्ट करता है, शब्दों के लिए एक अद्वितीय हस्ताक्षर बनाता है जो एक दूसरे के विपर्यय हैं। <code>release()</code> ई> के वापसी मूल्य पर विधि <code>sort()</code> कोड को एकल अभिव्यक्ति के रूप में रखना आसान है।
# दूसरा <code>foreach</code> साहचर्य सरणी के मूल्यों पर पुनरावृत्ति करता है, यह प्रकार का अनुमान लगाने में सक्षम है <code>words</code>.
# <code>signature</code> एक अपरिवर्तनीय चर को सौंपा गया है, इसका प्रकार अनुमानित है।
# [[यूटीएफ-32]] -32 <code>dchar[]</code> सामान्य [[UTF-8]] के बजाय प्रयोग किया जाता है <code>char[]</code> अन्यथा <code>sort()</code> इसे क्रमबद्ध करने से इंकार कर देता है। केवल UTF-8 का उपयोग करके इस प्रोग्राम को लिखने के अधिक प्रभावी तरीके हैं।


== उपयोग करता है ==
डी का AAA (वीडियो गेम उद्योग) के लिए सफलतापूर्वक उपयोग किया गया है,<ref>{{cite web |title=क्वांटम ब्रेक: एएए गेमिंग कुछ डी कोड के साथ|url=http://dconf.org/2016/talks/watson.html |access-date=4 January 2018}}</ref> भाषा इंटरप्रेटेर्स, आभासी मशीन,<ref>{{cite web |title=हिग्स जावास्क्रिप्ट वर्चुअल मशीन|website=[[GitHub]] |url=https://github.com/higgsjs/Higgs |access-date=4 January 2018}}</ref><ref>{{cite web |title=ईसीएमए 262 (जावास्क्रिप्ट) प्रोग्रामिंग भाषा का ए डी कार्यान्वयन|website=[[GitHub]] |url=https://github.com/DigitalMars/DMDScript |access-date=4 January 2018}}</ref> ऑपरेटिंग सिस्टम [[कर्नेल (ऑपरेटिंग सिस्टम)]],<ref>{{cite web |title=प्रोजेक्ट हाइलाइट: द पॉवरनेक्स कर्नेल|date=24 June 2016 |url=https://dlang.org/blog/2016/06/24/project-highlight-the-powernex-kernel/ |access-date=4 January 2018}}</ref> [[ग्राफ़िक्स प्रोसेसिंग युनिट]] प्रोग्रामिंग,<ref>{{cite web |title=DCompute: GPU पर D चल रहा है|date=30 October 2017 |url=https://dlang.org/blog/2017/10/30/d-compute-running-d-on-the-gpu/ |access-date=4 January 2018}}</ref> [[वेब विकास]],<ref>{{cite web |title=vibe.d - एक उच्च-प्रदर्शन अतुल्यकालिक I/O, संगामिति और वेब अनुप्रयोग टूलकिट डी में लिखा गया है|url=http://vibed.org/ |access-date=4 January 2018}}</ref><ref>{{cite web |title=प्रोजेक्ट हाइलाइट: डायमंड एमवीसी फ्रेमवर्क|date=20 November 2017 |url=https://dlang.org/blog/2017/11/20/project-highlight-diamond-mvc-framework/ |access-date=4 January 2018}}</ref> [[संख्यात्मक विश्लेषण]],<ref>{{cite web |title=D के लिए सांख्यिक आयु: Mir GLAS, OpenBLAS और Eigen से तेज़ है|url=http://blog.mir.dlang.io/glas/benchmark/openblas/2016/09/23/glas-gemm-benchmark.html |access-date=4 January 2018}}</ref> ग्राफिकल यूज़र इंटरफ़ेस,<ref>{{cite web |title=टिलिक्स और डी पर: गेराल्ड नन के साथ एक साक्षात्कार|date=11 August 2017 |url=https://dlang.org/blog/2017/08/11/on-tilix-and-d-an-interview-with-gerald-nunn/ |access-date=4 January 2018}}</ref><ref>{{cite web |title=प्रोजेक्ट हाइलाइट: DlangUI|date=7 October 2016 |url=https://dlang.org/blog/2016/10/07/project-highlight-dlangui/ |access-date=4 January 2018}}</ref> [[यात्री सूचना प्रणाली]],<ref>{{cite web |title=प्रोजेक्ट हाइलाइट: फंकवर्क|url=https://dlang.org/blog/2017/07/ |access-date=4 January 2018}}</ref> मशीन लर्निंग,<ref>{{cite web |title=नेटफ्लिक्स/वेक्टरफ्लो|url=https://github.com/नेटफ्लिक्स/वेक्टरफ्लो|website=GitHub.com |publisher=Netflix, Inc. |access-date=2020-05-07 |date=5 May 2020}}</ref> टेक्स्ट प्रोसेसिंग, वेब और एप्लिकेशन सर्वर और रिसर्च के लिए उपयोग किया गया है।
परियोजनाओं के लिए D प्रोग्रामिंग भाषा का उपयोग करने वाले उल्लेखनीय संगठनों में [[Facebook]],<ref>{{cite web |title=अंडर द हुड: ताना, एक तेज सी और सी ++ प्रीप्रोसेसर|date=28 March 2014 |url=https://code.facebook.com/posts/476987592402291/under-the-hood-warp-a-fast-c-and-c-preprocessor/ |access-date=4 January 2018}}</ref> ईबे,<ref>{{cite web |title=डी में तेज़ कमांड लाइन उपकरण|date=24 May 2017 |url=https://dlang.org/blog/2017/05/24/faster-command-line-tools-in-d/ |access-date=4 January 2018}}</ref> और [[Netflix]]।<ref>{{cite web |title=पेश है वेक्टरफ्लो|date=2 August 2017 |url=https://medium.com/@NetflixTechBlog/introducing-vectorflow-fe10d7f126b8 |access-date=4 January 2018}}</ref>
D का AAA (वीडियो गेम उद्योग) के लिए सफलतापूर्वक उपयोग किया गया है,<ref>{{cite web |title=क्वांटम ब्रेक: एएए गेमिंग कुछ डी कोड के साथ|url=http://dconf.org/2016/talks/watson.html |access-date=4 January 2018}}</ref> भाषा दुभाषिए, आभासी मशीन,<ref>{{cite web |title=हिग्स जावास्क्रिप्ट वर्चुअल मशीन|website=[[GitHub]] |url=https://github.com/higgsjs/Higgs |access-date=4 January 2018}}</ref><ref>{{cite web |title=ईसीएमए 262 (जावास्क्रिप्ट) प्रोग्रामिंग भाषा का ए डी कार्यान्वयन|website=[[GitHub]] |url=https://github.com/DigitalMars/DMDScript |access-date=4 January 2018}}</ref> एक ऑपरेटिंग सिस्टम [[कर्नेल (ऑपरेटिंग सिस्टम)]],<ref>{{cite web |title=प्रोजेक्ट हाइलाइट: द पॉवरनेक्स कर्नेल|date=24 June 2016 |url=https://dlang.org/blog/2016/06/24/project-highlight-the-powernex-kernel/ |access-date=4 January 2018}}</ref> [[ग्राफ़िक्स प्रोसेसिंग युनिट]] प्रोग्रामिंग,<ref>{{cite web |title=DCompute: GPU पर D चल रहा है|date=30 October 2017 |url=https://dlang.org/blog/2017/10/30/d-compute-running-d-on-the-gpu/ |access-date=4 January 2018}}</ref> [[वेब विकास]],<ref>{{cite web |title=vibe.d - एक उच्च-प्रदर्शन अतुल्यकालिक I/O, संगामिति और वेब अनुप्रयोग टूलकिट डी में लिखा गया है|url=http://vibed.org/ |access-date=4 January 2018}}</ref><ref>{{cite web |title=प्रोजेक्ट हाइलाइट: डायमंड एमवीसी फ्रेमवर्क|date=20 November 2017 |url=https://dlang.org/blog/2017/11/20/project-highlight-diamond-mvc-framework/ |access-date=4 January 2018}}</ref> [[संख्यात्मक विश्लेषण]],<ref>{{cite web |title=D के लिए सांख्यिक आयु: Mir GLAS, OpenBLAS और Eigen से तेज़ है|url=http://blog.mir.dlang.io/glas/benchmark/openblas/2016/09/23/glas-gemm-benchmark.html |access-date=4 January 2018}}</ref> ग्राफिकल यूज़र इंटरफ़ेस,<ref>{{cite web |title=टिलिक्स और डी पर: गेराल्ड नन के साथ एक साक्षात्कार|date=11 August 2017 |url=https://dlang.org/blog/2017/08/11/on-tilix-and-d-an-interview-with-gerald-nunn/ |access-date=4 January 2018}}</ref><ref>{{cite web |title=प्रोजेक्ट हाइलाइट: DlangUI|date=7 October 2016 |url=https://dlang.org/blog/2016/10/07/project-highlight-dlangui/ |access-date=4 January 2018}}</ref> एक [[यात्री सूचना प्रणाली]],<ref>{{cite web |title=प्रोजेक्ट हाइलाइट: फंकवर्क|url=https://dlang.org/blog/2017/07/ |access-date=4 January 2018}}</ref> मशीन लर्निंग,<ref>{{cite web |title=नेटफ्लिक्स/वेक्टरफ्लो|url=https://github.com/नेटफ्लिक्स/वेक्टरफ्लो|website=GitHub.com |publisher=Netflix, Inc. |access-date=2020-05-07 |date=5 May 2020}}</ref> टेक्स्ट प्रोसेसिंग, वेब और एप्लिकेशन सर्वर और रिसर्च।


== यह भी देखें ==
== यह भी देखें ==
Line 601: Line 500:


==बाहरी संबंध==
==बाहरी संबंध==
{{wikibooks|A Beginner's Guide to D}}
{{wikibooks|D Programming}}
* {{Official website}}
* [http://www.digitalmars.com Digital Mars]
* [http://www.digitalmars.com Digital Mars]
* [http://ddili.org/forum Turkish Forum]
* [http://ddili.org/forum Turkish Forum]
* {{GitHub|dlang}}
* {{GitHub|dlang}}


{{C programming language}}
{{DEFAULTSORT:D (programming language)}}
 
{{DEFAULTSORT:D (programming language)}}[[Category: प्रोग्रामिंग भाषाएं]]
[[Category:सी प्रोग्रामिंग भाषा परिवार]]
[[Category:वर्ग आधारित प्रोग्रामिंग भाषाएं]]
[[Category:क्रॉस-प्लेटफ़ॉर्म सॉफ़्टवेयर]]
[[Category:मुफ्त संकलक और दुभाषिए]]
[[Category:उच्च स्तरीय प्रोग्रामिंग भाषाएं]]
[[Category: बहु-प्रतिमान प्रोग्रामिंग भाषाएं]]
[[Category: वस्तु-उन्मुख प्रोग्रामिंग भाषाएं]]
[[Category:प्रक्रियात्मक प्रोग्रामिंग भाषाएं]]
[[Category: 2001 में बनाई गई प्रोग्रामिंग भाषा]]
[[Category:सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषाएं]]
[[Category: सिस्टम प्रोग्रामिंग भाषाएं]]
[[Category:2001 सॉफ्टवेयर]]
[[Category: बूस्ट लाइसेंस का प्रयोग करने वाला सॉफ्टवेयर]]
[[Category: उदाहरण डी कोड के साथ लेख]]
 


[[Category: Machine Translated Page]]
[[Category:2001 में बनाई गई प्रोग्रामिंग भाषा|D (programming language)]]
[[Category:Created On 01/12/2022]]
[[Category:2001 सॉफ्टवेयर|D (programming language)]]
[[Category:All articles with unsourced statements]]
[[Category:Articles with hatnote templates targeting a nonexistent page|D (programming language)]]
[[Category:Articles with unsourced statements from September 2020]]
[[Category:CS1 English-language sources (en)]]
[[Category:CS1 errors]]
[[Category:Citation Style 1 templates|M]]
[[Category:Collapse templates|D (programming language)]]
[[Category:Created On 01/12/2022|D (programming language)]]
[[Category:Lua-based templates|D (programming language)]]
[[Category:Machine Translated Page|D (programming language)]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|D (programming language)]]
[[Category:Official website missing URL|D (programming language)]]
[[Category:Pages with empty portal template|D (programming language)]]
[[Category:Pages with reference errors]]
[[Category:Pages with script errors|D (programming language)]]
[[Category:Portal templates with redlinked portals|D (programming language)]]
[[Category:Short description with empty Wikidata description|D (programming language)]]
[[Category:Sidebars with styles needing conversion|D (programming language)]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|D (programming language)]]
[[Category:Templates based on the Citation/CS1 Lua module|D (programming language)]]
[[Category:Templates generating COinS|Cite magazine]]
[[Category:Templates generating microformats|D (programming language)]]
[[Category:Templates that add a tracking category|D (programming language)]]
[[Category:Templates that are not mobile friendly|D (programming language)]]
[[Category:Templates that generate short descriptions|D (programming language)]]
[[Category:Templates using TemplateData|D (programming language)]]
[[Category:Wikipedia fully protected templates|Cite magazine]]
[[Category:Wikipedia metatemplates|D (programming language)]]
[[Category:उच्च स्तरीय प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:उदाहरण डी कोड के साथ लेख|D (programming language)]]
[[Category:क्रॉस-प्लेटफ़ॉर्म सॉफ़्टवेयर|D (programming language)]]
[[Category:प्रक्रियात्मक प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:बहु-प्रतिमान प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:बूस्ट लाइसेंस का प्रयोग करने वाला सॉफ्टवेयर|D (programming language)]]
[[Category:मुफ्त संकलक और दुभाषिए|D (programming language)]]
[[Category:वर्ग आधारित प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:वस्तु-उन्मुख प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:सिस्टम प्रोग्रामिंग भाषाएं|D (programming language)]]
[[Category:सी प्रोग्रामिंग भाषा परिवार|D (programming language)]]

Latest revision as of 16:34, 2 November 2023

डी, जिसे डीलैंग के नाम से भी जाना जाता है, डिजिटल मार्स पर वाल्टर ब्राइट द्वारा बनाई गई और 2001 में जारी की गई बहु-प्रतिमान प्रणाली प्रोग्रामिंग भाषा है। आंद्रेई अलेक्जेंड्रेस्कु 2007 में डिजाइन और विकास के प्रयास में सम्मिलित हुए। चूंकि इसकी प्रारंभ -C++, D की री-इंजीनियरिंग के रूप में हुई थी। यह पूरी तरह से एक अलग भाषा है- डी की विशेषताओं को C++ के विचारों पर सुव्यवस्थित और विस्तारित माना जा सकता है,[1] चूँकि डी अन्य उच्च-स्तरीय प्रोग्रामिंग भाषाओं, विशेष रूप से जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा) और एफिल (प्रोग्रामिंग भाषा) से भी प्रेरणा लेता है।

डी आधुनिक गतिशील प्रोग्रामिंग भाषा और कार्यात्मक प्रोग्रामिंग भाषाओं की अभिव्यंजक शक्ति (कंप्यूटर विज्ञान) के साथ संकलित भाषाओं के प्रदर्शन और सुरक्षा को जोड़ती है।[2] प्रोग्रामिंग मुहावरा डी कोड सामान्यतः समतुल्य C++ कोड जितना तेज़ होता है, उतना छोटा भी होता है।[3] समग्र रूप से भाषा मेमोरी सुरक्षित नहीं है।[4] लेकिन इसमें वैकल्पिक विशेषताओं को सम्मिलित किया गया है जो या तो सबसेट या पूरे कार्यक्रम की मेमोरी सुरक्षा की गारंटी के लिए डिज़ाइन की गई हैं।[5]

सामान्य प्रकारों के लिए टाइप अनुमान, स्वचालित मेमोरी प्रबंधन (कंप्यूटर विज्ञान) और सिंटैक्टिक सुगर तेजी से सॉफ़्टवेयर विकास की अनुमति देती है, जबकि अनुबंध द्वारा जांच और डिज़ाइन को रनटाइम पर पहले बग ढूंढते हैं, और समवर्ती (कंप्यूटर विज्ञान) -जागरूक प्रकार प्रणाली संकलन समय पर बग पकड़ती है।[6]


विशेषताएं

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

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

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

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

डी में, टेक्स्ट कैरेक्टर स्ट्रिंग केवल वर्णों की सरणियाँ हैं, और डी में सरणियाँ C ++ के विपरीत सीमा-जांच की जाती हैं।[7] स्ट्रिंग हैंडलिंग के लिए विशिष्ट ऑपरेटर उपस्थित हैं, जो गणितीय सहसंबंधों से दृष्टिगत रूप से भिन्न हैं। डी के पास जटिल और काल्पनिक संख्याओं के लिए प्रथम श्रेणी के प्रकार हैं, और ऐसे प्रकारों से जुड़े भावों का कुशलता से मूल्यांकन करता है।[8]

प्रोग्रामिंग प्रतिमान

डी पांच मुख्य प्रोग्रामिंग प्रतिमानों का समर्थन करता है:

अनिवार्य

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

import std.stdio;

void main() {
    int multiplier = 10;
    int scaled(int x) { return x * multiplier; }

    foreach (i; 0 .. 10) {
        writefln("Hello, world %d! scaled = %d", i, scaled(i));
    }
}

वस्तु-उन्मुख

डी में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एकल वंशानुक्रम पदानुक्रम पर आधारित है, जिसमें क्लास ऑब्जेक्ट से प्राप्त सभी वर्ग हैं। डी एकाधिक वंशानुक्रम का समर्थन नहीं करता है; इसके अतिरिक्त, यह जावा-शैली इंटरफ़ेस (जावा) का उपयोग करता है, जो C++ के शुद्ध सार वर्गों और मिश्रणों से तुलनीय है, जो विरासत पदानुक्रम से सामान्य कार्यक्षमता को अलग करता है। डी इंटरफेस में स्थिर और अंतिम (गैर-आभासी) विधियों को परिभाषित करने की भी अनुमति देता है।

डी में इंटरफेस और इनहेरिटेंस रिटर्न प्रकार के ओवरराइड विधियों के लिए सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) का समर्थन करते हैं।

डी प्रकार अग्रेषण, साथ ही वैकल्पिक कस्टम गतिशील प्रेषण का समर्थन करता है।

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

जेनेरिक कोड या स्वचालित कोड जनरेशन (सामान्यतः संकलन-समय तकनीकों का उपयोग करके) की सुविधा के लिए कक्षाओं (और structs) के कई दृष्टिकोण को संकलन समय (type traits) का उपयोग करके (प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) का एक रूप) और रन टाइम (RTTI / TypeInfo) पर स्वचालित रूप से आत्मनिरीक्षण किया जा सकता है।

कार्यात्मक

डी कार्यात्मक प्रोग्रामिंग सुविधाओं जैसे फ़ंक्शन शाब्दिक, क्लोजर, पुनरावर्ती-अपरिवर्तनीय वस्तुओं और उच्च-क्रम के कार्यों के उपयोग का समर्थन करता है। अस्पष्ट कार्यों के लिए दो सिंटैक्स हैं, जिनमें बहु-विवरण प्रपत्र और "आशुलिपि" एकल-अभिव्यक्ति संकेतन सम्मिलित है:[3]

int function(int) g;
g = (x) { return x * x; }; // longhand
g = (x) => x * x;          // shorthand

फंक्शन लिटरल के लिए दो बिल्ट-इन प्रकार हैं, function, जो केवल स्टैक-आवंटित फ़ंक्शन के लिए एक सूचक है, और delegate, जिसमें आसपास के वातावरण के लिए एक संकेतक भी सम्मिलित है। अज्ञात फ़ंक्शन के साथ प्रकार अनुमान का उपयोग किया जा सकता है, जिस स्थिति में संकलक एकdelegate बनाता है जब तक कि यह सिद्ध न हो जाए कि पर्यावरण सूचक आवश्यक नहीं है। इसी तरह, क्लोजर को लागू करने के लिए, कंपाइलर केवल आवश्यक होने पर स्थानीय वेरिएबल को हीप पर रखता है (उदाहरण के लिए, यदि क्लोजर किसी अन्य फ़ंक्शन द्वारा वापस किया जाता है, और उस फ़ंक्शन के सीमा से बाहर निकलता है)। प्रकार के अनुमान का उपयोग करते समय, संकलकpure तथा nothrow जैसे गुणों को फ़ंक्शन के प्रकार में भी जोड़ देगा, यदि यह सिद्ध कर सकता है कि वह लागू होते हैं। अन्य कार्यात्मक विशेषताएं जैसे कि करीइंग और सामान्य उच्च-क्रम फ़ंक्शन जैसे मानचित्र (उच्च-क्रम फ़ंक्शन), फ़िल्टर (उच्च-क्रम फ़ंक्शन), और फोल्ड (उच्च-क्रम फ़ंक्शन) मानक लाइब्रेरी मॉड्यूल std.functional और std.algorithmके माध्यम से उपलब्ध हैं।

import std.stdio, std.algorithm, std.range;

void main()
{
    int[] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    int[] a2 = [6, 7, 8, 9];

    // must be immutable to allow access from inside a pure function
    immutable pivot = 5;

    int mySum(int a, int b) pure nothrow // pure function
    {
        if (b <= pivot) // ref to enclosing-scope
            return a + b;
        else
            return a;
    }

    // passing a delegate (closure)
    auto result = reduce!mySum(chain(a1, a2));
    writeln("Result: ", result); // Result: 15

    // passing a delegate literal
    result = reduce!((a, b) => (b <= pivot) ? a + b : a)(chain(a1, a2));
    writeln("Result: ", result); // Result: 15
}

वैकल्पिक रूप से, उपरोक्त फ़ंक्शन रचनाओं को अधिक प्राकृतिक बाएँ से दाएँ पढ़ने के लिए यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स (UFCS) का उपयोग करके व्यक्त किया जा सकता है:

  auto result = a1.chain(a2).reduce!mySum();
    writeln("Result: ", result);

    result = a1.chain(a2).reduce!((a, b) => (b <= pivot) ? a + b : a)();
    writeln("Result: ", result);

समानांतरवाद

लाइब्रेरी में समानांतर प्रोग्रामिंग अवधारणाओं को लागू किया जाता है, और संकलक से अतिरिक्त समर्थन की आवश्यकता नहीं होती है। चूंकि डी टाइप सिस्टम और कंपाइलर सुनिश्चित करते हैं कि डेटा शेयरिंग का पता लगाया जा सकता है और पारदर्शी रूप से प्रबंधित किया जा सकता है।

import std.stdio : writeln;
import std.range : iota;
import std.parallelism : parallel;

void main()
{
    foreach (i; iota(11).parallel) {
        // The body of the foreach loop is executed in parallel for each i
        writeln("processing ", i);
    }
}

iota(11).parallel यूएफसीएस का उपयोग करके std.parallelism.parallel(iota(11))के बराबर है। वही मॉड्यूल taskPool का भी सपोर्ट करता है जिसका उपयोग समांतर कार्यों के गतिशील निर्माण के साथ-साथ मानचित्र-फ़िल्टर-कम करने और श्रेणियों (और सरणी) पर फोल्ड स्टाइल ऑपरेशंस के लिए किया जा सकता है, जो कार्यात्मक संचालन के साथ संयुक्त होने पर उपयोगी होता है। std.algorithm.map सरणी के अतिरिक्त एक शिथिल मूल्यांकित सीमा देता है। इस तरह, तत्वों की गणना प्रत्येक कार्यकर्ता कार्य द्वारा स्वचालित रूप से समानांतर में की जाती है।

import std.stdio : writeln;
import std.algorithm : map;
import std.range : iota;
import std.parallelism : taskPool;

/* On Intel i7-3930X and gdc 9.3.0:
 * 5140ms using std.algorithm.reduce
 * 888ms using std.parallelism.taskPool.reduce
 *
 * On AMD Threadripper 2950X, and gdc 9.3.0:
 * 2864ms using std.algorithm.reduce
 * 95ms using std.parallelism.taskPool.reduce
 */
void main()
{
  auto nums = iota(1.0, 1_000_000_000.0);

  auto x = taskPool.reduce!"a + b"(
      0.0, map!"1.0 / (a * a)"(nums)
  );

  writeln("Sum: ", x);

समवर्ती

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

import std.stdio, std.concurrency, std.variant;

void foo()
{
    bool cont = true;

    while (cont)
    {
        receive( // Delegates are used to match the message type.
            (int msg) => writeln("int received: ", msg),
            (Tid sender) { cont = false; sender.send(-1); },
            (Variant v) => writeln("huh?") // Variant matches any type
        );
    }
}

void main()
{
    auto tid = spawn(&foo); // spawn a new thread running foo()

    foreach (i; 0 .. 10)
        tid.send(i);   // send some integers

    tid.send(1.0f);    // send a float
    tid.send("hello"); // send a string
    tid.send(thisTid); // send a struct (Tid)

    receive((int x) => writeln("Main thread received message: ", x));
}

मेटाप्रोग्रामिंग

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

टेम्पलेट्स के लिए C++ कार्यात्मक शैली की तुलना में डी में टेम्पलेट अधिक अनिवार्य शैली में लिखे जा सकते हैं। यह एक नियमित कार्य है जो किसी संख्या के भाज्य की गणना करता है:

ulong factorial(ulong n) {
    if (n < 2)
        return 1;
    else
        return n * factorial(n-1);
}

यहाँ, static if का उपयोग, डी का संकलन-समय सशर्त निर्माण, एक टेम्पलेट बनाने के लिए प्रदर्शित किया जाता है जो उपरोक्त फ़ंक्शन के समान कोड का उपयोग करके समान गणना करता है:

template Factorial(ulong n) {
    static if (n < 2)
        enum Factorial = 1;
    else
        enum Factorial = n * Factorial!(n-1);
}

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

enum fact_7 = Factorial!(7);

यह संकलन-समय फ़ंक्शन निष्पादन (सीटीएफई) का उदाहरण है। साधारण कार्यों का उपयोग निरंतर, संकलन-समय के भावों में किया जा सकता है, लेकिन वह कुछ मानदंडों को पूरा करते हों:

enum fact_9 = factorial(9);

std.string.format E> फ़ंक्शन प्रिंटफ करता हैprintf-जैसे डेटा स्वरूपण (सीटीएफई के माध्यम से संकलन-समय पर भी), और संदेश निर्देश (प्रोग्रामिंग) संकलन समय पर परिणाम प्रदर्शित करता है:

import std.string : format;
pragma(msg, format("7! = %s", fact_7));
pragma(msg, format("9! = %s", fact_9));

स्ट्रिंग मिश्रण, संकलन-समय फ़ंक्शन निष्पादन के साथ संयुक्त, संकलन समय पर स्ट्रिंग ऑपरेशंस का उपयोग करके डी कोड की पीढ़ी के लिए अनुमति देता है। इसका उपयोग डोमेन-विशिष्ट भाषाओं को पार्स करने के लिए किया जा सकता है, जिसे प्रोग्राम के भाग के रूप में संकलित किया जाएगा:

import FooToD; // hypothetical module which contains a function that parses Foo source code
               // and returns equivalent D code
void main() {
    mixin(fooToD(import("example.foo")));
}

मेमोरी प्रबंधन

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

यदि मेमोरी लेआउट पर अधिक नियंत्रण और उत्तम प्रदर्शन की आवश्यकता हो, तो C (प्रोग्रामिंग लैंग्वेज) के मॉलोक को सीधे कॉल करके, या कस्टम एलोकेटर स्कीमों (अर्थात् फ़ॉलबैक के साथ स्टैक पर, RAII स्टाइल एलोकेशन, रेफरेंस काउंटिंग, शेयर्ड रेफरेंस काउंटिंग) को लागू करके ऑपरेटर ओवरलोडिंग new तथा delete का उपयोग करके स्पष्ट मेमोरी प्रबंधन संभव होता है। गार्बेज संग्रह को नियंत्रित किया जा सकता है: प्रोग्रामर मेमोरी रेंज को कलेक्टर द्वारा देखे जाने से जोड़ और बाहर कर सकते हैं, कलेक्टर को अक्षम और सक्षम कर सकते हैं और या तो एक पीढ़ीगत या पूर्ण संग्रह चक्र को बाध्य कर सकते हैं।[9] जब किसी प्रोग्राम में गारबेज संग्रह अपर्याप्त होता है तो मैनुअल विभिन्न अत्यधिक अनुकूलित मेमोरी प्रबंधन योजनाओं को लागू करने के कई उदाहरण देता है।[10]

फ़ंक्शन में, struct के उदाहरण डिफ़ॉल्ट रूप से स्टैक पर आवंटित किए जाते हैं, जबकि डिफ़ॉल्ट रूप से स्टैक पर आवंटित class के उदाहरण (स्टैक पर होने वाले वर्ग उदाहरण के संदर्भ में)। चूँकि इसे कक्षाओं के लिए बदला जा सकता है, उदाहरण के लिए मानक लाइब्रेरी टेम्पलेट std.typecons.scoped का प्रयोग करके, या स्ट्रक्चर्स के लिए new का उपयोग करके और मूल्य-आधारित वेरिएबल के अतिरिक्त पॉइंटर को असाइन करके।[11]

कार्यों में, स्टैक पर स्थिर सरणियाँ (ज्ञात आकार की) आवंटित की जाती हैं। गतिशील सरणियों के लिए, कोई उपयोग कर सकता है core.stdc.stdlib.alloca फ़ंक्शन (के समान alloca सी में), स्टैक पर मेमोरी आवंटित करने के लिए। एक स्लाइस के माध्यम से लौटाए गए पॉइंटर को (टाइप किए गए) डायनेमिक एरे में उपयोग किया जा सकता है (चूंकि रीसाइज़िंग एरे, जिसमें एपेंडिंग सम्मिलित है, से बचा जाना चाहिए; और स्पष्ट कारणों से उन्हें फ़ंक्शन से वापस नहीं किया जाना चाहिए)।[11]

scope कीवर्ड का उपयोग कोड के कुछ भागों को एनोटेट करने के लिए किया जा सकता है, लेकिन यह दर्शाने के लिए वेरिएबल और वर्ग/संरचनाएं भी हो सकती हैं कि उन्हें स्कोप से बाहर निकलने पर तुरंत नष्ट कर दिया जाना चाहिए (विनाशक कहा जाता है)। जो कुछ भी मेमोरी को हटा दिया गया है वह भी कार्यान्वयन और वर्ग-बनाम-संरचना के अंतर पर निर्भर करता है।[12]

std.experimental.allocator विशेष उपयोग की स्थितियों के लिए कस्टम उच्च प्रदर्शन आवंटक बनाने के लिए एक मॉड्यूलर और कंपोज़ेबल एलोकेटर टेम्प्लेट सम्मिलित हैं।[13]


सेफडी

सेफडी[14] डी के सबसेट को दिया गया नाम है जिसे मेमोरी सुरक्षित होने की गारंटी दी जा सकती है (कोई मेमोरी नहीं लिखता है जिसे आवंटित नहीं किया गया है या जिसे पुनर्नवीनीकरण किया गया है)। @safe चिह्नित कार्यों को संकलित समय पर जांचा जाता है जिससे यह सुनिश्चित किया जा सके कि वह ऐसी किसी भी सुविधा का उपयोग नहीं करते हैं जिसके परिणामस्वरूप मेमोरी का करप्शन हो सकता है, जैसे कि सूचक अंकगणितीय और अनियंत्रित कास्ट, और किसी भी अन्य फ़ंक्शन को भी @safe या @trusted के रूप में चिह्नित किया जाना चाहिए। कार्यों को उन स्थितियों के लिए @trusted के रूप में चिह्नित किया जा सकता है जहां संकलक SafeD में अक्षम सुविधा के सुरक्षित उपयोग और मेमोरी करप्शन के संभावित स्थितियों के बीच अंतर नहीं कर सकता है।[15]


स्कोप आजीवन सुरक्षा

प्रारंभ में DIP1000 के बैनरों के नीचे[16] और DIP25[17] (अब भाषा विनिर्देश का भाग है[18]), डी डेटा के जीवनकाल को सम्मिलित करने वाले कुछ गलत निर्माणों के विरुद्ध सुरक्षा प्रदान करता है।

वर्तमान तंत्र मुख्य रूप से फ़ंक्शन मापदंडों और स्टैक मेमोरी क वर्णन करते हैं, चूंकि यह प्रोग्रामिंग भाषा के नेतृत्व की एक घोषित महत्वाकांक्षा है जो डी प्रोग्रामिंग भाषा के अन्दर जीवनकाल का अधिक संपूर्ण उपचार प्रदान करता है।[19] (रस्ट (प्रोग्रामिंग भाषा) के विचारों से प्रभावित)।

कार्य की आजीवन सुरक्षा

@Safe कोड के अन्दर, एक संदर्भ प्रकार से जुड़े असाइनमेंट का जीवनकाल यह सुनिश्चित करने के लिए चेक किया जाता है कि असाइनी का जीवनकाल असाइन किए गए से अधिक लंबा है।

@safe void test()
{
    int tmp = 0; // #1
    int* rad;    // #2
    rad = &tmp;  // If the order of the declarations of #1 and #2 is reversed, this fails.
    {
    	int bad = 45; // Lifetime of "bad" only extends to the scope in which it is defined.
        *rad = bad;   // This is kosher.
        rad = &bad;   // Lifetime of rad longer than bad, hence this is not kosher at all.
    }
}

@Safe कोड के आन्तरिक फ़ंक्शन पैरामीटर लाइफ़टाइम एनोटेशन

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

भाषा मानक निम्नलिखित व्यवहार को निर्धारित करता है:[20]

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

एक व्याख्यात्मक उदाहरण नीचे दिया गया है।

@safe:

int* gp;
void thorin(scope int*);
void gloin(int*);
int* balin(return scope int* p, scope int* q, int* r)
{
     gp = p; // error, p escapes to global gp
     gp = q; // error, q escapes to global gp
     gp = r; // ok

     thorin(p); // ok, p does not escape thorin()
     thorin(q); // ok
     thorin(r); // ok

     gloin(p); // error, gloin() escapes p
     gloin(q); // error, gloin() escapes q
     gloin(r); // ok that gloin() escapes r

     return p; // ok
     return q; // error, cannot return 'scope' q
     return r; // ok
}

अन्य प्रणालियों के साथ सहभागिता

C (प्रोग्रामिंग लैंग्वेज) का अनुप्रयोग बाइनरी इंटरफ़ेस (ABI) समर्थित है, साथ ही C के सभी मूलभूत और व्युत्पन्न प्रकार, उपस्थिता C कोड और लाइब्रेरी तक सीधी पहुँच को सक्षम करते हैं। डी भाषा बंधन कई लोकप्रिय सी लाइब्रेरी के लिए उपलब्ध है। इसके अतिरिक्त, C का मानक लाइब्रेरी (कंप्यूटर विज्ञान) मानक डी का भाग है।

माइक्रोसॉफ्ट विंडोज पर, D घटक वस्तु मॉडल (COM) कोड तक पहुँच सकता है।

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

चूंकि कई अन्य प्रोग्रामिंग भाषाएं अधिकांश एक्सटेंशन लिखने या भाषाओं के इंटरप्रेटर चलाने के लिए सी एपीआई प्रदान करती हैं, डी मानक C बाइंडिंग (पतली डी इंटरफ़ेस फ़ाइल के साथ) का उपयोग करके सीधे इन भाषाओं के साथ इंटरफेस कर सकता है। उदाहरण के लिए, पायथन (प्रोग्रामिंग लैंग्वेज) जैसी भाषाओं के लिए द्वि-दिशात्मक बाइंडिंग हैं,[21] लुआ (प्रोग्रामिंग भाषा)[22][23] और अन्य भाषाओं, अधिकांश संकलन-समय कोड पीढ़ी और संकलन-समय प्रकार प्रतिबिंब विधियों का उपयोग करते हुए।

C ++ कोड के साथ सहभागिता

डी सी ++ कोड के साथ इंटरऑपरेशन के लिए एक अनुमोदित लेकिन यथार्थवादी दृष्टिकोण लेता है।[24] डी कोड के रूप में चिह्नित के लिए extern(C++), निम्नलिखित विशेषताएं निर्दिष्ट हैं:

  • मैंगलिंग सम्मेलनों का नाम लक्ष्य पर C ++ के उन लोगों से मेल खाना चाहिए।
  • फंक्शन कॉल्स के लिए, एबीआई समतुल्य होगा।
  • वीटेबल को सिंगल इनहेरिटेंस (डी भाषा विनिर्देश द्वारा समर्थित एकमात्र स्तर) तक मिलान किया जाएगा।

C++ नेमस्पेस सिंटैक्स के माध्यम से उपयोग किए जाते हैं extern(C++, namespace) जहां नेमस्पेस C ++ नेमस्पेस का नाम है।

सी++ इंटरऑपरेशन का एक उदाहरण

C ++ पक्ष

#include <iostream>
using namespace std;
class Base
{
    public:
        virtual void print3i(int a, int b, int c) = 0;
};

class Derived : public Base
{
    public:
        int field;
        Derived(int field) : field(field) {}

        void print3i(int a, int b, int c)
        {
            cout << "a = " << a << endl;
            cout << "b = " << b << endl;
            cout << "c = " << c << endl;
        }

        int mul(int factor);
};

int Derived::mul(int factor)
{
    return field * factor;
}

Derived *createInstance(int i)
{
    return new Derived(i);
}

void deleteInstance(Derived *&d)
{
    delete d;
    d = 0;
}
डी पक्ष
extern(C++)
{
    abstract class Base
    {
        void print3i(int a, int b, int c);
    }

    class Derived : Base
    {
        int field;
        @disable this();
        override void print3i(int a, int b, int c);
        final int mul(int factor);
    }

    Derived createInstance(int i);
    void deleteInstance(ref Derived d);
}

void main()
{
    import std.stdio;

    auto d1 = createInstance(5);
    writeln(d1.field);
    writeln(d1.mul(4));

    Base b1 = d1;
    b1.print3i(1, 2, 3);

    deleteInstance(d1);
    assert(d1 is null);

    auto d2 = createInstance(42);
    writeln(d2.field);

    deleteInstance(d2);
    assert(d2 is null);
}

बेटर सी

डी प्रोग्रामिंग लैंग्वेज का एक आधिकारिक उपसमुच्चय है जिसे Better C जाना जाता है.[25] यह उपसमुच्चय C के अतिरिक्त अन्य रनटाइम लाइब्रेरी के उपयोग की आवश्यकता वाले डी सुविधाओं तक पहुंच को प्रतिबंधित करता है।

DMD और LDC पर कंपाइलर फ़्लैग -betterC और GDC पर -fno-druntime के माध्यम से सक्षम, Better C केवल एक ही ध्वज (और डी के अतिरिक्त लिंक किए गए कोड) के अनुसार संकलित डी कोड में कॉल कर सकते हैं लेकिन कोड बिना संकलित किए गए हैं Better C विकल्प इसके साथ संकलित कोड में कॉल कर सकता है: चूंकि, C और डी कैसे जोर देते हैं, इस अंतर के कारण कुछ अलग व्यवहार होगा।

बेटर सी में सम्मिलित विशेषताएं
  • संकलन-समय सुविधाओं का अप्रतिबंधित उपयोग (उदाहरण के लिए, डी की गतिशील आवंटन सुविधाओं का उपयोग डी डेटा को पूर्व-आवंटित करने के लिए संकलन समय पर किया जा सकता है)
  • पूर्ण मेटाप्रोग्रामिंग सुविधाएं
  • नेस्टेड फ़ंक्शंस, नेस्टेड स्ट्रक्चर्स, डेलीगेट्स और लैम्ब्डा
  • सदस्य कार्य, निर्माता, डिस्ट्रॉयर, ऑपरेटिंग ओवरलोडिंग, आदि।
  • पूर्ण मॉड्यूल प्रणाली
  • ऐरे स्लाइसिंग, और एरे बाउंड चेकिंग
  • राय
  • scope(exit)* मेमोरी सुरक्षा सुरक्षा
  • C ++ के साथ इंटरफेसिंग
  • COM क्लासेस और C++ क्लासेस
  • मुखर विफलताओं को सी रनटाइम लाइब्रेरी के लिए निर्देशित किया जाता है
  • तार के साथ स्विच करें
  • अंतिम स्विच
  • यूनिटटेस्ट ब्लॉक
  • प्रिंटफ प्रारूप सत्यापन

==== सुविधाओं को बेटर सी से बाहर रखा गया है

  • गार्बेज संग्रहण
  • टाइपइन्फो और मॉड्यूलइन्फो
  • बिल्ट-इन थ्रेडिंग (उदा. core.thread)
  • गतिशील सरणियाँ (चूंकि स्थिर सरणियों के स्लाइस काम करते हैं) और साहचर्य सरणियाँ
  • अपवाद
  • सिंक्रनाइज़ और core.sync
  • स्टेटिक मॉड्यूल कंस्ट्रक्टर या डिस्ट्रक्टर

इतिहास

वाल्टर ब्राइट ने 1999 में एक नई भाषा पर काम करना प्रारंभ किया। डी को पहली बार दिसंबर 2001 में रिलीज़ किया गया था[26] और जनवरी 2007 में संस्करण 1.0 पर पहुंच गया।[27] भाषा का पहला संस्करण (D1) C ++ के समान अनिवार्य, वस्तु उन्मुख और मेटाप्रोग्रामिंग प्रतिमानों पर केंद्रित था,[28]

डी समुदाय के कुछ सदस्यों ने फोबोस, डी के आधिकारिक रनटाइम लाइब्रेरी और मानक लाइब्रेरी से असंतुष्ट होकर टैंगो नामक वैकल्पिक रनटाइम और मानक लाइब्रेरी बनाया। पहली सार्वजनिक टैंगो घोषणा डी 1.0 के जारी होने के कुछ दिनों के अन्दर हुई।[29] टैंगो ने ओओपी और उच्च प्रतिरूपकता को अपनाते हुए एक अलग प्रोग्रामिंग शैली अपनाई। समुदाय के नेतृत्व वाली परियोजना होने के संबंध में, टैंगो योगदान के लिए अधिक खुला था, जिसने इसे आधिकारिक मानक लाइब्रेरी की तुलना में तेजी से प्रगति करने की अनुमति दी। उस समय, अलग-अलग रनटाइम सपोर्ट एपीआई (गार्बेज कलेक्टर, थ्रेडिंग सपोर्ट, आदि) के कारण टैंगो और फोबोस असंगत थे। इससे एक ही परियोजना में दोनों लाइब्रेरी का उपयोग करना असंभव हो गया। दो लाइब्रेरी के अस्तित्व, दोनों व्यापक रूप से उपयोग में हैं, ने कुछ पैकेजों के कारण फोबोस और अन्य द्वारा टैंगो का उपयोग करने के कारण महत्वपूर्ण विवाद को जन्म दिया है।[30] जून 2007 में, D2 का पहला संस्करण जारी किया गया था।[31] D2 के विकास की प्रारंभ ने D1 के स्थिरीकरण का संकेत दिया। भाषा के पहले संस्करण को रखरखाव में रखा गया है, केवल सुधार और कार्यान्वयन बगफिक्स प्राप्त कर रहा है। D2 ने अपनी पहली प्रायोगिक स्थिरांक-शुद्धता के साथ प्रारंभ करते हुए, भाषा में ब्रेकिंग बदलाव प्रस्तुत किए। D2 ने बाद में क्लोजर (कंप्यूटर प्रोग्रामिंग), शुद्ध कार्य, और कार्यात्मक और समवर्ती प्रोग्रामिंग प्रतिमानों के लिए समर्थन जैसी कई अन्य भाषा सुविधाओं को जोड़ा। D2 ने मानक लाइब्रेरी से रनटाइम को अलग करके मानक लाइब्रेरी की समस्याओं का भी समाधान किया। फरवरी 2012 में डी2 टैंगो पोर्ट के पूरा होने की घोषणा की गई थी।[32] 12 जून 2010 को आंद्रेई अलेक्सांद्रेस्कू की पुस्तक द डी प्रोग्रामिंग लैंग्वेज के विमोचन ने डी2 के स्थिरीकरण को चिह्नित किया, जिसे आज सामान्यतः केवल डी के रूप में संदर्भित किया जाता है।

जनवरी 2011 में, डी विकास एक बगट्रैकर / पैच-सबमिशन आधार से गिटहब तक चला गया। इससे संकलक, रनटाइम और मानक लाइब्रेरी में योगदान में उल्लेखनीय वृद्धि हुई है।[33] दिसंबर 2011 में, आंद्रेई अलेक्जेंड्रेस्कू ने घोषणा की कि डी1, भाषा का पहला संस्करण, 31 दिसंबर 2012 को बंद कर दिया जाएगा।[34] अंतिम D1 रिलीज़, D v1.076, 31 दिसंबर 2012 को थी।[35] आधिकारिक डी कंपाइलर के लिए कोड, वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर, मूल रूप से कस्टम सॉफ़्टवेयर लाइसेंस के अनुसार जारी किया गया था, जो उपलब्ध स्रोत के रूप में योग्य है लेकिन ओपन सोर्स परिभाषा के अनुरूप नहीं है।[36] 2014 में, कंपाइलर कंपाइलर फ्रंट-एंड सॉफ्टवेयर लाइसेंसिंग था | बूस्ट सॉफ्टवेयर लाइसेंस के अनुसार ओपन सोर्स सॉफ्टवेयर के रूप में फिर से लाइसेंस दिया गया।[37] इस पुन: लाइसेंस कोड ने बैक-एंड को बाहर कर दिया, जिसे आंशिक रूप से नॉर्टनलाइफ लॉक पर विकसित किया गया था। 7 अप्रैल 2017 को, सिमेंटेक द्वारा बैक-एंड को भी फिर से लाइसेंस देने की अनुमति देने के बाद, पूरे कंपाइलर को बूस्ट लाइसेंस के अनुसार उपलब्ध कराया गया था।[38][39][40][41] 21 जून 2017 को, डी भाषा को GCC में सम्मिलित करने के लिए स्वीकार किया गया।[42]

कार्यान्वयन

कुशल निष्पादन के लिए अधिकांश वर्तमान डी कार्यान्वयन संकलक सीधे मशीन कोड में।

उत्पादन के लिए तैयार संकलक:

  • डीएमडी - वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर आधिकारिक डी कंपाइलर है; बूस्ट सॉफ्टवेयर लाइसेंस के अनुसार ओपन सोर्स[37][38] कंपाइलर्स के बीच अनुकूलता में सुधार करने के लिए डीएमडी फ्रंटेंड को जीडीसी (अब जीसीसी में) और एलडीसी द्वारा साझा किया जाता है। प्रारंभ में दृश्यपटल C++ में लिखा गया था, लेकिन अब इसका अधिकांश भाग डी में ही (सेल्फ-होस्टिंग) लिखा गया है। बैकएंड और मशीन कोड ऑप्टिमाइज़र सिमेंटेक कंपाइलर पर आधारित हैं। सबसे पहले यह केवल 32-बिट x86 का समर्थन करता था, वाल्टर ब्राइट द्वारा 64-बिट amd64 और पावरपीसी के लिए समर्थन जोड़ा गया था। बाद में बैकएंड और लगभग पूरे कंपाइलर को पूर्ण सेल्फ-होस्टिंग के लिए C++ से D में पोर्ट किया गया।
  • जीसीसी - जीएनयू कंपाइलर संग्रह, विलय जीडीसी[43] 29 अक्टूबर 2018 को जीसीसी 9 में।[44] Linux और macOS पर 32-बिट x86 पर GCC 3.3 और GCC 3.4 पर आधारित GCC के साथ GDC का पहला कार्यशील संस्करण[45] 22 मार्च 2004 को जारी किया गया था। तब से जीडीसी ने फ्रंटएंड और भाषा विनिर्देश के लिए अपस्ट्रीम डीएमडी कोड को ट्रैक करते समय अतिरिक्त प्लेटफॉर्म, उत्तम प्रदर्शन और फिक्स्ड बग के लिए समर्थन प्राप्त किया है।[46]
  • LDC - DMD फ्रंट-एंड पर आधारित कंपाइलर जो LLVM को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। पहला रिलीज़-क्वालिटी संस्करण 9 जनवरी 2009 को प्रकाशित हुआ था।[47] यह संस्करण 2.0 का समर्थन करता है।[48]

टॉय और प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर:

  • .NET के लिये डी कंपाइलर - डी प्रोग्रामिंग लैंग्वेज 2.0 कंपाइलर के लिए बैक-एंड।[49][50] यह कोड को मशीन कोड के अतिरिक्त सामान्य मध्यवर्ती भाषा (CIL) बायटेकोड में संकलित करता है। CIL को तब सामान्य भाषा अवसंरचना (CLI) आभासी मशीन के माध्यम से चलाया जा सकता है। परियोजना को वर्षों में अद्यतन नहीं किया गया है और लेखक ने संकेत दिया है कि परियोजना अब सक्रिय नहीं है।
  • एसडीसी - स्टूपिड डी कंपाइलर कस्टम फ्रंट-एंड और एलएलवीएम को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। यह डी में लिखा गया है और डी की संकलन-समय सुविधाओं को सुरुचिपूर्ण ढंग से संभालने के लिए प्रतीक संकल्प को संभालने के लिए शेड्यूलर का उपयोग करता है। यह कंपाइलर वर्तमान में भाषा के सीमित उपसमूह का समर्थन करता है।[51][52]

उपरोक्त कंपाइलर्स और टूलचेन्स का उपयोग करके, x86, amd64, AArch64, PowerPC, MIPS64, DEC Alpha, m68k, Sparc, s390, वेबअसेंबली सहित कई अलग-अलग आर्किटेक्चर को लक्षित करने के लिए डी प्रोग्राम को संकलित करना संभव है। प्राथमिक समर्थित ऑपरेटिंग सिस्टम खिड़कियाँ और लिनक्स हैं, लेकिन विभिन्न कंपाइलर Mac OS X, फ्रीबीएसडी, नेटबीएसडी, एआईऐक्स, सोलारिस (ऑपरेटिंग सिस्टम) और एंड्रॉइड (ऑपरेटिंग सिस्टम) का भी समर्थन करते हैं, या तो होस्ट या लक्ष्य के रूप में, या दोनों . वेब असेंबली लक्ष्य (LDC और LLVM के माध्यम से समर्थित) किसी भी वेब असेंबली वातावरण में काम कर सकता है, जैसे आधुनिक वेब ब्राउज़र (गूगल क्रोम, मोजिल्ला फायरफॉक्स, माइक्रोसॉफ्ट एड्ज, एप्पल सफारी), या समर्पित Wasm वर्चुअल मशीन।

विकास उपकरण

भाषा के लिए वाक्य - विन्यास पर प्रकाश डालना और आंशिक बुद्धिमान कोड पूर्णता का समर्थन करने विम (पाठ संपादक) एकीकृत विकास वातावरण (IDEs) में स्लिकएडिट, एमएसीएस, Vim (टेक्स्ट एडिटर), SciTE, स्मल्ट्रोन, ज़ीउस,[53] और गेनी सम्मिलित हैं।[54]

  • Dexed (पूर्व में सह-संपादित),[55] वस्तु पास्कल में लिखा गया डी केंद्रित ग्राफिकल आईडीई
  • मोनो-डी[56] मुख्य रूप से C Sharp में लिखे गए मोनोडेवलप / ज़ामरीन स्टूडियो पर आधारित सुविधा संपन्न क्रॉस-प्लेटफ़ॉर्म डी केंद्रित ग्राफ़िकल IDE है।[57]
  • डी के लिए एक्लिप्स (सॉफ्टवेयर) प्लग-इन में डीडीटी[58] और डिसेंट (मृत परियोजना) सम्मिलित हैं।[59]
  • विजुअल स्टूडियो इंटीग्रेशन विजुअलडी द्वारा प्रदान किया जाता है।[60][61]
  • Dlang-Vscode जैसे एक्सटेंशन के साथ विजुअल स्टूडियो कोड इंटीग्रेशन[62] या कोड-डी।[63]
  • टेक्स्टमैट के लिए एक बंडल उपलब्ध है, और कोड:: ब्लॉक आईडीई में भाषा के लिए आंशिक समर्थन सम्मिलित है। चूँकि, मानक IDE सुविधाएँ जैसे कि कोड पूर्णता या रिफैक्टरिंग अभी तक उपलब्ध नहीं हैं, चूँकि वह कोड:: ब्लॉक में आंशिक रूप से काम करते हैं (D की C से समानता के कारण)।
  • Xcode के लिए Xcode 3 प्लगइन D, D-आधारित परियोजनाओं और विकास को सक्षम बनाता है।[64]
  • केडेवलप (साथ ही इसका पाठ संपादक बैकएंड, केट) स्वत: पूर्णता प्लगइन उपलब्ध है।[65]

विंडोज के लिए ओपन-सोर्स सॉफ्टवेयर डी आईडीई उपस्थित हैं, कुछ डी में लिखे गए हैं, जैसे पोसीडॉन,[66] डी-आईडीई,[67] तथा अल्लुर डिजाइनर।[68] डी अनुप्रयोगों को किसी भी C/C++ डिबगर का उपयोग करके डीबग किया जा सकता है, जैसे GNU डीबगर या WinDbg, चूंकि विभिन्न D-विशिष्ट भाषा सुविधाओं के लिए समर्थन अत्यंत सीमित है। विंडोज़ पर, डी प्रोग्राम Ddbg, या माइक्रोसॉफ्ट डीबगिंग टूल्स (विनडीबीजी और विजुअल स्टूडियो) का उपयोग करके डीबग किया जा सकता है। cv2pdb का उपयोग करके डिबग जानकारी को रूपांतरित किया। Linux के लिए ZeroBUGS डीबगर में डी भाषा के लिए प्रयोगात्मक समर्थन है। डीडीबीजी का उपयोग विभिन्न आईडीई या कमांड लाइन से किया जा सकता है; ZeroBUGS का अपना ग्राफिकल यूज़र इंटरफ़ेस (GUI) है।

डस्टमाइट डी स्रोत कोड को कम करने के लिए शक्तिशाली उपकरण है, जो संकलक या परीक्षण मुद्दों को खोजने में उपयोगी है।[69] डब लोकप्रिय पैकेज है और डी अनुप्रयोगों और लाइब्रेरी के लिए प्रबंधक का निर्माण करता है, और इसे अधिकांश आईडीई समर्थन में एकीकृत किया जाता है।[70]

उदाहरण

उदाहरण 1

यह उदाहरण प्रोग्राम अपने कमांड लाइन तर्कों को प्रिंट करता है। main E> फ़ंक्शन डी प्रोग्राम का प्रवेश बिंदु है, और args कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की एक सरणी है। ए string डी में वर्णों की सरणी है, जिसका प्रतिनिधित्व immutable(char)[]द्वारा किया जाता है

import std.stdio: writefln;

void main(string[] args) {
    foreach (i, arg; args)
        writefln("args[%d] = '%s'", i, arg);
}

foreach e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस स्थितियों में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है (i) और मान (arg) सरणी से args. अनुक्रमणिका i और मूल्य arg उनके argsप्रकार सरणी के प्रकार से अनुमानित हैं

उदाहरण 2

निम्नलिखित एक छोटे कार्यक्रम में कई डी क्षमताओं और डी डिजाइन ट्रेड-ऑफ दिखाता है। यह नामित टेक्स्ट फ़ाइल की पंक्तियों पर पुनरावृत्त करता है words.txt, जिसमें प्रत्येक पंक्ति पर एक अलग शब्द होता है, और उन सभी शब्दों को प्रिंट करता है जो दूसरे शब्दों के विपर्यय हैं।

import std.stdio, std.algorithm, std.range, std.string;

void main() {
    dstring[] [dstring] signature2words;

    foreach (dchar[] w; lines(File("words.txt"))) {
        w = w.chomp().toLower();
        immutable signature = w.dup.sort().release().idup;
        signature2words[signature] ~= w.idup;
    }

    foreach (words; signature2words) {
        if (words.length > 1) {
            writeln(words.join(" "));
        }
    }
}
  1. signature2words अंतर्निहित साहचर्य सरणी है जो डीस्ट्रिंग (32-बिट / चार) कीज़ को डीस्ट्रिंग्स की सरणियों से मैप करता है। यह पायथन (प्रोग्रामिंग भाषा) में defaultdict(list) के समान है।
  2. lines(File()) न्यू लाइन के साथ आलसी रूप से लाइनें उत्पन्न करता है। इसके बाद साहचर्य सरणी मानों के लिए उपयोग की जाने वाली स्ट्रिंग प्राप्त करने के लिए idup के साथ कॉपी किया जाना चाहिए (idup सरणियों की संपत्ति सरणी का अपरिवर्तनीय डुप्लिकेट लौटाती है, जो कि आवश्यक है क्योंकि dstring प्रकार वास्तविक में immutable(dchar)[]) अपरिवर्तनीय है. अंतर्निहित साहचर्य सरणियों को अपरिवर्तनीय कुंजियों की आवश्यकता होती है।
  3. ~= E> ऑपरेटर सहयोगी गतिशील सरणी के मानों में नया स्ट्रिंग जोड़ता है।
  4. toLower, join तथा chomp स्ट्रिंग फ़ंक्शंस हैं जो डी विधि सिंटैक्स के साथ उपयोग करने की अनुमति देता है। ऐसे कार्यों के नाम अधिकांश पायथन स्ट्रिंग विधियों के समान होते हैं। toLower e> स्ट्रिंग को लोअर केस में कनवर्ट करता है, join(" ") स्ट्रिंग्स की एक सरणी को एक स्ट्रिंग में विभाजक के रूप में सिंगल स्पेस का उपयोग करके जोड़ता है, और chomp स्ट्रिंग के अंत से एक नई लाइन को हटा देता है यदि कोई उपस्थित है तो स्ट्रिंग के अंत से नई पंक्ति निकालता है। w.dup.sort().release().idup अधिक पठनीय है, लेकिन उदाहरण के लिए release(sort(w.dup)).idup के बराबर है। इस सुविधा को यूएफसीएस (यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स) कहा जाता है, और किसी भी अंतर्निहित या तृतीय पक्ष पैकेज प्रकारों को विधि-जैसी कार्यक्षमता के साथ विस्तारित करने की अनुमति देता है। इस तरह कोड लिखने की शैली को अधिकांश पाइपलाइन (यूनिक्स) या धाराप्रवाह इंटरफ़ेस के रूप में संदर्भित किया जाता है (विशेष रूप से जब उपयोग की जाने वाली वस्तुओं को आलसी रूप से गणना की जाती है, उदाहरण के लिए इटरेटर/श्रेणियां)
  5. sort एक std.algorithm फ़ंक्शन है जो जगह में सरणी को सॉर्ट करता है, शब्दों के लिए अद्वितीय हस्ताक्षर बनाता है जो एक दूसरे के विपर्यय हैं। release() के वापसी मूल्य पर विधि sort() कोड को एकल अभिव्यक्ति के रूप में रखना आसान है।
  6. दूसरा foreach साहचर्य सरणी के मूल्यों पर पुनरावृत्ति करता है, यह wordsके प्रकार का अनुमान लगाने में सक्षम है
  7. signature अपरिवर्तनीय वेरिएबल को समर्पण किया गया है, इसका प्रकार यह अनुमानित है।
  8. UTF-32 dchar[] का उपयोग सामान्यतः UTF-8 char[] के अतिरिक्त किया जाता है अन्यथा sort() इसे सॉर्ट करने से मना कर देता है। केवल UTF-8 का उपयोग करके इस प्रोग्राम को लिखने के अधिक प्रभावी विधियाँ हैं।

उपयोग करता है

परियोजनाओं के लिए डी प्रोग्रामिंग भाषा का उपयोग करने वाले उल्लेखनीय संगठनों में फेसबुक,[71] ईबे,[72] और नेटफ्लिक्स[73] सम्मिलत हैं।

डी का AAA (वीडियो गेम उद्योग) के लिए सफलतापूर्वक उपयोग किया गया है,[74] भाषा इंटरप्रेटेर्स, आभासी मशीन,[75][76] ऑपरेटिंग सिस्टम कर्नेल (ऑपरेटिंग सिस्टम),[77] ग्राफ़िक्स प्रोसेसिंग युनिट प्रोग्रामिंग,[78] वेब विकास,[79][80] संख्यात्मक विश्लेषण,[81] ग्राफिकल यूज़र इंटरफ़ेस,[82][83] यात्री सूचना प्रणाली,[84] मशीन लर्निंग,[85] टेक्स्ट प्रोसेसिंग, वेब और एप्लिकेशन सर्वर और रिसर्च के लिए उपयोग किया गया है।

यह भी देखें

संदर्भ

  1. "सी ++ प्रोग्रामर्स के लिए डी में प्रोग्रामिंग - डी प्रोग्रामिंग लैंग्वेज". dlang.org. Retrieved 2022-04-05.
  2. "कार्यात्मक प्रोग्रामिंग - डलंग टूर". tour.dlang.org. Retrieved 2022-04-05.
  3. 3.0 3.1 "भाव". Digital Mars. Retrieved 27 December 2012.
  4. "पर: डी पर अफवाहें: वाल्टर ब्राइट के साथ एक साक्षात्कार". Hacker News. August 30, 2016. "It's close, and we're working to close the remaining gaps."
  5. "मेमोरी-सेफ-डी-स्पेक". D Language Foundation.
  6. Archived at Ghostarchive and the Wayback Machine: Andrei Alexandrescu (2 August 2010). Three Cool Things About D.
  7. "डी स्ट्रिंग्स बनाम सी ++ स्ट्रिंग्स". Digital Mars. 2012.
  8. "डी कॉम्प्लेक्स प्रकार और सी ++ एसटीडी :: जटिल". Digital Mars. 2012. Archived from the original on 13 January 2008. Retrieved 4 November 2021.
  9. "एसटीडी.जीसी". D Programming Language 1.0. Digital Mars. Retrieved 6 July 2010.
  10. "स्मृति प्रबंधन". D Programming Language 2.0. Digital Mars. Retrieved 17 February 2012.
  11. 11.0 11.1 "अपने रास्ते जाओ (भाग एक: ढेर)". The D Blog. 7 July 2017. Retrieved 2020-05-07.
  12. "गुण - डी प्रोग्रामिंग भाषा". dlang.org. Retrieved 2020-05-07.
  13. "std.experimental.allocator - D प्रोग्रामिंग लैंग्वेज". dlang.org. Retrieved 2020-05-07.
  14. Bartosz Milewski. "सेफडी-डी प्रोग्रामिंग लैंग्वेज". Retrieved 17 July 2014.
  15. Steven Schveighoffer (28 September 2016). "डी में @ट्रस्टेड कोड कैसे लिखें". Retrieved 4 January 2018.
  16. "स्कोप्ड पॉइंटर्स". GitHub. 3 April 2020.
  17. "मोहरबंद संदर्भ".
  18. "डी भाषा विशिष्टता: कार्य - रिटर्न स्कोप पैरामीटर्स".
  19. "डी में स्वामित्व और उधार". 15 July 2019.
  20. "डी भाषा विशिष्टता: कार्य - फ़ंक्शन पैरामीटर संग्रहण वर्ग".
  21. "पीवाईडी". GitHub. 7 May 2020. Retrieved 2020-05-07.
  22. Parker, Mike. "डब पर पैकेज परित्यक्त-लुआ". DUB Package Registry. Retrieved 2020-05-07.
  23. Parker, Mike. "डब पर पैकेज बाइंडबीसी-लुआ". DUB Package Registry. Retrieved 2020-05-07.
  24. "C++ के लिए इंटरफेसिंग".
  25. "बेहतर सी".
  26. "डी चेंज लॉग टू नवंबर 7 2005". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
  27. "डी चेंज लॉग". D Programming Language 1.0. Digital Mars. Retrieved 11 January 2012.
  28. "पहचान". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
  29. "एक नए पुस्तकालय की घोषणा". Retrieved 15 February 2012.
  30. "Wiki4D: स्टैंडर्ड लिब". Retrieved 6 July 2010.
  31. "लॉग बदलें - डी प्रोग्रामिंग भाषा". D Programming Language 2.0. D Language Foundation. Retrieved 22 November 2020.
  32. "D2 के लिए टैंगो: पोर्ट किए गए सभी उपयोगकर्ता मॉड्यूल". Retrieved 16 February 2012.
  33. Walter Bright. "पुन: GitHub या dsource?". Retrieved 15 February 2012.
  34. Andrei Alexandrescu. "D1 को 31 दिसंबर, 2012 को बंद कर दिया जाएगा". Retrieved 31 January 2014.
  35. "डी चेंज लॉग". D Programming Language 1.0. Digital Mars. Retrieved 31 January 2014.
  36. "backendlicense.txt". DMD source code. GitHub. Archived from the original on 22 October 2016. Retrieved 5 March 2012.
  37. 37.0 37.1 "डीएमडी फ्रंट एंड अब बूस्ट लाइसेंस पर स्विच हो गया है". Retrieved 9 September 2014.
  38. 38.0 38.1 "dmd बैकएंड को बूस्ट लाइसेंस में बदला गया". 7 April 2017. Retrieved 9 April 2017.
  39. "वाल्टर ब्राइट द्वारा रेडिट टिप्पणी". 5 March 2009. Retrieved 9 September 2014.
  40. D-Compiler-unter-freier-Lizenz on linux-magazin.de (2017, in German)
  41. switch backend to Boost License #6680 from Walter Bright on github.com
  42. D Language accepted for inclusion in GCC
  43. "जीडीसी".
  44. "GCC 9 रिलीज़ सीरीज़ - परिवर्तन, नई सुविधाएँ और सुधार - GNU प्रोजेक्ट - फ़्री सॉफ़्टवेयर फ़ाउंडेशन (FSF)". gcc.gnu.org. Retrieved 2020-05-07.
  45. "जीसीसी के लिए एक और फ्रंट एंड". forum.dlang.org. Retrieved 2020-05-07.
  46. "GCC 9 रिलीज़ सीरीज़ में बदलाव, नई सुविधाएं और समाधान".
  47. "GitHub पर LLVM D कंपाइलर प्रोजेक्ट". GitHub. Retrieved 19 August 2016.
  48. "BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac". Retrieved 11 August 2015.
  49. "कोडप्लेक्स पर डी.नेट परियोजना". Retrieved 3 July 2010.
  50. Jonathan Allen (15 May 2009). "D.NET कम्पाइलर के लिए स्रोत अब उपलब्ध है". InfoQ. Retrieved 6 July 2010.
  51. Archived at Ghostarchive and the Wayback Machine: "DConf 2014: SDC, a D Compiler as a Library by Amaury Sechet". YouTube. Retrieved 8 January 2014.
  52. / एसडीसी "डेडलनिक्स / एसडीसी". GitHub. Retrieved 8 January 2014. {{cite web}}: Check |url= value (help)
  53. "Wiki4D: EditorSupport/ZeusForWindows". Retrieved 11 August 2015.
  54. "Wiki4D: संपादक समर्थन". Retrieved 3 July 2010.
  55. "बेसिल.बी / डेक्स्ड". GitLab (in English). Retrieved 2020-04-29.
  56. "मोनो-डी - डी विकी". wiki.dlang.org. Retrieved 2020-04-30.
  57. "मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट". Retrieved 11 August 2015.
  58. "Google प्रोजेक्ट होस्टिंग". Retrieved 11 August 2015.
  59. "चढ़ाई". Retrieved 11 August 2015.
  60. "विजुअल डी - डी प्रोग्रामिंग लैंग्वेज". Retrieved 11 August 2015.
  61. Schuetze, Rainer (17 April 2020). "रेनर्स/विज़ुअल: विजुअल डी - डी प्रोग्रामिंग लैंग्वेज के लिए विजुअल स्टूडियो एक्सटेंशन". github.com. Retrieved 2020-04-30.
  62. "dlang-vscode". GitHub. Retrieved 21 December 2016.
  63. "कोड-डी". GitHub. Retrieved 21 December 2016.
  64. "मिशेल फोर्टिन - एक्सकोड के लिए डी". Retrieved 11 August 2015.
  65. "डेव1डे/स्नो". GitHub. Retrieved 11 August 2015.
  66. "Poseidon". Retrieved 11 August 2015.
  67. "मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट". Retrieved 11 August 2015.
  68. "एन्टिस डिज़ाइनर - Dprogramming.com - D प्रोग्रामिंग लैंग्वेज". Retrieved 11 August 2015.
  69. "डस्टमाइट क्या है?". GitHub (in English). Retrieved 2020-04-29.
  70. "dlang/डब: डी के लिए पैकेज और निर्माण प्रबंधन प्रणाली". GitHub (in English). Retrieved 2020-04-29.
  71. "अंडर द हुड: ताना, एक तेज सी और सी ++ प्रीप्रोसेसर". 28 March 2014. Retrieved 4 January 2018.
  72. "डी में तेज़ कमांड लाइन उपकरण". 24 May 2017. Retrieved 4 January 2018.
  73. "पेश है वेक्टरफ्लो". 2 August 2017. Retrieved 4 January 2018.
  74. "क्वांटम ब्रेक: एएए गेमिंग कुछ डी कोड के साथ". Retrieved 4 January 2018.
  75. "हिग्स जावास्क्रिप्ट वर्चुअल मशीन". GitHub. Retrieved 4 January 2018.
  76. "ईसीएमए 262 (जावास्क्रिप्ट) प्रोग्रामिंग भाषा का ए डी कार्यान्वयन". GitHub. Retrieved 4 January 2018.
  77. "प्रोजेक्ट हाइलाइट: द पॉवरनेक्स कर्नेल". 24 June 2016. Retrieved 4 January 2018.
  78. "DCompute: GPU पर D चल रहा है". 30 October 2017. Retrieved 4 January 2018.
  79. "vibe.d - एक उच्च-प्रदर्शन अतुल्यकालिक I/O, संगामिति और वेब अनुप्रयोग टूलकिट डी में लिखा गया है". Retrieved 4 January 2018.
  80. "प्रोजेक्ट हाइलाइट: डायमंड एमवीसी फ्रेमवर्क". 20 November 2017. Retrieved 4 January 2018.
  81. "D के लिए सांख्यिक आयु: Mir GLAS, OpenBLAS और Eigen से तेज़ है". Retrieved 4 January 2018.
  82. "टिलिक्स और डी पर: गेराल्ड नन के साथ एक साक्षात्कार". 11 August 2017. Retrieved 4 January 2018.
  83. "प्रोजेक्ट हाइलाइट: DlangUI". 7 October 2016. Retrieved 4 January 2018.
  84. "प्रोजेक्ट हाइलाइट: फंकवर्क". Retrieved 4 January 2018.
  85. "नेटफ्लिक्स/वेक्टरफ्लो". GitHub.com. Netflix, Inc. 5 May 2020. Retrieved 2020-05-07.


अग्रिम पठन

बाहरी संबंध