डी (प्रोग्रामिंग भाषा)

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

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

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

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

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

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

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

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

प्रोग्रामिंग प्रतिमान
डी पांच मुख्य प्रोग्रामिंग प्रतिमानों का समर्थन करता है:
 * समवर्ती प्रोग्रामिंग भाषा (अभिनेता मॉडल)
 * वस्तु के उन्मुख
 * अनिवार्य प्रोग्रामिंग
 * कार्यात्मक प्रोग्रामिंग
 * मेटाप्रोग्रामिंग

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

विशेष उपयोग के मामलों के लिए कस्टम उच्च प्रदर्शन आवंटक बनाने के लिए एक मॉड्यूलर और कंपोज़ेबल एलोकेटर टेम्प्लेट शामिल हैं।

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

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

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

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

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

भाषा मानक निम्नलिखित व्यवहार को निर्धारित करता है: एक व्याख्यात्मक उदाहरण नीचे दिया गया है।

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

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

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

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

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

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

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

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

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

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

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

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

उत्पादन के लिए तैयार संकलक: खिलौना और प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर: उपरोक्त कंपाइलर्स और टूलचेन्स का उपयोग करके, x86, amd64, AArch64, PowerPC, MIPS64, DEC Alpha, m68k, Sparc, s390, वेबअसेंबली सहित कई अलग-अलग आर्किटेक्चर को लक्षित करने के लिए D प्रोग्राम को संकलित करना संभव है। प्राथमिक समर्थित ऑपरेटिंग सिस्टम खिड़कियाँ और लिनक्स हैं, लेकिन विभिन्न कंपाइलर Mac OS X, फ्रीबीएसडी, नेटबीएसडी, एआईऐक्स, सोलारिस (ऑपरेटिंग सिस्टम) और एंड्रॉइड (ऑपरेटिंग सिस्टम) का भी समर्थन करते हैं, या तो होस्ट या लक्ष्य के रूप में, या दोनों. वेब असेंबली लक्ष्य (LDC और LLVM के माध्यम से समर्थित) किसी भी वेब असेंबली वातावरण में काम कर सकता है, जैसे आधुनिक वेब ब्राउज़र (गूगल क्रोम, मोजिल्ला फायरफॉक्स, माइक्रोसॉफ्ट एड्ज, एप्पल सफारी), या समर्पित Wasm वर्चुअल मशीन।
 * डीएमडी - वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर आधिकारिक डी कंपाइलर है; बूस्ट सॉफ्टवेयर लाइसेंस के तहत ओपन सोर्स। कंपाइलर्स के बीच अनुकूलता में सुधार करने के लिए डीएमडी फ्रंटेंड को जीडीसी (अब जीसीसी में) और एलडीसी द्वारा साझा किया जाता है। प्रारंभ में दृश्यपटल C++ में लिखा गया था, लेकिन अब इसका अधिकांश भाग D में ही (सेल्फ-होस्टिंग) लिखा गया है। बैकएंड और मशीन कोड ऑप्टिमाइज़र सिमेंटेक कंपाइलर पर आधारित हैं। सबसे पहले यह केवल 32-बिट x86 का समर्थन करता था, वाल्टर ब्राइट द्वारा 64-बिट amd64 और पावरपीसी के लिए समर्थन जोड़ा गया था। बाद में बैकएंड और लगभग पूरे कंपाइलर को पूर्ण सेल्फ-होस्टिंग के लिए C++ से D में पोर्ट किया गया।
 * जीसीसी - जीएनयू कंपाइलर संग्रह, विलय जीडीसी 29 अक्टूबर 2018 को जीसीसी 9 में। Linux और macOS पर 32-बिट x86 पर GCC 3.3 और GCC 3.4 पर आधारित GCC के साथ GDC का पहला कार्यशील संस्करण 22 मार्च 2004 को जारी किया गया था। तब से जीडीसी ने फ्रंटएंड और भाषा विनिर्देश के लिए अपस्ट्रीम डीएमडी कोड को ट्रैक करते समय अतिरिक्त प्लेटफॉर्म, उत्तम प्रदर्शन और फिक्स्ड बग के लिए समर्थन प्राप्त किया है।
 * LDC - DMD फ्रंट-एंड पर आधारित एक कंपाइलर जो LLVM को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। पहला रिलीज़-क्वालिटी संस्करण 9 जनवरी 2009 को प्रकाशित हुआ था। यह संस्करण 2.0 का समर्थन करता है।
 * डी कंपाइलर के लिए .NET- डी प्रोग्रामिंग लैंग्वेज 2.0 कंपाइलर के लिए बैक-एंड। यह कोड को मशीन कोड के बजाय सामान्य मध्यवर्ती भाषा (CIL) बायटेकोड में संकलित करता है। CIL को तब सामान्य भाषा अवसंरचना (CLI) आभासी मशीन के माध्यम से चलाया जा सकता है। परियोजना को वर्षों में अद्यतन नहीं किया गया है और लेखक ने संकेत दिया है कि परियोजना अब सक्रिय नहीं है।
 * एसडीसी - स्टूपिड डी कंपाइलर एक कस्टम फ्रंट-एंड और एलएलवीएम को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। यह डी में लिखा गया है और डी की संकलन-समय सुविधाओं को सुरुचिपूर्ण ढंग से संभालने के लिए प्रतीक संकल्प को संभालने के लिए शेड्यूलर का उपयोग करता है। यह कंपाइलर वर्तमान में भाषा के सीमित उपसमूह का समर्थन करता है।

विकास उपकरण
भाषा के लिए वाक्य - विन्यास पर प्रकाश डालना और आंशिक बुद्धिमान कोड पूर्णता का समर्थन करने विम (पाठ संपादक) एकीकृत विकास वातावरण (IDEs) में स्लिकएडिट, एमएसीएस, Vim (टेक्स्ट एडिटर), SciTE, स्मल्ट्रोन, ज़ीउस, और गेनी शामिल हैं। विंडोज के लिए ओपन-सोर्स सॉफ्टवेयर डी आईडीई मौजूद हैं, कुछ डी में लिखे गए हैं, जैसे पोसीडॉन, डी-आईडीई, तथा अल्लुर डिजाइनर। D अनुप्रयोगों को किसी भी C/C++ डिबगर का उपयोग करके डीबग किया जा सकता है, जैसे GNU डीबगर या WinDbg, हालांकि विभिन्न D-विशिष्ट भाषा सुविधाओं के लिए समर्थन अत्यंत सीमित है। विंडोज़ पर, डी प्रोग्राम Ddbg, या माइक्रोसॉफ्ट डीबगिंग टूल्स (विनडीबीजी और विजुअल स्टूडियो) का उपयोग करके डीबग किया जा सकता है। cv2pdb का उपयोग करके डिबग जानकारी को रूपांतरित किया। Linux के लिए ZeroBUGS डीबगर में D भाषा के लिए प्रयोगात्मक समर्थन है। डीडीबीजी का उपयोग विभिन्न आईडीई या कमांड लाइन से किया जा सकता है; ZeroBUGS का अपना ग्राफिकल यूज़र इंटरफ़ेस (GUI) है।
 * Dexed (पूर्व में सह-संपादित), वस्तु पास्कल में लिखा गया एक डी केंद्रित ग्राफिकल आईडीई
 * मोनो-डी मुख्य रूप से C Sharp में लिखे गए मोनोडेवलप / ज़ामरीन स्टूडियो पर आधारित एक सुविधा संपन्न क्रॉस-प्लेटफ़ॉर्म D केंद्रित ग्राफ़िकल IDE है।
 * डी के लिए एक्लिप्स (सॉफ्टवेयर) प्लग-इन में डीडीटी और डिसेंट (मृत परियोजना) शामिल हैं।
 * विजुअल स्टूडियो इंटीग्रेशन विजुअलडी द्वारा प्रदान किया जाता है।
 * Dlang-Vscode जैसे एक्सटेंशन के साथ विजुअल स्टूडियो कोड इंटीग्रेशन या कोड-डी।
 * टेक्स्टमैट के लिए एक बंडल उपलब्ध है, और कोड:: ब्लॉक आईडीई में भाषा के लिए आंशिक समर्थन शामिल है। हालाँकि, मानक IDE सुविधाएँ जैसे कि कोड पूर्णता या रिफैक्टरिंग अभी तक उपलब्ध नहीं हैं, हालाँकि वह कोड:: ब्लॉक में आंशिक रूप से काम करते हैं (D की C से समानता के कारण)।
 * Xcode के लिए Xcode 3 प्लगइन D, D-आधारित परियोजनाओं और विकास को सक्षम बनाता है।
 * केडेवलप (साथ ही इसका पाठ संपादक बैकएंड, केट) स्वत: पूर्णता प्लगइन उपलब्ध है।

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

उदाहरण 1
यह उदाहरण प्रोग्राम अपने कमांड लाइन तर्कों को प्रिंट करता है।  ई> फ़ंक्शन डी प्रोग्राम का प्रवेश बिंदु है, और   कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की एक सरणी है। ए   डी में वर्णों की एक सरणी है, जिसका प्रतिनिधित्व     e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस मामले में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है  और मान  सरणी से. अनुक्रमणिका  और मूल्य   उनके  प्रकार सरणी के प्रकार से अनुमानित हैं

उदाहरण 2
निम्नलिखित एक छोटे कार्यक्रम में कई डी क्षमताओं और डी डिजाइन ट्रेड-ऑफ दिखाता है। यह नामित टेक्स्ट फ़ाइल की पंक्तियों पर पुनरावृत्त करता है, जिसमें प्रत्येक पंक्ति पर एक अलग शब्द होता है, और उन सभी शब्दों को प्रिंट करता है जो दूसरे शब्दों के विपर्यय हैं।
 * 1)   एक अंतर्निहित साहचर्य सरणी है जो स्ट्रिंग्स की सरणी के लिए स्ट्रिंग (32-बिट / चार) कुंजियों को मैप करती है। यह उसके जैसा है   पायथन (प्रोग्रामिंग भाषा) में।
 * 2)   न्यूलाइन के साथ आलसी रूप से लाइनें उत्पन्न करता है। इसके बाद इसे कॉपी करना होगा   सहयोगी सरणी मानों के लिए उपयोग की जाने वाली स्ट्रिंग प्राप्त करने के लिए (the   सरणियों की संपत्ति सरणी का एक अपरिवर्तनीय डुप्लिकेट लौटाती है, जो कि आवश्यक है   प्रकार वास्तव में है  ). अंतर्निहित साहचर्य सरणियों को अपरिवर्तनीय कुंजियों की आवश्यकता होती है।
 * 3)   ई> ऑपरेटर सहयोगी गतिशील सरणी के मानों में एक नई स्ट्रिंग जोड़ता है।
 * ,  तथा   स्ट्रिंग फ़ंक्शंस हैं जो डी एक विधि सिंटैक्स के साथ उपयोग करने की अनुमति देता है। ऐसे कार्यों के नाम अक्सर पायथन स्ट्रिंग विधियों के समान होते हैं।   e> एक स्ट्रिंग को लोअर केस में कनवर्ट करता है,   विभाजक के रूप में एकल स्थान का उपयोग करके स्ट्रिंग्स की एक सरणी को एक स्ट्रिंग में जोड़ता है, और   यदि कोई मौजूद है तो स्ट्रिंग के अंत से एक नई पंक्ति निकालता है।   e> अधिक पठनीय है, लेकिन इसके बराबर है   उदाहरण के लिए। इस सुविधा को यूएफसीएस (यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स) कहा जाता है, और किसी भी अंतर्निहित या तृतीय पक्ष पैकेज प्रकारों को विधि-जैसी कार्यक्षमता के साथ विस्तारित करने की अनुमति देता है। इस तरह कोड लिखने की शैली को अक्सर पाइपलाइन (यूनिक्स) के रूप में संदर्भित किया जाता है (विशेष रूप से जब उपयोग की जाने वाली वस्तुओं को आलसी रूप से गणना की जाती है, उदाहरण के लिए इटरेटर/श्रेणियां) या धाराप्रवाह इंटरफ़ेस
 * 1)   e> एक std.algorithm फ़ंक्शन है जो जगह में सरणी को सॉर्ट करता है, शब्दों के लिए एक अद्वितीय हस्ताक्षर बनाता है जो एक दूसरे के विपर्यय हैं।   ई> के वापसी मूल्य पर विधि   कोड को एकल अभिव्यक्ति के रूप में रखना आसान है।
 * 2) दूसरा   साहचर्य सरणी के मूल्यों पर पुनरावृत्ति करता है, यह प्रकार का अनुमान लगाने में सक्षम है.
 * 3)   एक अपरिवर्तनीय वेरिएबल को सौंपा गया है, इसका प्रकार अनुमानित है।
 * 4) यूटीएफ-32 -32   सामान्य UTF-8 के बजाय प्रयोग किया जाता है   अन्यथा   इसे क्रमबद्ध करने से इंकार कर देता है। केवल UTF-8 का उपयोग करके इस प्रोग्राम को लिखने के अधिक प्रभावी तरीके हैं।

उपयोग करता है
परियोजनाओं के लिए D प्रोग्रामिंग भाषा का उपयोग करने वाले उल्लेखनीय संगठनों में Facebook, ईबे, और Netflix।

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

यह भी देखें

 * डीडॉक
 * डी भाषा फाउंडेशन

अग्रिम पठन

 * (distributed under CC-BY-NC-SA license). This book teaches programming to novices, but covers many advanced D topics as well.
 * (distributed under CC-BY-NC-SA license). This book teaches programming to novices, but covers many advanced D topics as well.
 * (distributed under CC-BY-NC-SA license). This book teaches programming to novices, but covers many advanced D topics as well.
 * (distributed under CC-BY-NC-SA license). This book teaches programming to novices, but covers many advanced D topics as well.

बाहरी संबंध

 * Digital Mars
 * Turkish Forum
 * Turkish Forum