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

From Vigyanwiki

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

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

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


विशेषताएं

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

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

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

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

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

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

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

अनिवार्य

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

import std.stdio;

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

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

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

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

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

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

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

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

कार्यात्मक

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

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

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

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

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

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

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

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

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

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

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

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

समानांतरवाद

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

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

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

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

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

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

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

  writeln("Sum: ", x);

समवर्ती

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

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

void foo()
{
    bool cont = true;

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

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

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

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

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

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

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

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

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

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

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

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

enum fact_7 = Factorial!(7);

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

enum fact_9 = factorial(9);

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

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

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

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

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

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

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

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

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

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

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


सेफडी

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


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

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

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

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

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

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

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

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

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

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

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

@safe:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C ++ पक्ष

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

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

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

        int mul(int factor);
};

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

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

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

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

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

void main()
{
    import std.stdio;

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

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

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

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

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

बेटर सी

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

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

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

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

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

इतिहास

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

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

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

कार्यान्वयन

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

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

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

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

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

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

विकास उपकरण

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

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

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

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

उदाहरण

उदाहरण 1

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

import std.stdio: writefln;

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

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

उदाहरण 2

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

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

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

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

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

उपयोग करता है

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

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

यह भी देखें

संदर्भ

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


अग्रिम पठन

बाहरी संबंध