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

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

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

अनिवार्य
डी में अनिवार्य प्रोग्रामिंग लगभग सी के समान है। फ़ंक्शंस, डेटा, स्टेटमेंट्स, डिक्लेरेशन और एक्सप्रेशन ठीक वैसे ही काम करते हैं जैसे वे सी में करते हैं, और सी रनटाइम लाइब्रेरी को सीधे एक्सेस किया जा सकता है। दूसरी ओर, अनिवार्य प्रोग्रामिंग के क्षेत्र में डी और सी के बीच कुछ उल्लेखनीय अंतरों में डी का  लूप निर्माण शामिल है, जो एक संग्रह पर लूपिंग की अनुमति देता है, और नेस्टेड फ़ंक्शंस, जो ऐसे फ़ंक्शंस हैं जो दूसरे के अंदर घोषित किए जाते हैं और संलग्न फ़ंक्शन के स्थानीय चर तक पहुंच सकते हैं। 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) के कई दृष्टिकोण को संकलन समय का उपयोग करके (प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) का एक रूप) और रन टाइम (RTTI /  ) पर स्वचालित रूप से आत्मनिरीक्षण किया जा सकता है।

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

int function(int) g;

g = (x) { return x * x; }; // longhand

g = (x) => x * x;         // shorthand

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

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

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.stdio, std.algorithm, std.range;

शून्य मुख्य {   int [] a1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; int [] a2 = [6, 7, 8, 9];

// शुद्ध कार्य के अंदर से पहुंच की अनुमति देने के लिए अपरिवर्तनीय होना चाहिए अपरिवर्तनीय धुरी = 5;

int mySum(int a, int b) प्योर नोट्रो // प्योर फंक्शन {       अगर (बी <= धुरी) // संदर्भ संलग्न करने के दायरे में वापसी ए + बी; वरना वापसी ए; }

// एक प्रतिनिधि पास करना (बंद करना) ऑटो परिणाम = कम करें! mySum (श्रृंखला (a1, a2)); लेख (परिणाम:, परिणाम); // परिणाम: 15

// एक प्रतिनिधि शाब्दिक पास करना परिणाम = कम करें! ((ए, बी) => (बी <= धुरी)? ए + बी: ए) (श्रृंखला (ए 1, ए 2)); लेख (परिणाम:, परिणाम); // परिणाम: 15 } 

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

<वाक्यविन्यास प्रकाश लैंग = डी> स्वतः परिणाम = a1.चेन(a2).reduce!mySum; लेख (परिणाम:, परिणाम);

परिणाम = a1.चेन (ए 2)। कम करें! ((ए, बी) => (बी <= पिवट)? ए + बी: ए) ; लेख (परिणाम:, परिणाम); 

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

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.stdio : writeln; आयात एसटीडी.रेंज: आईओटीए; आयात std.parallelism : समानांतर;

शून्य मुख्य {   foreach (i; iota(11).समानांतर) { // foreach लूप की बॉडी को प्रत्येक i के समानांतर निष्पादित किया जाता है लेख (प्रसंस्करण, मैं); } } 

यूएफसीएस का उपयोग करके के बराबर है।

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

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.stdio: writeln; आयात std.algorithm: मानचित्र; आयात एसटीडी.रेंज: आईओटीए; आयात std.parallelism: टास्कपूल;

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

ऑटो एक्स = टास्कपूल। कम करें! ए + बी (     0.0, नक्शा! 1.0 / (ए * ए) (अंक)  );

लेख (योग:, x); } 

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

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.stdio, std.concurrency, std.variant;

शून्य फू {   बूल कॉन्ट = सच;

जबकि (जारी) {       प्राप्त करें (//प्रतिनिधियों का उपयोग संदेश प्रकार से मिलान करने के लिए किया जाता है।            (इंट संदेश) => राइटलन (इंट प्राप्त:, संदेश),            (समय प्रेषक) { जारी = असत्य; प्रेषक.भेजें (-1); },            (वैरिएंट वी) => राइटलन (हुह?) // वेरिएंट किसी भी प्रकार से मेल खाता है        ); } }

शून्य मुख्य {   ऑटो टिड = स्पॉन (और फू); // एक नया थ्रेड चल रहा है फू

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

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

प्राप्त करें ((int x) => राइटलन (मुख्य धागा प्राप्त संदेश: x)); } 

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

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

<वाक्यविन्यास प्रकाश लैंग = डी> उलॉन्ग कारख़ाने का (उलोंग एन) { अगर (एन <2) वापसी 1; वरना रिटर्न एन * फैक्टोरियल (एन -1); } 

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

<वाक्यविन्यास प्रकाश लैंग = डी> टेम्प्लेट फैक्टोरियल (उलॉन्ग एन) { स्थिर अगर (एन <2) एनम फैक्टोरियल = 1; वरना एनम क्रमगुणित = n * क्रमगुणित! (n-1); } 

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

<वाक्यविन्यास प्रकाश लैंग = डी> एनम तथ्य_7 = क्रमगुणित! (7); 

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

<वाक्यविन्यास प्रकाश लैंग = डी> एनम fact_9 = फैक्टोरियल (9);   ई> फ़ंक्शन प्रिंटफ करता है -जैसे डेटा स्वरूपण (सीटीएफई के माध्यम से संकलन-समय पर भी), और संदेश निर्देश (प्रोग्रामिंग) संकलन समय पर परिणाम प्रदर्शित करता है:

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.string : प्रारूप; प्रागमा (संदेश, प्रारूप (7! =% s, fact_7)); प्राग्मा (संदेश, प्रारूप (9! =% s, fact_9)); 

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

<वाक्यविन्यास प्रकाश लैंग = डी> आयात फूटोड; // काल्पनिक मॉड्यूल जिसमें एक फ़ंक्शन होता है जो फू स्रोत कोड को पार्स करता है // और समकक्ष डी कोड लौटाता है शून्य मुख्य { मिक्सिन (fooToD (आयात (उदाहरण। फू))); } 

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

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

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

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

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

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

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

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

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

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

उदाहरण के लिए: <वाक्यविन्यास प्रकाश लैंग = डी> @ सुरक्षित शून्य परीक्षण {   इंट टीएमपी = 0; // # 1 इंट * रेड; // # 2 रेड = &tmp; // यदि #1 और #2 की घोषणाओं का क्रम उलट दिया जाता है, तो यह विफल हो जाता है। {   इंट खराब = 45; // लाइफटाइम ऑफ बैड केवल उस दायरे तक विस्तारित होता है जिसमें इसे परिभाषित किया गया है। *राद = बुरा; // यह कोषेर है। रेड = और खराब; // रेड का जीवनकाल बुरा से अधिक है, इसलिए यह कोषेर बिल्कुल नहीं है। } } 

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

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


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

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

सी++ इंटरऑपरेशन का एक उदाहरण
सी ++ पक्ष <वाक्यविन्यास प्रकाश लैंग = सी ++> नेमस्पेस एसटीडी का उपयोग करना; वर्ग आधार {   जनता: आभासी शून्य Print3i (int a, int b, int c) = 0; };
 * 1) शामिल

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

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

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

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

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

शून्य डिलीट इंस्टेंस (व्युत्पन्न * और डी) {   डी हटाएं; डी = 0; } 

डी पक्ष <वाक्यविन्यास प्रकाश लैंग = डी> बाहरी (सी ++) {   सार वर्ग आधार {       शून्य प्रिंट 3i (इंट ए, इंट बी, इंट सी); }

वर्ग व्युत्पन्न: आधार {       इंट फील्ड; @ इसे अक्षम करें ; ओवरराइड शून्य प्रिंट 3i (इंट ए, इंट बी, इंट सी); अंतिम इंट मुल (इंट फैक्टर); }

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

शून्य मुख्य {   आयात std.stdio;

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

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

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

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

डिलीट इंस्टेंस (डी 2); जोर दें (डी 2 शून्य है); } 

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

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

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

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

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

डी समुदाय के कुछ सदस्यों ने फोबोस, डी के आधिकारिक रनटाइम पुस्तकालय और मानक पुस्तकालय से असंतुष्ट होकर टैंगो नामक एक वैकल्पिक रनटाइम और मानक पुस्तकालय बनाया। पहली सार्वजनिक टैंगो घोषणा डी 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 में, कंपाइलर कंपाइलर#फ्रंट एंड|फ्रंट-एंड सॉफ्टवेयर लाइसेंसिंग था|बूस्ट सॉफ्टवेयर लाइसेंस के तहत खुला स्रोत सॉफ्टवेयर के रूप में फिर से लाइसेंस दिया गया। इस पुन: लाइसेंस कोड ने बैक-एंड को बाहर कर दिया, जिसे आंशिक रूप से NortonLifeLock पर विकसित किया गया था। 7 अप्रैल 2017 को, सिमेंटेक द्वारा बैक-एंड को भी फिर से लाइसेंस देने की अनुमति देने के बाद, पूरे कंपाइलर को बूस्ट लाइसेंस के तहत उपलब्ध कराया गया था।  21 जून 2017 को, D भाषा को GCC में शामिल करने के लिए स्वीकार किया गया।

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

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

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

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

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

<वाक्यविन्यास हाइलाइट लैंग = डी लाइन हाइलाइट = 3,5> आयात std.stdio: writefln;

शून्य मुख्य (स्ट्रिंग [] तर्क) { foreach (i, आर्ग; आर्ग) राइटफ्लन (आर्ग्स [% d] = '% s', आई, आर्ग); }   e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस मामले में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है  और मान  सरणी से. अनुक्रमणिका  और मूल्य   उनके प्रकार सरणी के प्रकार से अनुमानित हैं.

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

<वाक्यविन्यास लैंग = डी लाइन हाइलाइट = 4,6,8,9,10,13,15> आयात std.stdio, std.algorithm, std.range, std.string;

शून्य मुख्य { डीस्ट्रिंग [] [डीस्ट्रिंग] हस्ताक्षर 2 शब्द;

foreach (dchar[] w; लाइनें (फ़ाइल (शब्द। txt))) { w = w.chomp.toLower; अपरिवर्तनीय हस्ताक्षर = w.dup.sort.release.idup; हस्ताक्षर2शब्द [हस्ताक्षर] ~= w.idup; }

foreach (शब्द; हस्ताक्षर 2 शब्द) { अगर (शब्दों की लंबाई> 1) { राइटलन (शब्द। जॉइन ); }   } }


 * 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