دي (لغة برمجة)
المحتويات
- البرمجة
- }
- تناول السلسلة
- }
- }
- المثال 1
- {
- دي دوك
- التطبيق
- }
- pragma(msg, Format!("9! = %s", fact_9));
- إدارة الذاكرة
- التفاعل مع النظم الأخرى
- البرمجة الأعلى
- {
- دي 2.0
- import tango.io.Stdout;
- }
- أدوات التطوير
- Digital Mars
- {
- signature2words[line.tolower.sort] ~= line.dup;
- const fact_7 = Factorial!(7);
- المثال 2
- التزامن
- int[] a2 = [6,7,8,9];
- {
- القائمة على الكائن
- int[] a2 = [6,7,8,9];
- الوظيفية
- tid.send("hello"); // send a string
- import std.stdio: writefln;
- else
- {
- }
- bool cont = true;
- الدعم غير المحدود للمكتبات المشاركة/ الحركية
- الأمرية
- الإصدارات
- دي 1.0
- {
- string[][string] signature2words;
- تقسيم المكتبة القياسية
- المميزات
- {
- Wiki4D
- const fact_9 = factorial(9);
- receive( // pattern matching

تعريفًا بالموضوع، دي هي لغة برمجة كائنية التوجه، وأمرية، وتدعم نماذج برمجية متعددة صممها والتر برايت في ديجيتال مارس. وقد أنشئت هذه اللغة باعتبارها إعادة هندسية للغة سي++، لكنها مع كونها متأثرة على نطاق كبير بهذه اللغة فإنها ليست فرع لـسي++. وقد أعادت دي تصميم بعض ميزات سي++ وكانت متأثرة بالمفاهيم المستعملة في لغات البرمجة الأخرى، مثل جافا، وبايثون، وروبي، وسي شارب، وإيفيل. وتعرض الأقسام التالية جوانب أخرى من الموضوع.
البرمجة
وفي هذا الصدد، تدعم لغة دي خمسة نماذج برمجة رئيسية وهي الأمرية والكائنية والبرمجة العلياوالوظيفية والتزامن.
}
- auto result = reduce!(mysum)( chain(a1, a2) ); // passing a delegate (closure)
- writeln("Result: ", result); // output is "15"
- return 0;
- }
تناول السلسلة
علاوةً على ذلك، تمتعت اللغة ثلاثة أنواع حروف مميزة وهي (حرف char، حرف و wchar، وحرف د dchar) وثلاثة كنيات مسلسلة (وهي السلسلة، سلسلة و، وسلسلة د، التي هي ببساطة مجموعات ديناميكية من السابقة) والتي تقدم وحدات شفرات وسلاسل UTF-8, UTF-16 ,UTF-32 على التوالي. ولأسباب متعلقة بالأداء، فإن تشريح السلسلة والخاصية الطويلة يعملان على وحدات التشفير أكثر من نقاط التشفير (الأحرف)، والتي تجعل المطورين مضطربين باستمرار. ولأن كل من UTF-8 و UTF-16 عبارة عن فك شفرات حرفية متباينة الطول، فإن الوصول باستخدام مؤشر نقطة التشفير في وقت ثابت ليس ممكنا بدون الحفاظ على جداول بحث إضافية. إن الشفرة التي تحتاج إلى وصول عشوائي سريع لنقاط التشفير سوف تحول السلاسل إلى UTF-32 أولا، أو استخدام جداول البحث. بأي حال فإن ذلك كذلك أمرا صحيحا بالنسبة للغات البرمجة الأخرى الداعمة لفك الشفرات Unicode مثل جافا وسي شارب اللتان تستعملان UTF-16، وهكذا فغنهما قد تحتاجا إلى أزواج بديلة لتمثيل بعض نقاط التشفير.
أمثلة
}
من جانب آخر، وفي المثالين التاليين، فإن كلا من القالب والوظيفة المحددان عاليه يستعملان لحساب المضاعفات. إن أنواع الثوابت ليست بحاجة إلى وضوح محدد كما هو حال المصرف في استنباط أنواعها من الجوانب اليمنى للواجبات:
}
مولد وثائق
ومن جهة أخرى، إن كل من تولوير tolower والمشترك وظيفتين متسلسلتين تسمح دي باستخدامهما بمنهج بنيوي، وأسماءهم تشبه عادة طرق تسلسل بايثون. ويحول تولوير tolower سلسلة ASCII إلى حالة أدنى وتقوم المشترك join (" ") بجمع مجموعة من السلاسل في سلسلة واحدة باستخدام مسافة واحدة كفاصل.
من جهة ثانية، وتحدد الفوريتش foreach الثانية (لغة لكل من) قيم المجموعة المترابطة، وهي قادرة على استنتاج نوع الكلمات.
من جانب آخر، نوع التوقيع على الكلمات عبارة عن مجموعة مترابطة داخليا تخطط سلسلة المفاتيح لمجموعات السلاسل. وهو شبيه (بالقائمة) المبدئية في بايثون Python.
من جانب آخر، يقوم ملف المخزنة بوضع السطور ببطء، دون سطورها الجديدة، لأن أداء السطر الذي تضعه يكون مجرد منظر على سلسلة، لذلك يجب نسخه مكررا ليكون له نسخة مسلسلة فعلية والتي يمكن استخدامها لاحقا (إن ازدواج خاصية المجموعات يحقق ازدواجا في المجموعات نفسها).
في هذا الإطار، تفرز خاصية الفرز المجموعة القائمة، وتكون توقيعا فريدا للكلمات التي تشكل الجناس التصحيحي لبعضها البعض.
يلحق مشغل ~= سلسلة جديدة للقيم التي تربط المجموعة.
المثال 1
علاوةً على ذلك، إن هذا البرنامج المثالي يطبع سطر أمر معطياته. وتكون وظيفته الأساسية هي نقطة إدخال برنامج دي، وأرجات args هي مجموعة من السلاسل التي تمثل معطيات سطر الأمر. والسلسلة في دي هي مجموعة من الأحرف، والممثلة من خلال الحرف [] في دي 1.0 أو (حرف) [] غير قابل للتغيير في أبجدية دي 2.0. بأي حال فإن الإصدارات الأحدث للغة تعرف السلسلة باعتبارها كنية عن الحرف[] أو (حرف) [] غير قابل للتغيير، ومن الضروري هنا وجود تعريف كنية واضحة للتوافق مع الإصدارات الأقدم
{
foreach (i, arg; args)
writefln("args[%d] = '%s'", i, arg);
دي دوك
في هذا الإطار، دي دوك هو جزء من مولدات الوثائق للغة البرمجة دي وقد قام بتصميمه برايت والتر. فإن تركيزه ينصب على أن يكون قادر على كتابة وثائق في تعليقات الرموز البرمجية في أسلوب الطبيعية، والتقليل من الحاجة إلى توصيف العلامات وبالتالي تحسين وضوح رمز التعليقات. والأمر مشابه في مفهوم إلى دي أكسجين وJavadoc.
- المراجع
- قراءات أخرى
- وصلات خارجية
التطبيق
في هذا الإطار، التشفير الرقمي المحلي Local Digital Coding (LDC) وهو مصرف يقوم على النهاية الأمامية لمصرف دي ديجيتال مارس الذي يستعمل LLVM باعتبارها المصرف ذو النهاية الخلفية لها. وقد نشرت أول نسخة ذات جودة في 9 يناير 2009. وهي تصرف الإصدار 1.0 فحسب.
وفي هذا الصدد، جي دي سي GDC وهو النهاية الأمامية للنهاية الخلفية لجي سي سي GCC، وهو مبني بحيث يستعمل الشفرة الأصلية المفتوحة لمصرف دي ديجيتال مارس. كما تدعم اللقطات المطورة إصدار دي رقم 2.0.
علاوةً على ذلك، مصرف دي ديجيتال مارس DMD مصرف دي ديجيتال مارس هو المصرف الرسمي من قبل ولتر برايت. إن المصرف ذو النهاية الأمامية مرخص له من قبل كل من ذي أرتيستيك ليسنس the Artistic License و GNU GPL؛ ومن هنا يتم توزيع الشفرة الأصلية للنهاية الأمامية بامتداد ثنائيات المصرف. وتكون الشفرة الأصلية للنهاية الخلفية للمصرف متاحة لكن ليس وفق رخصة أصلية مفتوحة. وتطبق إصداري 1.0 و2.0.
ومن جهة أخرى، مصرف لغة دي لدوت نت وهو النهاية الخلفية لمصرف لغة برمجة دي 2.0. وهو يصرف الشفرة للشفرة الثمانية ل CIL بدلا من الشفرة الآلية. ومن ثم فيمكن لـ CIL أن يجري تشغيله من خلال الآلة الظاهرية لـ CLR.
ومن ناحية أخرى، إن أغلب التطبيقات الحالية لD تصرف مباشرة في الشفرة الآلية من أجل التنفيذ الكفء.
}
من جهة ثانية، وهنا فإن استخدام إذا الثابتة، وهي البنية الشرطية لتصريف الوقت في لغة دي، يظهر لبناء قالب يقوم بنفس الحساب باستخدام الشفرة التي تشبه الوظيفة المذكورة عاليه:
template Factorial(ulong n)
pragma(msg, Format!("9! = %s", fact_9));
ومن جهة أخرى، إن سلسلة الفئات Mixins، بالترافق مع تنفيذ وظيفة تصريف الوقت، تسمح بتوليد شفرة دي باستخدام عمليات مسلسلة عند وقت التصرف. ويمكن أن يستعمل ذلك لتحليل اللغات محددة النطاق لشفرة دي، والتي سيتم التصرف فيها كجزء من البرنامج
- import std.algorithm, std.range, std.stdio;
- int main
- {
- int[] a1 = [0,1,2,3,4,5,6,7,8,9];
إدارة الذاكرة
إضافةً إلى ذلك، تدار الذاكرة في الغالب باستخدام المجموعة المهملة، لكن الكائنات المحددة يمكن اتمامها على الفور عندما تخرج عن النطاق. ويمكن تقديم إدارة مميزة للذاكرة باستخدام مشغلات الحمولة الزائدة الجديدة والملغاة، ومن خلال استدعاء تخصيص تناول البث المتعددة Multicast Address Allocation والحر ل C مباشرة.
كذلك، ويمكن التحكم في المجموعة المهملة: ويمكن للمبرمجين أن تضيف وتستبعد نطاقات ذاكرة من كونها ملاحظة من قبل الجامع، ويمكن أن تعطل وتمكن الجامع وتجبر حدوث دورة مجموعة توليدية أو كاملة. ويقدم الدليل أمثلة كثيرة على كيفية تطبيق نظم ذاكرة مختلفة للغاية عندما تكون المجموعة المهملة غير كافية في البرنامج.
التفاعل مع النظم الأخرى
وفي هذا السياق، إن واجهة التطبيق الثنائية لـ ليست مدعومة بالكامل، بالرغم من أنه يمكن لدي أن تستعمل شيفرة المكتوبة لواجهة التطبيق الثنائية لسي. ويفهم محلل دي خارجي يستدعي اتفاقا من أجل صلة محدودة بكائنات ، لكنه لا يطبق إلا في D 2.0.
من جهة ثانية، إن واجهة التطبيق الثنائية لسي (ABI) مدعومة كذلك كجميع الأنواع الأساسية والمشتقة، وتمكن من الوصول المباشر إلى شيفرة ومكتبات سي الموجودة. إن مكتبة سي القياسية هي جزء من المعيار دي.
البرمجة الأعلى
ulong factorial(ulong n)
وفي هذا السياق، تدعم البرمجة الأعلى مجموعة من القوالب، وتنفيذ وظيفة تصريف الوقت، التتابعات tuples، وسلسلة الفئات. وتظهر النماذج التالية بعضا من مميزات تصريف الوقت في لغة دي.
إضافةً إلى ذلك، ويمكن أن تكون القوالب في لغة دي مكتوبة في أسلوب أكثر شبها بالوظيفة مقارنة بما هو عليه الحال في سي++. وهذه وظيفة منتظمة تحسب مضروب رقم ما:
{
- if (b <= pivot) // ref to enclosing-scope
- return a + b;
- else
- return a;
دي 2.0
بادئات تخزين شاملة كى سيكية لتشعب المخزون المحلي.
إضافةً إلى ذلك، تفرق دي بين الإحالات القابلة للتغيير والبيانات غير القابلة للتغيير، والإحالات الثابتة للبيانات القابلة للتغيير والمرافقات لما هو مذكور سلفا.
وعلى صعيد آخر، دعم الوظائف الصرفة التي لا يمكنها سوى استخدام البيانات غير القابلة للتغيير واستدعاء الوظائف الصرفة الأخرى. ويضمن ذلك أن الوظيفة الصرفة ليس لها آثار سلبية (تكون نفس المدخلات المرصوصة دائمة مسفرة عن نفس المخرجات، ولا توجد المخرجات إلى من خلال قيم العائد). ومع دعم الإغلاق الحقيقي فإن ذلك يسمح بوجود البرمجة الوظيفية في دي ويفتح كذلك الطرق النظرية أمام التشعب الآلي الآمن.
من جهة ثانية، مجموعة فرعية «آمنة» (D آمنة SafeD)، والتي لا يمكنها الولوج مباشرة إلى ذاكرة لا تخص العملية (ولا يمكن توفر سوى مجموعة محددة من القوالب والمؤشر الحسابي في مثل هذه الشفرة).
دعم فرض تصويب ثابت:
وفي السياق ذاته، دعم الإغلاقات «الحقيقية». ولا يمكن للإغلاقات السابقة أن تعاد بامان من الوظائف، لأن المتغيرات المخصصة المرصوصة ستصبح غير قابلة للوصول إليها.
- أن الكلمات الدالة الثابتة وغير القابلة للتغيير تكون متعدية.
- دعم محدود للوصل بالشفرة المكتوبة في .
- تكرار فوريتش (لكل من) foreach على المدى المحدد فحسب.
من جهة ثانية، التغيرات في مكتبة فوبوس Phobos بما فيها إضافات البرمجة الأعلى والبرمجة الوظيفية.
وفي هذا السياق، أدخل دي 2.0 مجموعة كبيرة من الخصائص الجديدة، بعضها افترق عن التوافق مع شفرة دي 1.0. وبعض هذه الخصائص ما يلي:
حرفيات وظيفة قالب.
وظائف عدم التخلص.
ومن جهة أخرى، عمليات متجهة، مثل a[] = b[] + c[] (الخلاصة العنصرية الذكية element-wise summation لمجموعتين متحركتين/ثابتتين، أو a[] = 3 (مضروب في 3 من كل مجموعة عناصر).
import tango.io.Stdout;
void main(char[][] args)
}
ومن جهة أخرى، يمكن لبيان الفوريتش أن يحدد أي مجموعة، وفي هذه الحالة فإنه ينتج مؤشرات مرتبة (i) وقيم (arg) من مجموعة أرجات args. إن المؤشر i والقيمة arg لهما أنواعهما المستنبطة من نوع المجموعة أرجات.
وباستخدام مكتبة تانجو فإن الشفرة السابقة ستكون كما يلي:
أدوات التطوير
وعلى صعيد آخر، هناك حزمة متاحة لإلكترونيات القرص المتكاملة لكل من تكست ميت وكود بلوكس Code::Blocks وتشمل الدعم الجزئي للغة. بأي حال فإن الميزات القياسية لإلكترونيات القرص المتكاملة مثل إكمال الشفرة أو إعادة التخصيم ليست متاحة بعد، بالرغم من أنها تعمل جزئيا في Code::Blocks (نظرا لتشابه لغة دي مع لغة سي).
كذلك، إن قائمة المحررين والقائمين على إلكترونيات القرص المتكاملة Integrated eDriv sElectronic (IDEs) الداعمون لدي تشمل من بين ما تشمل إكليبس Eclipse، ومايكروسوفت فيجوال ستوديو Microsoft Visual Studio، وسليك إديت SlickEdit، وإيماكس emacs، وفيم vim، وسايتي SciTE، وسملترون Smultron، وتكست ميت TextMate، وزيوس Zeus ,، وجيني Geany.
علاوةً على ذلك، وهناك قابسين من إصدار إكليبس مخصصين للغة دي، وهما ديسنت Descent (مشروع ميت) و DDT,.
علاوةً على ذلك، تدعم فيم vim كل من التركيز على الصياغة وإكمال الشفرة (من خلال بطاقات سي Ctags المدفوعة).
إضافةً إلى ذلك، وهناك قابس متاح لاكس كود XCode، وهو D for Xcode يمكن المشروعات القائمة على دي وتطويرها.
تكامل فيجوال ستوديو مقدم من قبل فيجوال دي VisualD.
مشكلات وقضايا جدلية
وعلى صعيد آخر، إضافة إلى ذلك هناك إلكترونيات القرص المتكاملة لدي مفتوحة المصدر (بعضها مكتوب في لغة دي نفسها)، مثل بوسيدون، Poseidon، وD-IDE, وإنتيس ديزينر Entice Designer. وهناك كذلك ألكترونيات القرص المتكاملة التجارية المتوفرة مثل بيئة تنمية بيتبروكس BITPROX Development Environment.
في هذا الإطار، ويمكن تنقيح تطبيقات دي باستخدام أي منقح لـ C / سي++ ، مثل GDB، أو WinDbg، بالرغم من أن دعم الميزات اللغوية المتعددة المحددة للغة دي محدودة للغاية. وفي ويندوز فإن برامج دي يمكن تنقيحها باستخدام Ddbg أو أدوات التنقيح لمايكروسوفت (WinDBG و Visual Studio)، وبعد تحويلها تستعمل المعلومات المنقحة cv2pdb. إن المنقح التجاري زيروبجس ZeroBUGS للينوكس كان له دعم تجريبي للغة دي. ويمكن أن يستعمل Ddbg مع إلكترونيات قرص متكاملة متنوعة أو من سطر الأوامر؛ ولدى زيروبجس واجهة المستعمل الرسومية الخاصة Graphical User Interface بها.
Digital Mars
وفي السياق ذاته، DSource, an open source community for the D Programming Language
{
- if (b <= pivot) // ref to enclosing-scope
- return a + b;
- else
- return a;
signature2words[line.tolower.sort] ~= line.dup;
- foreach (words; signature2words)
- if (words.length> 1)
- writefln(words.join(" "));
const fact_7 = Factorial!(7);
إضافةً إلى ذلك، وفيما يلي مثال على تنفيذ وظيف تصريف الوقت. يمكن استخدام الوظائف المعتادة في التعبيرات الثابتة والمصرفة زمنيا بشرط أن تلبي معايير معينة:
المثال 2
- import std.stdio: writefln;
- import std.stream: BufferedFile;
- import std.string: tolower, join;
- void main
- {
إضافةً إلى ذلك، يظهر ما يلي القدرات العديدة لدي في برنامج قصير للغاية. ويحدد سطور ملف النصوص المسماة words.txt والتي تحتوي على كلمة مختلفة في كل سطر، ويطبع جميع الكلمات التي تشكل الجناس التصحيحي لجميع الكلمات الأخرى.
التزامن
- D 2.0 only.
- import std.concurrency, std.stdio, std.typecons;
- int main
int[] a2 = [6,7,8,9];
وفي هذا السياق، immutable pivot = 5; // must be immutable to allow access from inside mysum
int mysum(int a, int b) pure // pure function
{
- if(n <2)
- return 1;
- else
- return n * factorial(n - 1);
القائمة على الكائن
وفي هذا الصدد، إن البرمجة القائمة على الكائن في دي تقوم على تراتبية موروثة واحدة، مع جميع الفئات المشتقة من فئة الكائن Object. ولا تدعم لغة دي الموروث المتعدد؛ وبدلا من ذلك فإنها تستعمل واجهات بأسلوب الجافا، والتي يمكن مقارنتها بالفئات المجردة الصرفة للغة ، والفئات mixins، والتي تسمح بفصل الوظيفية المشتركة عن التراتبية الموروثة. إضافة إلى ذلك فإن دي 2.0 تسمح بإعلان الطرق الثابتة والنهائية (غير الظاهرية) في الواجهات.
int[] a2 = [6,7,8,9];
int mysum(int a, int b) pure // pure function
وفي هذا الصدد، immutable pivot = 5; // must be immutable to allow access from inside mysum
الوظيفية
- D 2.0 only.
- import std.algorithm, std.range, std.stdio;
- int main
- {
- int[] a1 = [0,1,2,3,4,5,6,7,8,9];
tid.send("hello"); // send a string
- tid.send(thisTid); // send an object (Tid)
- receive( (int x) { writeln("Main thread receives message: ", x); });
- return 0;
- }
- void foo
- {
import std.stdio: writefln;
void main(string[] args)
else
const Factorial = n * Factorial!(n - 1);
{
- foreach (i, arg; args)
- Stdout("args[")(i)("] = '")(arg)("'").newline;
- }
}
- auto result = reduce!(mysum)( chain(a1, a2) ); // passing a delegate (closure)
- writeln("Result: ", result); // output is "15"
- return 0;
- }
bool cont = true;
while (cont)
{
الدعم غير المحدود للمكتبات المشاركة/ الحركية
علاوةً على ذلك، وبالنسبة لنظم ويندوز فإن مكتبات الوصل الديناميكية Dynamic Link Libraries تكون مدعومة وتسمح للكائنات المخصصة من قبل جامعة المهملات في لغة دي بأن يمر بأمان إلى وظائف سي، لأن جامع المهملات يمسح الركام للمؤشرات. بأي حال فإنه لا تزال هناك قيود متعلقة بمكتبات الوصل الميكانيكية في لغة دي بما فيها حقيقة أن معلومات نوع وقت التشغيل للفئات المعرفة في مكتبات الوصل الديناميكية غير متوافقة مع تلك المحددة في القابلة للتنفيذ، وهكذا فإن أي كائن يكون من داخل مكتبات الوصل الديناميكية يجب أن يكتمل قبل تفريغ مكتبات الوصل الديناميكية.
في هذا الإطار، إن مكتبات Unix’s ELF المتشاركة مدعوة لاستخدام مصرف جي دي سي.
الأمرية
وفي هذا السياق، إن البرمجة الأمرية في لغة دي هي الأكثر ارتباطا بلغة سي C. وتعمل الدوال والبيانات والإعلانات والتعبيرات بطريقة مشابهة تماما للغة سي، ويمكن الوصول لمكتبة وقت تشغيل سي مباشرة. وهناك بعض الاختلافات الملحوظة بين دي وسي في مجال البرمجة الأمرية بما فيها حلقة foreach، والذي يسمح بالالتفاف حول المجموعات، والدوال المتداخلة، وهي الدوال التي تعلن داخل دوال أخرى ويمكنها الوصول إلى الدالة المتضمنة للمتغيرات المحلية.
الإصدارات
وفي هذا السياق، توجد لغة برمجة دي في إصدارين: 1.0 و 2.0. وقد أصبحت دي 1.0مستقرة بإصدار D2.0 في 17 يونيو 2007، ومنذ ذلك الوقت قدمت إضافات مزيدة للغة منذ تلك لاتي أضيفت للنسخة 2.0. إن إصدار كتاب أندريه ألكسندريسكو الذي يحمل عنوان لغة برمجة دي في 12 يونيو 2010 شكل بداية لاستقرار D2.0.
دي 1.0
وعلى صعيد آخر، صدر الإصدار 1.00من دي ديجيتال مارس في 2 يناير 2007. ومنذ صدور دي 2.0 لم يحظ دي 1.0 وتطبيقه الخاص بديجيتال مارس إلا بإضافات هامشية ومميزات غير كبيرة لم تؤثر على التوافقية تأثيرا رجعيا.
{
const Factorial = 1;
static if(n <2)
string[][string] signature2words;
foreach (string line; new BufferedFile("words.txt"))
تقسيم المكتبة القياسية
في هذا الإطار، وسيتم تناول هذه المشكلة في فرع دي 2.0من خلال عمل وقت تشغيل مفرد يسمى وقت تشغيل دي druntime، وربط كل من فوبوس وتانجو بوقت تشغيل دي. وفي أكتوبر 2008، فوبوس كان موصلا بوقت تشغيل دي في أحدث إصدار من مصرف ديجيتال مارس. اما تانجو فإنه في طور التوصيل بدي 2.0، ومن المتوقع أن يشغل عاجلا في قمة وقت تشغيل دي. وفي المستقبل المنظور فإن دي سوف تكون لديها مكتبتي تشغيل متنافستين، لكن في فرع دي 2.0 فإنهما ستكونان متوافقتين وقابلتين للاستخدام جنبا إلى جنب في نفس قاعدة الشفرة.
كذلك، يطلق على المكتبة القياسية في دي لفظ فوبوس. وكان بعض أفراد جماعة لغة دي يعتقدون أن فوبوس مبسطة أكثر من اللازم وأن بها الكثير من المراوغات والقضايا الأخرى، وأنها إحلال لمكتبة مكتوبة سابقا اسمها تانجو. بأي حال، في الفرع دي 1.0، فإن كل من تانجو وفوبوس غير متوافقين بسبب اختلاف دعم وقت التشغيل لواجهات التطبيق الثنائية (جامع المهملات، ودعم التشعب، إلخ). إن وجود مكتبتين، وكلاهما يستعملان على نطاق واسع، أدى إلى مشكلات كبيرة حيث أن بعض الحزم تستعمل فوبوس والبعض الآخر يستعمل تانجو.
المميزات
من جانب آخر، لقد صممت لغة دي بدروس مستفادة من الاستخدام العملي للغة أكثر من الاعتماد في ذلك على التصور النظري. وبالرغم من واقع أنها تستعمل الكثير من مفاهيم لغتي، فإنها كذلك لا تستعمل البعض الآخر وكذلك فإنها غير متوافقة مع الشيفرة الأصلية لـ. كما أنها تضيف إلى وظيفية من خلال تطبيق التصميم التعاقدي، واختبار الوحدة، والوحدات الحقيقية، وجمع القمامة، والمصفوفات من الدرجة الأولى، والمصفوفات الترابطية، والمصفوفات الديناميكية، والمصفوفة الشرائحية، والدوال المتداخلة، والفئات الداخلية، والإغلاقات، والدوال المجهولة، وتنفيذ الوظيفة في وقت التصريف، والتقييم الكسول، كما أنها أعادت هندسة بنية القالب. وتحتفظ لغة دي بقدرة على القيام باتشفير متدني لامستوى وتضيف له بدعم من أجل inline assembler. ويحل محل الوراثة المتعددة لـ أسلوب جافا ذو الوراثة الواحدة المزود بواجهات ومتخلطات. إن إعلان وبيان وتعبير دي عن البنية مرتبط بقوة بنظيرتها في .
من جهة ثانية، ويحدد inline assembler نوع الاختلافات بين دي ولغات التطبيق مثل جافا وسي شارب. ويمكن inline assembler المبرمجين من إدخال شفرة تجميع الآلة المحددة وفق معيار شفرة لغة دي- وهو التكنيك الذي يستعمل عادة من قبل مبرمجي النظام للوصول إلى الميزات منخفضة المستوى للمعالج والمطلوبة لتشغيل البرامج التي تتداخل مباشرة مع العتاد hardware المحدد مثل نظم التشغيل ومشغلات الجهاز.
نماذج البرمجة
يوجد في لغة دي دعم للتوثيق، بما يسمح بتوليد الآلي للتوثيق.
{
- auto tid = spawn(&foo); // create an actor object
- foreach(i; 0 .. 10)
- tid.send(i); // send some integers
- tid.send(1.0f); // send a float
Wiki4D
وفي هذا السياق، Computerworld Interview with Walter Bright on D Programming Language
وفي هذا الصدد، "New D language pumps up programmer productivity" by Nikolai Sivertsen (in a Linux programming environment)
const fact_9 = factorial(9);
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
في هذا الإطار، ويؤدي قالب std.metastrings.Formatمهمة تنسيق البيانات الذي يشبه طباعة إف printf، ويستعرض "msg" pragma النتيجة عند وقت التصرف:
receive( // pattern matching
- (int msg) { writeln("int receive: ", msg); }, // int type
- (Tid sender){ cont = false; sender.send(-1); }, // object type
- (Variant v) { writeln("huh?"); } // any type
- );
- }
- }
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟