hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
أحمد شمس الدين بن محمد أبي الفائز الموسوي الحائري مرقد ابن هاشم
مبنى الضريح مستطيل الشكل، يبلغ طوله 84.5 مترًا وعرضه 45 مترًا. ويشتمل على مبنى القبر الذي يشغل المنطقة المركزية للضريح، وهو مستطيل الشكل ويبلغ طوله 22.5 مترًا وعرضه 14.5 مترًا وارتفاعه 6 أمتار. يقع حرم القبر في وسط بناء العافية ويعلوه قبة بصلية الشكل ترتكز على ثمانية أعمدة ذات مقطع مربع طول ضلعه 65 سنتيمترًا. يبلغ قطر القبة حوالي 7 أمتار وارتفاع القبة حوالي 10 أمتار فوق مستوى أرض مبنى الضريح. تحتوي القبة على 8 نوافذ حول عنقها ويبلغ ارتفاع كل نافذة مترًا واحدًا وعرضها مترًا واحدًا أيضًا. زُين الجزء الخارجي من القبة ببلاط الكاشاني الجميل وفي نهايتها العلوية يوجد عمود معدني متصل به كرات ذات أحجام مختلفة. ويسبق مبنى القبر إيوان تتكون واجهته من ثلاثة أقواس مدببة، يكون القوس الأوسط أعلى من القوسين الآخرين ومغطى من الخارج ببلاط الكاشاني. الخط العلوي للواجهات الخارجية لمبنى القبر مغطى ببلاط الكاشاني المزخرف بنصوص من القرآن الكريم على طراز العربس. يحيط بمبنى القبر فناء مفتوح واسع يحيط به من جوانبه الأربعة إيوانات مسقوفة تعلوها أقواس مدببة وتستخدم كأماكن راحة للمسافرين.
حاجي خيل (قبيلة)
حاجي خيل هي عشيرة بشتونية من شامكانيس [الإنجليزية]
 وتارين [الإنجليزية]
. تُعتبر حاجي خيل طائفة فرعية في عشيرة ساربان [الإنجليزية]
، ونورزاي [الإنجليزية]
 وهارونزاي وتارين [الإنجليزية]
. يُعتقد أنهم من أصل عربي، وتحديدًا من نسل حاجي سيد أحمد شاه؛ وقد اندمجوا مع المجتمعات البشتونية. استقروا في تورا شاه، وبيشين، وبلوشستان، اللاتي يقعن في باكستان اليوم.
يعتبر حاجي خيل من البشتون ثقافيًا ولغويًا ويعرفون باسم "خانان" في القبائل البشتونية الأخرى والتي تعني "الحاكم" ولهذا السبب يستخدم معظمهم لقب "خان".
حاجي سيد أحمد شاه
حاجي بابا سيد أحمد شاه كان مهاجرًا عربيًّا من شبه الجزيرة العربية إلى جنوب آسيا في فترة ما في القرن الخامس عشر أو السادس عشر للدعوة للإسلام واستقر لاحقًا في منطقة خيبر بختونخوا.[بحاجة لشرح]. أحفاده الذين هم من البشتون يعرفون باسم حاجي خيل سيدان (سيد) (حاجي خيل) أو ميانجان. اندمجوا في القبائل البشتونية الأخرى التي يعيش معظمها في منطقة دير العليا [الإنجليزية]
 وبعضهم هاجر إلى مناطق أخرى من خيبر بختونخوا. يقع قبره في غانديغار [الإنجليزية]
، في منطقة دير العليا [الإنجليزية]
.
صليبي الظاهر
سليبي الظاهر أو صليبي الظاهر (تُوفي في عام 1773) كان ملتزم (جابي ضرائب) في طبرية الفلسطينية في منتصف القرن الثامن عشر ، خلال الحكم العثماني. عينه والده ظاهر العمر لهذا المنصب، وقد كان والده حاكمًا مُستقلًّا تقريبا في شمال فلسطين. كان الابن الأكبر للظاهر عمر ويُعرف عموما بأنه ابنه الأكثر ولاءً ومع ذلك، انضم إلى إخوته عثمان وأحمد وسعيد في تمرد ضد والدهم، حيث هُزموا.
قاد صليبي فرقة من قوات الظاهر لدعم مساعي علي بك الكبير لاستعادة السيطرة على مصر من أبي الذهب. ومع ذلك، هُزمت قوات صليبي وعلي بك بشكل حاسم، وقُتل صليبي في المعركة. لقد حزن زهير على وفاة ابنه وعندما سمع الخبر انهار على الأرض وصرخ "من هذا اليوم أنا هالك". وخلف صليبي أخوه أحمد الظاهر كملتزم طبرية.
يوحنا موروس
يوهانس موروس أو يوحنا موروس (الإيطالية: Giovanni Moro؛ توفي 1254، ودفن في تشرين الثاني) كان خادمًا لالإمبراطور الروماني المقدس فريدريك الثاني ملك شوابيا. كان يوحنا ابنًا لعبد سرساني (على الأغلب عربي)، وبالتالي كان عبدًا في البداية، لكنه استفاد من "تنقل اجتماعي غير عادي" سمح له باكتساب قوة سياسية كبيرة في سوابيا.
تدرّجَت أعماله من محكمة مملكة صقلية ، حتى منصب كبير المحاسبين [الإنجليزية] (أمين الخزانة)، والذي أضاف إليه دورًا بارزًا في لوجارة، في عهد فريدريك الثاني وابنه كونراد الرابع.
يوحنا موروس
يرجع الفضل في اسمه أيضًا إلى أصوله العربية (غالبًا من عرب شمال أفريقيا)، والذي يشير إلى أصله العرقي ولون بشرته. يُعتقد أن التمثال النصفي ذو الملامح الشمال أفريقية الذي عُثر عليه في قلعة لوجارة يمثل صورة يوحنا. انتهت ولائه لسلالة سوابيا في عام 1254، تحت حكم مانفريد، عندما انتقل يوحنا إلى الجانب الغويلفي المعارض المؤيد للبابا. وقد أدّت السياسات ضد المسلمين في لوجارة إلى قتله على يدهم. وفي رسالة مؤرخة في 9 تشرين الثاني 1254، أكد البابا إينوسنت الرابع تحول يوحنا إلى الإيمان الكاثوليكي. عند وفاته، أصبح منصب جراند تشامبرلين من اختصاص مانفريد الثاني، مركيز ماليتا.
طريقة فيينا للتطوير
طريقة فيينا للتطوير (بالإنجليزية: Vienna Development Method)، وتُعرف اختصارًا بـ VDM، هي واحدة من أقدم الطرق الشكلية المعروفة لتطوير الأنظمة القائمة على الحاسوب. نشأت من أعمال أُنجزت في آي بي إم في سبعينيات القرن العشرين، وتطورت لتشمل مجموعة من التقنيات والأدوات المعتمدة على لغة توصيف شكلية — وهي لغة توصيف طريقة فيينا للتطوير (VDM-SL). ولها صيغة موسعة، وهي طريقة تطوير فيينا ++ (VDM++)، والتي تدعم نمذجة الأنظمة الكائنية التوجه والمتزامنة. توجد أدوات تجارية وأكاديمية لدعم طريقة فيينا للتطوير لتحليل النماذج، بما في ذلك دعم لاختبار وإثبات خصائص النماذج وتوليد الشيفرة البرمجية من النماذج المعتمدة. كما أن لطريقة فيينا للتطوير تاريخاً في الاستخدام الصناعي، ونشأ عن هذا الأساس الهيكلي المتين عدد متزايد من الأبحاث التي أسهمت بشكل ملحوظ في هندسة الأنظمة الحرجة، والمصارف، والأنظمة المتزامنة، والمنطق ضمن علم الحاسوب.
طريقة فيينا للتطوير الفلسفة
يمكن نمذجة الأنظمة الحاسوبية باستخدام لغة توصيف طريقة فيينا للتطوير على مستوى عالٍ من التجريد لا يمكن بلوغه باستخدام لغات البرمجة، مما يسمح بتحليل التصاميم وتحديد الخصائص الأساسية، بما في ذلك العيوب، في مرحلة مبكرة من تطوير النظام. ويمكن تحويل النماذج التي تم التحقق منها إلى تصاميم نظام مفصلة عبر عملية تنقيح. وتتميز اللغة بدلالات شكلية، ما يتيح إثبات خصائص النماذج بمستوى عالٍ من الموثوقية. كما تحتوي اللغة على مجموعة قابلة للتنفيذ، بحيث يمكن تحليل النماذج من خلال الاختبار وتنفيذها عبر واجهات المستخدم الرسومية، مما يسمح بتقييمها من قِبل خبراء قد لا يكونون على دراية بلغة النمذجة نفسها.
طريقة فيينا للتطوير التاريخ
تعود أصول لغة توصيف طريقة فيينا للتطوير إلى مختبر آي بي إم في فيينا، حيث أُطلق على أول نسخة من اللغة اسم لغة تعريف فيينا (VDL). وقد استُخدمت VDL بشكل أساسي لوصف دلالات التشغيل، بخلاف طريقة فيينا للتطوير – Meta-IV التي قدمت الدلالات التعيينية.
«نحو نهاية عام 1972، عاودت مجموعة فيينا اهتمامها بمشكلة تطوير مترجم من تعريف لغة بطريقة منهجية. وقد أُطلق على النهج العام المتبع اسم "طريقة فيينا للتطوير"... أما اللغة الوصفية التي استُخدمت فعلياً ("ميتا-آي في") فقد استُخدمت لتعريف أجزاء رئيسية من لغة PL/1 (كما وردت في ECMA 74 – وهي وثيقة معايير شكلية مكتوبة كمفسر تجريدي) في BEKIČ 74.»
لا توجد أي علاقة بين ميتا-آي في ولغة ميتا 2 التي طوّرها شور، أو وريثتها تري ميتا؛ فهذه كانت أنظمة مصرف المصرفات وليست مناسبة لوصف المشكلات بشكل شكلي.
طريقة فيينا للتطوير التاريخ
وهكذا، استُخدمت ميتا-آي في "لتعريف أجزاء رئيسية من" لغة البرمجة بي إل/آي. ومن اللغات الأخرى التي وُصفت لاحقاً جزئياً أو كلياً باستخدام Meta-IV وVDM-SL: بيسيك، فورتران، إيه بي إل (لغة برمجة)، ألغول 60، أيدا، وباسكال. وقد تطورت ميتا-آي في إلى عدة صيغ، تُعرف عموماً باسم المدارس الدنماركية، والإنجليزية، والآيرلندية.
تنحدر "المدرسة الإنجليزية" من عمل كليف جونز على جوانب طريقة فيينا للتطوير غير المرتبطة بتعريف اللغة وتصميم المترجمات (جونز 1980، 1990). وتركز هذه المدرسة على نمذجة الحالة الدائمة باستخدام أنواع بيانات مبنية من مجموعة غنية من الأنواع الأساسية. وتُوصف الوظائف عادة من خلال عمليات قد يكون لها تأثيرات جانبية على الحالة وغالباً ما تُحدد ضمنياً باستخدام شرط مسبق وشرط لاحق. أما "المدرسة الدنماركية" (بيورنر وآخرون 1982) فتميل إلى نهج بنائي مع مواصفات تشغيلية صريحة بدرجة أكبر. وقد أدى العمل في المدرسة الدنماركية إلى إنتاج أول مترجم أيدا مُعتمد أوروبياً.
وقد صدر معيار من المنظمة الدولية للمعايير للغة في عام 1996 (آيزو، 1996).
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
يتم وصف الصياغة والدلالات النحوية لكل من لغة توصيف طريقة فيينا للتطوير وطريقة فيينا للتطوير++ بشكل موسّع في كتيبات لغة أدوات طريقة فيينا للتطوير (VDMTools) وفي النصوص المتوفرة. ويحتوي المعيار الصادر عن المنظمة الدولية للمعايير (آيزو) على تعريف رسمي لدلالات اللغة. في بقية هذه المقالة، تُستخدم صياغة التبادل المحددة في المعيار (أسكي). ويفضّل بعض المؤلفين استخدام تدوين رياضي أكثر إيجازًا.
نموذج لغة توصيف طريقة فيينا للتطوير هو وصف لنظام يُقدَّم من حيث الوظائف المنفذة على البيانات. ويتألف من سلسلة من تعريفات أنواع البيانات والدوال أو العمليات التي تُجرى عليها.
تتضمن لغة توصيف طريقة فيينا للتطوير أنواعًا أساسية تمثل الأعداد والأحرف كما يلي:
يتم تعريف أنواع البيانات لتمثيل البيانات الرئيسية في النظام المُمَثَّل. يقدم كل تعريف نوعًا جديدًا ويمنح تمثيلًا له باستخدام الأنواع الأساسية أو أنواع سبق تعريفها. على سبيل المثال، قد يُعرَّف نوع يمثل معرّفات المستخدمين في نظام إدارة تسجيل الدخول على النحو التالي:
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
وللتعامل مع القيم التابعة لأنواع البيانات، تُعرَّف عوامل (operators) تعمل على هذه القيم. وبالتالي، يتم توفير عمليات الجمع والطرح للأعداد الطبيعية، وكذلك العمليات المنطقية مثل التساوي وعدم التساوي. لا تحدد اللغة حدًا أقصى أو أدنى للأعداد الممكن تمثيلها أو دقة الأعداد الحقيقية. ويتم تحديد مثل هذه القيود عند الحاجة إليها داخل كل نموذج باستخدام ما يُعرف بثوابت النوع (invariants) — وهي تعبيرات منطقية تشير إلى الشروط التي يجب أن تحققها جميع عناصر النوع المعرف. على سبيل المثال، يُعبَّر عن شرط يقضي بأن معرّفات المستخدمين يجب ألا تتجاوز 9999 على النحو التالي (حيث <= هو عامل "أقل من أو يساوي" على الأعداد الطبيعية):
نظرًا لأن الثوابت (invariants) يمكن أن تكون تعبيرات منطقية معقدة بأي درجة، ولأن الانتماء إلى نوع معين يُحدَّد فقط بالقيم التي تحقق الثابت، فإن تحقق صحة النوع (type correctness) في لغة توصيف طريقة فيينا للتطوير ليس قابلًا للحسم تلقائيًا في جميع الحالات.
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
تشمل الأنواع الأساسية الأخرى char التي تمثل الأحرف. وفي بعض الحالات، لا يكون تمثيل النوع ذا أهمية لغرض النموذج، وقد يؤدي إلى تعقيده. في مثل هذه الحالات، يمكن تمثيل أعضاء النوع باستخدام توكنات بدون بنية داخلية. يمكن مقارنة قيم أنواع التوكن فقط من حيث التساوي – ولا تُعرَّف عليها أي عوامل أخرى. وعندما تكون هناك حاجة إلى قيم مسماة معينة، يتم إدخالها كأنواع اقتباس. يتكوّن كل نوع اقتباس من قيمة واحدة مسماة بنفس اسم النوع. ولا يمكن مقارنة قيم الاقتباس (وتُعرف بالأدبيات المقتبسة) إلا من حيث التساوي.
على سبيل المثال، عند تمثيل وحدة تحكم إشارات المرور، قد يكون من الملائم تعريف القيم التي تمثل ألوان الإشارة كأنواع اقتباس:
الأنواع الأساسية وحدها ذات فائدة محدودة. تُبنى أنواع بيانات جديدة وأكثر تنظيمًا باستخدام مُنشئات الأنواع.
أبسط مُنشئ نوع يُشكّل اتحادًا بين نوعين معرفين مسبقًا. النوع (A|B) يحتوي على جميع عناصر النوع A وجميع عناصر النوع B. في مثال وحدة تحكم إشارة المرور، يمكن تعريف النوع الذي يُمثّل لون الإشارة على النحو التالي:
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
تُعرّف نوع التعداد في لغة توصيف طريقة فيينا للتطوير كما هو موضح أعلاه بوصفها اتحادات لأنواع اقتباس.
يمكن أيضًا تعريف أنواع الجداء الديكارتي في لغة توصيف طريقة فيينا للتطوير. النوع (A1*…*An) هو نوع يتكوّن من جميع التُرب المرتبة من القيم، حيث العنصر الأول من النوع A1 والثاني من النوع A2 وهكذا. والنوع المركب أو نوع السجل هو جداء ديكارتي مع تسميات للحقول. النوع
هو الجداء الديكارتي مع الحقول الموسومة بـf1,…,fn. يمكن تركيب عنصر من النوع T من أجزائه المكونة باستخدام المُنشئ المكتوب على الشكل mk_T. وعلى العكس، عند إعطاء عنصر من النوع T، يمكن استخدام أسماء الحقول لاختيار المكوّن المُسمّى. على سبيل المثال، النوع:
يمثّل نوع تاريخ بسيط. القيمة mk_Date(1,4,2001) تقابل 1 أبريل 2001. إذا أعطينا تاريخًا d، فإن التعبير d.month يُرجع عددًا طبيعيًا يمثل الشهر. ويمكن دمج قيود على عدد الأيام في كل شهر والسنة الكبيسة في الثابت (invariant) إذا رغبت في ذلك. بدمج هذه:
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
أنواع المجموعات تُنمذج مجموعات من القيم. المجموعات هي مجموعات منتهية غير مرتبة تُزال فيها التكرارات بين القيم. التسلسلات هي مجموعات منتهية مرتبة (قوائم) يمكن أن تحتوي على تكرارات، وتمثل الخرائط علاقات منتهية بين مجموعتين من القيم.
مُنشئ نوع المجموعة (يُكتب set of T حيث T هو نوع معرف مسبقًا) يُنشئ نوعًا يتكوّن من جميع المجموعات المنتهية من القيم المأخوذة من النوع T. على سبيل المثال، يُعرّف تعريف النوع التالي:
نوع UGroup بوصفه مجموعة منتهية من القيم من نوع UserId. وتوجد العديد من المعاملات المعرفة على المجموعات لبناء اتحادها، وتقاطعها، وتحديد العلاقات بين المجموعات الجزئية الصارمة وغير الصارمة، وغيرها.
مُنشئ نوع التسلسل المنتهي (يُكتب seq of T حيث T هو نوع معرف مسبقًا) يُنشئ نوعًا يتكوّن من جميع القوائم المنتهية من القيم المأخوذة من النوع T. على سبيل المثال، يُعرّف تعريف النوع التالي:
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
نوع String بوصفه جميع السلاسل النصية المنتهية من الحروف. توجد عدة معاملات معرفة على التسلسلات لبناء السلاسل، واختيار العناصر، واستخراج تسلسلات فرعية، وغيرها. العديد من هذه المعاملات جزئية، بمعنى أنها غير معرفة لبعض التطبيقات. على سبيل المثال، اختيار العنصر الخامس من تسلسل يحتوي على ثلاثة عناصر فقط غير معرّف.
ترتيب وتكرار العناصر في التسلسل له أهمية، لذا [a, b] لا يساوي [b, a]، و[a] لا يساوي [a, a].
الخرائط المنتهية هي علاقة بين مجموعتين، النطاق والمدى، حيث يستخدم النطاق لفهرسة عناصر المدى. وهي بذلك تشبه الدوال المنتهية. مُنشئ نوع الخريطة في لغة توصيف طريقة فيينا للتطوير (ويكتب map T1 to T2 حيث T1 وT2 نوعان معرفان مسبقًا) ينشئ نوعًا يتكوّن من جميع الخرائط المنتهية من مجموعة من قيم T1 إلى مجموعة من قيم T2. على سبيل المثال، تعريف النوع التالي:
يُعرّف نوعًا اسمه Birthdays يربط سلاسل الأحرف إلى Date. ويوجد عدد من المعاملات المعرفة على الخرائط مثل الفهرسة داخل الخريطة، دمج الخرائط، والكتابة فوقها واستخراج خرائط فرعية.
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
الفرق الرئيسي بين الصيغتين لغة توصيف طريقة فيينا للتطوير وVDM++ هو في كيفية التعامل مع التنظيم البنيوي. في لغة توصيف طريقة فيينا للتطوير، هناك توسعة معيارية تقليدية، في حين أن طريقة تطوير فيينا++ تستخدم آلية تنظيم بنيوي موجه للكائنات تشمل الأصناف والوراثة.
في المعيار الدولي لـ لغة توصيف طريقة فيينا للتطوير، هناك ملحق إرشادي يحتوي على مبادئ مختلفة للتنظيم البنيوي. كلها تتبع مبادئ إخفاء المعلومات التقليدية باستخدام الوحدات، ويمكن شرحها كالتالي:
طريقة فيينا للتطوير ميزات طريقة فيينا للتطوير
الاستيراد: يمكن استيراد التعريفات التي تم تصديرها من وحدات أخرى. يتم ذلك في قسم الاستيراد الذي يبدأ بالكلمة المفتاحية imports ويتبعها تسلسل من الاستيرادات من وحدات مختلفة. يبدأ كل استيراد باستخدام الكلمة from متبوعة باسم الوحدة وتوقيع الوحدة. يمكن أن يكون توقيع الوحدة ببساطة هو الكلمة all مما يدل على استيراد كل التعريفات المُصدَّرة من تلك الوحدة، أو يمكن أن يكون تسلسلًا من توقيعات الاستيراد. توقيعات الاستيراد تكون خاصة بالأنواع والقيم والدوال والعمليات، وتبدأ كل منها بالكلمة المفتاحية المناسبة. يمكن أن تتضمن توقيعات الاستيراد معلومات نوعية اختيارية، ومن الممكن أيضًا إعادة تسمية كل من البنى عند الاستيراد. للأنواع، يجب أيضًا استخدام الكلمة المفتاحية struct إذا كان هناك رغبة في الوصول إلى البنية الداخلية لنوع معين.
التصدير: يتم تصدير التعريفات من وحدة بحيث تكون متاحة للوحدات الأخرى باستخدام الكلمة exports متبوعة بتوقيع الوحدة المُصدِّرة. يمكن أن يكون توقيع التصدير ببساطة الكلمة all أو تسلسلًا من توقيعات التصدير. توقيعات التصدير تكون خاصة بالأنواع والقيم والدوال والعمليات، وتبدأ كل منها بالكلمة المفتاحية المناسبة. إذا كان هناك رغبة في تصدير البنية الداخلية لنوع ما، يجب استخدام الكلمة struct.
خصائص أكثر تقدمًا: في الإصدارات السابقة من أدوات لغة توصيف طريقة فيينا للتطوير، كان هناك دعم للوحدات المُعلَّمة (المُعمّمة) وتطبيقاتها. لكن هذه الخصائص أُزيلت من أدوات طريقة فيينا للتطوير حوالي سنة 2000 لأنها نادرًا ما استُخدمت في التطبيقات الصناعية، كما أنها سببت عددًا كبيرًا من التحديات في أدوات التطوير.
في طريقة تطوير فيينا++ يتم التنظيم البنيوي باستخدام الأصناف والوراثة المتعددة. المفاهيم الأساسية هي:
مُعدّلات الوصول: يتم تنفيذ إخفاء المعلومات في طريقة تطوير فيينا++ بنفس الطريقة في معظم لغات البرمجة كائنية التوجه باستخدام مُعدّلات الوصول. بشكل افتراضي، تكون التعريفات في طريقة تطوير فيينا++ خاصة، ولكن يمكن استخدام واحدة من الكلمات المفتاحية التالية أمام كل تعريف: private، public وprotected.
طريقة فيينا للتطوير نمذجة الوظائف
في لغة لغة توصيف طريقة فيينا للتطوير، تُعرّف الدوال اعتمادًا على أنواع البيانات المعرفة ضمن النموذج. ويتطلب دعم التجريد أن يكون من الممكن وصف النتيجة التي يجب أن تحسبها الدالة دون الحاجة إلى تحديد كيفية حسابها. وتُعد "تعريفات الدوال الضمنية" الآلية الأساسية لتحقيق ذلك، حيث يُستخدم في هذه التعريفات مُحمَّل منطقي على متغيرات الإدخال والنتيجة، يُعرف بـ "شرط ما بعد التنفيذ"، لتحديد خصائص النتيجة.
على سبيل المثال، يمكن تعريف دالة SQRT لحساب الجذر التربيعي لعدد طبيعي كما يلي:
في هذا المثال، لا يوضح شرط ما بعد التنفيذ طريقة حساب النتيجة r، بل يحدد الخصائص التي يُفترض أن تحققها. لاحظ أن هذا يعرّف دالة تُرجع جذرًا تربيعيًا صالحًا، دون اشتراط أن يكون الجذر موجبًا أو سالبًا. على سبيل المثال، يمكن لدالة تُرجع الجذر السالب للعدد 4، والجذر الموجب لبقية القيم، أن تفي بالمواصفة أعلاه. ومع ذلك، يجب أن تكون الدوال في لغة توصيف طريقة فيينا للتطوير "حتمية"، أي أنها يجب أن تُرجع نفس النتيجة دومًا لنفس المُدخل.
طريقة فيينا للتطوير نمذجة الوظائف
يمكن الحصول على مواصفة أكثر تقييدًا للدالة عن طريق تقوية شرط ما بعد التنفيذ. على سبيل المثال، التعريف التالي يُقيّد الدالة بإرجاع الجذر الموجب فقط:
ويمكن تقييد كل مواصفة دالة باستخدام "شروط ما قبل التنفيذ" وهي مُحمَّلات منطقية تنطبق فقط على المتغيرات المُدخلة، وتصف القيود التي يُفترض أن تكون محققة عند تنفيذ الدالة. على سبيل المثال، يمكن تحديد دالة لحساب الجذر التربيعي للأعداد الحقيقية الموجبة فقط كما يلي:
يشكل شرطا ما قبل وما بعد التنفيذ "عقدًا" يجب على أي برنامج يدعي تنفيذ الدالة الالتزام به. إذ يُعبّر شرط ما قبل التنفيذ عن الافتراضات التي تضمن تحتها الدالة إرجاع نتيجة تحقق شرط ما بعد التنفيذ. وإذا تم استدعاء دالة على مُدخلات لا تحقق شرط ما قبل التنفيذ، تكون النتيجة غير معرفة (بل وقد لا تنتهي العملية أصلًا).
تدعم لغة توصيف طريقة فيينا للتطوير أيضًا تعريف دوال قابلة للتنفيذ على طريقة لغات البرمجة الوظيفية. في "تعريف الدالة الصريح"، يتم تحديد النتيجة باستخدام تعبير رياضي على المُدخلات. على سبيل المثال، يمكن تعريف دالة تُنتج قائمة من مربعات قائمة من الأعداد كما يلي:
طريقة فيينا للتطوير نمذجة الوظائف
يتكوَّن هذا التعريف التكراري من توقيع للدالة يحدد نوعي المُدخل والنتيجة، وجسم دالة يوضح آلية الحساب. أما تعريف الدالة الضمني نفسه فيمكن أن يأخذ الشكل التالي:
يمكن اعتبار التعريف الصريح تنفيذًا مباشرًا للدالة المحددة ضمنيًا. وتُحدد صحة التعريف الصريح بالنسبة إلى المواصفة الضمنية كما يلي:
فإننا نقول إنها تحقق المواصفة إذا وفقط إذا:
وبالتالي، يجب تفسير "الدالة f هي تنفيذ صحيح" على أنها "الدالة f تحقق المواصفة".
في لغة توصيف طريقة فيينا للتطوير، لا تملك الدوال تأثيرات جانبية مثل تغيير حالة متغير عمومي دائم. ومع أن هذه القدرة مفيدة في كثير من لغات البرمجة، فإن هناك مفهومًا مشابهًا في VDM-SL؛ إذ تُستخدم "العمليات" لتغيير "متغيرات الحالة" (المعروفة أيضًا بـ "العموميات").
طريقة فيينا للتطوير نمذجة الوظائف
على سبيل المثال، إذا كان لدينا حالة تتكوَّن من متغير واحد someStateRegister : nat، فيمكن تعريف هذه الحالة في لغة توصيف طريقة فيينا للتطوير كما يلي:
ويمكن تحديد عملية لتحميل قيمة إلى هذا المتغير كما يلي:
تُحدد جملة "الخارجيات" (ext) الأجزاء من الحالة التي يمكن للعملية الوصول إليها؛ حيث يشير rd إلى الوصول للقراءة فقط، وwr إلى الوصول للقراءة والكتابة.
وفي بعض الأحيان، من المهم الرجوع إلى قيمة الحالة قبل تعديلها؛ فمثلًا، يمكن تحديد عملية لإضافة قيمة إلى المتغير كما يلي:
حيث تشير العلامة ~ على متغير الحالة في شرط ما بعد التنفيذ إلى قيمة المتغير قبل تنفيذ العملية.
طريقة فيينا للتطوير أمثلة
هذه مثال لتعريف دالة ضمنية. تقوم هذه الدالة بإرجاع العنصر الأكبر من مجموعة من الأعداد الطبيعية:
تقوم شرطية ما بعد التنفيذ بتوصيف النتيجة بدلاً من تحديد خوارزمية للحصول عليها. وتُستخدم شرطية ما قبل التنفيذ لأنّه لا يمكن لأي دالة أن تُرجع قيمة r تنتمي إلى s إذا كانت المجموعة فارغة.
عند تطبيق التزام الإثبات forall p:T_p & pre-f(p) => f(p):T_r and post-f(p, f(p)) على تعريف صريح للدالة multp:
هذا مثال كلاسيكي يوضّح استخدام المواصفات الضمنية للعمليات في نموذج قائم على الحالة لبنية بيانات معروفة. يُنمذج الطابور كسلسلة مكوّنة من عناصر من النوع Qelt. وتمثيل Qelt ليس مهماً، ولذلك يُعرَّف كنوع رمز.
طريقة فيينا للتطوير أمثلة
كمثال بسيط جداً على نموذج لغة توصيف طريقة فيينا للتطوير، نأخذ نظاماً يحتفظ بتفاصيل حسابات العملاء المصرفية. يُمثَّل العملاء بأرقام العملاء (CustNum)، وتُمثَّل الحسابات بأرقام الحسابات (AccNum). وتمثيلات أرقام العملاء تُعد غير مهمة ولذلك يُعبَّر عنها كنوع رمز. أما الأرصدة والسُحوبات المكشوفة فتُنمذج بأنواع عددية.
تقوم العملية NEWAC بتخصيص رقم حساب جديد وتعيين الرصيد إلى صفر:
تُرجع العملية ACINF جميع أرصدة حسابات عميل ما، كخريطة من رقم الحساب إلى الرصيد:
طريقة فيينا للتطوير دعم الأدوات
توجد العديد من الأدوات المختلفة التي تدعم طريقة فيينا للتطوير:
VDMTools: كانت الأداة التجارية الرائدة لـ طريقة فيينا للتطوير وVDM++، وتمتلكها وتسوّقها وتدعمها وتطوّرها شركة CSK Systems، استناداً إلى نسخ سابقة طوّرتها الشركة الدنماركية IFAD. تتوفر الكتيبات ودليل عملي. جميع التراخيص متاحة مجاناً للنسخة الكاملة من الأداة، والتي تتضمن توليد كود تلقائي لـ Java وC++، ودعم مكتبة الربط الديناميكي ودعم CORBA.
Overture: مبادرة مفتوحة المصدر يقودها المجتمع، تهدف إلى توفير دعم أدوات مجاني لجميع لهجات طريقة فيينا للتطوير (VDM-SL، VDM++، وVDM-RT)، وكان ذلك في الأصل على منصة Eclipse ثم لاحقاً على منصة Visual Studio Code. الهدف منها تطوير إطار عمل لأدوات قابلة للتشغيل المتبادل مفيدة في التطبيقات الصناعية والبحث والتعليم.
طريقة فيينا للتطوير دعم الأدوات
vdm-mode: مجموعة من حزم Emacs لكتابة مواصفات طريقة فيينا للتطوير باستخدام لغة توصيف طريقة فيينا للتطوير وVDM++ وVDM-RT. تدعم التمييز اللوني والتحرير، والتحقق الفوري من صحة الصياغة، وإكمال القوالب، ودعم المفسر.
SpecBox: من شركة Adelard، يوفر التحقق من صحة الصياغة، وبعض الفحوصات الدلالية البسيطة، وتوليد ملف LaTeX يتيح طباعة المواصفات بصياغة رياضية. هذه الأداة متاحة مجاناً ولكن لم يعد يتم تطويرها.
لاتخ وحزم LaTeX2e متاحة لدعم عرض نماذج طريقة فيينا للتطوير باستخدام الصياغة الرياضية للغة المعيار الدولي. تم تطويرها ويتم صيانتها من قبل المختبر الفيزيائي الوطني في المملكة المتحدة. تتوفر الوثائق والحزم على الإنترنت.
طريقة فيينا للتطوير الخبرة الصناعية
تم تطبيق طريقة فيينا للتطوير على نطاق واسع في مجالات تطبيقية متنوعة. من أشهر هذه التطبيقات:
مصرفات أيدا وتشيل: تم تطوير أول مُجمّع أدا تم التحقق من صحته في أوروبا بواسطة مركز دانسك داتاماتيك باستخدام طريقة فيينا للتطوير. كما تم وصف الدلالات لتشيل ومودولا-2 في معاييرها باستخدام طريقة فيينا للتطوير.
تطوير أدوات طريقة فيينا: معظم مكونات حزمة أدوات طريقة فيينا تم تطويرها نفسها باستخدام طريقة فيينا للتطوير. وقد جرى هذا التطوير في IFAD في الدنمارك وشركة سي إس كيه القابضة في اليابان.
تريد ون: تم تطوير بعض المكونات الرئيسية لنظام تريد ون الخلفي من قبل أنظمة سي إس كي لبورصة طوكيو باستخدام طريقة فيينا للتطوير. وتوجد قياسات مقارنة لإنتاجية المطورين وكثافة العيوب للمكونات المطورة بـ طريقة فيينا للتطوير مقابل الكود المطور بالطريقة التقليدية.
طريقة فيينا للتطوير التحسين
يبدأ استخدام طريقة فيينا للتطوير بنموذج عالي التجريد ثم يُطوّر هذا إلى تنفيذ فعلي. كل خطوة تتضمن تجسيد البيانات ثم تفكيك العمليات.
تجسيد البيانات يحول نوع بيانات مجرد إلى بنية بيانات أكثر تحديدًا، بينما تفكيك العمليات يحول المواصفات الضمنية (المجردة) للعمليات والدوال إلى خوارزميةات قابلة للتنفيذ مباشرة بلغة برمجة مختارة.
تجسيد البيانات (التحسين خطوة بخطوة) ينطوي على إيجاد تمثيل أكثر تحديدًا لأنواع البيانات المجردة المستخدمة في المواصفة. قد تكون هناك عدة خطوات قبل الوصول إلى التنفيذ. كل خطوة تجسيد لتمثيل بيانات مجرد ABS_REP تتطلب اقتراح تمثيل جديد NEW_REP. لإثبات دقة التمثيل الجديد، يتم تعريف دالة استرجاع تربط NEW_REP بـ ABS_REP، أي retr : NEW_REP -> ABS_REP. تعتمد صحة تجسيد البيانات على إثبات الكفاية، أي:
طريقة فيينا للتطوير التحسين
وبما أن تمثيل البيانات قد تغير، من الضروري تحديث العمليات والدوال لتعمل على NEW_REP. يجب إثبات أن العمليات والدوال الجديدة تحافظ على أي لامتغير (رياضيات) لنوع البيانات على التمثيل الجديد. ولإثبات أن العمليات والدوال الجديدة تحاكي تلك الموجودة في المواصفة الأصلية، يجب الوفاء بواجبين برهانيين:
في نظام أمني صناعي، يُمنح العمال بطاقات هوية؛ تُستخدم هذه البطاقات في أجهزة قراءة البطاقات عند الدخول إلى المصنع والخروج منه.
العمليات المطلوبة:
بما أن معظم لغات البرمجة تحتوي على مفهوم مشابه للمجموعة (غالبًا في شكل مصفوفة)، فإن الخطوة الأولى من المواصفة هي تمثيل البيانات كسلسلة مرتبة. يجب ألا تسمح هذه السلاسل بالتكرار، لأنه من غير المُرَغّب في ظهور نفس العامل مرتين، لذا يجب إضافة لامتغيرات إلى نوع البيانات الجديد. في هذه الحالة، الترتيب غير مهم، فـ [a,b] تساوي [b,a].
طريقة تطوير فيينا قيمة للأنظمة المبنية على النماذج. لكنها غير مناسبة إذا كان النظام يعتمد على الزمن. في مثل هذه الحالات، يكون حساب الأنظمة التفاعلية أكثر فائدة.
طريقة فيينا للتطوير للمزيد من القراءة
Bjørner، Dines؛ Cliff B. Jones (1978). The Vienna Development Method: The Meta-Language, Lecture Notes in Computer Science 61. Berlin, Heidelberg, New York: Springer. ISBN:978-0-387-08766-5.
Cliff B. Jones، المحرر (1984). Programming Languages and Their Definition — H. Bekič (1936-1982). مذكرات محاضرة في علم الحاسوب [الإنجليزية]
. Berlin, Heidelberg, New York, Tokyo: Springer-Verlag. ج. 177. DOI:10.1007/BFb0048933. ISBN:978-3-540-13378-0. S2CID:7488558. {{استشهاد بكتاب}}: line feed character في |سلسلة= في مكان 220 (مساعدة)
فيتزجيرالد، ج. س. وLarsen, P.G.، نمذجة الأنظمة: أدوات وتقنيات عملية في هندسة البرمجيات. مطبعة جامعة كامبريدج، 1998 (ردمك 0-521-62348-0) (نُشرت النسخة اليابانية بواسطة إيوانامي شوتن 2003 (ردمك 4-00-005609-3)).
فيتزجيرالد، ج. س.، Larsen, P.G.، Mukherjee, P.، Plat, N. وVerhoef, M.، تصاميم مؤكدة للأنظمة الكائنية التوجه. شبرينغر، 2005. (ردمك 1-85233-881-4). موقع داعم يحتوي على أمثلة وأدوات مجانية: