ديلان (لغة برمجة)
ديلان هي لغة برمجة متعددة الأنماط تدعم البرمجة الوظيفية والبرمجة كائنية التوجه ، وتتميز بديناميكيتها وقدرتها على الانعكاس، كما أنها توفر نموذج برمجة مصمم لدعم توليد شفرة آلية فعالة ، بما في ذلك التحكم الدقيق في السلوكيات الديناميكية والثابتة. وقد تم تطويرها في أوائل التسعينيات من قبل فريق بقيادة شركة أبل .
تستمد لغة Dylan أصولها من لغتي Scheme و Common Lisp، وتضيف نظام كائنات متكاملًا مشتقًا من نظام كائنات Common Lisp (CLOS). في Dylan، تُعتبر جميع القيم (بما في ذلك الأرقام والحروف والدوال والفئات ) كائنات من الدرجة الأولى . تدعم Dylan الوراثة المتعددة ، وتعدد الأشكال ، والإرسال المتعدد ، والوسائط المُسماة ، واستكشاف الكائنات، ووحدات الماكرو لتوسيع بناء الجملة القائمة على الأنماط ، والعديد من الميزات المتقدمة الأخرى. يمكن للبرامج التعبير عن تحكم دقيق في الديناميكية، مما يسمح بإنشاء برامج تقع على طيف متصل بين البرمجة الديناميكية والثابتة، ويدعم التطوير التطوري (مما يسمح بإنشاء نماذج أولية سريعة متبوعة بتحسينات تدريجية).
يتمثل الهدف الرئيسي لتصميم لغة ديلان في أن تكون لغة ديناميكية مناسبة تمامًا لتطوير البرامج التجارية . وتسعى ديلان إلى معالجة مشكلات الأداء المحتملة من خلال فرض حدود "طبيعية" على المرونة الكاملة لأنظمة ليسب ، مما يسمح للمترجم بفهم الوحدات القابلة للترجمة بوضوح، مثل المكتبات .
يستمد ديلان الكثير من دلالاته من لغة سكيم ولغات ليسب الأخرى؛ وقد بُنيت بعض تطبيقات ديلان في البداية ضمن أنظمة ليسب الموجودة. ومع ذلك، فإن ديلان يستخدم بنية نحوية شبيهة بلغة ألغول بدلاً من بنية البادئات الشبيهة بلغة ليسب.
تاريخ
تم تطوير برنامج Dylan في أوائل التسعينيات من القرن الماضي على يد فريق بقيادة شركة Apple Computer . في مرحلة ما من مراحل تطويره، كان من المقرر استخدامه مع جهاز Apple Newton ، إلا أن تطبيق Dylan لم يكتمل تطويره في الوقت المناسب، فاستخدم Newton مزيجًا من لغة C ولغة NewtonScript التي طورها والتر سميث. أوقفت Apple جهودها في تطوير Dylan عام 1995، مع أنها أتاحت إصدارًا تقنيًا (Apple Dylan TR1) يتضمن بيئة تطوير متكاملة متقدمة (IDE).
ساهمت مجموعتان أخريان في تصميم اللغة وتطوير تطبيقاتها: أصدرت شركة هارليكوين بيئة تطوير متكاملة تجارية لأنظمة مايكروسوفت ويندوز ، بينما أصدرت جامعة كارنيجي ميلون مُترجمًا مفتوح المصدر لأنظمة يونكس يُسمى غويديون ديلان. كلا التطبيقين أصبحا الآن مفتوحي المصدر. يُعرف تطبيق هارليكوين حاليًا باسم أوبن ديلان، ويتولى صيانته مجموعة من المتطوعين تُعرف باسم ديلان هاكرز.
أُطلق على لغة ديلان الاسم الرمزي رالف. اختار جيمس جواكين اسم ديلان اختصاراً لـ "لغة ديناميكية".
بناء الجملة
تستمد لغة ديلان العديد من خصائص تركيبها النحوي من تراثها في لغة ليسب. في البداية، استخدمت ديلان تركيبًا نحويًا شبيهًا بلغة ليسب، قائمًا على تعابير s . عند اكتمال تصميم اللغة، تم تغيير التركيب النحوي إلى تركيب شبيه بلغة ألغول، على أمل أن يكون أكثر ألفةً لجمهور أوسع من المبرمجين. صمم هذا التركيب النحوي مايكل كاهل، وهو موصوف بتفصيل دقيق في دليل ديلان المرجعي. [ 2 ]
التركيب المعجمي
لغة ديلان غير حساسة لحالة الأحرف . يسمح تركيبها اللغوي باستخدام اصطلاح تسمية يُستخدم فيه الواصلة (علامة الطرح) لربط أجزاء المعرفات متعددة الكلمات (يُطلق عليها أحيانًا " حالة ليسب " أو " حالة الكباب "). هذا الاصطلاح شائع في لغات ليسب.
إلى جانب الأحرف الأبجدية الرقمية وعلامات الوصل والطرح، يسمح نظام ديلان باستخدام مجموعة متنوعة من الأحرف غير الأبجدية الرقمية كجزء من المعرّفات. لا يجوز أن تتكون المعرّفات من هذه الأحرف غير الأبجدية الرقمية فقط. [ 2 ] في حال وجود أي لبس، تُستخدم المسافات البيضاء.
مثال على التعليمات البرمجية
فئة بسيطة تحتوي على عدة خانات:
تعريف الصنف <point> ( <object> ) خانة point-x :: <integer> ، كلمة-تهيئة-مطلوبة: x: ; خانة point-y :: <integer> ، كلمة-تهيئة-مطلوبة: y: ; نهاية الصنف <point> ;بحسب العرف، يتم تسمية الفئات باستخدام علامات أصغر من وأكبر من كأقواس زاوية ، على سبيل المثال الفئة المسماة في مثال الكود.<point>
في كلتا الحالتين ، يكون استخدام "و" اختياريًا. وينطبق هذا على جميع الجمل. على سبيل المثال، يمكن كتابة " أو" لإنهاء جملة.end class <point>class<point>endend ifendif
لإثبات ذلك :<point>
إنشاء ( <نقطة> ، س: 100 ، ص: 200 )نفس الفئة، ولكن أعيدت كتابتها بأبسط طريقة ممكنة:
تعريف فئة <نقطة> ( <كائن> ) خانة نقطة-س ; خانة نقطة-ص ; نهاية ;تم الآن تحديد نوع كلا الخانتين . يجب تهيئة الخانتين يدويًا:<object>
let p = make ( <point> ); point-x ( p ) := 100 ; // أو p.point-x := 100; point-y ( p ) := 200 ; // أو p.point-y := 200;بحسب الاصطلاح، تبدأ أسماء الثوابت بـ "$":
تعريف ثابت $pi :: <double-float> = 3.1415927 d0 ;دالة مضروبية:
تعريف الدالة factorial ( n :: <عدد صحيح > ) => ( n! :: <عدد صحيح> ) case n < 0 => error ( "لا يمكن حساب مضروب عدد صحيح سالب: %d \n " , n ); n = 0 => 1 ; otherwise => n * factorial ( n - 1 ); end end ;هنا، n!و هي مجرد معرفات عادية.<integer>
لا توجد عبارة إرجاع صريحة . نتيجة الدالة أو الأسلوب هي آخر تعبير تم تقييمه. من الشائع حذف الفاصلة المنقوطة بعد التعبير الموجود في موضع الإرجاع.
الوحدات النمطية مقابل مساحة الاسم
في العديد من لغات البرمجة كائنية التوجه، تُعدّ الأصناف الوسيلة الرئيسية للتغليف والنمطية؛ إذ يُعرّف كل صنف نطاقًا اسميًا ويتحكم في التعريفات المرئية خارجيًا. علاوة على ذلك، تُعرّف الأصناف في العديد من اللغات وحدةً غير قابلة للتجزئة يجب استخدامها كوحدة واحدة. على سبيل المثال، Stringيتطلب استخدام دالة دمج السلاسل استيراد جميع عناصرها وتجميعها String.
تتضمن بعض اللغات، بما في ذلك لغة Dylan، نظام مساحة اسم أو وحدة نمطية منفصلة وصريحة تقوم بالتغليف بطريقة أكثر عمومية.
في لغة ديلان، يُفصل مفهوما وحدة التجميع ووحدة الاستيراد، ولا ترتبط الأصناف بأي منهما ارتباطًا مباشرًا. تُعرّف المكتبة العناصر التي يجب تجميعها ومعالجتها معًا، بينما تُعرّف الوحدة النمطية مساحة اسم. يمكن تجميع الأصناف في وحدات نمطية، أو توزيعها بينها، حسب رغبة المبرمج. غالبًا لا يوجد التعريف الكامل للصنف في وحدة نمطية واحدة، بل ينتشر عبر عدة وحدات يتم تجميعها معًا اختياريًا. يمكن أن تحتوي البرامج المختلفة على تعريفات مختلفة للصنف نفسه، بحيث تتضمن فقط ما تحتاجه.
على سبيل المثال، لنفترض مكتبة إضافية لدعم التعبيرات النمطية (regex)String في لغة البرمجة . في بعض اللغات، لكي تُضمَّن هذه الوظيفة في السلاسل النصية، يجب إضافتها إلى Stringمساحة الاسم. بمجرد حدوث ذلك، Stringيصبح حجم الصنف أكبر، وتضطر الدوال التي لا تحتاج إلى استخدام التعبيرات النمطية إلى تحمل تكلفة ذلك من خلال زيادة حجم المكتبة. لهذا السبب، تُوضع هذه الأنواع من الإضافات عادةً في مساحات أسماء وكائنات خاصة بها. الجانب السلبي لهذا النهج هو أن الدوال الجديدة لم تعد جزءًا من مساحة الاسمString ؛ بل أصبحت معزولة في مجموعة دوال خاصة بها يجب استدعاؤها بشكل منفصل. بدلًا من استخدام `regex` myString.parseWith(myPattern)، وهو التنظيم الطبيعي من وجهة نظر البرمجة الكائنية، myPattern.parseString(myString)يُستخدم تنظيم آخر مثل `regex`، مما يعكس الترتيب فعليًا.
في بيئة ديلان، يمكن تعريف العديد من الواجهات لنفس الكود، فعلى سبيل المثال، يمكن وضع دالة دمج السلاسل النصية في كلٍ من واجهة السلاسل النصية وواجهة "concat" التي تجمع جميع دوال الدمج المختلفة من فئات متنوعة. يُستخدم هذا الأسلوب بشكل شائع في مكتبات الرياضيات، حيث تميل الدوال إلى أن تكون قابلة للتطبيق على أنواع كائنات مختلفة على نطاق واسع.
يُعدّ استخدام بنية الواجهة أكثر عمليةً لإنشاء نسختين عامة وخاصة من الوحدة، وهو أمرٌ تُضيفه لغات أخرى كميزة إضافية تُسبّب مشاكل وتُضيف تعقيدات نحوية. في لغة Dylan، يُمكن وضع كل استدعاء دالة ببساطة في واجهة "الخاصة" أو "التطوير"، وتجميع الدوال المتاحة للعامة في مكانٍ مُحدد Public. أما في لغتي Java و C++، فتُحدّد رؤية الكائن في الكود، ما يعني أنه لدعم تغيير مماثل، سيُضطر المبرمج إلى إعادة كتابة التعريفات بالكامل، ولن يكون لديه نسختان في الوقت نفسه.
الصفوف الدراسية
تصف الفئات في لغة ديلان slotsخصائص الكائنات (أعضاء البيانات، والحقول، والمتغيرات، وما إلى ذلك) بطريقة مشابهة لمعظم لغات البرمجة الكائنية. ويتم الوصول إلى جميع الخانات عبر الدوال، كما هو الحال في لغة سمول توك . ويتم إنشاء دوال الوصول والتعديل الافتراضية تلقائيًا بناءً على أسماء الخانات. وعلى عكس معظم لغات البرمجة الكائنية الأخرى، غالبًا ما تُعرَّف الدوال الأخرى المطبقة على الفئة خارجها، وبالتالي فإن تعريفات الفئات في ديلان تتضمن عادةً تعريف التخزين فقط. على سبيل المثال:
تعريف الفئة <window> ( <view> ) خانة العنوان :: <string> = "بدون عنوان" ، كلمة مفتاحية للتهيئة: العنوان: ; خانة الموضع :: <point> ، كلمة مفتاحية مطلوبة للتهيئة: الموضع: ; نهاية الفئة ;في هذا المثال، تم تعريف الصنف " ". يُعدّ استخدام الصيغة < اسم الصنف > اصطلاحًا فقط، لتمييز أسماء الأصناف - فالأقواس الزاوية جزءٌ من اسم الصنف. في المقابل، في بعض اللغات، يُشترط كتابة الحرف الأول من اسم الصنف بحرف كبير أو إضافة البادئة C أو T (على سبيل المثال). يرث هذا الصنف من صنف واحد، ، ويحتوي على خانتين، إحداهما تحتوي على سلسلة نصية لعنوان النافذة، والأخرى تحتوي على إحداثيات XY لزاوية النافذة. في هذا المثال، تم إعطاء العنوان قيمة افتراضية، بينما لم يتم إعطاء الموضع قيمة افتراضية. تسمح صيغة الكلمة المفتاحية init الاختيارية للمبرمج بتحديد القيمة الأولية للخانة عند إنشاء كائن من الصنف.<window><window><view>titleposition
في لغات مثل C++ أو Java، يُعرّف الصنف أيضًا واجهته. في هذه الحالة، لا يحتوي التعريف أعلاه على تعليمات صريحة، لذا في كلتا اللغتين، يُعتبر الوصول إلى الفتحات والأساليب محدودًا protected، أي أنه لا يمكن استخدامها إلا من قِبل الأصناف الفرعية. للسماح لبرامج أخرى باستخدام مثيلات النافذة، يجب تعريفها public.
في لغة ديلان، لا تُعتبر قواعد الرؤية هذه جزءًا من الكود، بل من نظام الوحدات/الواجهات. وهذا يمنحها مرونة كبيرة. على سبيل المثال، يمكن لواجهة تُستخدم في المراحل الأولى من التطوير أن تُعلن عن كل شيء بشكل عام، بينما يمكن لواجهة أخرى تُستخدم في الاختبار والنشر أن تُقيّد ذلك. في لغات مثل C++ أو Java، تتطلب هذه التغييرات تعديلات على الكود المصدري، لذا لن يُقدم عليها المطورون، بينما في ديلان، يُعد هذا مفهومًا منفصلاً تمامًا.
على الرغم من أن هذا المثال لا يستخدمه، إلا أن ديلان يدعم أيضًا التوريث المتعدد .
الأساليب والوظائف العامة
في لغة ديلان، لا ترتبط الدوال جوهريًا بأي فئة محددة؛ بل يمكن اعتبارها موجودة خارج الفئات. ومثل لغة كلوس، تعتمد ديلان على الإرسال المتعدد (الأساليب المتعددة)، حيث يتم اختيار الدالة المراد استدعاؤها بناءً على أنواع جميع وسائطها. ولا يشترط معرفة الدالة وقت الترجمة، إذ يُفترض أن تكون الدالة المطلوبة متاحة أو غير متاحة، وفقًا لتفضيلات المستخدم.
في لغة جافا، تُعزل نفس الدوال في فئة مُحددة. لاستخدام هذه الخاصية، يُضطر المبرمج إلى استيراد تلك الفئة والإشارة إليها صراحةً لاستدعاء الدالة. إذا كانت تلك الفئة غير متوفرة، أو غير معروفة وقت الترجمة، فلن يتم تجميع التطبيق.
في لغة ديلان، يُعزل الكود عن التخزين في دوال . تحتوي العديد من الأصناف على توابع تستدعي دوالها الخاصة، مما يجعلها تبدو وتُشعر وكأنها في معظم لغات البرمجة الكائنية الأخرى. مع ذلك، يمكن أيضًا وضع الكود في دوال عامة ، أي أنها غير مرتبطة بصنف معين، ويمكن لأي مستخدم استدعاؤها مباشرةً. يتم ربط دالة عامة محددة بتابع في صنف على النحو التالي:
تعريف الدالة turn-blue ( w :: <window> ) w . color := $blue ; نهاية الدالة ;هذا التعريف مشابه للتعريفات في لغات أخرى، ومن المرجح أن يكون مُضمنًا داخل الفئة. لاحظ استدعاء الدالة المُعدِّلة :=، وهو اختصار برمجي لـ .<window> color-setter($blue, w)
تتجلى فائدة الأساليب العامة عند النظر إلى أمثلة أكثر عمومية. على سبيل المثال، إحدى الدوال الشائعة في معظم لغات البرمجة هي الدالة `window` to-string، التي تُعيد صيغةً مفهومةً للكائن. فعلى سبيل المثال، قد تُعيد نافذة عنوانها وموقعها بين قوسين، بينما تُعيد سلسلة نصية نفسها. في لغة Dylan، يمكن تجميع هذه الدوال في وحدة واحدة تُسمى `` to-string`، مما يُزيل هذا الكود من تعريف الصنف نفسه. إذا لم يدعم كائنٌ مُعين الدالة ```` to-string، فيمكن إضافتها بسهولة في to-stringالوحدة.
قابلية التوسعة
قد يبدو هذا المفهوم غريبًا للبعض. فكيف يُعقل ألا يكون الكود الخاص بمعالجة to-stringنافذة مُعرّفًا في مكان ما ؟ قد لا يبدو هذا منطقيًا حتى يُفهم كيف يتعامل Dylan مع استدعاء الدالة . في معظم لغات البرمجة ، عند تجميع البرنامج، يتم البحث عن الدالة واستبدالها بمؤشر (تقريبًا) إلى الدالة. أما في Dylan، فيحدث هذا عند تشغيل البرنامج لأول مرة؛ حيث يُنشئ وقت التشغيل جدولًا بتفاصيل أسماء الدوال ومعاملاتها، ويبحث عن الدوال ديناميكيًا عبر هذا الجدول. هذا يعني أن دالة لدالة معينة يمكن أن تكون موجودة في أي مكان، وليس فقط في وحدة وقت التجميع. في النهاية، يُمنح المبرمج مرونة كبيرة في تحديد مكان وضع الكود، حيث يجمعه وفقًا لخطوط الفئات عند الاقتضاء، وخطوط الدوال عند عدم الاقتضاء.<window>to-stringto-string<window>
المقصود هنا هو أن المبرمج يستطيع إضافة وظائف إلى الأصناف الموجودة بتعريف دوال في ملف منفصل. على سبيل المثال، قد يرغب المبرمج في إضافة خاصية التدقيق الإملائي لجميع السلاسل النصية، وهو ما يتطلب في لغتي C++ أو Java الوصول إلى شفرة المصدر لصنف السلسلة النصية - ونادرًا ما تُقدم هذه الأصناف الأساسية بصيغة شفرة المصدر. في لغة Dylan (وغيرها من "اللغات القابلة للتوسيع")، يمكن إضافة دالة التدقيق الإملائي في الوحدة النمطية، مع تعريف جميع الأصناف التي يمكن تطبيقها عليها باستخدام البنية. في هذه الحالة، يمكن تعريف الوظيفة الفعلية في دالة عامة واحدة، تأخذ سلسلة نصية وتعيد الأخطاء. عند تجميع الوحدة النمطية في برنامج، ستُضاف هذه الوظيفة إلى جميع السلاسل النصية (والكائنات الأخرى).<string>spell-checkdefine methodspell-check
أبل ديلان
Apple Dylan هو تطبيق لبرنامج Dylan من إنتاج شركة Apple Computer . وقد تم تطويره في الأصل لمنتج Apple Newton .
مراجع
- ↑ ستوكل-ووكر، كريس. "جوليا: لغة غولديلوكس" . إنكريمنت . سترايب . تم الاسترجاع في 23 أغسطس 2020 .
- 1 2 أندرو شاليت؛ ديفيد مون؛ أوركا ستارباك (11 سبتمبر 1996). دليل ديلان المرجعي . دار نشر أبل. أديسون-ويسلي . ISBN 9780201442113.
روابط خارجية
- الموقع الرسمي ، Open Dylan – يستضيف مُجمِّع Dylan مفتوح المصدر، ويعمل على تحسينه، ويستهدف أنظمة Unix/Linux و macOS و Microsoft Windows
- لمحة عامة عن اللغة
- مقدمة عن ديلان
- أبل ديلان TR1
- مترجم مارلايس ديلان – تطبيق لمجموعة فرعية من لغة ديلان، مناسب لتهيئة المترجم
- ديلان (لغة برمجة)
- برامج متعددة المنصات
- لغات برمجة ذات بنية قابلة للتوسيع
- عائلة لغات البرمجة ليسب
- لغات البرمجة التي تم إنشاؤها عام 1992
