إيفل (لغة برمجة)
| نموذج | كائني التوجه ، قائم على الفئة ، عام ، متزامن |
|---|---|
| صمم بواسطة | برتراند ماير |
| المطور | برنامج ايفل |
| ظهرت لأول مرة | 1986 [1] |
| إصدار مستقر | EiffelStudio 24.05 [2]
/ 14 يونيو 2024 |
| انضباط الطباعة | ثابت |
| لغة التنفيذ | ايفل |
| منصة | متعدد المنصات |
| نظام التشغيل | FreeBSD ، Linux ، macOS ، OpenBSD ، Solaris ، Windows |
| رخصة | ثنائي ومؤسسي |
| ملحقات اسم الملف | .e |
| موقع إلكتروني | ايفل.org |
| التنفيذات الرئيسية | |
| EiffelStudio ، LibertyEiffel ، SmartEiffel ، Visual Eiffel ، Gobo Eiffel، "The Eiffel Compiler" tecomp | |
| متأثر بـ | |
| آدا ، سيمولا ، زد | |
| متأثر | |
| Ada 2012 ، Albatross، C# ، D ، Java ، Racket ، Ruby ، [3] Sather ، Scala | |
Eiffel هي لغة برمجة موجهة للكائنات صممها برتراند ماير (مؤيد للتوجه نحو الكائنات ومؤلف كتاب بناء البرمجيات الموجهة للكائنات ) وEiffel Software. ابتكر ماير اللغة في عام 1985 بهدف زيادة موثوقية تطوير البرمجيات التجارية؛ [4] وأصبحت النسخة الأولى متاحة في عام 1986. في عام 2005، أصبحت Eiffel لغة موحدة وفقًا لمعايير ISO .
يرتبط تصميم اللغة ارتباطًا وثيقًا بطريقة برمجة إيفل. يعتمد كلاهما على مجموعة من المبادئ، بما في ذلك التصميم بالعقد ، وفصل الأوامر عن الاستعلامات ، ومبدأ الوصول الموحد ، ومبدأ الاختيار الفردي ، ومبدأ الفتح والإغلاق ، وفصل الخيار عن المتعامل .
وجدت العديد من المفاهيم التي قدمها إيفل في البداية طريقها لاحقًا إلى جافا وسي شارب ولغات أخرى. [5] لا تزال أفكار تصميم اللغة الجديدة، وخاصة من خلال عملية توحيد المعايير Ecma / ISO ، مدمجة في لغة إيفل.
صفات
تتضمن الخصائص الرئيسية للغة إيفل ما يلي:
- بنية برنامج موجهة نحو الكائنات حيث تعمل الفئة كوحدة أساسية للتحليل. [6]
- التصميم عن طريق العقد متكامل بشكل وثيق مع هياكل اللغة الأخرى.
- إدارة الذاكرة التلقائية، والتي يتم تنفيذها عادةً عن طريق جمع القمامة . [7]
- الميراث ، بما في ذلك الميراث المتعدد ، وإعادة التسمية، وإعادة التعريف ، و"التحديد"، والميراث غير المطابق، والآليات الأخرى المقصود منها جعل الميراث آمنًا.
- البرمجة العامة المقيدة وغير المقيدة [8]
- نظام نوع موحد يتعامل مع دلالات القيمة والمرجع حيث تكون جميع الأنواع، بما في ذلك الأنواع الأساسية مثل INTEGER، مبنية على الفئة.
- الكتابة الثابتة
- السلامة من الفراغ ، أو الحماية الثابتة ضد المكالمات على المراجع الفارغة، من خلال آلية الأنواع المرفقة.
- الوكلاء أو الكائنات التي تغلف العمليات الحسابية، ترتبط ارتباطًا وثيقًا بالإغلاقات وحساب لامدا .
- روتينات مرة واحدة ، أو روتينات يتم تقييمها مرة واحدة فقط، لمشاركة الكائنات والتهيئة اللامركزية.
- بناء جملة يعتمد على الكلمات الأساسية في تقليد ALGOL / Pascal ولكن بدون فواصل، حيث تكون الفواصل المنقوطة اختيارية، مع وجود بناء جملة المشغل متاحًا للروتينات.
- عدم حساسية الحالة
- تسهل البرمجة الشيئية المتزامنة البسيطة ( SCOOP ) إنشاء مركبات تنفيذ متعددة ونشطة في وقت واحد على مستوى التجريد فوق التفاصيل المحددة لهذه المركبات (على سبيل المثال، خيوط متعددة بدون إدارة متزامنة محددة).
أهداف التصميم
يؤكد إيفل على البيانات التصريحية على حساب الكود الإجرائي ويحاول التخلص من الحاجة إلى تعليمات المحاسبة.
يتجنب إيفل الحيل البرمجية أو تقنيات البرمجة المقصود منها تقديم تلميحات تحسين للمترجم. والهدف ليس فقط جعل الكود أكثر قابلية للقراءة، بل وأيضًا السماح للمبرمجين بالتركيز على الجوانب المهمة للبرنامج دون الانغماس في تفاصيل التنفيذ. وتهدف بساطة إيفل إلى الترويج لإجابات بسيطة وقابلة للتوسيع وقابلة لإعادة الاستخدام وموثوقة لمشاكل الحوسبة. توفر المترجمات للبرامج الحاسوبية المكتوبة في إيفل تقنيات تحسين شاملة، مثل التضمين التلقائي، مما يخفف عن المبرمج جزءًا من عبء التحسين.
خلفية
تم تطوير برنامج Eiffel في الأصل بواسطة شركة Eiffel Software، وهي شركة أسسها برتراند ماير . يحتوي كتاب بناء البرمجيات الموجهة للكائنات على معالجة تفصيلية لمفاهيم ونظرية تكنولوجيا الكائنات التي أدت إلى تصميم برنامج Eiffel. [9]
الهدف التصميمي وراء لغة إيفل والمكتبات وطرق البرمجة هو تمكين المبرمجين من إنشاء وحدات برمجية موثوقة وقابلة لإعادة الاستخدام. تدعم إيفل الوراثة المتعددة والتعميم والتعدد الأشكال والتغليف والتحويلات الآمنة للنوع وتباين المعلمات . أهم مساهمة لإيفل في هندسة البرمجيات هي التصميم بالعقد (DbC) ، حيث يتم استخدام التأكيدات والشروط المسبقة والشروط اللاحقة وثوابت الفئة للمساعدة في ضمان صحة البرنامج دون التضحية بالكفاءة.
يعتمد تصميم إيفل على نظرية البرمجة الموجهة للكائنات، مع تأثير طفيف فقط على النماذج الأخرى أو الاهتمام بدعم الكود القديم. يدعم إيفل رسميًا أنواع البيانات المجردة . بموجب تصميم إيفل، يجب أن يكون نص البرنامج قادرًا على إعادة إنتاج وثائق التصميم الخاصة به من النص نفسه، باستخدام تنفيذ رسمي لـ "نوع البيانات المجردة".
التنفيذات والبيئات
EiffelStudio هي بيئة تطوير متكاملة متاحة إما بموجب ترخيص مفتوح المصدر أو ترخيص تجاري. وهي توفر بيئة موجهة للكائنات للهندسة البرمجية . EiffelEnvision هو مكون إضافي لبرنامج Microsoft Visual Studio يسمح للمستخدمين بتحرير وتجميع وتصحيح أخطاء مشاريع Eiffel من داخل Microsoft Visual Studio IDE. تتوفر خمسة تطبيقات مفتوحة المصدر أخرى: "The Eiffel Compiler" tecomp؛ Gobo Eiffel؛ SmartEiffel ، تطبيق GNU، المستند إلى إصدار أقدم من اللغة؛ LibertyEiffel ، المستند إلى مُجمِّع SmartEiffel؛ و Visual Eiffel .
تتضمن العديد من لغات البرمجة الأخرى عناصر تم تقديمها لأول مرة في Eiffel. على سبيل المثال، كانت لغة Sather مبنية في الأصل على Eiffel ولكنها انحرفت منذ ذلك الحين، وهي الآن تتضمن العديد من ميزات البرمجة الوظيفية . لغة التدريس التفاعلية Blue، سلف BlueJ ، تعتمد أيضًا على Eiffel. تتضمن أداة Apple Media لغة Apple Media Language المستندة إلى Eiffel.
المواصفات والمعايير
تعريف لغة إيفل هو معيار دولي لمنظمة ISO . تم تطوير المعيار بواسطة ECMA International ، والتي وافقت على المعيار لأول مرة في 21 يونيو 2005 كمعيار ECMA-367، إيفل: لغة التحليل والتصميم والبرمجة. في يونيو 2006، اعتمدت ECMA وISO الإصدار الثاني. في نوفمبر 2006، نشرت ISO هذا الإصدار لأول مرة. يمكن العثور على المعيار واستخدامه مجانًا على موقع ECMA. [10] إصدار ISO [11] متطابق في جميع النواحي باستثناء التنسيق.
لقد التزمت كل من شركة Eiffel Software و"The Eiffel Compiler" tecomp وEiffel-library-developer Gobo بتنفيذ المعيار؛ حيث تقوم Eiffel Software's EiffelStudio 6.1 و"The Eiffel Compiler" tecomp بتنفيذ بعض الآليات الجديدة الرئيسية—وبشكل خاص، الوكلاء المضمنين، وأوامر التعيين، وترميز الأقواس، والوراثة غير المطابقة، والأنواع المرفقة. وقد ابتعد فريق SmartEiffel عن هذا المعيار لإنشاء نسخته الخاصة من اللغة، والتي يعتقدون أنها أقرب إلى النمط الأصلي لـ Eiffel. ولم تكشف Object Tools عما إذا كانت الإصدارات المستقبلية من مُجمِّع Eiffel الخاص بها ستتوافق مع المعيار أم لا. كما تنفذ LibertyEiffel لهجة ما بين لغة SmartEiffel والمعيار.
يستشهد المعيار بالمواصفات التالية، لغة إيفل السابقة:
- برتراند ماير: إيفل: اللغة ، برنتيس هول، الطبعة الثانية، 1992 (الطبعة الأولى: 1991)
- برتراند ماير: معيار إيفل (مراجعة المدخل السابق)، مستمر، 1997 حتى الآن، في صفحة ETL3 الخاصة ببرتراند ماير، و
- برتراند ماير: بناء البرمجيات الموجهة للكائنات ، برنتيس هول: الطبعة الأولى، 1988؛ الطبعة الثانية، 1997.
- برتراند ماير: لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الأشياء والعقود ، دار نشر سبرينغر، 2009، رقم الكتاب المعياري الدولي 978-3-540-92144-8 ، الصفحة 876، طباعة ملونة بالكامل، العديد من الصور الملونة
تحتوي النسخة الحالية من المعيار من يونيو 2006 على بعض التناقضات (على سبيل المثال إعادة تعريف المتغيرات المشتركة) [ بحاجة لمصدر ] . ولم تعلن لجنة ECMA بعد عن أي جدول زمني أو توجيه بشأن كيفية حل التناقضات.
النحو والدلالات
الهيكل العام
"نظام" أو "برنامج" إيفل هو مجموعة من الفئات . فوق مستوى الفئات، يحدد إيفل العنقود ، وهو في الأساس مجموعة من الفئات، وربما مجموعات فرعية (مجموعات متداخلة). المجموعات ليست بنية لغوية نحوية ، بل هي اتفاقية تنظيمية قياسية. عادةً ما يتم تنظيم برنامج إيفل مع كل فئة في ملف منفصل، وكل مجموعة في دليل يحتوي على ملفات الفئات. في هذا التنظيم، المجموعات الفرعية هي أدلة فرعية. على سبيل المثال، وفقًا لاتفاقيات التنظيم والحالة القياسية، x.eقد يكون اسم الملف الذي يحدد فئة تسمى X.
تحتوي الفئة على ميزات ، تشبه "الروتينات" أو "الأعضاء" أو "السمات" أو "الطرق" في لغات البرمجة الموجهة للكائنات الأخرى. كما تحدد الفئة ثوابتها، وتحتوي على خصائص أخرى، مثل قسم "الملاحظات" للوثائق والبيانات الوصفية. أنواع البيانات القياسية لـ Eiffel، مثل و INTEGERو STRING، ARRAYكلها فئات بحد ذاتها.
يجب أن يحتوي كل نظام على فئة معينة باسم "الجذر"، مع تعيين أحد إجراءات إنشائه باسم "إجراء الجذر". يتكون تنفيذ النظام من إنشاء مثيل للفئة الجذرية وتنفيذ إجراء الجذر الخاص بها. بشكل عام، يؤدي القيام بذلك إلى إنشاء كائنات جديدة، واستدعاء ميزات جديدة، وما إلى ذلك.
يحتوي برنامج Eiffel على خمس تعليمات أساسية قابلة للتنفيذ: التعيين، وإنشاء الكائن، واستدعاء الروتين، والشرط، والتكرار. إن هياكل التحكم في برنامج Eiffel صارمة في فرض البرمجة المنظمة : فكل كتلة لها مدخل واحد ومخرج واحد فقط.
تحديد النطاق
على عكس العديد من لغات البرمجة الموجهة للكائنات، ولكن مثل Smalltalk ، لا تسمح لغة Eiffel بأي تعيين لسمات الكائنات، إلا داخل ميزات الكائن، وهو التطبيق العملي لمبدأ إخفاء المعلومات أو تجريد البيانات، مما يتطلب واجهات رسمية لطفرة البيانات. وبعبارة أخرى، فإن جميع سمات Eiffel "محمية"، وهناك حاجة إلى "المحددات" لكي تتمكن كائنات العميل من تعديل القيم. والنتيجة المترتبة على ذلك هي أن "المحددات" يمكنها، وعادة ما تفعل ذلك، تنفيذ الثوابت التي يوفر لها Eiffel بناء الجملة.
على الرغم من أن Eiffel لا يسمح بالوصول المباشر إلى ميزات الفئة بواسطة عميل الفئة، إلا أنه يسمح بتعريف "أمر التعيين"، مثل:
some_attribute : SOME_TYPE تعيين set_some_attribute set_some_attribute ( v : VALUE_TYPE ) -- تعيين قيمة some_attribute إلى `v'. do some_attribute := v end
على الرغم من أن هذا يمثل انحناءة طفيفة لمجتمع المطورين بشكل عام للسماح بشيء يبدو وكأنه وصول مباشر (على سبيل المثال، مما يؤدي إلى كسر مبدأ إخفاء المعلومات)، فإن هذه الممارسة خطيرة لأنها تخفي أو تحجب حقيقة استخدام "المحدد". في الممارسة العملية، من الأفضل إعادة توجيه المكالمة إلى المحدد بدلاً من التلميح إلى الوصول المباشر إلى ميزة كما هو الحال some_attributeفي كود المثال أعلاه. [ بحاجة لمصدر ]
على عكس اللغات الأخرى، التي تتضمن مفاهيم "public" و"protected" و"private" وما إلى ذلك، تستخدم Eiffel تقنية التصدير للتحكم بشكل أكثر دقة في النطاق بين فئات العميل والمورد. يتم التحقق من وضوح الميزة بشكل ثابت في وقت التجميع. على سبيل المثال، (أدناه)، "{NONE}" مشابه لـ "protected" في اللغات الأخرى. يمكن تغيير النطاق المطبق بهذه الطريقة على "مجموعة ميزات" (على سبيل المثال، كل شيء أسفل كلمة المفتاح "feature" إلى كلمة المفتاح التالية لمجموعة الميزات أو نهاية الفئة) في الفئات المنحدرة باستخدام كلمة المفتاح "export".
الميزة { NONE } -- تهيئة default_create -- تهيئة مثيل جديد من "صفر" عشري. do make_zero end
بدلاً من ذلك، فإن عدم وجود إعلان تصدير {x} يعني {ANY} وهو مشابه للنطاق "العام" للغات الأخرى.
الميزة -- الثوابت
أخيرًا، يمكن التحكم في النطاق بشكل انتقائي ودقيق لأي فئة في عالم مشروع إيفل، مثل:
الميزة { DECIMAL , DCM_MA_DECIMAL_PARSER , DCM_MA_DECIMAL_HANDLER } -- الوصول
هنا، سيسمح المترجم فقط للفئات المدرجة بين الأقواس المتعرجة بالوصول إلى الميزات الموجودة داخل مجموعة الميزات (على سبيل المثال DECIMAL، DCM_MA_DECIMAL_PARSER، DCM_MA_DECIMAL_HANDLER ).
"مرحبا بالعالم!"
غالبًا ما يتم نقل مظهر لغة البرمجة وأسلوبها باستخدام برنامج "Hello, world!" . قد يكون مثل هذا البرنامج المكتوب بلغة Eiffel:
الفئة
HELLO_WORLD إنشاء ميزة إنشاء طباعة ( " مرحبًا بالعالم!%N " ) نهاية نهاية
يحتوي هذا البرنامج على الفئة HELLO_WORLD. يقوم المنشئ (إجراء الإنشاء) للفئة، المسماة make, باستدعاء printإجراء مكتبة النظام لكتابة "Hello, world!"رسالة إلى المخرجات.
التصميم حسب العقد
إن مفهوم التصميم بالعقد يشكل جوهر لغة إيفل. وتؤكد العقود على ما يجب أن يكون صحيحًا قبل تنفيذ روتين (شرط مسبق) وما يجب أن يظل صحيحًا بعد انتهاء الروتين (شرط لاحق). وتحدد العقود الثابتة للفئة ما يجب أن تظل صحيحة قبل وبعد الوصول إلى أي ميزة من ميزات الفئة (كل من الروتينات والسمات). وعلاوة على ذلك، تقوم العقود بتدوين افتراضات المطورين والمصممين حول بيئة التشغيل لميزات الفئة أو الفئة ككل في كود قابل للتنفيذ عن طريق الثابت.
تم تصميم مُجمِّع Eiffel ليشمل عقود الميزات والفئات في مستويات مختلفة. على سبيل المثال، يقوم برنامج EiffelStudio بتنفيذ جميع عقود الميزات والفئات أثناء التنفيذ في "وضع Workbench". عند إنشاء ملف قابل للتنفيذ، يتم توجيه المُجمِّع من خلال ملف إعدادات المشروع (مثل ملف ECF) إما لتضمين أو استبعاد أي مجموعة من العقود. وبالتالي، يمكن تجميع ملف قابل للتنفيذ إما لتضمين أو استبعاد أي مستوى من العقود، وبالتالي تحقيق مستويات مستمرة من اختبار الوحدة والتكامل. علاوة على ذلك، يمكن ممارسة العقود بشكل مستمر ومنهجي من خلال ميزة الاختبار التلقائي الموجودة في برنامج EiffelStudio.
تم دمج آليات التصميم حسب العقد بشكل وثيق مع اللغة وإعادة تعريف الميزات في الميراث:
- الشرط المسبق الروتيني: لا يمكن إضعاف الشرط المسبق إلا عن طريق الميراث؛ أي نداء يلبي متطلبات السلف يلبي متطلبات السليل.
- الشرط اللاحق الروتيني: لا يمكن تعزيز الشرط اللاحق إلا عن طريق الميراث؛ أي نتيجة مضمونة من قبل السلف لا يزال يتم توفيرها من قبل السليل.
- متغير الفئة: الشروط التي يجب أن تكون صحيحة بعد إنشاء الكائن وبعد أي استدعاء لروتين الفئة المصدرة. نظرًا لأن الثابت يتم فحصه كثيرًا، فإنه يجعله في نفس الوقت الشكل الأكثر تكلفة وأقوى للشروط أو العقود.
بالإضافة إلى ذلك، تدعم اللغة "تعليمات التحقق" (نوع من "التأكيد")، ومتغيرات الحلقة، ومتغيرات الحلقة (التي تضمن إنهاء الحلقة).
القدرة على منع الفراغ
إن القدرة على منع الثغرات، مثل الكتابة الثابتة، هي ميزة أخرى لتحسين جودة البرمجيات. فالبرمجيات التي تمنع الثغرات محمية من أخطاء وقت التشغيل الناتجة عن استدعاءات مراجع الثغرات ، وبالتالي ستكون أكثر موثوقية من البرمجيات التي يمكن أن تحدث فيها استدعاءات لأهداف الثغرات. والقياس على الكتابة الثابتة مفيد. في الواقع، يمكن النظر إلى القدرة على منع الثغرات باعتبارها امتدادًا لنظام النوع، أو خطوة تتجاوز الكتابة الثابتة، لأن آلية ضمان منع الثغرات مدمجة في نظام النوع.
يمكن رؤية الحماية ضد استدعاءات الهدف الفارغ من خلال مفهوم التعلق و(بالتبعية) الانفصال (على سبيل المثال، الكلمة الرئيسية القابلة للفصل). يمكن رؤية مرفق الحماية من الفراغ في إعادة صياغة قصيرة لكود المثال المستخدم أعلاه:
some_attribute : قابل للفصل SOME_TYPE use_some_attribute -- تعيين قيمة some_attribute إلى `v'. do إذا تم إرفاق some_attribute كـ l_attribute ، فافعل شيئًا ( l_attribute ) end end do_something ( a_value : SOME_TYPE ) -- افعل شيئًا ما باستخدام `a_value'. do ... فعل شيء ما باستخدام ` a_value ' ... end
يوضح مثال الكود أعلاه كيف يمكن للمترجم أن يعالج بشكل ثابت موثوقية ما إذا some_attributeكان سيتم إرفاقه أو فصله عند النقطة التي يتم استخدامه فيها. والجدير بالذكر أن attachedالكلمة الأساسية تسمح بـ "attachment local" (eg )، والتي تقتصر على كتلة الكود المحاطة ببنية if-statement فقط. وبالتالي، داخل كتلة الكود الصغيرة هذه، يمكن ضمان أن
l_attributeالمتغير المحلي (eg ) غير فارغ بشكل ثابت (أي آمن من الفراغ).l_attribute
الميزات: الأوامر والاستعلامات
السمة الأساسية للفئة هي أنها تحدد مجموعة من الميزات: حيث تمثل الفئة مجموعة من الكائنات وقت التشغيل، أو "المثيلات"، فإن الميزة هي عملية على هذه الكائنات. هناك نوعان من الميزات: الاستعلامات والأوامر. يوفر الاستعلام معلومات حول مثيل. ويعدل الأمر مثيلاً.
إن التمييز بين الأمر والاستعلام مهم لطريقة إيفل. على وجه الخصوص:
- مبدأ الوصول الموحد : من وجهة نظر عميل البرنامج الذي يقوم باستدعاء ميزة فئة، سواء كان الاستعلام عبارة عن سمة (قيمة حقل) أو دالة (قيمة محسوبة) فلا ينبغي أن يحدث أي فرق. على سبيل المثال،
a_vehicle.speedيمكن أن تكون سمة يتم الوصول إليها على الكائنa_vehicle، أو يمكن حسابها بواسطة دالة تقسم المسافة على الوقت. يكون الترميز هو نفسه في كلتا الحالتين، بحيث يسهل تغيير تنفيذ الفئة دون التأثير على برنامج العميل. - مبدأ فصل الأوامر عن الاستعلامات : لا يجب أن تعدل الاستعلامات المثيل. هذه ليست قاعدة لغوية بل مبدأ منهجي. لذا، وفقًا لأسلوب إيفل الجيد، لا نجد وظائف "الحصول" التي تغير شيئًا ما وتعيد نتيجة؛ بل توجد أوامر (إجراءات) لتغيير الكائنات، واستعلامات للحصول على معلومات حول الكائن، نتيجة للتغييرات السابقة.
التحميل الزائد
لا يسمح Eiffel بزيادة تحميل الحجج . كل اسم ميزة داخل فئة يطابق دائمًا ميزة معينة داخل الفئة. اسم واحد، داخل فئة واحدة، يعني شيئًا واحدًا. يساعد اختيار التصميم هذا على سهولة قراءة الفئات، من خلال تجنب سبب الغموض حول الروتين الذي سيتم استدعاؤه بواسطة استدعاء. كما أنه يبسط آلية اللغة؛ على وجه الخصوص، هذا ما يجعل آلية الوراثة المتعددة الخاصة بـ Eiffel ممكنة. [12]
يمكن بالطبع إعادة استخدام الأسماء في فئات مختلفة. على سبيل المثال، يتم تعريف خاصية plus (مع البادئة "+" ) في عدة فئات: INTEGER و REAL و STRING وما إلى ذلك.
التعددية
الفئة العامة هي فئة تختلف حسب النوع (على سبيل المثال LIST [PHONE]، وهي قائمة بأرقام الهواتف؛ ACCOUNT [G->ACCOUNT_TYPE]، مع السماح بـ ACCOUNT [SAVINGS] وACCOUNT [CHECKING]، وما إلى ذلك). يمكن أن تكون الفئات عامة، للتعبير عن أنها محددة حسب الأنواع. تظهر المعلمات العامة بين قوسين مربعين:
الفئة LIST [ G ] ...
تُعرف G بأنها "معامل عام رسمي". (يحتفظ Eiffel بـ "الوسيطة" للروتينات، ويستخدم "المعامل" فقط للفئات العامة.) مع مثل هذا الإعلان، يمثل G داخل الفئة نوعًا عشوائيًا؛ لذا يمكن للدالة إرجاع قيمة من النوع G، ويمكن للروتين أن يأخذ معاملًا من هذا النوع:
البند : G افعل ... النهاية ضع ( x : G ) افعل ... النهاية
إن LIST [INTEGER]و LIST [WORD]هي "اشتقاقات عامة" لهذه الفئة. التركيبات المسموح بها (مع n: INTEGER, w: WORD, il: LIST [INTEGER], wl: LIST [WORD]) هي:
ن := il . بند wl . ضع ( w )
INTEGERوهي WORD"المعلمات العامة الفعلية" في هذه المشتقات العامة.
من الممكن أيضًا أن يكون لدينا معلمات رسمية "مقيدة"، حيث يجب أن يرث المعلم الفعلي من فئة معينة، "القيد". على سبيل المثال، في
الفئة HASH_TABLE [ G , KEY -> HASHABLE ]
لا يكون الاشتقاق HASH_TABLE [INTEGER, STRING]صالحًا إلا إذا STRINGورث من HASHABLE(كما يحدث بالفعل في مكتبات إيفل النموذجية). داخل الفصل، بعد KEYتقييده بـ HASHABLEيعني أنه x: KEYمن الممكن تطبيقه على xجميع ميزات HASHABLE، كما في x.hash_code.
أساسيات الميراث
للوراثة من فئة واحدة أو أكثر، ستتضمن الفئة inheritشرطًا في البداية:
الفئة C ترث A B
-- ... إعلان بقية الفصل ...
يمكن للفئة إعادة تعريف (تجاوز) بعض أو كل الميزات الموروثة. يجب الإعلان عن ذلك صراحةً في بداية الفئة من خلال redefineبند فرعي من بند الميراث، كما في
الفئة C ترث A إعادة تعريف f ، g ، h النهاية B إعادة تعريف u ، v النهاية
انظر [13] لمناقشة كاملة حول ميراث إيفل.
الفصول والميزات المؤجلة
يمكن تعريف الفئات باستخدام deferred classبدلاً من مع classللإشارة إلى أنه لا يمكن إنشاء مثيل للفئة بشكل مباشر. تسمى الفئات غير القابلة للإنشاء فئات مجردة في بعض لغات البرمجة الموجهة للكائنات الأخرى. في لغة إيفل، يمكن إنشاء مثيل لفئة "فعّالة" فقط (قد تكون من نسل فئة مؤجلة). يمكن أيضًا تأجيل ميزة باستخدام الكلمة deferredالأساسية بدلاً من doجملة. إذا كانت الفئة تحتوي على أي ميزات مؤجلة، فيجب إعلانها على أنها مؤجلة؛ ومع ذلك، يمكن تأجيل الفئة التي لا تحتوي على ميزات مؤجلة.
تلعب الفئات المؤجلة نفس الدور الذي تلعبه الواجهات في لغات مثل Java، على الرغم من أن العديد من منظري البرمجة الموجهة للكائنات يعتقدون أن الواجهات هي في حد ذاتها إجابة إلى حد كبير على افتقار Java إلى الميراث المتعدد (الذي تمتلكه Eiffel). [14] [15]
إعادة التسمية
تحصل الفئة التي ترث من فئة أو أكثر على جميع ميزاتها، افتراضيًا تحت أسمائها الأصلية. ومع ذلك، قد تغير أسماءها من خلال renameالبنود. وهذا مطلوب في حالة الوراثة المتعددة إذا كانت هناك تعارضات في الأسماء بين الميزات الموروثة؛ بدون إعادة التسمية، فإن الفئة الناتجة تنتهك مبدأ عدم التحميل الزائد المذكور أعلاه وبالتالي ستكون غير صالحة.
الثنائيات
يمكن اعتبار أنواع المجموعات كشكل بسيط من أشكال الفئة، حيث توفر فقط السمات وإجراء "التعيين" المقابل. يقرأ نوع المجموعة النموذجي
TUPLE [ الاسم : سلسلة ؛ الوزن : حقيقي ؛ التاريخ : تاريخ ]
ويمكن استخدامها لوصف مفهوم بسيط لسجل الميلاد إذا لم تكن هناك حاجة إلى فئة. إن مثالًا لمثل هذه المجموعة هو ببساطة تسلسل من القيم ذات الأنواع المعطاة، والموضحة بين قوسين، مثل
[ "بريجيت" , 3.5 , الليلة الماضية ]
يمكن الوصول إلى مكونات مثل هذه المجموعة كما لو كانت علامات المجموعة عبارة عن سمات لفئة، على سبيل المثال، إذا tتم تعيين المجموعة أعلاه، فسيكون t.weightلها قيمة 3.5.
بفضل مفهوم أمر التعيين (انظر أدناه)، يمكن أيضًا استخدام تدوين النقاط لتعيين مكونات مثل هذه المجموعة، كما في
الوزن t : = الوزن t + 0.5
العلامات الثنائية اختيارية، لذا من الممكن أيضًا كتابة نوع ثنائي كـ TUPLE [STRING, REAL, DATE]. (في بعض المترجمات، هذا هو الشكل الوحيد للثنائي، حيث تم تقديم العلامات مع معيار ECMA.)
إن المواصفات الدقيقة لـ eg TUPLE [A, B, C]هي أنها تصف تسلسلات تتكون من ثلاثة عناصر على الأقل ، حيث تكون العناصر الثلاثة الأولى من النوع A، B، Cعلى التوالي. ونتيجة لذلك، TUPLE [A, B, C]تتوافق مع (يمكن تعيينها إلى) TUPLE [A, B]، إلى TUPLE [A]و إلى TUPLE(بدون معلمات)، أعلى نوع من أنواع التوبل تتوافق معه جميع أنواع التوبل.
الوكلاء
تغلف آلية "الوكيل" الخاصة بـ Eiffel العمليات في الكائنات. يمكن استخدام هذه الآلية للتكرار والبرمجة القائمة على الأحداث والسياقات الأخرى التي يكون من المفيد فيها تمرير العمليات حول بنية البرنامج. تسمح لغات البرمجة الأخرى، وخاصة تلك التي تؤكد على البرمجة الوظيفية ، بنمط مماثل باستخدام الاستمرارية أو الإغلاقات أو المولدات ؛ تؤكد وكلاء Eiffel على نموذج اللغة الموجه للكائنات، وتستخدم بناء جملة ودلالات مشابهة لكتل التعليمات البرمجية في Smalltalk و Ruby .
على سبيل المثال، لتنفيذ my_actionالكتلة لكل عنصر من عناصر my_list، يجب أن نكتب:
my_list .do_all ( الوكيل my_action )
لتنفيذ my_actionفقط على العناصر التي تلبي الشرط my_condition، يمكن إضافة قيد/مرشح:
my_list . do_if ( الوكيل my_action ، الوكيل my_condition )
في هذه الأمثلة، my_actionو my_conditionهي روتينات. إضافة البادئة لها agentيؤدي إلى إنشاء كائن يمثل الروتين المقابل مع كل خصائصه، وخاصة القدرة على استدعائه بالحجج المناسبة. لذا إذا كان aيمثل هذا الكائن (على سبيل المثال لأن aهو الحجة إلى do_all)، فإن التعليمات
أ . نداء ( [ x ] )
سيتم استدعاء الروتين الأصلي بالحجة x، كما لو كنا قد استدعينا الروتين الأصلي مباشرة: my_action (x). يتم تمرير الوسائط callإلى كمجموعة، هنا [x].
من الممكن الاحتفاظ ببعض الحجج لوكيل مفتوحًا وجعل البعض الآخر مغلقًا . يتم تمرير الحجج المفتوحة كحجج إلى call: يتم توفيرها في وقت استخدام الوكيل . يتم توفير الحجج المغلقة في وقت تعريف الوكيل . على سبيل المثال، إذا action2كان لديه حجتان، فإن التكرار
my_list .do_all ( الوكيل action2 ( ?, y ) )
يتكرر action2 (x, y)للقيم المتعاقبة لـ x، حيث تظل الحجة الثانية مضبوطة على y. تشير علامة الاستفهام ?إلى حجة مفتوحة؛ yهي حجة مغلقة للوكيل. لاحظ أن بناء الجملة الأساسي agent fهو اختصار لـ agent f (?, ?, ...)مع كل الحجج مفتوحة. من الممكن أيضًا جعل هدف الوكيل مفتوحًا من خلال التدوين {T}?حيث Tهو نوع الهدف.
يتوافق التمييز بين المتغيرات المفتوحة والمغلقة (المتغيرات = الحجج + الهدف) مع التمييز بين المتغيرات المقيدة والحرة في حساب لامدا . يتوافق تعبير الوكيل مثل action2 (?, y)مع بعض المتغيرات المغلقة وبعض المتغيرات المفتوحة مع إصدار من العملية الأصلية التي تم تنفيذها على المتغيرات المغلقة.
تسمح آلية الوكيل أيضًا بتعريف وكيل دون الرجوع إلى روتين موجود (مثل my_action، my_condition، action2)، من خلال وكلاء مضمنين كما في
my_list.do_all ( الوكيل ( s : STRING ) يتطلب not_void : s / = Void do s.append_character ( ' , ' ) تأكد من الإلحاق : s.count = old s.count + 1 end )
يمكن للوكيل المضمن الذي تم تمريره هنا أن يحتوي على جميع زخارف الروتين العادي، بما في ذلك الشرط المسبق، والشرط اللاحق، وعبارة الإنقاذ (غير المستخدمة هنا)، والتوقيع الكامل. وهذا يتجنب تعريف الروتينات عندما يكون كل ما هو مطلوب هو عملية حسابية يتم تضمينها في وكيل. وهذا مفيد بشكل خاص للعقود، كما هو الحال في عبارة ثابتة تعبر عن أن جميع عناصر القائمة موجبة:
my_list.for_all ( الوكيل ( x : INTEGER ) : BOOLEAN do النتيجة : = ( x > 0 ) end )
تترك آلية الوكيل الحالية احتمالية حدوث خطأ في نوع وقت التشغيل (إذا تم تمرير روتين يحتوي على n وسيطة إلى وكيل يتوقع m وسيطة مع m < n ). يمكن تجنب ذلك من خلال فحص وقت التشغيل من خلال الشرط المسبق valid_arguments. callتتوفر عدة مقترحات لتصحيح ثابت بحت لهذه المشكلة، بما في ذلك اقتراح تغيير اللغة من قبل Ribet et al. [16]
روتين مرة واحدة
يمكن تخزين نتيجة الروتين مؤقتًا باستخدام onceالكلمة الأساسية بدلاً من do. لا تتطلب المكالمات غير الأولى للروتين أي حسابات إضافية أو تخصيص موارد، ولكنها ببساطة تعيد نتيجة تم حسابها مسبقًا. النمط الشائع لـ "وظائف مرة واحدة" هو توفير كائنات مشتركة؛ ستنشئ المكالمة الأولى الكائن، وستعيد المكالمات اللاحقة المرجع إلى هذا الكائن. المخطط النموذجي هو:
shared_object : SOME_TYPE بمجرد إنشاء Result . make ( args ) -- يؤدي هذا إلى إنشاء الكائن وإرجاع مرجع إليه من خلال `Result'. end
يمكن أن يكون الكائن المُرجع - Resultفي المثال - قابلاً للتغيير بحد ذاته، ولكن مرجعه يظل كما هو.
غالبًا ما تقوم "الروتينات التي تعمل مرة واحدة" بتنفيذ تهيئة مطلوبة: يمكن أن تتضمن المكالمات المتعددة إلى مكتبة استدعاءً لإجراء التهيئة، ولكن المكالمة الأولى فقط هي التي ستنفذ الإجراءات المطلوبة. باستخدام هذا النمط، يمكن جعل التهيئة لامركزية، مما يتجنب الحاجة إلى وحدة تهيئة خاصة. تتشابه "الروتينات التي تعمل مرة واحدة" في الغرض والتأثير مع نمط singleton في العديد من لغات البرمجة، ونمط Borg المستخدم في Python.
بشكل افتراضي، يتم استدعاء "الروتين مرة واحدة" مرة واحدة لكل خيط . يمكن تعديل الدلالات لتكون مرة واحدة لكل عملية أو مرة واحدة لكل كائن من خلال تأهيلها بمفتاح "مرة واحدة"، على سبيل المثال once ("PROCESS").
التحويلات
يوفر إيفل آلية تسمح بالتحويلات بين أنواع مختلفة. تتعايش هذه الآليات مع الوراثة وتكملها. لتجنب أي ارتباك بين الآليتين، يفرض التصميم المبدأ التالي:
- (مبدأ التحويل) لا يمكن لنوع أن يتوافق ويتحول إلى نوع آخر.
على سبيل المثال، NEWSPAPERقد يتوافق مع PUBLICATION، لكنه INTEGERيتحول إليه REAL(ولا يرث منه).
تعمل آلية التحويل ببساطة على تعميم قواعد التحويل المخصصة (مثل indeed between INTEGERو REAL) الموجودة في معظم لغات البرمجة، مما يجعلها قابلة للتطبيق على أي نوع طالما تم مراعاة المبدأ المذكور أعلاه. على سبيل المثال، DATEقد يتم إعلان فئة لتحويلها إلى STRING؛ وهذا يجعل من الممكن إنشاء سلسلة من تاريخ ببساطة من خلال
سلسلة نصية := تاريخي
كاختصار لاستخدام إنشاء كائن صريح مع إجراء تحويل:
إنشاء my_string . make_from_date ( my_date )
لجعل الشكل الأول ممكنًا كمرادف للثاني، يكفي إدراج إجراء الإنشاء (المنشئ) make_from_dateفي convertجملة في بداية الفصل.
كمثال آخر، إذا كان هناك إجراء تحويل مدرج من هذا القبيل TUPLE [day: INTEGER; month: STRING; year: INTEGER]، فيمكن للمرء أن يعين بشكل مباشر مجموعة إلى تاريخ، مما يتسبب في التحويل المناسب، كما في
يوم الباستيل := [ 14 ، "يوليو" ، 1789 ]
معالجة الاستثناءات
تعتمد معالجة الاستثناءات في Eiffel على مبادئ التصميم بالعقد. على سبيل المثال، يحدث استثناء عندما يفشل المتصل بالروتين في تلبية شرط مسبق، أو عندما لا يتمكن الروتين من ضمان شرط لاحق موعود. في Eiffel، لا يتم استخدام معالجة الاستثناءات لتدفق التحكم أو لتصحيح أخطاء إدخال البيانات.
يتم تعريف معالج استثناء Eiffel باستخدام كلمة rescue الأساسية . داخل قسم rescue ، تقوم كلمة retry الأساسية بتنفيذ الروتين مرة أخرى. على سبيل المثال، يتتبع الروتين التالي عدد محاولات تنفيذ الروتين، ويعيد المحاولة لعدد معين من المرات فقط:
connect_to_server ( server : SOCKET ) -- الاتصال بالخادم أو الاستسلام بعد 10 محاولات. require server / = Void ثم server.address / = Void محاولات محلية : INTEGER do server.connect تأكد من الاتصال : server.is_connected rescue إذا كانت المحاولات < 10 ، فإن المحاولات : = المحاولات + 1 إعادة المحاولة end end
يمكن القول إن هذا المثال معيب لأي شيء غير أبسط البرامج، وذلك لأن فشل الاتصال أمر متوقع. بالنسبة لمعظم البرامج، سيكون اسم روتيني مثل attempt_connecting_to_server أفضل، ولن يعد الشرط اللاحق باتصال، مما يترك الأمر للمتصل لاتخاذ الخطوات المناسبة إذا لم يتم فتح الاتصال.
التزامن
يتوفر عدد من مكتبات الشبكات والترابط، مثل EiffelNet وEiffelThreads. نموذج التزامن لـ Eiffel، استنادًا إلى مفاهيم التصميم بالعقد، هو SCOOP ، أو البرمجة الشيئية المتزامنة البسيطة الموجهة ، وهو ليس جزءًا من تعريف اللغة الرسمي ولكنه متاح في EiffelStudio . CAMEO [17] هو أحد المتغيرات (غير المنفذة) لـ SCOOP لـ Eiffel. يتفاعل التزامن أيضًا مع الاستثناءات. يمكن أن تكون الاستثناءات غير المتزامنة مزعجة (حيث يثير الروتين استثناءً بعد أن ينتهي المتصل به). [18]
قواعد بناء الجملة للمشغل والأقواس، أوامر التعيين
إن وجهة نظر إيفل في الحوسبة موجهة بالكامل نحو الكائنات بمعنى أن كل عملية نسبية بالنسبة لكائن، "الهدف". على سبيل المثال، فإن إضافة مثل
أ + ب
يتم فهمه من الناحية المفاهيمية كما لو كان استدعاء الطريقة
أ . زائد ( ب )
مع الهدف aوالميزة plusوالحجة b.
بالطبع، فإن الصيغة السابقة هي الصيغة التقليدية وعادة ما تكون مفضلة. تتيح صيغة المشغل إمكانية استخدام أي من النموذجين عن طريق إعلان الميزة (على سبيل المثال في INTEGER، ولكن هذا ينطبق على فئات أساسية أخرى ويمكن استخدامه في أي فئة أخرى يكون فيها مثل هذا المشغل مناسبًا):
إضافة الاسم المستعار "+" ( أخرى : INTEGER ): INTEGER -- ... إعلان الوظيفة العادية... النهاية
إن نطاق العوامل التي يمكن استخدامها كـ "أسماء مستعارة" واسع للغاية؛ فهي تشمل عوامل محددة مسبقًا مثل "+" ولكن أيضًا "عوامل حرة" مكونة من رموز غير أبجدية رقمية. وهذا يجعل من الممكن تصميم تدوينات خاصة للبادئات والبادئات، على سبيل المثال في تطبيقات الرياضيات والفيزياء.
يمكن أن يكون لكل فئة أيضًا وظيفة بديلة لـ "[]"، عامل "الأقواس"، مما يسمح بالترميز a [i, ...]كمرادف لـ a.f (i, ...)where fهي الوظيفة المختارة. هذا مفيد بشكل خاص لهياكل الحاويات مثل المصفوفات وجداول التجزئة والقوائم وما إلى ذلك. على سبيل المثال، يمكن كتابة الوصول إلى عنصر من جدول التجزئة بمفاتيح سلسلة
الرقم := دليل الهاتف [ "جيل سميث" ]
"أوامر التعيين" هي آلية مصاحبة مصممة بنفس روح السماح بإعادة تفسير التدوين الراسخ والمريح في إطار البرمجة الموجهة للكائنات. تسمح أوامر التعيين بقواعد نحوية شبيهة بالتعيين لاستدعاء إجراءات "التعيين". لا يمكن أن يكون التعيين الصحيح من الشكل أبدًا a.x := vلأن هذا ينتهك إخفاء المعلومات؛ يجب عليك اختيار أمر تعيين (إجراء). على سبيل المثال، يمكن أن تحتوي فئة جدول التجزئة على الوظيفة والإجراء
الاسم المستعار للعنصر "[]" ( المفتاح : سلسلة ) : العنصر [ 3 ] -- عنصر المفتاح `key'. -- (استعلام "Getter") ... النهاية
ضع ( e : ELEMENT ؛ key : STRING ) -- أدخل العنصر `e'، واربطه بالمفتاح `key'. -- (أمر "Setter") do ... end
ثم لإدراج عنصر يجب عليك استخدام استدعاء صريح لأمر setter:
[ 4 ] دليل الهاتف . ضع ( شخص جديد ، "جيل سميث" )
من الممكن كتابة هذا على نحو مكافئ على النحو التالي
[ 5 ] دفتر الهاتف [ "JILL SMITH" ] := شخص جديد
(بنفس الطريقة التي phone_book ["JILL SMITH"]تعد مرادفًا لـ number := phone_book.item ("JILL SMITH"))، بشرط أن يبدأ إعلان itemالآن (استبدالًا لـ [3]) بـ
الاسم المستعار للعنصر " []" ( المفتاح : سلسلة ): تعيين العنصر
يعلن هذا الأمر putباعتباره أمر التعيين المرتبط بـ itemو، عند دمجه مع الاسم المستعار بين قوسين، يجعل [5] قانونيًا ومكافئًا لـ [4]. (يمكن أيضًا كتابته، دون الاستفادة من القوس، كـ phone_book.item ("JILL SMITH") := New_person.
ملاحظة: قائمة وسيطات المعين a مقيدة لتكون: (نوع الإرجاع a؛ كل قائمة وسيطات a...)
الخصائص المعجمية والنحوية
لا يفرق Eiffel بين الأحرف الكبيرة والصغيرة. تشير الرموز makeو maKeو MAKEإلى نفس المعرف. ومع ذلك، راجع "قواعد الأسلوب" أدناه.
يتم تقديم التعليقات بواسطة --(شرطتين متتاليتين) وتمتد إلى نهاية السطر.
الفاصلة المنقوطة، كفاصل بين التعليمات، اختيارية. في أغلب الأحيان يتم حذف الفاصلة المنقوطة، إلا عند فصل تعليمات متعددة على سطر واحد. يؤدي هذا إلى تقليل الفوضى في صفحة البرنامج.
لا يوجد تعشيش لإعلانات الميزات والفئات. ونتيجة لذلك، فإن بنية فئة Eiffel بسيطة: بعض البنود على مستوى الفئة (الوراثة، الثوابت) وسلسلة من إعلانات الميزات، كلها على نفس المستوى.
من المعتاد تجميع الميزات في "جمل ميزات" منفصلة لتحقيق قدر أكبر من قابلية القراءة، مع ظهور مجموعة قياسية من علامات الميزات الأساسية بترتيب قياسي، على سبيل المثال:
الفئة HASH_TABLE [ ELEMENT , KEY -> HASHABLE ] ترث TABLE [ ELEMENT ]
الميزة -- التهيئة -- ... إعلانات أوامر التهيئة (إجراءات/منشئو الإنشاء) ...
الميزة -- الوصول -- ... إعلانات الاستعلامات غير المنطقية حول حالة الكائن، على سبيل المثال العنصر ...
الميزة -- تقرير الحالة -- ... إعلانات الاستعلامات المنطقية حول حالة الكائن، على سبيل المثال is_empty ...
الميزة -- تغيير العنصر -- ... إعلانات الأوامر التي تغير البنية، على سبيل المثال وضع ...
-- الخ.
النهاية
على النقيض من معظم لغات البرمجة التي تستخدم الأقواس المتعرجة ، فإن لغة إيفل تميز بوضوح بين التعبيرات والتعليمات. وهذا يتماشى مع مبدأ فصل الأوامر عن الاستعلامات في طريقة إيفل.
اتفاقيات الأسلوب
تستخدم أغلب وثائق Eiffel اتفاقيات أسلوب مميزة، مصممة لفرض مظهر وشعور متناسقين. تنطبق بعض هذه الاتفاقيات على تنسيق الكود نفسه، وتنطبق بعضها الآخر على العرض الطباعي القياسي لكود Eiffel في التنسيقات والمنشورات حيث تكون هذه الاتفاقيات ممكنة.
على الرغم من أن اللغة لا تميز بين الأحرف الكبيرة والصغيرة، فإن معايير الأسلوب تنص على استخدام الأحرف الكبيرة لأسماء الفئات ( LIST)، والأحرف الصغيرة لأسماء الميزات ( make)، والأحرف الكبيرة الأولية للثوابت ( Avogadro). يقترح الأسلوب الموصى به أيضًا استخدام الشرطة السفلية لفصل مكونات المعرف متعدد الكلمات، كما في average_temperature.
تتضمن مواصفات Eiffel إرشادات لعرض نصوص البرامج بتنسيقات منسقة: الكلمات الرئيسية بخط غامق، والمعرفات والثوابت المحددة من قبل المستخدم تظهر في italics، والتعليقات، والمشغلات، وعلامات الترقيم في Roman، مع نص البرنامج في blueكما هو موضح في المقالة الحالية لتمييزه عن النص التوضيحي. على سبيل المثال، سيتم عرض برنامج "Hello, world!" المذكور أعلاه على النحو التالي في وثائق Eiffel:
class
HELLO_WORLD إنشاء ميزة إنشاء عمل طباعة ( "مرحبًا بالعالم! " ) نهاية نهاية
الواجهات لأدوات ولغات أخرى
إن Eiffel هي لغة برمجة موجهة نحو الكائنات بحتة ولكنها توفر بنية مفتوحة للتفاعل مع البرامج "الخارجية" في أي لغة برمجة أخرى.
من الممكن على سبيل المثال برمجة العمليات على مستوى الجهاز ونظام التشغيل بلغة C. يوفر Eiffel واجهة مباشرة لروتينات C، بما في ذلك دعم "C المضمنة" (كتابة نص روتين Eiffel بلغة C، عادةً للعمليات القصيرة على مستوى الجهاز).
على الرغم من عدم وجود اتصال مباشر بين Eiffel و C، فإن العديد من مُجمِّعي Eiffel ( Visual Eiffel هو أحد الاستثناءات) يُخرجون كود مصدر C كلغة وسيطة ، لتقديمه إلى مُجمِّع C، لتحسينه وإمكانية نقله . وعلى هذا النحو، فهم أمثلة على المُجمِّعين المترجمين . يمكن لمُجمِّع Eiffel tecomp تنفيذ كود Eiffel مباشرةً (مثل المُفسِّر) دون المرور عبر كود C وسيط أو إصدار كود C الذي سيتم تمريره إلى مُجمِّع C من أجل الحصول على كود أصلي مُحسَّن. على .NET، يُنشئ مُجمِّع EiffelStudio كود CIL (لغة وسيطة مشتركة) مباشرةً . يمكن لمُجمِّع SmartEiffel أيضًا إخراج كود بايت Java .
مراجع
- ^ "إيفل في جوزة". archive.eiffel.com . تم الاسترجاع في 24 أغسطس 2017 .
- ^ "EiffelStudio 24.05 متاح الآن!". Eiffel.org . 14 يونيو 2024.
- ^ كوبر، بيتر (2009). بداية روبي: من المبتدئ إلى المحترف . بداية روبي: من المبتدئ إلى المحترف (الطبعة الثانية). بيركلي: إيه بريس. ص. 101. رقم ISBN 978-1-4302-2363-4إلى حد أقل ،
تأثرت Ruby أيضًا بلغات Python وLISP وEiffel وAda وC++.
- ^ "إيفل – اللغة". berenddeboer.net . تم الاسترجاع في 6 يوليو 2016 .
- ^ ماير، برتراند (2009-08-28). لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الكائنات والعقود. سبرينغر ساينس آند بيزنس ميديا. رقم ISBN 978-3-540-92144-8.
- ^ "لغات البرمجة - إيفل" (PDF) . قسم علوم الكمبيوتر، جامعة فرجينيا للتكنولوجيا . تم الاسترجاع في 25 مارس 2023 .
- ^ كارل فريس. "دليل بناء الجملة لـ Eiffel". دليل بناء الجملة لـ Eiffel . تم الاسترجاع في 25 مارس 2023 .
- ^ Claus Brabrand. "The EIFFEL Programming Language" (PDF) . جامعة كوبنهاجن لتكنولوجيا المعلومات . تم الاسترجاع في 25 مارس 2023 .
- ^ بناء البرمجيات الموجهة للكائنات ، الطبعة الثانية، بقلم برتراند ماير ، برنتيس هول، 1997، ISBN 0-13-629155-4
- ^ ECMA International: Standard ECMA-367 – Eiffel: Analysis, Design and Programming Language 2nd edition (June 2006)؛ متاح على الإنترنت على https://ecma-international.org/publications-and-standards/standards/ecma-367/
- ^ المنظمة الدولية للمعايير: المعيار ISO/IEC DIS 25436، متاح على الإنترنت على [1]
- ^ برتراند ماير: التحميل الزائد مقابل تكنولوجيا الكائنات، في مجلة البرمجة الموجهة للكائنات (JOOP)، المجلد 14، العدد 4، أكتوبر-نوفمبر 2001، متاح على الإنترنت
- ^ "9 الميراث". Archive.eiffel.com. 1997-03-23 . تم الاسترجاع في 2013-07-08 .
- ^ "الوراثة المتعددة والواجهات". Artima.com. 2002-12-16 . تم الاسترجاع في 2013-07-08 .
- ^ "الوراثة المتعددة ليست شرًا". C2.com. 2007-04-28 . تم الاسترجاع في 2013-07-08 .
- ^ Philippe Ribet, Cyril Adrian, Olivier Zendra, Dominique Colnet: Conformance of agents in the Eiffel language , in Journal of Object Technology , vol. 3, no. 4, April 2004, Special issue: TOOLS USA 2003, pp. 125-143. متاح على الإنترنت من صفحة مقالة JOT
- ^ بروك، فيليب؛ ريتشارد بايج (2008). "كاميو: نموذج بديل للتزامن لـ إيفل" (PDF) . الجوانب الرسمية للحوسبة . 21 (4). سبرينغر: 363-391. doi :10.1007/s00165-008-0096-1. S2CID 18336088.
- ^ بروك، فيليب؛ ريتشارد بايج (2007). "الاستثناءات في إيفل المتزامن". مجلة تكنولوجيا الكائنات . 6 (10): 111-126. doi : 10.5381/jot.2007.6.10.a4 .
روابط خارجية
- كان موقع الويب الخاص بالشركة التي قدمت برنامج Eiffel Software هو Interactive Software Engineering (ISE).
- موقع LibertyEiffel لنظام تطوير GNU Eiffel المجاني.
