डी (प्रोग्रामिंग भाषा)
| Paradigm | Multi-paradigm: functional, imperative, object-oriented |
|---|---|
| द्वारा डिज़ाइन किया गया | Walter Bright, Andrei Alexandrescu (since 2007) |
| Developer | D Language Foundation |
| पहली प्रस्तुति | 8 December 2001[1] |
| Stable release | Script error: The module returned a nil value. It is supposed to return an export table.
/ Script error: The module returned a nil value. It is supposed to return an export table. |
| टाइपिंग अनुशासन | Inferred, static, strong |
| लाइसेंस | Boost[2][3][4] |
| फ़ाइल नाम एक्सटेंशनएस | .d[5][6] |
| वेबसाइट | dlang |
| Major implementations | |
| DMD (reference implementation), GCC,
GDC, LDC, SDC | |
| Influenced | |
| Genie, MiniD, Qore, Swift,[7] Vala, C++11, C++14, C++17, C++20, Go, C#, and others. | |
| |
D, जिसे डीलैंग के नाम से भी जाना जाता है, डिजिटल मार्स पर वाल्टर ब्राइट द्वारा बनाई गई और 2001 में जारी की गई बहु-प्रतिमान प्रणाली प्रोग्रामिंग भाषा है। आंद्रेई अलेक्जेंड्रेस्कु 2007 में डिजाइन और विकास के प्रयास में शामिल हुए। हालांकि इसकी प्रारंभ -C++, D की री-इंजीनियरिंग के रूप में हुई थी। एक पूरी तरह से अलग भाषा है- D की विशेषताओं को C++ के विचारों पर सुव्यवस्थित और विस्तारित माना जा सकता है,[9] हालाँकि D अन्य उच्च-स्तरीय प्रोग्रामिंग भाषाओं, विशेष रूप से जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा) और एफिल (प्रोग्रामिंग भाषा) से भी प्रेरणा लेता है।
डी आधुनिक गतिशील प्रोग्रामिंग भाषा और कार्यात्मक प्रोग्रामिंग भाषाओं की अभिव्यंजक शक्ति (कंप्यूटर विज्ञान) के साथ संकलित भाषाओं के प्रदर्शन और सुरक्षा को जोड़ती है।[10] प्रोग्रामिंग मुहावरा डी कोड सामान्यतः समतुल्य C++ कोड जितना तेज़ होता है, जबकि छोटा भी होता है।[11] समग्र रूप से भाषा मेमोरी सुरक्षा नहीं है।[12] लेकिन इसमें वैकल्पिक विशेषताओं को शामिल किया गया है जो या तो सबसेट या पूरे कार्यक्रम की मेमोरी सुरक्षा की गारंटी के लिए डिज़ाइन की गई हैं।[13]
सामान्य प्रकारों के लिए टाइप अनुमान, स्वचालित मेमोरी प्रबंधन (कंप्यूटर विज्ञान) और सिंटैक्टिक चीनी तेजी से सॉफ़्टवेयर विकास की अनुमति देती है, जबकि अनुबंध द्वारा जांच और डिज़ाइन को रनटाइम पर पहले बग ढूंढते हैं, और एक समवर्ती (कंप्यूटर विज्ञान) -जागरूक प्रकार प्रणाली संकलन समय पर बग पकड़ती है।[14]
विशेषताएं
डी को पूरी तरह से सैद्धांतिक परिप्रेक्ष्य के बजाय व्यावहारिक C++ उपयोग से सीखे गए पाठों के साथ डिजाइन किया गया था। हालाँकि भाषा कई C (प्रोग्रामिंग भाषा) और C++ अवधारणाओं का उपयोग करती है, यह कुछ लक्ष्यों को प्राप्त करने के लिए कुछ को त्याग देती है, या विभिन्न दृष्टिकोणों (और वाक्य - विन्यास) का उपयोग करती है। इस प्रकार, यह सामान्य रूप से C और C++ स्रोत-कोड के साथ स्रोत संगत नहीं है (न ही इसका लक्ष्य है) (इन भाषाओं से कुछ सरल कोड बेस भाग्य से डी के साथ काम कर सकते हैं, या कुछ में पोर्टिंग की आवश्यकता होती है)। हालांकि, डी को इसके डिजाइन में इस नियम से विवश किया गया है कि कोई भी कोड जो सी और डी दोनों में वैध था, उसी तरह व्यवहार करना चाहिए।
D ने C++ से पहले कुछ विशेषताएं प्राप्त कीं, जैसे कि क्लोजर (कंप्यूटर साइंस), अनाम फ़ंक्शंस, कंपाइल-टाइम फ़ंक्शन निष्पादन, रेंज, बिल्ट-इन कंटेनर इटरेशन कॉन्सेप्ट और टाइप इंट्रेंस। D अनुबंध, इकाई परीक्षण, सच्चे मॉड्यूल (प्रोग्रामिंग), कचरा संग्रह, प्रथम श्रेणी ऑब्जेक्ट सरणी डेटा प्रकार, साहचर्य सरणियों, गतिशील सरणी, सरणी टुकड़ा करना, नेस्टेड कार्यों, आलसी मूल्यांकन, स्कॉप्ड (स्थगित) कोड निष्पादन द्वारा डिजाइन को लागू करके C ++ की कार्यक्षमता को जोड़ता है। एक पुन: इंजीनियर टेम्पलेट सिंटैक्स। C++ एकाधिक वंशानुक्रम को जावा-स्टाइल सिंगल इनहेरिटेंस द्वारा इंटरफेस और मिक्सिन के साथ बदल दिया गया था। दूसरी ओर, डी की घोषणा, कथन और अभिव्यक्ति सिंटैक्स सी ++ के साथ निकटता से मेल खाता है।
D इनलाइन असेंबलर सहित निम्न-स्तरीय प्रोग्रामिंग करने की C++ की क्षमता को निरंतर रखता है, जो Java (प्रोग्रामिंग भाषा) और C Sharp (प्रोग्रामिंग भाषा) जैसी डी और एप्लिकेशन भाषाओं के बीच के अंतर को दर्शाता है। इनलाइन असेंबलर प्रोग्रामर को मानक डी कोड के भीतर मशीन-विशिष्ट असेंबली भाषा में प्रवेश करने देता है, सिस्टम प्रोग्रामर द्वारा केंद्रीय प्रसंस्करण इकाई की निम्न-स्तरीय सुविधाओं तक पहुंचने के लिए उपयोग की जाने वाली एक विधि प्रोग्राम चलाने के लिए आवश्यक होती है जो सीधे अंतर्निहित संगणक धातु सामग्री के साथ इंटरफेस करती है, जैसे ऑपरेटिंग सिस्टम और डिवाइस ड्राइवर, साथ ही उच्च-प्रदर्शन कोड लिखना (अर्थात वेक्टर एक्सटेंशन, SIMD का उपयोग करना) जो कि संकलक द्वारा स्वचालित रूप से उत्पन्न करना कठिन है।
डी फ़ंक्शन ओवरलोडिंग और ऑपरेटर ओवरलोडिंग के साथ-साथ गतिशील सरणी और डिफ़ॉल्ट रूप से सहयोगी सरणी का समर्थन करता है। प्रतीकों (कार्यों, चर, वर्गों) को किसी भी क्रम में घोषित किया जा सकता है - आगे की घोषणाओं की आवश्यकता नहीं है। इसी प्रकार आयात लगभग किसी भी क्रम में किया जा सकता है, और यहां तक कि दायरा भी किया जा सकता है (यानी किसी फ़ंक्शन, कक्षा अध्याय परीक्षा के अंदर कुछ मॉड्यूल या इसका हिस्सा आयात करें)। डी में प्रलेखन टिप्पणियों के लिए अंतर्निहित समर्थन है, जिससे स्वचालित प्रलेखन जनरेटर की अनुमति मिलती है।
D में, टेक्स्ट कैरेक्टर स्ट्रिंग केवल वर्णों की सरणियाँ हैं, और D में सरणियाँ C ++ के विपरीत सीमा-जांच की जाती हैं।[15] स्ट्रिंग हैंडलिंग के लिए विशिष्ट ऑपरेटर मौजूद हैं, जो गणितीय सहसंबंधों से दृष्टिगत रूप से भिन्न हैं। डी के पास जटिल और काल्पनिक संख्याओं के लिए प्रथम श्रेणी के प्रकार हैं, और ऐसे प्रकारों से जुड़े भावों का कुशलता से मूल्यांकन करता है।[16]
प्रोग्रामिंग प्रतिमान
डी पांच मुख्य प्रोग्रामिंग प्रतिमानों का समर्थन करता है:
- समवर्ती प्रोग्रामिंग भाषा (अभिनेता मॉडल)
- वस्तु के उन्मुख
- अनिवार्य प्रोग्रामिंग
- कार्यात्मक प्रोग्रामिंग
- मेटाप्रोग्रामिंग
अनिवार्य
डी में अनिवार्य प्रोग्रामिंग लगभग सी के समान है। फ़ंक्शंस, डेटा, स्टेटमेंट्स, डिक्लेरेशन और एक्सप्रेशन ठीक वैसे ही काम करते हैं जैसे वे सी में करते हैं, और सी रनटाइम लाइब्रेरी को सीधे एक्सेस किया जा सकता है। दूसरी ओर, अनिवार्य प्रोग्रामिंग के क्षेत्र में डी और सी के बीच कुछ उल्लेखनीय अंतरों में डी का 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) पर स्वचालित रूप से आत्मनिरीक्षण किया जा सकता है।
कार्यात्मक
डी कार्यात्मक प्रोग्रामिंग सुविधाओं जैसे फ़ंक्शन शाब्दिक, क्लोजर, पुनरावर्ती-अपरिवर्तनीय वस्तुओं और उच्च-क्रम के कार्यों के उपयोग का समर्थन करता है। अनाम कार्यों के लिए दो सिंटैक्स हैं, जिनमें एक बहु-विवरण प्रपत्र और एक "आशुलिपि" एकल-अभिव्यक्ति संकेतन शामिल है:[11]
int function(int) g;
g = (x) { return x * x; }; // longhand
g = (x) => x * x; // shorthand
फंक्शन लिटरल के लिए दो बिल्ट-इन प्रकार हैं, function, जो केवल स्टैक-आवंटित फ़ंक्शन के लिए एक सूचक है, और delegate, जिसमें आसपास के वातावरण के लिए एक संकेतक भी शामिल है। अज्ञात फ़ंक्शन के साथ प्रकार अनुमान का उपयोग किया जा सकता है, जिस स्थिति में संकलक एकdelegate बनाता है जब तक कि यह साबित न हो जाए कि एक पर्यावरण सूचक आवश्यक नहीं है। इसी तरह, एक क्लोजर को लागू करने के लिए, कंपाइलर केवल आवश्यक होने पर स्थानीय चर को हीप पर रखता है (उदाहरण के लिए, यदि एक क्लोजर किसी अन्य फ़ंक्शन द्वारा वापस किया जाता है, और उस फ़ंक्शन के दायरे से बाहर निकलता है)। प्रकार के अनुमान का उपयोग करते समय, संकलकpure तथा nothrow जैसे गुणों को फ़ंक्शन के प्रकार में भी जोड़ देगा, अगर यह सिद्ध कर सकता है कि वे लागू होते हैं।
अन्य कार्यात्मक विशेषताएं जैसे कि करीइंग और सामान्य उच्च-क्रम फ़ंक्शन जैसे मानचित्र (उच्च-क्रम फ़ंक्शन), फ़िल्टर (उच्च-क्रम फ़ंक्शन), और फोल्ड (उच्च-क्रम फ़ंक्शन) मानक लाइब्रेरी मॉड्यूल std.functional और std.algorithmके माध्यम से उपलब्ध हैं।
<syntax light lang=D>
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];
// शुद्ध कार्य के अंदर से पहुंच की अनुमति देने के लिए अपरिवर्तनीय होना चाहिए अपरिवर्तनीय धुरी = 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 के समानांतर निष्पादित किया जाता है
लेख (प्रसंस्करण, मैं);
}
} </वाक्यविन्यास हाइलाइट>
iota(11).parallel यूएफसीएस का उपयोग करके std.parallelism.parallel(iota(11))के बराबर है।
वही मॉड्यूल taskPool का भी सपोर्ट करता है जिसका उपयोग समांतर कार्यों के गतिशील निर्माण के साथ-साथ मानचित्र-फ़िल्टर-कम करने और श्रेणियों (और सरणी) पर फोल्ड स्टाइल ऑपरेशंस के लिए किया जा सकता है, जो कार्यात्मक संचालन के साथ संयुक्त होने पर उपयोगी होता है। std.algorithm.map एक सरणी के बजाय एक आलसी मूल्यांकित सीमा देता है। इस तरह, तत्वों की गणना प्रत्येक कार्यकर्ता कार्य द्वारा स्वचालित रूप से समानांतर में की जाती है।
<वाक्यविन्यास प्रकाश लैंग = डी> आयात 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);
} </वाक्यविन्यास हाइलाइट>
समवर्ती
संगामिति लाइब्रेरी में पूरी तरह से लागू है, और इसे संकलक से समर्थन की आवश्यकता नहीं है। समवर्ती कोड लिखने के वैकल्पिक कार्यान्वयन और पद्धतियां संभव हैं। डी टाइपिंग सिस्टम का उपयोग मेमोरी सुरक्षा सुनिश्चित करने में सहायता करता है।
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++ कार्यात्मक शैली की तुलना में D में टेम्पलेट अधिक अनिवार्य शैली में लिखे जा सकते हैं। यह एक नियमित कार्य है जो किसी संख्या के भाज्य की गणना करता है:
<वाक्यविन्यास प्रकाश लैंग = डी> उलॉन्ग कारख़ाने का (उलोंग एन) {
अगर (एन <2)
वापसी 1;
वरना
रिटर्न एन * फैक्टोरियल (एन -1);
} </वाक्यविन्यास हाइलाइट>
यहाँ, static if का उपयोग, डी का संकलन-समय सशर्त निर्माण, एक टेम्पलेट बनाने के लिए प्रदर्शित किया जाता है जो उपरोक्त फ़ंक्शन के समान कोड का उपयोग करके समान गणना करता है:
<वाक्यविन्यास प्रकाश लैंग = डी> टेम्प्लेट फैक्टोरियल (उलॉन्ग एन) {
स्थिर अगर (एन <2)
एनम फैक्टोरियल = 1;
वरना
एनम क्रमगुणित = n * क्रमगुणित! (n-1);
} </वाक्यविन्यास हाइलाइट>
निम्नलिखित दो उदाहरणों में, ऊपर परिभाषित टेम्पलेट और फ़ंक्शन का उपयोग फैक्टोरियल की गणना करने के लिए किया जाता है। स्थिरांक के प्रकारों को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि असाइनमेंट के दाईं ओर से कंपाइलर प्रकार का अनुमान है:
<वाक्यविन्यास प्रकाश लैंग = डी> एनम तथ्य_7 = क्रमगुणित! (7); </वाक्यविन्यास हाइलाइट>
यह संकलन-समय फ़ंक्शन निष्पादन (सीटीएफई) का एक उदाहरण है। साधारण कार्यों का उपयोग निरंतर, संकलन-समय के भावों में किया जा सकता है, लेकिन वे कुछ मानदंडों को पूरा करते हों:
<वाक्यविन्यास प्रकाश लैंग = डी>
एनम fact_9 = फैक्टोरियल (9);
</वाक्यविन्यास हाइलाइट> std.string.format ई> फ़ंक्शन प्रिंटफ करता हैprintf-जैसे डेटा स्वरूपण (सीटीएफई के माध्यम से संकलन-समय पर भी), और संदेश निर्देश (प्रोग्रामिंग) संकलन समय पर परिणाम प्रदर्शित करता है:
<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.string : प्रारूप; प्रागमा (संदेश, प्रारूप (7! =% s, fact_7)); प्राग्मा (संदेश, प्रारूप (9! =% s, fact_9)); </वाक्यविन्यास हाइलाइट>
स्ट्रिंग मिश्रण, संकलन-समय फ़ंक्शन निष्पादन के साथ संयुक्त, संकलन समय पर स्ट्रिंग ऑपरेशंस का उपयोग करके डी कोड की पीढ़ी के लिए अनुमति देता है। इसका उपयोग डोमेन-विशिष्ट भाषाओं को पार्स करने के लिए किया जा सकता है, जिसे प्रोग्राम के भाग के रूप में संकलित किया जाएगा:
<वाक्यविन्यास प्रकाश लैंग = डी> आयात फूटोड; // काल्पनिक मॉड्यूल जिसमें एक फ़ंक्शन होता है जो फू स्रोत कोड को पार्स करता है
// और समकक्ष डी कोड लौटाता है
शून्य मुख्य () {
मिक्सिन (fooToD (आयात (उदाहरण। फू)));
} </वाक्यविन्यास हाइलाइट>
मेमोरी प्रबंधन
मेमोरी को सामान्यतः कचरा संग्रह (कंप्यूटर विज्ञान) के साथ प्रबंधित किया जाता है, लेकिन विशिष्ट वस्तुओं को दायरे से बाहर जाने पर तुरंत अंतिम रूप दिया जा सकता है। डी उपयोग में लिखे गए अधिकांश कार्यक्रम और लाइब्रेरी यही हैं।
यदि मेमोरी लेआउट पर अधिक नियंत्रण और बेहतर प्रदर्शन की आवश्यकता होती है, तो ऑपरेटर ओवरलोडिंग का उपयोग करके स्पष्ट मेमोरी प्रबंधन संभव है new तथा delete, C (प्रोग्रामिंग लैंग्वेज) के मॉलोक को सीधे कॉल करके, या कस्टम एलोकेटर स्कीमों को लागू करके (यानी फ़ॉलबैक के साथ स्टैक पर, RAII स्टाइल एलोकेशन, रेफरेंस काउंटिंग, शेयर्ड रेफरेंस काउंटिंग)। कचरा संग्रह को नियंत्रित किया जा सकता है: प्रोग्रामर मेमोरी रेंज को कलेक्टर द्वारा देखे जाने से जोड़ और बाहर कर सकते हैं, कलेक्टर को अक्षम और सक्षम कर सकते हैं और या तो एक पीढ़ीगत या पूर्ण संग्रह चक्र को बाध्य कर सकते हैं।[17] जब किसी प्रोग्राम में गारबेज संग्रह अपर्याप्त होता है तो मैनुअल विभिन्न अत्यधिक अनुकूलित मेमोरी प्रबंधन योजनाओं को लागू करने के कई उदाहरण देता है।[18]
फ़ंक्शन में, struct के उदाहरण डिफ़ॉल्ट रूप से स्टैक पर आवंटित किए जाते हैं, जबकि डिफ़ॉल्ट रूप से स्टैक पर आवंटित class के उदाहरण (स्टैक पर होने वाले वर्ग उदाहरण के संदर्भ में)। हालाँकि इसे कक्षाओं के लिए बदला जा सकता है, उदाहरण के लिए मानक लाइब्रेरी टेम्पलेट std.typecons.scoped का प्रयोग करके, या स्ट्रक्चर्स के लिए new का उपयोग करके और मूल्य-आधारित चर के बजाय पॉइंटर को असाइन करके।[19]
कार्यों में, स्टैक पर स्थिर सरणियाँ (ज्ञात आकार की) आवंटित की जाती हैं। गतिशील सरणियों के लिए, कोई उपयोग कर सकता है core.stdc.stdlib.alloca फ़ंक्शन (के समान alloca सी में), स्टैक पर मेमोरी आवंटित करने के लिए। एक स्लाइस के माध्यम से लौटाए गए पॉइंटर को एक (टाइप किए गए) डायनेमिक एरे में इस्तेमाल किया जा सकता है (हालांकि रीसाइज़िंग एरे, जिसमें एपेंडिंग शामिल है, से बचा जाना चाहिए; और स्पष्ट कारणों से उन्हें फ़ंक्शन से वापस नहीं किया जाना चाहिए)।[19]
एक scope कीवर्ड का उपयोग कोड के कुछ हिस्सों को एनोटेट करने के लिए किया जा सकता है, लेकिन यह दर्शाने के लिए चर और वर्ग/संरचनाएं भी हो सकती हैं कि उन्हें स्कोप से बाहर निकलने पर तुरंत नष्ट कर दिया जाना चाहिए (विनाशक कहा जाता है)। जो कुछ भी स्मृति को हटा दिया गया है वह भी कार्यान्वयन और वर्ग-बनाम-संरचना के अंतर पर निर्भर करता है।[20]
std.experimental.allocator विशेष उपयोग के मामलों के लिए कस्टम उच्च प्रदर्शन आवंटक बनाने के लिए एक मॉड्यूलर और कंपोज़ेबल एलोकेटर टेम्प्लेट शामिल हैं।[21]
सेफडी
सेफडी[22] डी के सबसेट को दिया गया नाम है जिसे मेमोरी सुरक्षित होने की गारंटी दी जा सकती है (कोई मेमोरी नहीं लिखता है जिसे आवंटित नहीं किया गया है या जिसे पुनर्नवीनीकरण किया गया है)। @safe चिह्नित कार्यों को संकलित समय पर जांचा जाता है ताकि यह सुनिश्चित किया जा सके कि वे ऐसी किसी भी सुविधा का उपयोग नहीं करते हैं जिसके परिणामस्वरूप मेमोरी का भ्रष्टाचार हो सकता है, जैसे कि सूचक अंकगणितीय और अनियंत्रित कास्ट, और किसी भी अन्य फ़ंक्शन को भी @safe या @trusted के रूप में चिह्नित किया जाना चाहिए। कार्यों को उन मामलों के लिए @trusted के रूप में चिह्नित किया जा सकता है जहां संकलक SafeD में अक्षम सुविधा के सुरक्षित उपयोग और स्मृति भ्रष्टाचार के संभावित मामले के बीच अंतर नहीं कर सकता है।[23]
स्कोप आजीवन सुरक्षा
प्रारंभ में DIP1000 के बैनर तले[24] और DIP25[25] (अब भाषा विनिर्देश का हिस्सा है[26]), डी डेटा के जीवनकाल को शामिल करने वाले कुछ गलत निर्माणों के विरुद्ध सुरक्षा प्रदान करता है।
मौजूदा तंत्र मुख्य रूप से फ़ंक्शन मापदंडों और स्टैक मेमोरी से निपटते हैं, हालांकि यह प्रोग्रामिंग भाषा के नेतृत्व की एक घोषित महत्वाकांक्षा है जो डी प्रोग्रामिंग भाषा के भीतर जीवनकाल का अधिक संपूर्ण उपचार प्रदान करता है।[27] (रस्ट (प्रोग्रामिंग भाषा) के विचारों से प्रभावित)।
कार्य की आजीवन सुरक्षा
@Safe कोड के भीतर, एक संदर्भ प्रकार से जुड़े असाइनमेंट का जीवनकाल यह सुनिश्चित करने के लिए चेक किया जाता है कि असाइनी का जीवनकाल असाइन किए गए से अधिक लंबा है।
उदाहरण के लिए: <वाक्यविन्यास प्रकाश लैंग = डी> @ सुरक्षित शून्य परीक्षण () {
इंट टीएमपी = 0; // # 1
इंट * रेड; // # 2
रेड = &tmp; // यदि #1 और #2 की घोषणाओं का क्रम उलट दिया जाता है, तो यह विफल हो जाता है।
{
इंट खराब = 45; // लाइफटाइम ऑफ बैड केवल उस दायरे तक विस्तारित होता है जिसमें इसे परिभाषित किया गया है।
*राद = बुरा; // यह कोषेर है।
रेड = और खराब; // रेड का जीवनकाल बुरा से अधिक है, इसलिए यह कोषेर बिल्कुल नहीं है।
}
} </वाक्यविन्यास हाइलाइट>
==== फ़ंक्शन पैरामीटर लाइफ़टाइम एनोटेशन @safe कोड ==== के भीतर जब फ़ंक्शन पैरामीटर पर लागू किया जाता है जो या तो सूचक प्रकार या संदर्भ के होते हैं, तो कीवर्ड रिटर्न और स्कोप आजीवन और उस पैरामीटर के उपयोग को बाधित करते हैं।
भाषा मानक निम्नलिखित व्यवहार को निर्धारित करता है:[28]
| भंडारण वर्ग | भंडारण वर्ग के साथ एक पैरामीटर का व्यवहार (और बाधाएं)। |
|---|---|
| विस्तार | पैरामीटर में संदर्भों से बचा नहीं जा सकता। बिना संदर्भ वाले पैरामीटर के लिए अनदेखा किया गया |
| वापसी | पैरामीटर वापस किया जा सकता है या पहले पैरामीटर में कॉपी किया जा सकता है, लेकिन अन्यथा फ़ंक्शन से नहीं निकलता है। ऐसी प्रतियों के लिए आवश्यक है कि वे उस तर्क (ओं) से अधिक न हों जिनसे वे प्राप्त किए गए थे। बिना संदर्भ वाले पैरामीटर के लिए अनदेखा किया गया |
एक व्याख्यात्मक उदाहरण नीचे दिया गया है।
@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 कोड और पुस्तकालयों तक सीधी पहुँच को सक्षम करते हैं। डी भाषा बंधन कई लोकप्रिय सी लाइब्रेरी के लिए उपलब्ध है। इसके अतिरिक्त, सी का मानक पुस्तकालय (कंप्यूटर विज्ञान) मानक डी का हिस्सा है।
Microsoft Windows पर, D घटक वस्तु मॉडल (COM) कोड तक पहुँच सकता है।
जब तक स्मृति प्रबंधन का ठीक से ध्यान रखा जाता है, तब तक कई अन्य भाषाओं को एक ही बाइनरी में डी के साथ मिलाया जा सकता है। उदाहरण के लिए, जीडीसी कंपाइलर सी, सी ++, और अन्य समर्थित भाषा कोडों को आपस में जोड़ने की अनुमति देता है। डी कोड (फ़ंक्शंस) को सी, सी ++, पास्कल एबीआई का उपयोग करने के रूप में भी चिह्नित किया जा सकता है, और इस प्रकार कॉलबैक (कंप्यूटर प्रोग्रामिंग) के रूप में इन भाषाओं में लिखे गए पुस्तकालयों को पास किया जा सकता है। इसी तरह इन भाषाओं में लिखे कोड के बीच डेटा को दोनों तरह से इंटरचेंज किया जा सकता है। यह आमतौर पर आदिम प्रकारों, पॉइंटर्स, सरणियों के कुछ रूपों, यूनियन प्रकार, स्ट्रक्चर्स और केवल कुछ प्रकार के फ़ंक्शन पॉइंटर्स के उपयोग को प्रतिबंधित करता है।
चूंकि कई अन्य प्रोग्रामिंग भाषाएं अक्सर एक्सटेंशन लिखने या भाषाओं के दुभाषिया चलाने के लिए सी एपीआई प्रदान करती हैं, डी मानक सी बाइंडिंग (पतली डी इंटरफ़ेस फ़ाइल के साथ) का उपयोग करके सीधे इन भाषाओं के साथ इंटरफेस कर सकता है। उदाहरण के लिए, पायथन (प्रोग्रामिंग लैंग्वेज) जैसी भाषाओं के लिए द्वि-दिशात्मक बाइंडिंग हैं,[29] लुआ (प्रोग्रामिंग भाषा)[30][31] और अन्य भाषाओं, अक्सर संकलन-समय कोड पीढ़ी और संकलन-समय प्रकार प्रतिबिंब विधियों का उपयोग करते हुए।
सी ++ कोड के साथ सहभागिता
डी सी ++ कोड के साथ इंटरऑपरेशन के लिए एक अनुमोदित लेकिन यथार्थवादी दृष्टिकोण लेता है।[32] डी कोड के रूप में चिह्नित के लिए extern(C++), निम्नलिखित विशेषताएं निर्दिष्ट हैं:
- मैंगलिंग सम्मेलनों का नाम लक्ष्य पर सी ++ के उन लोगों से मेल खाना चाहिए।
- फंक्शन कॉल्स के लिए, एबीआई समतुल्य होगा।
- वीटेबल को सिंगल इनहेरिटेंस (डी भाषा विनिर्देश द्वारा समर्थित एकमात्र स्तर) तक मिलान किया जाएगा।
C++ नेमस्पेस सिंटैक्स के माध्यम से उपयोग किए जाते हैं extern(C++, namespace) जहां नेमस्पेस सी ++ नेमस्पेस का नाम है।
सी++ इंटरऑपरेशन का एक उदाहरण
सी ++ पक्ष <वाक्यविन्यास प्रकाश लैंग = सी ++>
- शामिल <iostream>
नेमस्पेस एसटीडी का उपयोग करना; वर्ग आधार
#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;
}
डी पक्ष
<syntax light lang = D> extern (C++)
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);
}बेहतर सी
D प्रोग्रामिंग लैंग्वेज का एक आधिकारिक उपसमुच्चय है जिसे जाना जाता हैBetter C.[33] यह उपसमुच्चय सी के अलावा अन्य रनटाइम पुस्तकालयों के उपयोग की आवश्यकता वाले डी सुविधाओं तक पहुंच को प्रतिबंधित करता है।
DMD और LDC पर कंपाइलर फ़्लैग -betterC और GDC पर -fno-druntime के माध्यम से सक्षम, Better C केवल एक ही ध्वज (और डी के अलावा लिंक किए गए कोड) के तहत संकलित डी कोड में कॉल कर सकते हैं लेकिन कोड बिना संकलित किए गए हैं Better C विकल्प इसके साथ संकलित कोड में कॉल कर सकता है: हालांकि, सी और डी कैसे जोर देते हैं, इस अंतर के कारण थोड़ा अलग व्यवहार होगा।
== बेहतर सी == में शामिल विशेषताएं
- संकलन-समय सुविधाओं का अप्रतिबंधित उपयोग (उदाहरण के लिए, डी की गतिशील आवंटन सुविधाओं का उपयोग डी डेटा को पूर्व-आवंटित करने के लिए संकलन समय पर किया जा सकता है)
- पूर्ण मेटाप्रोग्रामिंग सुविधाएं
- नेस्टेड फ़ंक्शंस, नेस्टेड स्ट्रक्चर्स, डेलीगेट्स और लैम्ब्डा
- सदस्य कार्य, निर्माता, विध्वंसक, ऑपरेटिंग ओवरलोडिंग, आदि।
- पूर्ण मॉड्यूल प्रणाली
- ऐरे स्लाइसिंग, और एरे बाउंड चेकिंग
- राय
- scope(exit)* स्मृति सुरक्षा सुरक्षा
- सी ++ के साथ इंटरफेसिंग
- COM क्लासेस और C++ क्लासेस
- मुखर विफलताओं को सी रनटाइम लाइब्रेरी के लिए निर्देशित किया जाता है
- तार के साथ स्विच करें
- अंतिम स्विच
- यूनिटटेस्ट ब्लॉक
- प्रिंटफ प्रारूप सत्यापन
==== सुविधाओं को बेटर सी से बाहर रखा गया है
- कचरा संग्रहण
- टाइपइन्फो और मॉड्यूलइन्फो
- बिल्ट-इन थ्रेडिंग (उदा.
core.thread) - गतिशील सरणियाँ (हालांकि स्थिर सरणियों के स्लाइस काम करते हैं) और साहचर्य सरणियाँ
- अपवाद
- सिंक्रनाइज़ और
core.sync - स्टेटिक मॉड्यूल कंस्ट्रक्टर या डिस्ट्रक्टर
इतिहास
वाल्टर ब्राइट ने 1999 में एक नई भाषा पर काम करना शुरू किया। डी को पहली बार दिसंबर 2001 में रिलीज़ किया गया था[1] और जनवरी 2007 में संस्करण 1.0 पर पहुंच गया।[34] भाषा का पहला संस्करण (D1) अनिवार्य, वस्तु उन्मुख और मेटाप्रोग्रामिंग प्रतिमानों पर केंद्रित था,[35] सी ++ के समान।
डी समुदाय के कुछ सदस्यों ने फोबोस, डी के आधिकारिक रनटाइम पुस्तकालय और मानक पुस्तकालय से असंतुष्ट होकर टैंगो नामक एक वैकल्पिक रनटाइम और मानक पुस्तकालय बनाया। पहली सार्वजनिक टैंगो घोषणा डी 1.0 के जारी होने के कुछ दिनों के भीतर हुई।[36] टैंगो ने ओओपी और उच्च प्रतिरूपकता को अपनाते हुए एक अलग प्रोग्रामिंग शैली अपनाई। समुदाय के नेतृत्व वाली परियोजना होने के नाते, टैंगो योगदान के लिए अधिक खुला था, जिसने इसे आधिकारिक मानक पुस्तकालय की तुलना में तेजी से प्रगति करने की अनुमति दी। उस समय, अलग-अलग रनटाइम सपोर्ट एपीआई (कचरा कलेक्टर, थ्रेडिंग सपोर्ट, आदि) के कारण टैंगो और फोबोस असंगत थे। इससे एक ही परियोजना में दोनों पुस्तकालयों का उपयोग करना असंभव हो गया। दो पुस्तकालयों के अस्तित्व, दोनों व्यापक रूप से उपयोग में हैं, ने कुछ पैकेजों के कारण फोबोस और अन्य द्वारा टैंगो का उपयोग करने के कारण महत्वपूर्ण विवाद को जन्म दिया है।[37] जून 2007 में, D2 का पहला संस्करण जारी किया गया था।[38] D2 के विकास की शुरुआत ने D1 के स्थिरीकरण का संकेत दिया। भाषा के पहले संस्करण को रखरखाव में रखा गया है, केवल सुधार और कार्यान्वयन बगफिक्स प्राप्त कर रहा है। D2 ने अपनी पहली प्रायोगिक स्थिरांक-शुद्धता के साथ शुरुआत करते हुए, भाषा में ब्रेकिंग बदलाव पेश किए। D2 ने बाद में क्लोजर (कंप्यूटर प्रोग्रामिंग), शुद्ध कार्य, और कार्यात्मक और समवर्ती प्रोग्रामिंग प्रतिमानों के लिए समर्थन जैसी कई अन्य भाषा सुविधाओं को जोड़ा। D2 ने मानक पुस्तकालय से रनटाइम को अलग करके मानक पुस्तकालय की समस्याओं को भी हल किया। फरवरी 2012 में डी2 टैंगो बंदरगाह के पूरा होने की घोषणा की गई थी।[39] 12 जून 2010 को आंद्रेई अलेक्सांद्रेस्कू की पुस्तक द डी प्रोग्रामिंग लैंग्वेज के विमोचन ने डी2 के स्थिरीकरण को चिह्नित किया, जिसे आज आमतौर पर केवल डी के रूप में संदर्भित किया जाता है।
जनवरी 2011 में, डी विकास एक बगट्रैकर / पैच-सबमिशन आधार से गिटहब तक चला गया। इससे संकलक, रनटाइम और मानक पुस्तकालय में योगदान में उल्लेखनीय वृद्धि हुई है।[40] दिसंबर 2011 में, आंद्रेई अलेक्जेंड्रेस्कू ने घोषणा की कि डी1, भाषा का पहला संस्करण, 31 दिसंबर 2012 को बंद कर दिया जाएगा।[41] अंतिम D1 रिलीज़, D v1.076, 31 दिसंबर 2012 को थी।[42] आधिकारिक डी कंपाइलर के लिए कोड, वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर, मूल रूप से एक कस्टम सॉफ़्टवेयर लाइसेंस के तहत जारी किया गया था, जो उपलब्ध स्रोत के रूप में योग्य है लेकिन ओपन सोर्स परिभाषा के अनुरूप नहीं है।[43] 2014 में, कंपाइलर कंपाइलर#फ्रंट एंड|फ्रंट-एंड सॉफ्टवेयर लाइसेंसिंग था|बूस्ट सॉफ्टवेयर लाइसेंस के तहत खुला स्रोत सॉफ्टवेयर के रूप में फिर से लाइसेंस दिया गया।[2] इस पुन: लाइसेंस कोड ने बैक-एंड को बाहर कर दिया, जिसे आंशिक रूप से NortonLifeLock पर विकसित किया गया था। 7 अप्रैल 2017 को, सिमेंटेक द्वारा बैक-एंड को भी फिर से लाइसेंस देने की अनुमति देने के बाद, पूरे कंपाइलर को बूस्ट लाइसेंस के तहत उपलब्ध कराया गया था।[3][44][45][46] 21 जून 2017 को, D भाषा को GCC में शामिल करने के लिए स्वीकार किया गया।[47]
कार्यान्वयन
कुशल निष्पादन के लिए अधिकांश वर्तमान डी कार्यान्वयन संकलक सीधे मशीन कोड में।
उत्पादन के लिए तैयार संकलक:
- डीएमडी - वाल्टर ब्राइट द्वारा डिजिटल मार्स डी कंपाइलर आधिकारिक डी कंपाइलर है; बूस्ट सॉफ्टवेयर लाइसेंस के तहत ओपन सोर्स।[2][3]कंपाइलर्स के बीच अनुकूलता में सुधार करने के लिए डीएमडी फ्रंटेंड को जीडीसी (अब जीसीसी में) और एलडीसी द्वारा साझा किया जाता है। प्रारंभ में दृश्यपटल C++ में लिखा गया था, लेकिन अब इसका अधिकांश भाग D में ही (सेल्फ-होस्टिंग) लिखा गया है। बैकएंड और मशीन कोड ऑप्टिमाइज़र सिमेंटेक कंपाइलर पर आधारित हैं। सबसे पहले यह केवल 32-बिट x86 का समर्थन करता था, वाल्टर ब्राइट द्वारा 64-बिट amd64 और पावरपीसी के लिए समर्थन जोड़ा गया था। बाद में बैकएंड और लगभग पूरे कंपाइलर को पूर्ण सेल्फ-होस्टिंग के लिए C++ से D में पोर्ट किया गया।
- जीसीसी - जीएनयू कंपाइलर संग्रह, विलय जीडीसी[48] 29 अक्टूबर 2018 को जीसीसी 9 में।[49] Linux और macOS पर 32-बिट x86 पर GCC 3.3 और GCC 3.4 पर आधारित GCC के साथ GDC का पहला कार्यशील संस्करण[50] 22 मार्च 2004 को जारी किया गया था। तब से जीडीसी ने फ्रंटएंड और भाषा विनिर्देश के लिए अपस्ट्रीम डीएमडी कोड को ट्रैक करते समय अतिरिक्त प्लेटफॉर्म, बेहतर प्रदर्शन और फिक्स्ड बग के लिए समर्थन प्राप्त किया है।[51]
- LDC - DMD फ्रंट-एंड पर आधारित एक कंपाइलर जो LLVM को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। पहला रिलीज़-क्वालिटी संस्करण 9 जनवरी 2009 को प्रकाशित हुआ था।[52] यह संस्करण 2.0 का समर्थन करता है।[53]
खिलौना और प्रूफ-ऑफ-कॉन्सेप्ट कंपाइलर:
- डी कंपाइलर के लिए .NET- डी प्रोग्रामिंग लैंग्वेज 2.0 कंपाइलर के लिए बैक-एंड।[54][55] यह कोड को मशीन कोड के बजाय सामान्य मध्यवर्ती भाषा (CIL) बायटेकोड में संकलित करता है। CIL को तब सामान्य भाषा अवसंरचना (CLI) आभासी मशीन के माध्यम से चलाया जा सकता है। परियोजना को वर्षों में अद्यतन नहीं किया गया है और लेखक ने संकेत दिया है कि परियोजना अब सक्रिय नहीं है।
- एसडीसी - स्टूपिड डी कंपाइलर एक कस्टम फ्रंट-एंड और एलएलवीएम को इसके कंपाइलर बैक-एंड के रूप में उपयोग करता है। यह डी में लिखा गया है और डी की संकलन-समय सुविधाओं को सुरुचिपूर्ण ढंग से संभालने के लिए प्रतीक संकल्प को संभालने के लिए शेड्यूलर का उपयोग करता है। यह कंपाइलर वर्तमान में भाषा के सीमित उपसमूह का समर्थन करता है।[56][57]
उपरोक्त कंपाइलर्स और टूलचेन्स का उपयोग करके, 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 वर्चुअल मशीन।
विकास उपकरण
भाषा के लिए वाक्य - विन्यास पर प्रकाश डालना और आंशिक बुद्धिमान कोड पूर्णता का समर्थन करने विम (पाठ संपादक) एकीकृत विकास वातावरण (IDEs) में शामिल हैं SlickEdit, Emacs, Vim (टेक्स्ट एडिटर), SciTE, Smultron, Zeus,[58] और गेनी दूसरों के बीच में।[59]
- Dexed (पूर्व में सह-संपादित),[60] वस्तु पास्कल में लिखा गया एक डी केंद्रित ग्राफिकल आईडीई
- मोनो-डी[61] मुख्य रूप से C Sharp में लिखे गए MonoDevelop / Xamarin Studio पर आधारित एक सुविधा संपन्न क्रॉस-प्लेटफ़ॉर्म D केंद्रित ग्राफ़िकल IDE है।[62]
- डी के लिए एक्लिप्स (सॉफ्टवेयर) प्लग-इन में डीडीटी शामिल है[63] और वंश (मृत परियोजना)।[64]
- विजुअल स्टूडियो इंटीग्रेशन विजुअलडी द्वारा प्रदान किया जाता है।[65][66]
- Dlang-Vscode जैसे एक्सटेंशन के साथ विजुअल स्टूडियो कोड इंटीग्रेशन[67] या कोड-डी।[68]
- टेक्स्टमैट के लिए एक बंडल उपलब्ध है, और कोड :: ब्लॉक आईडीई में भाषा के लिए आंशिक समर्थन शामिल है। हालाँकि, मानक IDE सुविधाएँ जैसे कि कोड पूर्णता या रिफैक्टरिंग अभी तक उपलब्ध नहीं हैं, हालाँकि वे कोड :: ब्लॉक में आंशिक रूप से काम करते हैं (D की C से समानता के कारण)।
- Xcode के लिए Xcode 3 प्लगइन D, D-आधारित परियोजनाओं और विकास को सक्षम बनाता है।[69]
- केडेवलप (साथ ही इसका पाठ संपादक बैकएंड, केट) स्वत: पूर्णता प्लगइन उपलब्ध है।[70]
विंडोज के लिए ओपन-सोर्स सॉफ्टवेयर डी आईडीई मौजूद हैं, कुछ डी में लिखे गए हैं, जैसे पोसीडॉन,[71] डी-आईडीई,[72] तथा लुभाना डिजाइनर।[73] D अनुप्रयोगों को किसी भी C/C++ डिबगर का उपयोग करके डीबग किया जा सकता है, जैसे GNU डीबगर या WinDbg, हालांकि विभिन्न D-विशिष्ट भाषा सुविधाओं के लिए समर्थन अत्यंत सीमित है। विंडोज़ पर, डी प्रोग्राम Ddbg, या माइक्रोसॉफ्ट डीबगिंग टूल्स (विनडीबीजी और विजुअल स्टूडियो) का उपयोग करके डीबग किया जा सकता है। cv2pdb का उपयोग करके डिबग जानकारी को रूपांतरित किया। Linux के लिए ZeroBUGS डीबगर में D भाषा के लिए प्रयोगात्मक समर्थन है। डीडीबीजी का उपयोग विभिन्न आईडीई या कमांड लाइन से किया जा सकता है; ZeroBUGS का अपना ग्राफिकल यूज़र इंटरफ़ेस (GUI) है।
डस्टमाइट डी स्रोत कोड को कम करने के लिए एक शक्तिशाली उपकरण है, जो संकलक या परीक्षण मुद्दों को खोजने में उपयोगी है।[74] डब एक लोकप्रिय पैकेज है और डी अनुप्रयोगों और पुस्तकालयों के लिए प्रबंधक का निर्माण करता है, और इसे अक्सर आईडीई समर्थन में एकीकृत किया जाता है।[75]
उदाहरण
This section possibly contains original research. (September 2020) (Learn how and when to remove this template message) |
उदाहरण 1
यह उदाहरण प्रोग्राम अपने कमांड लाइन तर्कों को प्रिंट करता है। main ई> फ़ंक्शन डी प्रोग्राम का प्रवेश बिंदु है, और args कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की एक सरणी है। ए string डी में वर्णों की एक सरणी है, जिसका प्रतिनिधित्व किया जाता है immutable(char)[].
<वाक्यविन्यास हाइलाइट लैंग = डी लाइन हाइलाइट = 3,5> आयात std.stdio: writefln;
शून्य मुख्य (स्ट्रिंग [] तर्क) {
foreach (i, आर्ग; आर्ग)
राइटफ्लन (आर्ग्स [% d] = '% s', आई, आर्ग);
} </वाक्यविन्यास हाइलाइट> foreach e> कथन किसी भी संग्रह पर पुनरावृति कर सकता है। इस मामले में, यह अनुक्रमणिका का अनुक्रम उत्पन्न कर रहा है (i) और मान (arg) सरणी से args. अनुक्रमणिका i और मूल्य arg उनके प्रकार सरणी के प्रकार से अनुमानित हैं args.
उदाहरण 2
निम्नलिखित एक छोटे कार्यक्रम में कई डी क्षमताओं और डी डिजाइन ट्रेड-ऑफ दिखाता है। यह नामित टेक्स्ट फ़ाइल की पंक्तियों पर पुनरावृत्त करता है words.txt, जिसमें प्रत्येक पंक्ति पर एक अलग शब्द होता है, और उन सभी शब्दों को प्रिंट करता है जो दूसरे शब्दों के विपर्यय हैं।
<वाक्यविन्यास लैंग = डी लाइन हाइलाइट = 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) {
राइटलन (शब्द। जॉइन ());
}
}
}
signature2wordsएक अंतर्निहित साहचर्य सरणी है जो स्ट्रिंग्स की सरणी के लिए स्ट्रिंग (32-बिट / चार) कुंजियों को मैप करती है। यह उसके जैसा हैdefaultdict(list)पायथन (प्रोग्रामिंग भाषा) में।lines(File())न्यूलाइन के साथ आलसी रूप से लाइनें उत्पन्न करता है। इसके बाद इसे कॉपी करना होगाidupसहयोगी सरणी मानों के लिए उपयोग की जाने वाली स्ट्रिंग प्राप्त करने के लिए (theidupसरणियों की संपत्ति सरणी का एक अपरिवर्तनीय डुप्लिकेट लौटाती है, जो कि आवश्यक हैdstringप्रकार वास्तव में हैimmutable(dchar)[]). अंतर्निहित साहचर्य सरणियों को अपरिवर्तनीय कुंजियों की आवश्यकता होती है।~=ई> ऑपरेटर सहयोगी गतिशील सरणी के मानों में एक नई स्ट्रिंग जोड़ता है।toLower,joinतथाchompस्ट्रिंग फ़ंक्शंस हैं जो डी एक विधि सिंटैक्स के साथ उपयोग करने की अनुमति देता है। ऐसे कार्यों के नाम अक्सर पायथन स्ट्रिंग विधियों के समान होते हैं।toLowere> एक स्ट्रिंग को लोअर केस में कनवर्ट करता है,join(" ")विभाजक के रूप में एकल स्थान का उपयोग करके स्ट्रिंग्स की एक सरणी को एक स्ट्रिंग में जोड़ता है, औरchompयदि कोई मौजूद है तो स्ट्रिंग के अंत से एक नई पंक्ति निकालता है।w.dup.sort().release().idupe> अधिक पठनीय है, लेकिन इसके बराबर हैrelease(sort(w.dup)).idupउदाहरण के लिए। इस सुविधा को यूएफसीएस (यूनिफ़ॉर्म फ़ंक्शन कॉल सिंटैक्स) कहा जाता है, और किसी भी अंतर्निहित या तृतीय पक्ष पैकेज प्रकारों को विधि-जैसी कार्यक्षमता के साथ विस्तारित करने की अनुमति देता है। इस तरह कोड लिखने की शैली को अक्सर पाइपलाइन (यूनिक्स) के रूप में संदर्भित किया जाता है (विशेष रूप से जब उपयोग की जाने वाली वस्तुओं को आलसी रूप से गणना की जाती है, उदाहरण के लिए इटरेटर/श्रेणियां) या धाराप्रवाह इंटरफ़ेसsorte> एक std.algorithm फ़ंक्शन है जो जगह में सरणी को सॉर्ट करता है, शब्दों के लिए एक अद्वितीय हस्ताक्षर बनाता है जो एक दूसरे के विपर्यय हैं।release()ई> के वापसी मूल्य पर विधिsort()कोड को एकल अभिव्यक्ति के रूप में रखना आसान है।- दूसरा
foreachसाहचर्य सरणी के मूल्यों पर पुनरावृत्ति करता है, यह प्रकार का अनुमान लगाने में सक्षम हैwords. signatureएक अपरिवर्तनीय चर को सौंपा गया है, इसका प्रकार अनुमानित है।- यूटीएफ-32 -32
dchar[]सामान्य UTF-8 के बजाय प्रयोग किया जाता हैchar[]अन्यथाsort()इसे क्रमबद्ध करने से इंकार कर देता है। केवल UTF-8 का उपयोग करके इस प्रोग्राम को लिखने के अधिक प्रभावी तरीके हैं।
उपयोग करता है
परियोजनाओं के लिए D प्रोग्रामिंग भाषा का उपयोग करने वाले उल्लेखनीय संगठनों में Facebook,[76] ईबे,[77] और Netflix।[78] D का AAA (वीडियो गेम उद्योग) के लिए सफलतापूर्वक उपयोग किया गया है,[79] भाषा दुभाषिए, आभासी मशीन,[80][81] एक ऑपरेटिंग सिस्टम कर्नेल (ऑपरेटिंग सिस्टम),[82] ग्राफ़िक्स प्रोसेसिंग युनिट प्रोग्रामिंग,[83] वेब विकास,[84][85] संख्यात्मक विश्लेषण,[86] ग्राफिकल यूज़र इंटरफ़ेस,[87][88] एक यात्री सूचना प्रणाली,[89] मशीन लर्निंग,[90] टेक्स्ट प्रोसेसिंग, वेब और एप्लिकेशन सर्वर और रिसर्च।
यह भी देखें
- डीडॉक
- डी भाषा फाउंडेशन
संदर्भ
- ↑ 1.0 1.1 "डी चेंज लॉग टू नवंबर 7 2005". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
- ↑ 2.0 2.1 2.2 "डीएमडी फ्रंट एंड अब बूस्ट लाइसेंस पर स्विच हो गया है". Retrieved 9 September 2014.
- ↑ 3.0 3.1 3.2 "dmd Backend converted to Boost License". 7 April 2017. Retrieved 9 April 2017. Cite error: Invalid
<ref>tag; name "boost-backend" defined multiple times with different content - ↑ "D 2.0 FAQ". Retrieved 11 August 2015.
- ↑ "D Programming Language - Fileinfo.com". Retrieved 15 November 2020.[citation needed]
- ↑ "D Programming Language - dlang.org". Retrieved 15 November 2020.[citation needed]
- ↑ "Building assert() in Swift, Part 2: __FILE__ and __LINE__". Retrieved 25 September 2014.
- ↑ Alexandrescu, Andrei (2010). डी प्रोग्रामिंग भाषा (First ed.). Upper Saddle River, New Jersey: Addison-Wesley. p. 314. ISBN 978-0321635365.
- ↑ "सी ++ प्रोग्रामर्स के लिए डी में प्रोग्रामिंग - डी प्रोग्रामिंग लैंग्वेज". dlang.org. Retrieved 2022-04-05.
- ↑ "कार्यात्मक प्रोग्रामिंग - डलंग टूर". tour.dlang.org. Retrieved 2022-04-05.
- ↑ 11.0 11.1 "भाव". Digital Mars. Retrieved 27 December 2012.
- ↑ "पर: डी पर अफवाहें: वाल्टर ब्राइट के साथ एक साक्षात्कार". Hacker News. August 30, 2016. "It's close, and we're working to close the remaining gaps."
- ↑ "मेमोरी-सेफ-डी-स्पेक". D Language Foundation.
- ↑ Archived at Ghostarchive and the Wayback Machine: Andrei Alexandrescu (2 August 2010). Three Cool Things About D.
- ↑ "डी स्ट्रिंग्स बनाम सी ++ स्ट्रिंग्स". Digital Mars. 2012.
- ↑ "डी कॉम्प्लेक्स प्रकार और सी ++ एसटीडी :: जटिल". Digital Mars. 2012. Archived from the original on 13 January 2008. Retrieved 4 November 2021.
- ↑ "एसटीडी.जीसी". D Programming Language 1.0. Digital Mars. Retrieved 6 July 2010.
- ↑ "स्मृति प्रबंधन". D Programming Language 2.0. Digital Mars. Retrieved 17 February 2012.
- ↑ 19.0 19.1 "अपने रास्ते जाओ (भाग एक: ढेर)". The D Blog. 7 July 2017. Retrieved 2020-05-07.
- ↑ "गुण - डी प्रोग्रामिंग भाषा". dlang.org. Retrieved 2020-05-07.
- ↑ "std.experimental.allocator - D प्रोग्रामिंग लैंग्वेज". dlang.org. Retrieved 2020-05-07.
- ↑ Bartosz Milewski. "सेफडी-डी प्रोग्रामिंग लैंग्वेज". Retrieved 17 July 2014.
- ↑ Steven Schveighoffer (28 September 2016). "डी में @ट्रस्टेड कोड कैसे लिखें". Retrieved 4 January 2018.
- ↑ "स्कोप्ड पॉइंटर्स". GitHub. 3 April 2020.
- ↑ "मोहरबंद संदर्भ".
- ↑ "डी भाषा विशिष्टता: कार्य - रिटर्न स्कोप पैरामीटर्स".
- ↑ "डी में स्वामित्व और उधार". 15 July 2019.
- ↑ "डी भाषा विशिष्टता: कार्य - फ़ंक्शन पैरामीटर संग्रहण वर्ग".
- ↑ "पीवाईडी". GitHub. 7 May 2020. Retrieved 2020-05-07.
- ↑ Parker, Mike. "डब पर पैकेज परित्यक्त-लुआ". DUB Package Registry. Retrieved 2020-05-07.
- ↑ Parker, Mike. "डब पर पैकेज बाइंडबीसी-लुआ". DUB Package Registry. Retrieved 2020-05-07.
- ↑ "C++ के लिए इंटरफेसिंग".
- ↑ "बेहतर सी".
- ↑ "डी चेंज लॉग". D Programming Language 1.0. Digital Mars. Retrieved 11 January 2012.
- ↑ "पहचान". D Programming Language 1.0. Digital Mars. Retrieved 1 December 2011.
- ↑ "एक नए पुस्तकालय की घोषणा". Retrieved 15 February 2012.
- ↑ "Wiki4D: स्टैंडर्ड लिब". Retrieved 6 July 2010.
- ↑ "लॉग बदलें - डी प्रोग्रामिंग भाषा". D Programming Language 2.0. D Language Foundation. Retrieved 22 November 2020.
- ↑ "D2 के लिए टैंगो: पोर्ट किए गए सभी उपयोगकर्ता मॉड्यूल". Retrieved 16 February 2012.
- ↑ Walter Bright. "पुन: GitHub या dsource?". Retrieved 15 February 2012.
- ↑ Andrei Alexandrescu. "D1 को 31 दिसंबर, 2012 को बंद कर दिया जाएगा". Retrieved 31 January 2014.
- ↑ "डी चेंज लॉग". D Programming Language 1.0. Digital Mars. Retrieved 31 January 2014.
- ↑ "backendlicense.txt". DMD source code. GitHub. Archived from the original on 22 October 2016. Retrieved 5 March 2012.
- ↑ "वाल्टर ब्राइट द्वारा रेडिट टिप्पणी". 5 March 2009. Retrieved 9 September 2014.
- ↑ D-Compiler-unter-freier-Lizenz on linux-magazin.de (2017, in German)
- ↑ switch backend to Boost License #6680 from Walter Bright on github.com
- ↑ D Language accepted for inclusion in GCC
- ↑ "जीडीसी".
- ↑ "GCC 9 रिलीज़ सीरीज़ - परिवर्तन, नई सुविधाएँ और सुधार - GNU प्रोजेक्ट - फ़्री सॉफ़्टवेयर फ़ाउंडेशन (FSF)". gcc.gnu.org. Retrieved 2020-05-07.
- ↑ "जीसीसी के लिए एक और फ्रंट एंड". forum.dlang.org. Retrieved 2020-05-07.
- ↑ "GCC 9 रिलीज़ सीरीज़ में बदलाव, नई सुविधाएं और समाधान".
- ↑ "GitHub पर LLVM D कंपाइलर प्रोजेक्ट". GitHub. Retrieved 19 August 2016.
- ↑ "BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac". Retrieved 11 August 2015.
- ↑ "कोडप्लेक्स पर डी.नेट परियोजना". Retrieved 3 July 2010.
- ↑ Jonathan Allen (15 May 2009). "D.NET कम्पाइलर के लिए स्रोत अब उपलब्ध है". InfoQ. Retrieved 6 July 2010.
- ↑ Archived at Ghostarchive and the Wayback Machine: "DConf 2014: SDC, a D Compiler as a Library by Amaury Sechet". YouTube. Retrieved 8 January 2014.
- ↑ / एसडीसी "डेडलनिक्स / एसडीसी". GitHub. Retrieved 8 January 2014.
{{cite web}}: Check|url=value (help) - ↑ "Wiki4D: EditorSupport/ZeusForWindows". Retrieved 11 August 2015.
- ↑ "Wiki4D: संपादक समर्थन". Retrieved 3 July 2010.
- ↑ "बेसिल.बी / डेक्स्ड". GitLab (in English). Retrieved 2020-04-29.
- ↑ "मोनो-डी - डी विकी". wiki.dlang.org. Retrieved 2020-04-30.
- ↑ "मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट". Retrieved 11 August 2015.
- ↑ "Google प्रोजेक्ट होस्टिंग". Retrieved 11 August 2015.
- ↑ "चढ़ाई". Retrieved 11 August 2015.
- ↑ "विजुअल डी - डी प्रोग्रामिंग लैंग्वेज". Retrieved 11 August 2015.
- ↑ Schuetze, Rainer (17 April 2020). "रेनर्स/विज़ुअल: विजुअल डी - डी प्रोग्रामिंग लैंग्वेज के लिए विजुअल स्टूडियो एक्सटेंशन". github.com. Retrieved 2020-04-30.
- ↑ "dlang-vscode". GitHub. Retrieved 21 December 2016.
- ↑ "कोड-डी". GitHub. Retrieved 21 December 2016.
- ↑ "मिशेल फोर्टिन - एक्सकोड के लिए डी". Retrieved 11 August 2015.
- ↑ "डेव1डे/स्नो". GitHub. Retrieved 11 August 2015.
- ↑ "Poseidon". Retrieved 11 August 2015.
- ↑ "मोनो-डी - मोनो डेवलपमेंट के लिए डी सपोर्ट". Retrieved 11 August 2015.
- ↑ "एन्टिस डिज़ाइनर - Dprogramming.com - D प्रोग्रामिंग लैंग्वेज". Retrieved 11 August 2015.
- ↑ "डस्टमाइट क्या है?". GitHub (in English). Retrieved 2020-04-29.
- ↑ "dlang/डब: डी के लिए पैकेज और निर्माण प्रबंधन प्रणाली". GitHub (in English). Retrieved 2020-04-29.
- ↑ "अंडर द हुड: ताना, एक तेज सी और सी ++ प्रीप्रोसेसर". 28 March 2014. Retrieved 4 January 2018.
- ↑ "डी में तेज़ कमांड लाइन उपकरण". 24 May 2017. Retrieved 4 January 2018.
- ↑ "पेश है वेक्टरफ्लो". 2 August 2017. Retrieved 4 January 2018.
- ↑ "क्वांटम ब्रेक: एएए गेमिंग कुछ डी कोड के साथ". Retrieved 4 January 2018.
- ↑ "हिग्स जावास्क्रिप्ट वर्चुअल मशीन". GitHub. Retrieved 4 January 2018.
- ↑ "ईसीएमए 262 (जावास्क्रिप्ट) प्रोग्रामिंग भाषा का ए डी कार्यान्वयन". GitHub. Retrieved 4 January 2018.
- ↑ "प्रोजेक्ट हाइलाइट: द पॉवरनेक्स कर्नेल". 24 June 2016. Retrieved 4 January 2018.
- ↑ "DCompute: GPU पर D चल रहा है". 30 October 2017. Retrieved 4 January 2018.
- ↑ "vibe.d - एक उच्च-प्रदर्शन अतुल्यकालिक I/O, संगामिति और वेब अनुप्रयोग टूलकिट डी में लिखा गया है". Retrieved 4 January 2018.
- ↑ "प्रोजेक्ट हाइलाइट: डायमंड एमवीसी फ्रेमवर्क". 20 November 2017. Retrieved 4 January 2018.
- ↑ "D के लिए सांख्यिक आयु: Mir GLAS, OpenBLAS और Eigen से तेज़ है". Retrieved 4 January 2018.
- ↑ "टिलिक्स और डी पर: गेराल्ड नन के साथ एक साक्षात्कार". 11 August 2017. Retrieved 4 January 2018.
- ↑ "प्रोजेक्ट हाइलाइट: DlangUI". 7 October 2016. Retrieved 4 January 2018.
- ↑ "प्रोजेक्ट हाइलाइट: फंकवर्क". Retrieved 4 January 2018.
- ↑ "नेटफ्लिक्स/वेक्टरफ्लो". GitHub.com. Netflix, Inc. 5 May 2020. Retrieved 2020-05-07.
अग्रिम पठन
- Alexandrescu, Andrei (4 January 2010). The D Programming Language (1 ed.). Addison-Wesley Professional. ISBN 978-0-321-63536-5.
- Alexandrescu, Andrei (15 June 2009). "The Case for D". Dr. Dobb's Journal.
- Bright, Walter (8 April 2014). "How I Came to Write D". Dr. Dobb's Journal.
- Çehreli, Ali (1 February 2012). "Programming in D". (distributed under CC-BY-NC-SA license). This book teaches programming to novices, but covers many advanced D topics as well.
- Metz, Cade (7 July 2014). "The Next Big Programming Language You've Never Heard Of". Wired.
- Ruppe, Adam (May 2014). D Cookbook (1 ed.). PACKT Publishing. ISBN 978-1-783-28721-5.
बाहरी संबंध
- No URL found. Please specify a URL here or add one to Wikidata.
- Digital Mars
- Turkish Forum
- Dlang on GitHub