لغة البرمجة D

لغة D ، المعروفة أيضًا باسم dlang ، هي لغة برمجة أنظمة متعددة الأنماط ، ابتكرها والتر برايت في شركة ديجيتال مارس ، وأُصدرت عام 2001. انضم أندريه ألكسندرسكو إلى فريق التصميم والتطوير عام 2007. على الرغم من أنها نشأت كإعادة هندسة للغة C++ ، إلا أن D أصبحت الآن لغة مختلفة تمامًا. مع تطورها، استلهمت من لغات برمجة عالية المستوى أخرى ، ولا سيما لغات جافا ، وبايثون ، وروبي ، وسي شارب ، وإيفل .

يصف مرجع لغة D ذلك على النحو التالي:

لغة D هي لغة برمجة أنظمة للأغراض العامة، ذات بنية شبيهة بلغة C، وتُترجم إلى كود أصلي. وهي لغة ذات كتابة ثابتة، وتدعم إدارة الذاكرة التلقائية (عن طريق جمع البيانات المهملة) واليدوية. تُبنى برامج D على شكل وحدات يمكن ترجمتها بشكل منفصل وربطها بمكتبات خارجية لإنشاء مكتبات أو ملفات تنفيذية أصلية. [ 11 ]

سمات

لا تتوافق لغة D مع شفرة المصدر للغتين C و C++ بشكل عام. ومع ذلك، فإن أي شفرة قانونية في كل من C/C++ و D يجب أن تتصرف بنفس الطريقة.

مثل لغة C++، تحتوي لغة D على الدوال المغلقة ، والدوال المجهولة ، وتنفيذ الدوال في وقت الترجمة ، والتصميم التعاقدي ، والنطاقات، ومفاهيم تكرار الحاويات المدمجة، واستنتاج الأنواع . كما تتطابق صيغ التصريحات والعبارات والتعبيرات في لغة D بشكل كبير مع تلك الموجودة في لغة C++.

على عكس لغة C++، تدعم لغة D أيضًا جمع البيانات المهملة ، والمصفوفات من الدرجة الأولى ( بينما لا تُعتبر كذلك في لغة C++ من الناحية التقنية)، وتقطيع المصفوفات ، والدوال المتداخلة ، والتقييم الكسول . وتستخدم لغة D نمط الوراثة الأحادية على غرار لغة Java مع الواجهات والمزيجات بدلاً من نمط الوراثة المتعددة على غرار لغة C++ .std::array

لغة D هي لغة برمجة أنظمة. على غرار لغة C++، وعلى عكس لغات التطبيقات مثل Java و C# ، تدعم D البرمجة منخفضة المستوى ، بما في ذلك لغة التجميع المضمنة . تتيح لغة التجميع المضمنة للمبرمجين إدخال كود تجميع خاص بالجهاز ضمن كود D القياسي. يستخدم مبرمجو الأنظمة هذه الطريقة للوصول إلى ميزات المعالج منخفضة المستوى اللازمة لتشغيل البرامج التي تتفاعل مباشرة مع المكونات المادية الأساسية ، مثل أنظمة التشغيل وبرامج تشغيل الأجهزة . تُستخدم البرمجة منخفضة المستوى أيضًا لكتابة كود ذي أداء أعلى مما ينتجه المترجم .

تدعم لغة D تحميل الدوال وتحميل المعاملات . يمكن تعريف الرموز ( الدوال ، والمتغيرات ، والفئات ) بأي ترتيب؛ ولا حاجة إلى تعريفات مسبقة .

في لغة D، تُعتبر سلاسل الأحرف النصية عبارة عن مصفوفات من الأحرف، ويتم التحقق من حدود المصفوفات في D. [ 12 ] تحتوي D على أنواع من الدرجة الأولى للأعداد المركبة والتخيلية. [ 13 ]

نماذج البرمجة

تدعم لغة البرمجة D خمسة نماذج برمجة رئيسية :

إلزامي

البرمجة الإجرائية في لغة D تكاد تكون مطابقة لتلك في لغة C. فالدوال والبيانات والعبارات والتصريحات والتعبيرات تعمل تمامًا كما في لغة C، ويمكن الوصول إلى مكتبة وقت تشغيلforeach C مباشرةً. مع ذلك، وعلى عكس لغة C، تسمح بنية الحلقة في لغة D بالتكرار على مجموعة. كما تسمح لغة D بالدوال المتداخلة ، وهي دوال مُعلنة داخل دالة أخرى، ويمكنها الوصول إلى المتغيرات المحلية للدالة المُحيطة .

استيراد 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 )); } }

البرمجة الكائنية

تعتمد البرمجة الكائنية في لغة D على تسلسل هرمي واحد للوراثة ، حيث تُشتق جميع الفئات من الفئة Object. لا تدعم D الوراثة المتعددة؛ بل تستخدم واجهات على غرار Java ، والتي تُشابه الفئات المجردة البحتة في C++، بالإضافة إلى mixins ، التي تفصل الوظائف المشتركة عن التسلسل الهرمي للوراثة. كما تسمح D بتعريف الدوال الثابتة والنهائية (غير الافتراضية) في الواجهات.

تدعم الواجهات والوراثة في لغة D أنواعًا متغيرة لأنواع الإرجاع للطرق التي تم تجاوزها.

يدعم D إعادة توجيه الأنواع والإرسال الديناميكي المخصص الاختياري .

يمكن أن تحتوي الفئات (والواجهات) في لغة D على ثوابت يتم فحصها تلقائيًا قبل وبعد الدخول إلى الطرق العامة، وفقًا لمنهجية التصميم عن طريق العقد .

يمكن فحص العديد من جوانب الفئات (والهياكل) تلقائيًا في وقت الترجمة (شكل من أشكال البرمجة الانعكاسية (الانعكاس) باستخدام type traits) وفي وقت التشغيل (RTTI / TypeInfo)، لتسهيل إنشاء التعليمات البرمجية العامة أو توليد التعليمات البرمجية التلقائية (عادة باستخدام تقنيات وقت الترجمة).

وظيفي

تدعم لغة D ميزات البرمجة الوظيفية مثل الدوال الحرفية ، والإغلاقات ، والكائنات غير القابلة للتغيير بشكل متكرر، واستخدام الدوال ذات الرتبة العليا . يوجد نوعان من صيغ الدوال المجهولة، بما في ذلك صيغة متعددة العبارات وصيغة مختصرة أحادية التعبير: [ 14 ]

دالة عددية ( عدد صحيح ) g ؛ g = ( x ) { return x * x ؛ // الصيغة المطولة g = ( x ) => x * x ؛ // الصيغة المختصرة

يوجد نوعان مُضمّنان للقيم الحرفية للدوال: `<function>` function، وهو ببساطة مؤشر إلى دالة مُخصصة في الذاكرة المكدسة، و`<function>` delegate، الذي يتضمن أيضًا مؤشرًا إلى إطار المكدس ذي الصلة ، أي "البيئة" المحيطة التي تحتوي على المتغيرات المحلية الحالية. يمكن استخدام استنتاج النوع مع دالة مجهولة، وفي هذه الحالة يُنشئ المُصرّف `<function>` delegateما لم يُثبت عدم ضرورة مؤشر البيئة. وبالمثل، لتنفيذ إغلاق، يضع المُصرّف المتغيرات المحلية المُحاطة في الذاكرة الديناميكية فقط عند الضرورة (على سبيل المثال، إذا أعادت دالة أخرى إغلاقًا، وخرجت من نطاق تلك الدالة). عند استخدام استنتاج النوع، سيضيف المُصرّف أيضًا سمات مثل `<function>` pureو`< nothrowfunction>` إلى نوع الدالة، إذا أثبت انطباقها.

تتوفر ميزات وظيفية أخرى مثل التخصيص الجزئي ووظائف الرتبة العليا الشائعة مثل map و filter و reducestd.functional من خلال وحدات المكتبة القياسية و std.algorithm.

استيراد 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 ];// يجب أن يكون غير قابل للتغيير للسماح بالوصول إليه من داخل دالة خالصة immutable pivot = 5 ;int mySum ( int a , int b ) pure nothrow /* دالة نقية */ { // مرجع إلى النطاق المحيط if ( b <= pivot ) { return a + b ; } else { return a ; } }// تمرير دالة تفويض (إغلاق) auto result = reduce ! mySum ( chain ( a1 , a2 )); writeln ( "النتيجة: " , result ); // النتيجة: 15// تمرير قيمة حرفية للمفوض result = reduce !(( a , b ) => ( b <= pivot ) ? a + b : a )( chain ( a1 , a2 )); writeln ( "النتيجة: " , result ); // النتيجة: 15 }

بدلاً من ذلك، يمكن التعبير عن تركيبات الدوال المذكورة أعلاه باستخدام صيغة استدعاء الدوال الموحدة (UFCS) لقراءة أكثر طبيعية من اليسار إلى اليمين:

auto result = a1 . chain ( a2 ). reduce ! mySum (); writeln ( "النتيجة: " , result );result = a1.chain ( a2 ) .reduce !(( a , b ) => ( b <= pivot ) ? a + b : a ) ( ); writeln ( "النتيجة: " , result ) ;

التوازي

تُطبَّق مفاهيم البرمجة المتوازية في المكتبة، ولا تتطلب دعمًا إضافيًا من المُصرِّف. ومع ذلك، يضمن نظام أنواع البيانات والمُصرِّف إمكانية اكتشاف مشاركة البيانات وإدارتها بشفافية.

استيراد std.stdio : writeln ؛ استيراد std.range : iota ؛ استيراد std.parallelism : parallel ؛void main () { foreach ( i ; iota ( 11 ). parallel ) { // يتم تنفيذ جسم حلقة foreach بالتوازي لكل i writeln ( "processing " , i ); } }

iota(11).parallelوهو ما يعادل std.parallelism.parallel(iota(11))استخدام UFCS.

تدعم الوحدة نفسها أيضًا taskPoolوظائف يمكن استخدامها لإنشاء مهام متوازية ديناميكيًا، ولعمليات map-filter-reduce و fold على النطاقات (والمصفوفات)، وهو أمر مفيد عند دمجه مع العمليات الوظيفية. std.algorithm.mapتُرجع هذه الوظيفة نطاقًا يتم تقييمه عند الحاجة بدلًا من مصفوفة. وبهذه الطريقة، يتم حساب العناصر بواسطة كل مهمة عاملة بالتوازي تلقائيًا.

استيراد std.stdio : writeln ؛ استيراد std.algorithm : map ؛ استيراد std.range : iota ؛ استيراد std.parallelism : taskPool ؛/* على معالج Intel i7-3930X و gdc 9.3.0: * 5140 مللي ثانية باستخدام std.algorithm.reduce * 888 مللي ثانية باستخدام std.parallelism.taskPool.reduce * * على معالج AMD Threadripper 2950X و gdc 9.3.0: * 2864 مللي ثانية باستخدام std.algorithm.reduce * 95 مللي ثانية باستخدام 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 ( "المجموع: " , x ); }

التزامن

تُطبَّق خاصية التزامن بشكل كامل في المكتبة، ولا تتطلب دعمًا من المُصرِّف. تتوفر تطبيقات ومنهجيات بديلة لكتابة التعليمات البرمجية المتزامنة. يُسهم استخدام نظام كتابة النوع D في ضمان سلامة الذاكرة.

استيراد std.stdio و std.concurrency و std.variant ؛void foo () { bool cont = true ;بينما ( cont ) { // تُستخدم المندوبون لمطابقة نوع الرسالة. receive ( ( int msg ) => writeln ( "int received: " , msg ), ( Tid sender ) { cont = false ; sender.send ( -1 ); }, ( Variant v ) => writeln ( " huh?" ) // يطابق Variant أي نوع ); } }void main () { auto tid = spawn (& foo ); // إنشاء سلسلة عمليات جديدة تقوم بتشغيل foo()foreach ( i ; 0 .. 10 ) { tid . send ( i ); // إرسال بعض الأعداد الصحيحة }tid.send ( 1.0f ); // إرسال قيمة عشرية tid.send ( " hello " ); // إرسال سلسلة نصية tid.send ( thisTid ) ; // إرسال بنية بيانات (Tid )receive (( int x ) => writeln ( "استقبلت الخيط الرئيسي رسالة: " , x )); }

البرمجة الوصفية

يدعم لغة البرمجة الوصفية القوالب، وتنفيذ الدوال في وقت الترجمة، والصفوف ، ومزج السلاسل النصية. توضح الأمثلة التالية بعض ميزات وقت الترجمة في لغة D.

يمكن كتابة القوالب في لغة D بأسلوب إجرائي أكثر مقارنةً بأسلوب البرمجة الوظيفية في لغة C++. هذه دالة عادية تحسب مضروب عدد ما:

مضروب ulong ( ulong n ) { if ( n < 2 ) { return 1 ; } else { إرجاع n * مضروب ( n - 1 ); } }

هنا، يتم توضيح استخدام static ifبنية D الشرطية في وقت الترجمة لإنشاء قالب يقوم بنفس الحساب باستخدام كود مشابه لكود الدالة المذكورة أعلاه:

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

في المثالين التاليين، يُستخدم القالب والدالة المُعرّفان أعلاه لحساب المضروب. لا يلزم تحديد أنواع الثوابت صراحةً، حيث يستنتج المُصرّف أنواعها من الجانب الأيمن لعمليات الإسناد.

enum factorial7 = Factorial !( 7 );

هذا مثال على تنفيذ الدوال في وقت الترجمة (CTFE). يمكن استخدام الدوال العادية في التعبيرات الثابتة التي تُنفذ في وقت الترجمة بشرط استيفائها لمعايير معينة:

enum factorial9 = factorial ( 9 );

std.string.formatتقوم الدالة بتنفيذ تنسيق printfالبيانات المشابه (أيضًا في وقت الترجمة، من خلال CTFE)، ويعرض الأمر البرمجي "msg" النتيجة في وقت الترجمة:

استيراد std.string : format ;pragma ( msg , format ( "7! = %s" , fact_7 )); pragma ( msg , format ( "9! = %s" , fact_9 ));

تتيح ميزة دمج السلاسل النصية، بالإضافة إلى تنفيذ الدوال أثناء الترجمة، توليد كود D باستخدام عمليات السلاسل النصية في وقت الترجمة. ويمكن استخدام هذه الميزة لتحليل لغات خاصة بمجال معين ، والتي سيتم ترجمتها كجزء من البرنامج.

// وحدة افتراضية تحتوي على دالة تقوم بتحليل كود المصدر Foo // وإرجاع كود D المكافئ import FooToD ;void main () { mixin ( fooToD ( import ( "example.foo" ))); }

إدارة الذاكرة

تُدار الذاكرة عادةً باستخدام عملية جمع البيانات المهملة ، ولكن قد يتم إنهاء بعض الكائنات فور خروجها من نطاق التعريف. وهذا ما تستخدمه غالبية البرامج والمكتبات المكتوبة بلغة D.

يمكن إدارة الذاكرة بشكل صريح باستخدام عامل التشغيل new المُحمّل ، أو عن طريق استدعاء دالتي malloc وfree في لغة C مباشرةً، أو بتطبيق أنظمة تخصيص ذاكرة مخصصة مثل تخصيص الذاكرة باستخدام المكدس مع خيار التراجع، أو تخصيص الذاكرة بنمط RAII، أو عدّ المراجع، أو عدّ المراجع المشترك. ويمكن التحكم في عملية جمع البيانات المهملة: إذ يُمكن للمبرمجين إضافة نطاقات ذاكرة أو استبعادها من مراقبة جامع البيانات المهملة، كما يُمكنهم تعطيل جامع البيانات المهملة أو تفعيله، وفرض دورة جمع بيانات جزئية أو دورة جمع بيانات كاملة. [ 15 ] وتُقدّم وثائق اللغة أمثلةً لكيفية تطبيق أنظمة بديلة لإدارة الذاكرة في الحالات التي لا يُفضّل فيها استخدام جمع البيانات المهملة. [ 16 ]

في الدوال، structتُخصص النسخ افتراضيًا على المكدس، بينما classتُخصص النسخ افتراضيًا على الكومة (مع وجود مرجع فقط لنسخة الفئة على المكدس). ومع ذلك، يمكن تغيير ذلك بالنسبة للفئات، على سبيل المثال باستخدام قالب المكتبة القياسية std.typecons.scoped، أو باستخدام newهياكل البيانات وتعيين القيمة إلى مؤشر بدلاً من متغير قائم على القيمة. [ 17 ]

في الدوال، تُخصص المصفوفات الثابتة (ذات الحجم المعروف) على المكدس. أما بالنسبة للمصفوفات الديناميكية، فيمكن استخدام core.stdc.stdlib.allocaدالة (مشابهة لتلك allocaالموجودة في لغة C) لتخصيص الذاكرة على المكدس. ويمكن استخدام المؤشر المُعاد (إعادة صياغته) في مصفوفة ديناميكية (من نوع محدد) عن طريق شريحة (مع ذلك، يجب تجنب تغيير حجم المصفوفة، بما في ذلك الإلحاق؛ ولأسباب واضحة، يجب عدم إرجاعها من الدالة). [ 17 ]

يمكن استخدام الكلمة scopeالمفتاحية لتمييز أجزاء من الكود، وكذلك المتغيرات والفئات/الهياكل، للإشارة إلى ضرورة تدميرها (استدعاء المُدمِّر) فور الخروج من النطاق. ويعتمد تحرير الذاكرة أيضًا على التنفيذ والاختلافات بين الفئات والهياكل. [ 18 ]

std.experimental.allocatorيحتوي على قوالب تخصيص معيارية وقابلة للتركيب لإنشاء مخصصات مخصصة لحالات استخدام محددة. [ 19 ]

SafeD

SafeD [ 20 ] هو الاسم المُطلق على مجموعة فرعية من D التي يُمكن ضمان أمانها من حيث الذاكرة . @safeيتم فحص الدوال المُعلّمة أثناء الترجمة للتأكد من أنها لا تستخدم أي ميزات قد تؤدي إلى تلف الذاكرة، مثل العمليات الحسابية على المؤشرات والتحويلات غير المُدققة. يجب أيضًا تعليم أي دوال أخرى يتم استدعاؤها بعلامة SafeD @safeأو SafeD @trusted. يُمكن تعليم الدوال @trustedفي الحالات التي لا يستطيع فيها المُترجم التمييز بين الاستخدام الآمن لميزة مُعطلة في SafeD وحالة تلف الذاكرة المُحتملة. [ 21 ]

نطاق أمان مدى الحياة

في البداية تحت رايات DIP1000 [ 22 ] و DIP25 [ 23 ] (والتي أصبحت الآن جزءًا من مواصفات اللغة [ 24 ] )، يوفر D حماية ضد بعض البنى غير الصحيحة التي تتضمن فترات حياة البيانات.

تتعامل الآليات الحالية الموجودة بشكل أساسي مع معلمات الوظائف وذاكرة المكدس؛ ومع ذلك، تتضمن خارطة طريق تصميم اللغة خططًا لتوسيع تتبع دورة الحياة داخل لغة البرمجة D، بالاعتماد على مفاهيم من لغة البرمجة Rust . [ 25 ] (متأثرة بأفكار من لغة البرمجة Rust ).

أمان المهام مدى الحياة

في الكود الآمن @safe، يتم التحقق من عمر عملية التعيين التي تتضمن نوع مرجعي للتأكد من أن عمر المُعين له أطول من عمر المُعين له.

على سبيل المثال:

@safe void test () { int tmp = 0 ; // #1 int * rad ; // #2 rad = & tmp ; // إذا عُكِسَ ترتيب تعريفات #1 و #2، فسيفشل هذا الاختبار. { int bad = 45 ; // عمر "bad" يقتصر على النطاق الذي عُرِّف فيه. * rad = bad ; // هذا صحيح. rad = & bad ; // عمر rad أطول من bad، لذا فهذا غير صحيح. } }

تعليقات توضيحية حول عمر معلمات الدوال ضمن التعليمات البرمجية الآمنة (@safe).

عند تطبيقها على معلمات الدالة التي تكون إما من نوع المؤشر أو المراجع، فإن الكلمات الرئيسية return و scope تقيد عمر واستخدام تلك المعلمة.

يحدد معيار اللغة السلوك التالي: [ 26 ]

فئة التخزينسلوك (وقيود) أحد المعاملات مع فئة التخزين
نِطَاقلا يمكن تجاوز المراجع الموجودة في المعامل. يتم تجاهلها بالنسبة للمعاملات التي لا تحتوي على مراجع.
يعوديمكن إرجاع المعامل (أو voidنسخه إلى المعامل الأول في حالة الدوال)، ولكنه لا يخرج من الدالة في غير ذلك. يجب ألا تتجاوز مدة صلاحية هذه النسخ مدة صلاحية الوسيط (الوسائط) التي اشتُقت منها. يتم تجاهل المعاملات التي ليس لها مراجع.

يُقدَّم أدناه مثال مُوضَّح.

@آمن :int * gp ; void thorin ( scope int *); void gloin ( int *); int * balin ( return scope int * p , scope int * q , int * r ) { gp = p ; // خطأ، p ينتقل إلى المتغير العام gp. gp = q ; // خطأ، q ينتقل إلى المتغير العام gp. gp = r ; // صحيح.thorin ( p ); // حسنًا، p لا يهرب من thorin(). thorin ( q ); // حسنًا. thorin ( r ); // حسنًا.الخاصرة ( ع ) ؛ // خطأ، p يفلت من gloin(). الخاصرة ( ف ) ؛ // خطأ، q يهرب من gloin(). الخاصرة ( ص ) ؛ // حسنًا، هذا r يفلت من gloin().return p ; // صحيح. return q ; // خطأ، لا يمكن إرجاع 'scope' q. return r ; // صحيح. }

التفاعل مع الأنظمة الأخرى

يدعم C واجهة التطبيق الثنائية (ABI) ، بالإضافة إلى جميع أنواع C الأساسية والمشتقة، مما يتيح الوصول المباشر إلى أكواد ومكتبات C الموجودة. تتوفر روابط D للعديد من مكتبات C الشائعة. علاوة على ذلك، تُعد مكتبة C القياسية جزءًا من D القياسية .

في نظام التشغيل مايكروسوفت ويندوز، يمكن لـ D الوصول إلى كود نموذج كائن المكون (COM).

طالما تتم إدارة الذاكرة بشكل صحيح، يمكن دمج العديد من اللغات الأخرى مع لغة D في ملف تنفيذي واحد. على سبيل المثال، يسمح مُصرّف GDC بربط ودمج أكواد لغات C وC++ وغيرها من اللغات المدعومة مثل Objective-C. كما يمكن تمييز أكواد D (الدوال) باستخدام واجهات التطبيقات الثنائية (ABIs) للغات C وC++ وPascal، وبالتالي تمريرها إلى المكتبات المكتوبة بهذه اللغات كدوال رد نداء . وبالمثل، يمكن تبادل البيانات بين الأكواد المكتوبة بهذه اللغات في كلا الاتجاهين. عادةً ما يقتصر هذا الاستخدام على الأنواع الأولية، والمؤشرات، وبعض أنواع المصفوفات، والاتحادات ، والهياكل، وبعض أنواع مؤشرات الدوال فقط.

نظرًا لأن العديد من لغات البرمجة الأخرى توفر غالبًا واجهة برمجة تطبيقات C ( API ) لكتابة الإضافات أو تشغيل مترجم تلك اللغات، يمكن للغة D التفاعل مباشرةً مع هذه اللغات أيضًا، باستخدام روابط C القياسية (مع ملف واجهة D بسيط). على سبيل المثال، توجد روابط ثنائية الاتجاه للغات بايثون [ 27 ] ولوا [ 28 ] [ 29 ] وغيرها، وغالبًا ما تستخدم هذه الروابط توليد الكود في وقت الترجمة وأساليب انعكاس النوع في وقت الترجمة .

التفاعل مع كود C++

بالنسبة لرمز D الذي تم تحديده على أنه ، يتم تحديد الميزات التالية:extern(C++)

  • يجب أن تتطابق اصطلاحات تشويه الأسماء مع تلك الخاصة بلغة C++ على الجهاز المستهدف.
  • بالنسبة لاستدعاءات الدوال، يجب أن يكون ABI مكافئًا.
  • يجب مطابقة جدول الدوال الافتراضية حتى الوراثة الفردية (المستوى الوحيد المدعوم من قبل مواصفات لغة D).

تُستخدم مساحات الأسماء في لغة C++ عبر بناء الجملة

extern ( C ++ , namespace )

أين namespaceاسم مساحة اسم C++؟

مثال على التفاعل بين لغات البرمجة C++

في لغة C++:

استيراد std ؛class Base { public : virtual void print3i ( int a , int b , int c ) = 0 ; };class Derived : public Base { private : int field ; public : explicit Derived ( int field ) : field ( field ) {}void print3i ( int a , int b , int c ) { std :: println ( "a = {}" , a ); std :: println ( "b = {}" , b ); std :: println ( "c = {}" , c ); }int mul ( int factor ) { return field * factor ; } };Derived * createInstance ( int i ) { return new Derived ( i ); }void deleteInstance ( Derived *& d ) { delete d ; d = 0 ; }

على D:

extern ( C ++) { abstract class Base { public : void print3i ( int a , int b , int c ); }class Derived : Base { private : int field ; public : @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 );حذف النسخة ( d1 تأكيد ( d1 فارغ ) ؛auto d2 = createInstance ( 42 ); writeln ( d2 . field );deleteInstance ( d2 ); assert ( d2 is null ); }

ج الأفضل

تحتوي لغة البرمجة D على مجموعة فرعية رسمية تُعرف باسم " Better C ". [ 30 ] تمنع هذه المجموعة الفرعية الوصول إلى ميزات D التي تتطلب استخدام مكتبات وقت التشغيل بخلاف تلك الخاصة بلغة C.

يتم تمكين Better C عبر علامات المترجم "-betterC" على DMD و LDC، و "-fno-druntime" على GDC، ولا يمكن استدعاء Better C إلا في كود D الذي تم تجميعه تحت نفس العلامة (والكود المرتبط بخلاف D) ولكن الكود الذي تم تجميعه بدون خيار Better C يمكن أن يستدعي الكود الذي تم تجميعه به: ومع ذلك، سيؤدي هذا إلى سلوكيات مختلفة قليلاً بسبب الاختلافات في كيفية تعامل C و D مع التأكيدات.

الميزات المضمنة في Better C

  • الاستخدام غير المقيد لميزات وقت الترجمة (على سبيل المثال، يمكن استخدام ميزات التخصيص الديناميكي للغة D في وقت الترجمة لتخصيص بيانات D مسبقًا)
  • مرافق برمجة كاملة
  • الدوال المتداخلة، والهياكل المتداخلة، والمفوضون، ودوال لامدا
  • الدوال الأعضاء، والمنشئات، والمدمرات، وتحميل العمليات الزائد، إلخ.
  • نظام الوحدات الكامل
  • تقطيع المصفوفة، والتحقق من حدود المصفوفة
  • RAII
  • scope(exit)
  • حماية أمان الذاكرة
  • التفاعل مع لغة C++
  • فئات COM وفئات C++
  • assertيتم توجيه حالات الفشل إلى مكتبة وقت التشغيل C
  • switchمع سلاسل
  • final switch
  • unittestمكعبات
  • printf()التحقق من صحة التنسيق

الميزات المستبعدة من Better C

  • جمع القمامة
  • معلومات النوع ومعلومات الوحدة
  • خاصية الربط المدمج (على سبيل المثال core.thread)
  • المصفوفات الديناميكية (على الرغم من أن أجزاء من المصفوفات الثابتة تعمل) والمصفوفات الترابطية
  • الاستثناءات
  • synchronizedوcore.sync
  • مُنشئات أو مُدمِّرات الوحدات النمطية الثابتة

تاريخ

بدأ والتر برايت العمل على لغة جديدة في عام 1999. تم إصدار D لأول مرة في ديسمبر 2001 [ 1 ] ووصلت إلى الإصدار 1.0 في يناير 2007. [ 31 ] ركز الإصدار الأول من اللغة (D1) على نماذج البرمجة الإجرائية، والبرمجة الكائنية، والبرمجة الوصفية، [ 32 ] على غرار C++.

قام بعض أعضاء مجتمع لغة D بإنشاء بيئة تشغيل ومكتبة قياسية بديلة تُسمى Tango، كبديل لـ Phobos، بيئة التشغيل والمكتبة القياسية الرسمية للغة D. صدر الإعلان الرسمي الأول عن Tango بعد أيام من إصدار D 1.0. [ 33 ] تبنت Tango أسلوب برمجة مختلفًا، حيث تبنت البرمجة الكائنية التوجه (OOP) والنمطية العالية. وباعتبارها مشروعًا يقوده المجتمع، كانت Tango أكثر انفتاحًا على المساهمات، مما سمح لها بالتقدم بشكل أسرع من المكتبة القياسية الرسمية. في ذلك الوقت، كانت Tango وPhobos غير متوافقتين بسبب اختلاف واجهات برمجة التطبيقات (APIs) الخاصة بدعم بيئة التشغيل (مثل جامع البيانات المهملة، ودعم تعدد الخيوط، وما إلى ذلك). هذا جعل من المستحيل استخدام كلتا المكتبتين في نفس المشروع. وجود مكتبتين واسعتي الاستخدام يعني أن بعض الحزم البرمجية كانت تستخدم Phobos والبعض الآخر يستخدم Tango، مما أدى إلى عدم توافق بين المشاريع المختلفة. [ 34 ]

في يونيو 2007، صدرت النسخة الأولى من لغة D2. [ 35 ] مثّل بدء تطوير D2 بداية استقرار D1. وُضعت النسخة الأولى من اللغة في مرحلة الصيانة، حيث اقتصرت على تصحيح الأخطاء البرمجية وإصلاحها. أدخلت D2 تغييرات جذرية على اللغة، بدءًا من نظام الثوابت الأول . أضافت D2 لاحقًا العديد من الميزات الأخرى، مثل الإغلاقات ، والنقاء ، ودعم نماذج البرمجة الوظيفية والمتزامنة. كما حلت D2 مشاكل المكتبة القياسية بفصل وقت التشغيل عنها. أُعلن عن اكتمال منفذ D2 Tango في فبراير 2012. [ 36 ]

وقد مثّل إصدار كتاب أندريه ألكسندرسكو " لغة البرمجة D" في 12 يونيو 2010، استقرار D2، والتي يشار إليها اليوم بشكل شائع باسم "D" فقط.

في يناير 2011، انتقل تطوير لغة D من نظام تتبع الأخطاء/إرسال التصحيحات إلى منصة GitHub . وقد أدى ذلك إلى زيادة كبيرة في المساهمات في المترجم ووقت التشغيل والمكتبة القياسية. [ 37 ]

في ديسمبر 2011، أعلن أندريه ألكسندرسكو أن D1، الإصدار الأول من اللغة، سيتم إيقافه في 31 ديسمبر 2012. [ 38 ] وكان الإصدار الأخير من D1، D v1.076، في 31 ديسمبر 2012. [ 39 ]

تم إصدار شفرة مُصرّف لغة D الرسمي، مُصرّف Digital Mars D من تطوير والتر برايت، في الأصل بموجب ترخيص خاص ، ما جعله متاحًا كمصدر ، ولكنه لم يكن متوافقًا مع تعريف المصادر المفتوحة . [ 40 ] في عام 2014، أُعيد ترخيص واجهة المُصرّف الأمامية كمصدر مفتوح بموجب ترخيص Boost Software License . [ 3 ] استثنى هذا الترخيص الجديد الواجهة الخلفية، التي طُوّرت جزئيًا في شركة Symantec . في 7 أبريل 2017، أُتيح المُصرّف بالكامل بموجب ترخيص Boost License بعد أن سمحت Symantec بإعادة ترخيص الواجهة الخلفية أيضًا. [ 4 ] [ 41 ] [ 42 ] [ 43 ] في 21 يونيو 2017، قُبلت لغة D لإدراجها في مُجمّع GCC. [ 44 ]

التطبيقات

معظم تطبيقات لغة D الحالية تُترجم مباشرة إلى لغة الآلة .

برامج تجميع جاهزة للإنتاج:

  • DMD - مُصرّف لغة D من Digital Mars، من تطوير والتر برايت، هو مُصرّف لغة D الرسمي، وهو مفتوح المصدر بموجب ترخيص Boost Software License . [ 3 ] [ 4 ] تتشارك GDC (الموجودة الآن في GCC) وLDC واجهة DMD الأمامية لتحسين التوافق بين المُصرّفات. في البداية، كُتبت الواجهة الأمامية بلغة C++، ولكن معظمها الآن مكتوب بلغة D نفسها (استضافة ذاتية). تعتمد الواجهة الخلفية ومُحسِّنات كود الآلة على مُصرّف Symantec. في البداية، كان يدعم فقط معالجات x86 ذات 32 بت، ثم أضاف والتر برايت دعمًا لمعالجات amd64 وPowerPC ذات 64 بت.
قال برايت في عام 2020: "أكبر مشروع هو تنفيذ مُصرّف لغة D نفسه بلغة D بنسبة 100%". [ 45 ] تم نقل الواجهة الخلفية ومعظم المُصرّف بالكامل من لغة C++ إلى لغة D من أجل بدء التشغيل الكامل .
  • قامت مجموعة مترجمات جنو ( GCC ) بدمج GDC [ 46 ] في GCC 9 بتاريخ 29 أكتوبر 2018. [ 47 ] صدرت أولى النسخ العاملة من GDC مع GCC، والمبنية على GCC 3.3 وGCC 3.4 على معالجات x86 32 بت على أنظمة Linux وmacOS [ 48 ] ، بتاريخ 22 مارس 2004. ومنذ ذلك الحين، اكتسبت GDC دعمًا لمنصات إضافية، وحسّنت الأداء، وأصلحت الأخطاء، مع مواكبة كود DMD الأصلي للواجهة الأمامية ومواصفات اللغة. [ 49 ]
  • LDC – مُصرّف يعتمد على واجهة DMD الأمامية ويستخدم LLVM كواجهة خلفية للمُصرّف. نُشرت أول نسخة جاهزة للاستخدام في 9 يناير 2009. [ 50 ] وهو يدعم الإصدار 2.0. [ 51 ]

برامج تجميعية تجريبية وإثبات المفهوم:

  • مُجمِّع لغة D لـ .NET – واجهة خلفية لمُجمِّع لغة البرمجة D 2.0. [ 52 ] [ 53 ] يقوم هذا المُجمِّع بتحويل الشفرة إلى بايت كود لغة وسيطة مشتركة (CIL) بدلاً من شفرة الآلة. ويمكن تشغيل CIL عبر آلة افتراضية للبنية التحتية للغة المشتركة (CLI) . لم يتم تحديث المشروع منذ سنوات، وأشار مُطوِّره إلى أنه غير نشط حاليًا.
  • يستخدم مُصرّف SDC – The Snazzy D Compiler [ 54 ] واجهة أمامية مُخصصة و LLVM كخلفية للمُصرّف. وهو مكتوب بلغة D ويستخدم مُجدولًا لمعالجة حلّ الرموز لميزات وقت الترجمة في لغة D. يدعم هذا المُصرّف حاليًا مجموعة فرعية محدودة من اللغة. [ 55 ] [ 56 ]

باستخدام المترجمات وسلاسل الأدوات المذكورة أعلاه، يُمكن ترجمة برامج D لاستهداف العديد من البنى المختلفة، بما في ذلك IA-32 و amd64 و AArch64 و PowerPC و MIPS64 و DEC Alpha و Motorola m68k و SPARC و s390 و WebAssembly . أنظمة التشغيل المدعومة بشكل أساسي هي Windows و Linux ، ولكن تدعم بعض المترجمات أيضًا Mac OS X و FreeBSD و NetBSD و AIX وSolaris / OpenSolaris و Android ، سواءً كنظام مضيف أو هدف، أو كليهما. يمكن لهدف WebAssembly (المدعوم عبر LDC وLLVM) العمل في أي بيئة WebAssembly، مثل متصفحات الويب الحديثة ( Google Chrome و Mozilla Firefox و Microsoft Edge و Apple Safari )، أو الآلات الافتراضية المخصصة لـ WebAssembly.

أدوات التطوير

تشمل محررات النصوص وبيئات التطوير المتكاملة (IDEs) التي تدعم تمييز بناء الجملة وإكمال التعليمات البرمجية الجزئي للغة SlickEdit و Emacs و vim و SciTE و Smultron و Zeus، [ 57 ] و Geany من بين أمور أخرى. [ 58 ]

  • Dexed (المعروف سابقًا باسم Coedit)، [ 59 ] بيئة تطوير متكاملة رسومية تركز على لغة D، مكتوبة بلغة Object Pascal
  • Mono-D [ 60 ] هو بيئة تطوير متكاملة رسومية غنية بالميزات ومتعددة المنصات تركز على لغة D، وتعتمد على MonoDevelop / Xamarin Studio، ومكتوبة بشكل أساسي بلغة C#. [ 61 ]
  • تتضمن إضافات Eclipse للغة D كلاً من DDT ​​[ 62 ] و Descent (مشروع متوقف). [ 63 ]
  • يتم توفير التكامل مع Visual Studio بواسطة VisualD. [ 64 ] [ 65 ]
  • التكامل مع Visual Studio Code باستخدام ملحقات مثل Dlang-Vscode [ 66 ] أو Code-D. [ 67 ]
  • تتوفر حزمة برمجية لـ TextMate ، ويتضمن بيئة التطوير المتكاملة Code::Blocks دعمًا جزئيًا للغة. مع ذلك، لا تتوفر ميزات بيئة التطوير المتكاملة القياسية، مثل إكمال التعليمات البرمجية أو إعادة هيكلة الكود ، حتى الآن، على الرغم من أنها تعمل جزئيًا في Code::Blocks (نظرًا لتشابه لغة D مع لغة C).
  • تتيح إضافة Xcode 3 "D for Xcode" إمكانية إنشاء المشاريع وتطويرها باستخدام لغة D. [ 68 ]
  • يتوفر ملحق الإكمال التلقائي لبرنامج KDevelop (وكذلك برنامج تحرير النصوص الخلفي الخاص به، Kate). [ 69 ]
  • بيئة تطوير Dlang هي بيئة تطوير متكاملة متعددة المنصات مكتوبة بلغة D باستخدام مكتبة DlangUI. [ 70 ]

توجد بيئات تطوير متكاملة مفتوحة المصدر للغة D لنظام التشغيل Windows ، بعضها مكتوب بلغة D، مثل Poseidon، [ 71 ] و D-IDE، [ 72 ] وEntice Designer. [ 73 ]

يمكن تصحيح تطبيقات D باستخدام أي مصحح أخطاء C/C++، مثل GNU Debugger (GDB) أو WinDbg ، على الرغم من أن دعم العديد من ميزات لغة D محدود للغاية. في نظام Windows، يمكن تصحيح برامج D باستخدام Ddbg ، أو أدوات تصحيح الأخطاء من Microsoft (WinDBG وVisual Studio)، بعد تحويل معلومات التصحيح باستخدام cv2pdb . يوفر مصحح الأخطاء ZeroBUGS لنظام Linux، المؤرشف بتاريخ 23 ديسمبر 2017 في Wayback Machine، دعمًا تجريبيًا للغة D. يمكن استخدام Ddbg مع بيئات التطوير المتكاملة (IDEs) المختلفة أو من سطر الأوامر؛ بينما يمتلك ZeroBUGS واجهة مستخدم رسومية خاصة به .

DustMite هي أداة لتقليل حجم كود المصدر D، وهي مفيدة عند اكتشاف مشاكل المترجم أو الاختبارات. [ 74 ]

يُعد dub مدير حزم وبناء شائع لتطبيقات ومكتبات D، وغالبًا ما يتم دمجه في دعم بيئة التطوير المتكاملة (IDE). [ 75 ]

الاستخدامات

ومن بين المنظمات البارزة التي تستخدم لغة البرمجة D في مشاريعها : فيسبوك ، [ 76 ] وإيباي ، [ 77 ] ونتفليكس . [ 78 ]

تم استخدام D بنجاح في ألعاب AAA ، [ 79 ] ومترجمات اللغات، والآلات الافتراضية، [ 80 ] [ 81 ] ونواة نظام التشغيل ، [ 82 ] وبرمجة وحدة معالجة الرسومات، [ 83 ] وتطوير الويب ، [ 84 ] [ 85 ] والتحليل العددي ، [ 86 ] وتطبيقات واجهة المستخدم الرسومية ، [ 87 ] [ 88 ] ونظام معلومات الركاب ، [ 89 ] والتعلم الآلي، [ 90 ] ومعالجة النصوص، وخوادم الويب والتطبيقات، والبحوث.

استغلت مجموعة القرصنة الكورية الشمالية لازاروس الثغرة CVE-2021-44228، والمعروفة أيضًا باسم " Log4Shell "، لنشر ثلاث عائلات من البرامج الضارة المكتوبة بلغة DLang. [ 91 ]

نقد

يُشير مقالٌ نُشر على مدونة [ 92 ] بقلم أحد المساهمين السابقين إلى افتقار عملية التطوير للمرونة وصعوبة إدخال تغييرات على لغة D. وقد أدّى الإحباط الواضح الذي ذُكر هناك إلى ظهور نسخة مُعدّلة من OpenD [ 93 ] في 1 يناير 2024.

انظر أيضاً

مراجع

  1. 1 2 "سجل تغييرات لغة البرمجة D حتى 7 نوفمبر 2005" . لغة البرمجة D 1.0 . ديجيتال مارس . تم الاطلاع عليه في 1 ديسمبر 2011 .
  2. "سجل التغييرات: 2.112.0" . 7 يناير 2026.
  3. 1 2 3 "تم تحويل واجهة dmd الأمامية الآن إلى ترخيص Boost" . تم الاطلاع عليه في 9 سبتمبر 2014 .
  4. 1 2 3 "تحويل الواجهة الخلفية لـ dmd إلى ترخيص Boost" . 7 أبريل 2017. تم الاطلاع عليه في 9 أبريل 2017 .
  5. "الأسئلة الشائعة حول D 2.0" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  6. "لغة البرمجة D - Fileinfo.com" . تم الاطلاع عليه بتاريخ 15 نوفمبر 2020 .
  7. "لغة البرمجة D - dlang.org" . تم الاطلاع عليه بتاريخ 15 نوفمبر 2020 .
  8. "On: Show HN: A nice C string API" . Hacker News . 3 ديسمبر 2022. تم الاطلاع عليه في 4 ديسمبر 2022 .
  9. ↑ ألكسندريسكو ، أندريه (2010). لغة البرمجة D ( الطبعة الأولى). أبر سادل ريفر، نيو جيرسي: أديسون-ويسلي. ص 314. ISBN   978-0321635365.
  10. "بناء دالة assert() في لغة Swift، الجزء 2: __FILE__ و __LINE__" . مؤرشف من الأصل في 6 أكتوبر 2014.
  11. "مقدمة - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 21 أبريل 2024 . تتضمن هذه المقالة نصًا من هذا العمل المجاني . مرخص بموجب ترخيص BSL-1.0 ( بيان الترخيص/الإذن ).
  12. "سلاسل D مقابل سلاسل C++" . ديجيتال مارس. 2012.
  13. "أنواع البيانات المركبة في لغة D و std::complex في لغة C++" . ديجيتال مارس . 2012. مؤرشف من الأصل في 13 يناير 2008. تم الاطلاع عليه في 4 نوفمبر 2021 .
  14. "تعبيرات" . ديجيتال مارس . تم الاسترجاع في 27 ديسمبر 2012 .
  15. "std.gc" . لغة البرمجة D 1.0 . ديجيتال مارس . تم الاطلاع عليه في 6 يوليو 2010 .
  16. "إدارة الذاكرة" . لغة البرمجة D 2.0 . ديجيتال مارس . تم الاطلاع عليه بتاريخ 17 فبراير 2012 .
  17. 1 2 "اسلك طريقك الخاص (الجزء الأول: المكدس)" . مدونة دي . 7 يوليو 2017. تم الاطلاع عليه في 7 مايو 2020 .
  18. "السمات - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 7 مايو 2020 .
  19. "std.experimental.allocator - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 7 مايو 2020 .
  20. بارتوش ميليفسكي. "SafeD – لغة برمجة D" . تم الاطلاع عليه بتاريخ 17 يوليو 2014 .
  21. ستيفن شفيغوفر (28 سبتمبر 2016). "كيفية كتابة كود @trusted في لغة D" . تم الاطلاع عليه في 4 يناير 2018 .
  22. "المؤشرات ذات النطاق المحدد" . جيت هاب . 3 أبريل 2020.
  23. "مراجع مختومة" .
  24. "مواصفات لغة D: الدوال - معلمات نطاق الإرجاع" .
  25. "الملكية والاقتراض في D" . 15 يوليو 2019.
  26. "مواصفات لغة D: الدوال - فئات تخزين معلمات الدوال" .
  27. "PyD" . GitHub . 7 مايو 2020. تم الاطلاع عليه في 7 مايو 2020 .
  28. باركر، مايك. "حزمة derelict-lua على DUB" . سجل حزم DUB . تم الاسترجاع في 7 مايو 2020 .
  29. باركر، مايك. "حزمة bindbc-lua على DUB" . سجل حزم DUB . تم الاسترجاع في 7 مايو 2020 .
  30. "Better C" .
  31. "سجل تغييرات لغة البرمجة D" . لغة البرمجة D 1.0 . ديجيتال مارس . تم الاطلاع عليه بتاريخ 11 يناير 2012 .
  32. "مقدمة" . لغة البرمجة D 1.0 . ديجيتال مارس . تم الاطلاع عليه في 1 ديسمبر 2011 .
  33. "الإعلان عن مكتبة جديدة" . تم الاطلاع عليه بتاريخ 15 فبراير 2012 .
  34. "Wiki4D: Standard Lib" . تم الاطلاع عليه بتاريخ 6 يوليو 2010 .
  35. "سجل التغييرات - لغة البرمجة D" . لغة البرمجة D 2.0 . مؤسسة لغة D. تم الاطلاع عليه بتاريخ 22 نوفمبر 2020 .
  36. "Tango for D2: All user modules ported" . تم الاطلاع عليه بتاريخ 16 فبراير 2012 .
  37. والتر برايت. "ردًا على: جيت هاب أم دي سورس؟" . تم الاطلاع عليه بتاريخ 15 فبراير 2012 .
  38. أندريه ألكسندرسكو. "سيتم إيقاف إنتاج D1 في 31 ديسمبر 2012" . تم الاطلاع عليه في 31 يناير 2014 .
  39. "سجل تغييرات لغة البرمجة D" . لغة البرمجة D 1.0 . ديجيتال مارس . تم الاطلاع عليه بتاريخ 31 يناير 2014 .
  40. "backendlicense.txt" . شفرة مصدر DMD . GitHub. مؤرشف من الأصل في 25 مارس 2026. تم الاطلاع عليه في 5 مارس 2012 .
  41. "تعليق على موقع Reddit بقلم والتر برايت" . 5 مارس 2009. تم الاطلاع عليه في 9 سبتمبر 2014 .
  42. ^ D-Compiler-unter-freier-Lizenz على linux-magazin.de (2017، باللغة الألمانية)
  43. قم بتغيير الواجهة الخلفية إلى Boost License #6680 من Walter Bright على github.com
  44. تم قبول اللغة D لإدراجها في دول مجلس التعاون الخليجي
  45. برايت، والتر (26 مايو 2020). "ردًا على: جهاز داف" . هاكر نيوز . تم الاطلاع عليه في 6 أبريل 2025 .
  46. "GDC" .
  47. "سلسلة إصدارات GCC 9 - التغييرات والميزات الجديدة والإصلاحات - مشروع جنو - مؤسسة البرمجيات الحرة (FSF)" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 7 مايو 2020 .
  48. "واجهة أمامية أخرى لـ GCC" . forum.dlang.org . تم الاطلاع عليه بتاريخ 7 مايو 2020 .
  49. "تغييرات سلسلة إصدارات GCC 9، والميزات الجديدة، والإصلاحات" .
  50. "مشروع مُصرّف LLVM D على GitHub" . GitHub . تم الاطلاع عليه بتاريخ 19 أغسطس 2016 .
  51. "BuildInstructionsPhobosDruntimeTrunk – ldc – D Programming Language – Trac" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  52. "مشروع D .NET على CodePlex" . مؤرشف من الأصل بتاريخ 26 يناير 2018. تم الاطلاع عليه بتاريخ 3 يوليو 2010 .
  53. جوناثان ألين (15 مايو 2009). "المصدر الخاص بمترجم D.NET متاح الآن" . InfoQ . تم الاطلاع عليه في 6 يوليو 2010 .
  54. "اجعل SDC مُصرّف Snazzy D" . GitHub . تم الاطلاع عليه بتاريخ 24 سبتمبر 2023 .
  55. مؤتمر DConf 2014: SDC، مُترجم لغة D كمكتبة، بقلم أموري سيشيه . يوتيوب . تم الاطلاع عليه بتاريخ 8 يناير 2014 .مؤرشف في أرشيف الأشباحوآلة Wayback
  56. ^ "ديدالنيكس/SDC" . جيثب . تم الاسترجاع 8 يناير 2014 .
  57. "Wiki4D: EditorSupport/ZeusForWindows" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  58. "Wiki4D: دعم المحرر" . تم الاطلاع عليه بتاريخ 3 يوليو 2010 .
  59. "Basile.B / dexed" . GitLab . تم الاطلاع عليه بتاريخ 29 أبريل 2020 .
  60. "Mono-D - D Wiki" . wiki.dlang.org . تم الاطلاع عليه بتاريخ 30 أبريل 2020 .
  61. "Mono-D – دعم D لـ MonoDevelop" . مؤرشف من الأصل في 1 فبراير 2012. تم الاطلاع عليه في 11 أغسطس 2015 .
  62. "استضافة مشاريع جوجل" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  63. "النزول" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  64. "لغة البرمجة المرئية ثنائية الأبعاد" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  65. شوتزه، راينر (17 أبريل 2020). "rainers/visuald: Visual D - إضافة Visual Studio للغة البرمجة D" . github.com . تم الاطلاع عليه في 30 أبريل 2020 .
  66. "dlang-vscode" . GitHub . تم الاطلاع عليه بتاريخ 21 ديسمبر 2016 .
  67. "code-d" . GitHub . تم الاطلاع عليه بتاريخ 21 ديسمبر 2016 .
  68. "ميشيل فورتين - D لـ Xcode" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  69. "Dav1dde/lumen" . GitHub . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  70. مايكل، باركر (7 أكتوبر 2016). "تسليط الضوء على المشروع: DlangUI" . مدونة D. تم الاطلاع عليه بتاريخ 12 سبتمبر 2024 .
  71. "بوسيدون" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  72. "Mono-D – دعم D لـ MonoDevelop" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  73. "Entice Designer – Dprogramming.com – لغة البرمجة D" . تم الاطلاع عليه بتاريخ 11 أغسطس 2015 .
  74. "ما هو عث الغبار؟" . جيت هاب . تم الاطلاع عليه بتاريخ 29 أبريل 2020 .
  75. "dlang/dub: نظام إدارة الحزم والبناء للغة D" . GitHub . تم الاطلاع عليه بتاريخ 29 أبريل 2020 .
  76. "نظرة معمقة: warp، معالج مسبق سريع للغتين C و C++" . 28 مارس 2014. تم الاطلاع عليه في 4 يناير 2018 .
  77. "أدوات سطر أوامر أسرع في لغة D" . 24 مايو 2017. تم الاطلاع عليه في 4 يناير 2018 .
  78. مدونة، قسم التكنولوجيا في نتفليكس (2 أغسطس 2017). "تقديم Vectorflow" . موقع Medium . تاريخ الاطلاع: 4 يناير 2018 .
  79. "Quantum Break: AAA Gaming With Some D Code" . تم الاطلاع عليه بتاريخ 4 يناير 2018 .
  80. "آلة جافا سكريبت الافتراضية من هيغز" . جيت هاب . تم الاطلاع عليه في 4 يناير 2018 .
  81. "تنفيذ AD للغة البرمجة ECMA 262 (جافا سكريبت)" . GitHub . تم الاطلاع عليه في 4 يناير 2018 .
  82. "أبرز ما في المشروع: نواة PowerNex" . 24 يونيو 2016. تم الاطلاع عليه في 4 يناير 2018 .
  83. "DCompute: تشغيل D على وحدة معالجة الرسومات" . 30 أكتوبر 2017. تم الاطلاع عليه في 4 يناير 2018 .
  84. "vibe.d - مجموعة أدوات عالية الأداء للإدخال/الإخراج غير المتزامن، والتزامن، وتطبيقات الويب مكتوبة بلغة D" . تم الاطلاع عليه بتاريخ 4 يناير 2018 .
  85. "تسليط الضوء على المشروع: إطار عمل Diamond MVC" . 20 نوفمبر 2017. تم الاطلاع عليه في 4 يناير 2018 .
  86. "العمر العددي لـ D: Mir GLAS أسرع من OpenBLAS و Eigen" . تم الاطلاع عليه بتاريخ 4 يناير 2018 .
  87. "حول تيليكس ودي: مقابلة مع جيرالد نان" . 11 أغسطس 2017. تم الاطلاع عليه في 4 يناير 2018 .
  88. "تسليط الضوء على المشروع: DlangUI" . 7 أكتوبر 2016. تم الاطلاع عليه في 4 يناير 2018 .
  89. "أبرز مشاريع: فانكويرك" . 28 يوليو 2017. تم الاطلاع عليه بتاريخ 4 يناير 2018 .
  90. "Netflix/vectorflow" . GitHub.com . Netflix, Inc. 5 مايو 2020. تم الاطلاع عليه في 7 مايو 2020 .
  91. "قراصنة لازاروس ينشرون برمجية خبيثة جديدة للتحكم عن بُعد باستخدام ثغرة في Log4j عمرها سنتان" . ١١ ديسمبر ٢٠٢٣. تم الاطلاع عليه بتاريخ ١١ ديسمبر ٢٠٢٣ .
  92. "أبحرت سفينة تحمل أدوات مائدة فضية" . تم الاطلاع عليه بتاريخ 6 مايو 2024 .
  93. "لغة برمجة OpenD" . تم الاطلاع عليه بتاريخ 14 مايو 2024 .

للمزيد من القراءة

  • ألكسندريسكو، أندريه (4 يناير 2010). لغة البرمجة D (  الطبعة الأولى). أديسون-ويسلي بروفيشنال. ISBN 978-0-321-63536-5.
  • ألكسندريسكو، أندريه (15 يونيو 2009). "قضية د" . مجلة الدكتور دوب.
  • برايت، والتر (8 أبريل 2014). "كيف بدأتُ بكتابة حرف D" . مجلة دكتور دوبز.
  • Çehreli, Ali (1 فبراير 2012). "البرمجة بلغة D" .(موزع بموجب ترخيص CC-BY-NC-SA). يُعلّم هذا الكتاب البرمجة للمبتدئين، ولكنه يغطي أيضاً العديد من المواضيع المتقدمة في لغة D.
  • ميتز، كيد (7 يوليو 2014). "لغة البرمجة الكبيرة التالية التي لم تسمع بها من قبل" . وايرد .
  • روب ، آدم (مايو 2014). كتاب الطبخ د (1  ed.). باكت للنشر. رقم ISBN 978-1-783-28721-5.