ميزات تنفيذ لغة MSH

أتابع سلسلة المقالات حول لغة برمجة MSH. في مقال سابق ، وصفت بالفعل مواصفات هذه اللغة. لكن المواصفات لا تكشف عن جميع ميزات اللغة. أريد أن أزيل هذه الفجوة مع هذه المقالة. بالطبع ، لم أتمكن من وصف كل شيء ، ولكن في الأساس وصفت الميزات الرئيسية. سنؤجل الباقي حتى أوقات أفضل.

عندما تتشكل صورة اللغة ، يبدو أن كل شيء منطقي ومتسق. ولكن عند مدخل تنفيذ اللغة ، هناك مشاكل يجب حلها عن طريق اختيار استراتيجية أو أخرى. الآن بعد أن أصبح مترجم اللغة جاهزًا ، يمكنك أن ترى كيف قام بحل مشكلة تنفيذ أو أخرى.

مفاهيم لغة البرمجة MSH


جدول المحتويات


المقدمة 2
تنظيم البرنامج. 2
وقت التشغيل. 2
إدارة البيانات. 3
تعريب البيانات. 3
صيغة الاختزال. 5
ثوابت. 5
ميزات بعض الفرق. 5
أمر ثابت. 5
أمر XECUTE. 6
أوامر COPY و MOVE. 6
تزامن الموارد. 7
الشكل المختصر للأمر SET. 8
فرق كتلة. 8
أمر IF. 8
أمر الحالة. 9
الأمر WHILE. 10
حلقة تكرار بلوك. 10
فريق NEXT. 11
أمر عودة. 12
فريق QUERY. 12
أوامر غير كتلة أوامر اجتياز شجرة البيانات. 12
فريق NEXT1. 12
أمر BACK1. ثلاثة عشر
فريق الاستعلام 1. 13
إدارة تنفيذ البرنامج. 13
معلمات النجاح. 14
التعامل مع الأحداث. 15
أمر EVENTTRAP. 15
فريق EVENTDELETE. 16
فريق EVENTCALL. 16
فريق EVENTWAIT. 16
نواقل. 16
متجه 64 بت. 16
ناقل 32 بت. 17
متجه 16 بت. 17
ناقل 8 بت. 17
العمليات. 17
قطعة. 18
وراثة الأشياء. 19
تبادل مع الملف. 20
الخلاصة. عشرون

المقدمة


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

وحدة الترجمة هي وحدة لغة MSH. تبدأ الوحدة من 8 بايت القياسية التي تحدد إصدار اللغة. قد يكون في بداية السطر تسمية أو مسافات. التسمية تنتهي بـ ":" ويتم فصلها عن باقي الأوامر بأي عدد من المسافات. تتكون الخطوط من الأوامر. علامة نهاية الفريق هي الرمز "؛". يتم فصل الأمر عن الوسيطات بمسافات. حالة الأحرف لا يهم. يمكن كتابة الأمر بأحرف من أي تسجيل. بالإضافة إلى ذلك ، تحتوي العديد من الفرق على شكل مختصر. قد يكون للأمر شرط لتنفيذه. إذا كان هناك واحد ، فإن الرمز "؟" يتبع الأمر بدون مسافات وشرط تنفيذ هذا الأمر. إذا كان شرط تنفيذ الأمر لا يساوي 0 ، فسيتم تنفيذ الأمر. داخل الشرط ، لا يُسمح بالمسافات ، وإلا سيتم معالجتها كفواصل بين الأمر والوسيطات.

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

SET؟ [5]> 5 Val [1] = 25؛ // هل هذا صحيح
SET؟ [2]> 5 Val [1] = 25؛ // خطأ في بناء الجملة
SET؟ ([1،2]> 5) Val [1] = 25؛ // صحيح ، يُسمح بداخل () المسافات.

يتم فصل الوسيطات بالرمز "،". داخل الحجج ، لا تعد المسافة حرفًا خاصًا ويمكن احتوائها في أي مكان. بشكل عام ، يمكن أن يحتوي الأمر على أي عدد من الوسيطات. تتم ترجمة التسميات في الوحدة داخل الوحدة ويجب أن تكون فريدة فيها ، باستثناء التسميات الموجودة داخل أمر CASE . يجب أن تكون تسميات الأمر CASE المترجمة داخل هذا الأمر فريدة داخل هذا الأمر فقط ويمكن أن تكرر التسميات خارج هذا الأمر وفي أوامر CASE المتداخلة .

مدة العرض


في وقت التشغيل ، يحتوي التطبيق على مهمة واحدة أو أكثر. يتم تنفيذ جميع المهام بالتوازي. في كل مهمة ، يتم تنفيذ البرامج بالتتابع. في كل لحظة من الزمن ، يتم تنفيذ رمز برنامج واحد فقط في المهمة. تنتهي المهمة بنهاية آخر برنامج قيد التشغيل. يتم إطلاق المهمة الرئيسية من خلال وقت تشغيل اللغة. يتم إنشاء المهام المتبقية بواسطة الأمر Job .

إدارة البيانات


بالنسبة لأولئك الذين يعرفون لغة MUMPS ، فإن تنظيم البيانات في MSH واضح تمامًا. لا يوجد وصف للبيانات في MSH. لا يوجد تصريح بيانات. يمكن تخزين البيانات كشجرة ، ثم يتم الوصول إلى عقد الشجرة بواسطة اسم وفهرس اختياريين. الفهرس محاط بأقواس مربعة []. الاسم أمامهم.

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

SET Pr [4،5، "rt"] = Is ["ty ^ 578"]؛
هنا Pr و Is هي أسماء الأشجار. 4،5 ، "rt" و "ty ^ 578" هي مؤشرات العقدة.

يمكن أن تحتوي الشجرة على عدد عشوائي من المستويات ، وبالتالي ، يحتوي الفهرس على العدد المقابل من الحقول مفصولة بفواصل. يمكن أن يحتوي حقل الفهرس على قيمة عشوائية من النوع الأساسي. الأنواع الأساسية في MSH هي الأرقام والسلاسل. يتم تخزين العقد التي تم التسجيل عليها مباشرة في الشجرة. يمكن أن يكون الاسم وحقل الفهرس والفهرس نفسه تعبيرًا. بعد الحساب ، لا يمكن أن يكون الاسم سوى معرف.

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

على سبيل المثال: mc $ 0
يمكن تغيير حجم الصفيف عن طريق كتابة طول صفيف جديد لهذا العنصر. ولكن في الحالة العامة ، هذا ليس ضروريًا ، لأن الصفيف يتمدد تلقائيًا.

تحتوي عقد الشجرة وعناصر الصفيف على بيانات من الأنواع الأساسية. هذه إما سلاسل أو أرقام. كيفية تخزين بيانات المبرمج ليست معنية. تقع مسؤولية تخزين أنواع البيانات ومعالجتها على عاتق تنفيذ لغة MSH.

توطين البيانات


تنقسم بيانات MSH إلى العالمية والمحلية. تختلف في نوع الاسم. يتم تخزين البيانات العامة في ذاكرة طويلة الأمد ولا تعتمد على عمر التطبيق. بمجرد إنشائها ، يمكن تغييرها بواسطة التطبيق وستظل موجودة حتى يقوم التطبيق بتدميرها باستخدام الأمر KILL . تحتوي جميع البيانات العالمية على البادئة "^" في الاسم.

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

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

^ gl [87،9] - الوصول إلى عقدة الشجرة العامة.

^ glar $ 45 - الوصول إلى عنصر المصفوفة العالمية.

البيانات المحلية موجودة فقط أثناء تشغيل التطبيق. لا يمكن لإطلاق التطبيق التالي الوصول إلى البيانات المحلية للإطلاق السابق.

يعتمد نطاق البيانات المحلية على نوعه. هناك ثلاثة أنواع من توطين البيانات.

1. بيانات البرنامج المحلي. يتم توطينها داخل البرنامج وتوجد من لحظة إطلاق البرنامج حتى اكتماله. إذا كان البرنامج يستدعي الروتين الفرعي ، فسيتم إنشاء بيانات روتين فرعي جديدة ، ولا تظهر بيانات البرنامج المحلي داخل الروتين الفرعي. عند العودة إلى البرنامج ، تصبح بيانات البرنامج المحلي متاحة مرة أخرى. بيانات البرنامج المحلي ليس لها اسم.

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

[7،9] - الوصول إلى عقدة الشجرة المترجمة داخل البرنامج.

5 دولارات - الوصول إلى عنصر مصفوفة مترجمة داخل البرنامج.

هناك استثناء واحد. يتم أيضًا ترجمة مجموعة من المعلمات التي تم تمريرها إلى برنامج A $ داخل البرنامج.

2. بيانات التطبيق المحلي. تكون مرئية في جميع مهام التطبيق. يمكنك الاتصال بهم من أي مهمة. وهي موجودة منذ لحظة إنشائها في التطبيق بأي مهمة حتى اكتمال التطبيق أو حتى يتم تدميرها من قبل فريق KILL . تكون أسماء هذه البيانات مسبوقة بـ " ٪ ". هذه المتغيرات متاحة في وقت واحد في مهام مختلفة ، لذلك فهي متزامنة مثل الكرات.

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

٪ dapp [87.9] - الوصول إلى عقدة الشجرة مترجمة داخل التطبيق.

٪ dapp $ 45 - الوصول إلى عنصر صفيف مترجم داخل التطبيق.

3. بيانات العمل المحلية. يتم ترجمتها داخل المهمة وتوجد من لحظة إنشائها في أي برنامج مهمة حتى يتم إكمال المهمة أو تدميرها من قبل فريق KILL . يجب أن تحمل هذه البيانات اسمًا ولا تحتوي على البادئة " ^ " و " ٪ ". الاستثناء هو مجموعة معلمات البرنامج A $ ، فهي مترجمة داخل البرنامج ،

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

djob [87،9] - الوصول إلى عقدة الشجرة مترجمة داخل المهمة.
djob 45 دولارًا - الوصول إلى عنصر المصفوفة المترجمة داخل المهمة.
يمكن الوصول إلى المتغيرات فقط الأنواع المدرجة هنا.

صيغة الاختزال


هذا المصطلح ليس له علاقة بمصطلح مماثل في لغة MUMPS. يتم استخدام بناء الجملة المختصر في MSH للإشارة إلى الشجرة بأكملها أو الصفيف بأكمله. يتم استخدامه فقط في فرق منفصلة وحيثما يكون مسموحًا به يتم التفاوض عليه دائمًا. يتكون النداء إلى الشجرة بأكملها من اسم وأقواس مربعة مطلوبة. لم يتم تحديد اسم لشجرة البرنامج المحلي.
على سبيل المثال:
لنا [] - الوصول إلى شجرة الولايات المتحدة بأكملها.
[] - الوصول إلى شجرة البرنامج المحلي.

يتكون الوصول إلى المصفوفة بالكامل من الاسم والحرف المطلوب " $ ". لم يتم توفير اسم للصفيف المحلي للبرنامج.

على سبيل المثال:
us $ - الوصول إلى مصفوفة us بأكملها.
$ - الوصول إلى صفيف البرنامج المحلي.

الثوابت


يمكن أن تكون أنواع البيانات الأساسية إما رقمية أو سلسلة. الصيغة الرقمية هي عدد صحيح أو عدد حقيقي في وجود علامة عشرية. أساس الأرقام هو 10. يمكن أن تكون موجبة أو سالبة.
على سبيل المثال:
25 ، -4 ، 789.56 ، -9.3

ثوابت السلسلة هي أي تسلسل من الأحرف. إذا كان الثابت يتكون من أحرف وأرقام فقط ، فلا يمكنك وضعه بين علامتي اقتباس ، لأنه لا يمكن الخلط بينه وبين متغير. إذا كان الثابت يحتوي على أحرف أخرى ، فيجب وضعه بين علامات اقتباس مفردة أو مزدوجة.
على سبيل المثال:
"rt @ tty # 123"
'14 "5 * 7" 89 \؟ '
125 دي إس

ميزات بعض الفرق


فريق ثابت


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

على سبيل المثال:
Constant ioInOut = "/ini/par.ini>،maxIs=25؛
يتم تعيين ثوابت ioInOut و maxIs. علاوة على ذلك ، يمكن استخدام هذه الأسماء في البرنامج بدلاً من هذه القيم.
فريق ثابتلها شكلان. في هذه الحالة ، الجانب الأيمن من المساواة غائب. معنى هذا الفريق مختلف. الاسم هو اسم الوحدة النمطية التي تحتوي على الثوابت. يتم تصدير ثوابت هذه الوحدة إلى الوحدة النمطية الحالية. لا تحتوي الوحدة النمطية لاستيراد الثوابت على أي أوصاف إضافية حول الاستيراد. يمكن أن تحتوي وحدة الاستيراد على كل من الثوابت والبرامج فقط.
على سبيل المثال:
CONSANT sysCnsNet، usrCnsByx؛
sysCnsNet و usrCnsByx هي أسماء وحدات تحتوي على ثوابت.
يمكن أن يحدث كلا النموذجين كوسيطات لأمر ثابت واحد .

فريق XECUTE


أمر XECUTE هو فريق غريب نوعًا ما ، ولكنه موجود في لغة MUMPS. في لغات البرمجة الأخرى ، قابلتني فقط في JavaScript. هناك يطلق عليه اسم EV. عندما يتم تنفيذ هذا الأمر ، يتم حساب تعبير وسيطة هذا الأمر ، ثم يتم تحويل هذا التعبير إلى سلسلة ، ويتم تفسيره على أنه أمر MSH ، ويتم تنفيذه.

على سبيل المثال:
XECUTE "SET $ 1 = 89؛"؛
نتيجة لذلك ، سيحصل المتغير $ 1 على القيمة 89 .
هذا مثال بدائي ، في هذا الشكل من الصعب استخدام هذا الأمر. الوسيطات للأمر XECUTE هي تعبيرات ، والتي تسمح لك بإنشاء أوامر MSH مختلفة في وقت تشغيل البرنامج.
يتم تنفيذ الأمر في سياق البرنامج حيث يوجد الأمر. جميع موارد البرنامج متاحة لها ، بما في ذلك بيانات البرنامج المحلي.

الأمران COPY و MOVE


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

على سبيل المثال:
// node us [5،6] يتم نسخه إلى العقدة [1]
COPY [1] = us [5،6]؛
// يتم نقل الشجرة الأمريكية بالكامل إلى العقدة [8]
MOVE [8] = us []؛
يمكن أيضًا استخدام هذه الأوامر لنسخ المصفوفات. في هذه الحالة ، يمكن استخدام الروابط المختصرة فقط كمصدر وجهاز استقبال.
يتم نسخ وسيطات البرنامج إلى مصفوفة arg.
COPY arg $ = A $؛
يمكنك استخدام الأمر MOVE للتحرك.
تحريك a1 $ = b1 $ ؛
يمكنك نسخ ونقل أي صفائف.

مزامنة الموارد


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

فريق LockRيمنع قراءة الأسماء. سيتم حظر الأسماء المدرجة في حججها عن طريق القراءة. يمكن لأي عدد من المهام حظر نفس الأسماء ، ولكن المهمة التي حاولت حظر أي من هذه الأسماء ستنتظر حتى يتم إلغاء قفل كل هذه الأسماء. بعد التقاط اسم الكتابة ، لا يمكن تنفيذ أي أمر قفل للقراءة حتى يقوم قفل الكتابة بتحرير الاسم. إذا لم يكن بالإمكان قفله ، فسينتظر الأمر حتى يتم تحرير الاسم.

على سبيل المثال:
LockR name1، name2، name3؛
سيتم حظر هذه الأسماء بالقراءة. يمكن مهمة أخرى أيضا قفل هذه الأسماء دون انتظار بالنسبة لهم لتكون مقفلة. LockW

القيادةيحظر الأسماء حسب السجل. سيتم حظر الأسماء المدرجة في حججها بواسطة السجل. إذا تم حظر الأسماء المدرجة في الوسيطات بالفعل بواسطة أي أمر قفل ، فسينتظر هذا الأمر إصدار هذه الأسماء.
على سبيل المثال:
LockW name1، name2، name3؛
سيتم قفل هذه الأسماء بواسطة السجل. يفتح
الأمر LockUn هذا الاسم. إذا تم حظر الاسم من خلال القراءة عدة مرات ، فأنت بحاجة إلى إلغاء قفل نفس العدد من المرات.
على سبيل المثال:
LockUn name1، name2، name3؛
تحتوي الوظائف القياسية على نظائر هذه الأوامر مع مهلة.

نموذج قصير للأمر SET


يحتوي الأمر SET على نموذج مختصر. في هذه الحالة ، الجانب الأيسر من المساواة غائب ، ويتم لعب دوره بواسطة المتغير الأخير المذكور في التعبير.
على سبيل المثال:
SET $ 1 = 2، $ 1 + 3؛
المتغير $ 1 سيساوي 5 .
إذا كان هناك العديد من المتغيرات في التعبير ، فسيتم تعيين النتيجة للمتغير الأخير.

على سبيل المثال:
SET $ 1 = 1 ، $ 2 = 2 ، $ 3 = 3 ، $ 1 + $ 2 + $ 3 ؛ سيصبح
المتغير $ 3 1 + 2 + 3 = 6. على الرغم من أن هذا النموذج هو أكثر ملاءمة للاستخدام فقط في حالات بسيطة للغاية ، على غرار المثال الأول. يتم توفير المثال الثاني فقط كتوضيح لإمكانيات هذا النموذج من الأمر SET .

منع الفرق


تشكل أوامر الكتلة كتلة من الأوامر وتعمل في الوقت نفسه كعنوان للكتلة. يجب أن يكون لكل أمر كتلة أمر END الخاص به ، حتى إذا كان هناك أمر واحد فقط في الكتلة.

فريق IF


يشكل الأمر IF كتلة يتم تنفيذها إذا تحققت شروط تنفيذ هذا الأمر. هذا الأمر لا يوجد لديه الحجج. قد تحتوي هذه الكتلة على أوامر ELSE . لا يحتوي الأمر ELSE على وسيطات. خارج كتلة IF ، هذه الأوامر ليس لها معنى ولا يمكن تطبيقها. إذا كانت هناك أوامر ELSE في كتلة IF عند استيفاء الشرط الخاص بالأمر IF ، فلن يتم تنفيذ سوى الأوامر وراء الأمر IF حتى الأمر ELSE التالي . فريق ELSEقد يحتوي على شرط تنفيذ ، ثم في حالة الحقيقة في هذا الشرط سيتم تنفيذ الأوامر الموجودة بعد هذا الأمر حتى الأمر ELSE التالي أو الأمر END . يمكن أن تحتوي كتلة IF على أمر ELSE واحد فقط دون شرط لتنفيذه ، ويجب أن تكون الأخيرة من بين أوامر ELSE .

على سبيل المثال:
IF؟ [6] <0؛
SET y [1] = 1 ؛
ELSE؟ [6] <5 ؛
SET y [1] = 2 ؛
ELSE؟ [6] <10 ؛
SET y [1] = 3 ؛
آخر SET y [1] = 4 ؛
النهاية
قد يكون شرط تنفيذ هذا الأمر غائبًا ، ثم سيتم تنفيذ هذا الحظر على أي حال. على الرغم من أنه من الصعب تخيل لماذا يمكن أن يكون هذا مفيدًا.

فريق CASE


تختلف دلالات هذا الأمر إلى حد ما عن دلالات فرق MSH الأخرى. شرط تنفيذ الأمر فيه ليس كذلك. في حالة تنفيذ الأمر CASE ، يجب أن يحسب التعبير التسمية التي سيتم نقل عنصر التحكم إليها. هذا الأمر لا يوجد لديه الحجج.

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

CASE؟ L_ $ J؛ // تم تقييم التسمية
SET x [1] = 1؛ // إذا لم يتم العثور على تسمية ، فسيتم تنفيذ أوامر هذه الكتلة
SET a [2] = x [1] +1؛
L1: SET x [1] = 2 ؛ // block block block L1
SET a [2] = x [1] +2؛
L2: SET x [1] = 3 ؛ // كتلة أمر التسمية L2
SET a [2] = x [1] +3؛
النهاية
تشكل التسميات في هذا الأمر بشكل ضمني كتلة داخلية من الأوامر. بعد تنفيذ مثل هذه الكتلة من الأوامر ، يتم نقل التحكم خارج كتلة الأمر CASE .

في حين الأمر


يتم استخدام الأمر WHILE لتنظيم الحلقة. تحدد حالة تنفيذ هذا الأمر الشرط لاستمرار الحلقة. طالما أن شرط تنفيذ الأمر ليس 0 ، سيتم تنفيذ الكتلة التي شكلها هذا الأمر. تنتهي الكتلة مع الأمر END . يحتوي الأمر END لمثل هذه الكتلة على ميزة. قد يكون لديه حالة إنهاء كتلة. إذا لم يكن الشرط 0 ، فسيتم إكمال الكتلة. وعلاوة على ذلك، قد تكون هذه الشروط موجودة في كل من WHILE القيادة وفي نهاية الأمر .
على سبيل المثال:
WHILE؟ X [7]> 0؛ // شرط استمرار الدورة
SET y [2] = x [7] +2؛
فاصل؟ Y [2] <0 ؛
SET x [7] = x [7] +1 ؛
نهاية؟ X [7]> 20 ؛ // شرط إنهاء الحلقة
داخل الكتلة ، يمكن مقاطعة الحلقة بواسطة الأمر BREAK.

التكرارات حلقة كتلة


تم تحسين محركات حلقة العروة للوصول إلى عقد الشجرة. يستخدمون رابطًا داخليًا لتحسين الوصول إلى العقد الالتفافية. هذا يفرض قيود على استخدام التكرارات. داخل الكتلة لا يمكنك تغيير هيكل الشجرة. لا يمكنك الكتابة لهذه الشجرة. في أوامر تكرار حلقة الكتلة ، وسيطتان.
الحجة الأولى مطلوبة ، الرابط إلى العقدة التي سيتم تجاوز أحفادها. فهرس مرجعي. يمكن استخدام الروابط المختصرة. الوسيطة الثانية هي الارتباط إلى العقدة حيث سيتم تخزين فهرس السلالة. هذه الحجة اختيارية. داخل الكتلة ، لا يجب أن تتغير الوسيطة الثانية. لا يُسمح بتعبيرات مثل $$ 2 أو [[3]] إذا كان $ 2 أو [3]تغيير داخل كتلة المكرر. لن تؤخذ التغييرات على هذه المتغيرات في الاعتبار. يمكن الحصول على الوصول إلى الفهرس الفرعي من خلال متغير النظام ٪ queryKey وبيانات العقدة من خاصية٪ queryData . إذا كان لا يجب تجاوز النسل من البداية ، فإن الوسيطة الثانية مطلوبة ويجب وضع فهرس العقدة فيها وبعد ذلك يبدأ تجاوز النسل. إذا كان هناك وسيطة ثانية ، لكنك تحتاج إلى الانتقال من البداية ، ثم قبل الحلقة ، تحتاج إلى حذف هذا المتغير باستخدام الأمر KILL .
قد يكون للأوامر حالة تنفيذ كتلة. يتم فحص هذا الشرط مرة واحدة فقط عند دخول الكتلة.

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

فريق NEXT


يتكرر الأمر NEXT عبر النسل المباشر لعُقدة شجرة. تتحدر الأحفاد في الاتجاه الأمامي من الحد الأدنى إلى الحد الأقصى للمؤشر.
على سبيل المثال:
NEXT us [4،5]؛ الوسيطة // 2 غير محددة ، يتم أخذ الفهرس
// من متغير النظام٪ queryKey
SET $ 1 =٪ queryKey، $ 2 =٪ queryData؛
النهاية؟ $ 1> 1000 ؛ // شرط إنهاء الحلقة
يتم وضع مؤشر العقدة على الفور في البيانات
KILL $ 1؛
التالي لنا [4،5] ، 1 دولار ؛
تعيين $ 2 =٪ queryData ؛
النهاية

يتم استخدام ارتباط مختصر كعقدة مرجعية. في هذه الحالة ، يتم تجاوز المستوى الأول من الشجرة.
اقتل 1 دولار ؛
التالي لنا [] ، $ 1 ؛
تعيين $ 2 =٪ queryData ؛
النهاية
الزحف بعد الفهرس 3.
تعيين 1 دولار = 3 ؛
التالي لنا [4،5] ، 1 دولار ؛
تعيين $ 2 =٪ queryData ؛
النهاية
عند اجتياز مصفوفة ، تكون جميع الحقول مرتبة ، حتى تلك التي لا يتم فيها تحديد البيانات.
على سبيل المثال:
KILL $ 1؛
التالي لنا $ 1 دولار ؛
تعيين $ 2 =٪ queryData ؛
النهاية
داخل الكتلة ، يمكن مقاطعة الحلقة بواسطة الأمر BREAK .

فريق BACK


يختلف الأمر BACK عن الأمر NEXT فقط في اتجاه الاجتياز من قمة الرأس الأخيرة إلى الأولى.
على سبيل المثال:
KILL $ 1؛
عودة إلينا [4،5] ، دولار واحد ؛
تعيين $ 2 =٪ queryData ؛
النهاية

فريق QUERY


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

خلاف ذلك ، هذا الأمر مشابه للأمر التالي . يجتاز

الأمر QUERY الصفيف في الاتجاه الأمامي فقط من اليسار إلى اليمين.

على سبيل المثال:
KILL $ 1؛
QUERY us [4،5]، $ 1 ؛
تعيين $ 2 =٪ queryData ؛
النهاية
لكن هذا الأمر يتجاوز القمم التي تهم فقط.

أوامر اجتياز شجرة البيانات غير أوامر الأوامر


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

يعطي

الأمر NEXT1 للأمر NEXT1 العقدة التالية على نفس المستوى تحت العقدة المرجعية.
بيانات العقدة متاحة في متغير النظام ٪ queryData .
على سبيل المثال:
SET $ 1 = 2؛
NEXT1 us [1،4] ، 1 دولار ؛
// ستعطي العقدة الموجودة في المستوى 3 بعد العقدة لنا [1،4،2]

فريق BACK1


يعطي الأمر BACK1 الرأس السابق عند نفس المستوى أسفل العقدة المرجعية.
خلاف ذلك ، فهو مشابه للأمر NEXT1 .

فريق QUERY1


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

خلاف ذلك ، فهو مشابه للأمر NEXT1 .

إدارة البرنامج


يمكن أن تكون تسمية الوحدة النمطية نقطة اتصال لبرنامج ووظيفة ونقطة استدعاء لمهمة جديدة وخاصية كائن وطريقة كائن وتسمية ، اعتمادًا على الوصول إلى هذا التصنيف.
علاوة على ذلك ، يمكن الوصول إلى الملصق بشكل مختلف في أجزاء مختلفة من الوحدة.
على سبيل المثال:
LB: Set Val [25] = 7 + A $ 1؛ عودة فال [25] ؛
هل LB (78) ؛ // الوصول إلى البرنامج. يتم تجاهل القيمة المرتجعة.
Set Val [7] = 8 * LB (6) ؛ // استدعاء كدالة ، يتم استخدام قيمة الإرجاع.
JOB LB (17، "yt") ؛ // استدعاء وظيفة جديدة
Set Val [9] = Mod.LB (3)؛ // الوصول إلى أسلوب الفئة Mod - يتم التعامل مع اسم الوحدة النمطية في هذا السياق كاسم فئة الكائن.
Set Val [15] = Obj [1،2، A] .LB؛ // الوصول إلى خاصية LB للكائن Obj [1،2، A]،
اذهب LB ؛ // انتقل إلى ملصق LB
في الأمثلة أعلاه ، بالإضافة إلى 4 و 5 ، يتم إجراء المكالمة داخل الوحدة النمطية الحالية. يمكن تنفيذ استدعاء البرامج والوظائف إلى أي وحدة متاحة. بالمناسبة ، هذا ينطبق أيضًا على فريق Go.
على سبيل المثال ، في وحدة Mod هناك تسمية Lb. ثم سيبدو النداء عليه:
Do Mod.Lb (78)؛
Set Val [7] = 8 * Mod.Lb (6) ؛
Set Val [9] = Mod.Lb (3) ؛
JOB Mod.Lb (78) ؛
اذهب Mod.Lb ؛

بشكل عام ، يتم استخدام الملصق كبرنامج أو وظيفة. إذا تم استخدام الوحدة النمطية كفئة كائن ، فإن التسمية هي خاصية أو طريقة لهذا الكائن. تعد خصائص الكائن وأساليبه شكلاً آخر من أشكال الوصول إلى البرامج والوظائف ، لذا فإن كل ما يقال عن البرامج والوظائف ينطبق بشكل متساوٍ على الخصائص والأساليب. لا توجد فروق دقيقة مهمة عند الوصول إلى الكائنات فقط من حيث الميراث. سيتم وصف هذه المشكلة بمزيد من التفصيل أدناه.

في الحالة العامة ، يعد اسم الوحدة النمطية واسم الملصق في الاستدعاء لها تعبيرات ويمكن حسابها في وقت المكالمة.
على سبيل المثال:
Set $ ​​1 = “Md”، $ 2 = “Lb”؛
هل $ 1. $ 2 ؛

ينتهي البرنامج بأمر العودة ؛ يمكن استكمال الوحدة النمطية بالأمر إنهاء ؛

تمرير المعلمات


في MSH ، يتم تمرير المعلمات حسب القيمة فقط. بشكل عام ، لا توجد مراجع ومؤشرات من حيث لغة C ++ والمشكلات الهائلة المرتبطة باستخدامها هنا ، من حيث المبدأ ، غير موجودة. يأخذ البرنامج دائمًا عددًا عشوائيًا من المعلمات في مصفوفة A $ . يمكن العثور على رقمهم بالرجوع إلى العنصر 0 للصفيف A $ 0 . المبرمج مسؤول عن معنى هذه المعلمات.

على سبيل المثال:
لدينا برنامج Lb. يمكن تناولها:
DO Lb (1،2،7)؛
DO Lb (25.7) ؛
DO Lb () ؛
JOB Lb (8) ؛
SET [7.8] = Lb (187، "Privet") ؛

لم يتم تحديد المعلمات التي تم تمريرها في البرنامج.
لا يتداخل تمرير المعلمات بالقيمة مع تمرير أسماء المتغيرات في البرنامج واستخدامها هناك.
على سبيل المثال:
Set us [5] = 48؛
هل Lb ("لنا") ؛
...
العودة ؛
Lb: Set par [8،1،9] = A $ 1 [5] ؛
// A $ 1 - تحتوي المعلمة الأولى التي تم تمريرها على اسم
المتغير //: us .
// [5] - الوصول إلى أعلى هذه الشجرة
// نتيجة لذلك ، قيمة العقدة لنا [5] = 48
العودة ؛
ونتيجة لذلك ، يمكن معالجة اسم المتغيرات بشكل تعسفي.
عند الانتقال إلى التسمية باستخدام الأمر GO ، لا يتغير صفيف المعلمة. يحتوي MSH على نموذج أمر GO مع نقل المعلمات الجديدة. في هذه الحالة ، يتم استبدال صفيف المعلمة الحالية بالصفيف الجديد المحدد في استدعاء أمر GO .
على سبيل المثال:
GO Lb (1،2،7)؛

التعامل مع الحدث


معالجة الأحداث هي آلية برمجة قوية لا يتم تضمينها عادةً في اللغات عالية المستوى. لكن وجودها في المكتبات ونظام التشغيل يتحدث عن أهميتها. مكتبات المكونات المرئية مبنية على هذه الآلية. إن وجود معالجة الحدث في اللغة يوسع قدرات اللغة. يفتح نمط برمجة جديد يحركه الحدث. بالمناسبة ، لغة برمجة محترمة مثل Assembler لديها مثل هذه الميزات. لذلك ، تمت إضافة هذه الآلية إلى لغة MSH.

أساس هذه الآلية هو الحدث. يتم ترجمته داخل التطبيق. وفقًا لذلك ، يجب أن تكون هذه الأسماء فريدة في جميع أنحاء التطبيق. إذا كان اسم الحدث يطابق الاسم المعلن في الأمر CONSTANT، ثم سيتم استبدال اسم الحدث بقيمة الثابت المعلن. كن حذرا. عند تسمية الأحداث ، من المستحسن الالتزام بنوع من استراتيجية التسمية. على سبيل المثال ، قم بتعيين أسماء الأحداث التي تبدأ بـ evu . يجب ألا يتجاوز طول الاسم ، مع مراعاة ترميز UTF8 ، 18 بايت. يرتبط هذا القيد فقط مع تطبيق اللغة الحالية.

يظهر حدث تم إنشاؤه في مهمة واحدة ويمكن معالجته في أي مهمة. يمكن أن تكون معالجات الأحداث أي رقم ويمكن أن تكون في مهام مختلفة.
بعد حدوث الحدث ، يتم التحقق مما إذا كانت هناك معالجات لهذا الحدث ؛ إذا لم يكن هناك معالجات ، يتم حذف الحدث. إذا كانت هناك معالجات ، يتم تنفيذها بالتسلسل. يمكن أن تكون الأحداث النظام والمستخدم. يتم إنشاء أحداث النظام بواسطة النظام. يتم إنشاء حدث مخصص بواسطة الأمر EVENTTRAP . يمرر الحدث المعلمات إلى المعالجات ، كما هو الحال عند استدعاء برنامج. بعد المعالجة ، لا يتم حذف معالجات الأحداث. لحذف حدث ، استخدم الأمر EVENTDELETE . يمكن معالجة الحدث بواسطة الأمرين EVENTCALL و EVENTWAIT .

فريق EVENTTRAP


يقوم الأمر بإنشاء حدث مخصص. يشبه تنسيق الأمر استدعاء برنامج ، يتم استخدام اسم الحدث فقط بدلاً من اسم البرنامج. تكون أسماء الأحداث محلية داخل التطبيق ، بحيث تكون مرئية في جميع المهام.

سيقوم الفريق بإنشاء حدث بالاسم المحدد. سيتم تمرير معالجات الأحداث المعلمات المدرجة في وسيطات الأمر.

على سبيل المثال:
EVENTTRAP؟ X [1]> 8 evuBoxData (us [7]، $ 4)، evuKorXY (us [X]، us [Y]، sh)؛ يتم إنشاء
حدثين evuBoxData و evuKorXY كمتغيرات us [7] و $ 4 و us [X] و us [Y] و ثابت السلسلة sh .
إذا لم يكن هناك حاليًا معالجات لهذا الحدث ، فلن يتم إنشاء الحدث.

EVENTDELETE فريق


يزيل الأمر معالجات الأحداث المدرجة في وسائط البرنامج.
على سبيل المثال:
EVENTDELETE؟ X [1]> 7 evuKorXY، evuBoxData؛
سيتم حذف الأحداث بالترتيب في الفريق.

فريق EVENTCALL


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

على سبيل المثال:
EVENTCALL evuBoxData = Mod1.intEvuBoxData، evuKorXY = Mod2.intevuKorXY؛

فريق EVENTWAIT


ينتظر الفريق حدوث الأحداث. سيحجب هذا الأمر المهمة الحالية حتى تحدث الأحداث المدرجة في وسيطاتها. يجب أن تحدث جميع الأحداث المدرجة في وسيطاتها لمتابعة تنفيذ سلسلة المحادثات الحالية. يتم استبدال معلمات البرنامج الحالية بتلك التي تم نقلها في أمر إنشاء الحدث.
على سبيل المثال:
EVENTWAIT evuBoxData، evuKorXY؛
تسمح لك هذه الأوامر بتنظيم التنفيذ غير المتزامن للبرامج.

ثلاثة أبعاد


ترتبط المتجهات ارتباطًا وثيقًا بالتنفيذ الحالي. يقومون بتخزين الأعداد الصحيحة الموقعة وغير الموقعة. يعتمد بُعد هذه المتجهات على عمق البت للمكون المتجه وهو ثابت.

ناقلات 64 بت


البعد لمثل هذا المتجه هو 2. يمكن أن تكون المكونات أعداد صحيحة 64 بت أو أعداد صحيحة غير موقعة. يتم تخزين هذه الأرقام في أي متغيرات.
جاذبية المكونات الصحيحة الأيقونية للمتجه.
تعيين لنا [5].٪ V64 (0) = ss $ 1.٪ v64 (1) ؛
٪ v64 - الوصول إلى مكون العدد الصحيح الموجه للمتجه.
مناشدة للمكونات الصحيحة غير الموقعة للمتجه.
تعيين لنا [5].٪ Vu64 (0) = ss $ 1.٪ vu64 (1) ؛
٪ vu64 - الوصول إلى المكون غير الموقّع بالكامل للمتجه.

ناقلات 32 بت


البعد لمثل هذا المتجه هو 5. يمكن أن تكون المكونات أعداد صحيحة 32 بت أو أعداد صحيحة غير موقعة. يتم تخزين هذه الأرقام في أي متغيرات.
جاذبية المكونات الصحيحة الأيقونية للمتجه.
تعيين لنا [5].٪ V32 (0) = ss $ 1.٪ v32 (4) ؛
٪ v32 - الوصول إلى مكون العدد الصحيح الموجه للمتجه.
مناشدة للمكونات الصحيحة غير الموقعة للمتجه.
تعيين لنا [5].٪ Vu32 (0) = ss $ 1.٪ vu32 (4) ؛
٪ vu32 - الوصول إلى المكون غير الموقّع بالكامل للمتجه.

16 متجه بت


البعد لمثل هذا المتجه هو 11. يمكن أن تكون المكونات أعدادًا صحيحة أو غير موقعة 16 بت. يتم تخزين هذه الأرقام في أي متغيرات.
جاذبية المكونات الصحيحة الأيقونية للمتجه.
تعيين لنا [5].٪ V16 (0) = ss $ 1.٪ v16 (10) ؛
٪ v16 - الوصول إلى مكون العدد الصحيح الموجه للمتجه.
مناشدة للمكونات الصحيحة غير الموقعة للمتجه.
تعيين لنا [5].٪ Vu16 (0) = ss $ 1.٪ vu16 (4) ؛
٪ vu16 - الوصول إلى مكون العدد الصحيح غير الموقّع للمتجه.

8 نواقل بت


البعد لمثل هذا المتجه هو 22. يمكن أن تكون المكونات أعدادًا صحيحة أو غير موقعة 8 بت. يتم تخزين هذه الأرقام في أي متغيرات.
جاذبية المكونات الصحيحة الأيقونية للمتجه.
تعيين لنا [5].٪ V8 (0) = ss $ 1.٪ v8 (21) ؛
٪ v8 - الوصول إلى المكون الصحيح الموقّع للمتجه.
مناشدة للمكونات الصحيحة غير الموقعة للمتجه.
تعيين لنا [5].٪ Vu8 (0) = ss $ 1.٪ vu8 (21) ؛
٪ vu8 - الوصول إلى المكون غير الموقّع بالكامل للمتجه.

عمليات


تلعب العمليات في MSH دورًا خاصًا. هم الذين يتحكمون في تحويل أنواع البيانات. بناءً على العملية ، يتم تحويل المعاملات إلى نوع البيانات المطلوب. يتوافق نوع نتيجة البيانات بشكل فريد مع نوع العملية. لا تتداخل عمليات السلسلة والعمليات الرقمية ، مثل عملية + في اللغات المشابهة لـ C. لا يعتمد نوع العملية في MSH على نوع المعاملات ، فكل شيء هو عكس ذلك تمامًا. لا توجد أولويات للعمليات في MSH ؛ إنها إرث تاريخي لـ MUMPS.

على سبيل المثال:
SET $ 1 = 2 + 3 * 4؛ سيكون
1 $ 20 ، وليس 14. من
أجل أن تكون النتيجة 14 ، يتم استخدام الأقواس.
SET $ 1 = 2 + (3 * 4) ؛ يتم استخدام
الرمز " _ " أثناء عملية ربط السلاسل .
إن عدم وجود أولوية للعمليات أمر غير معتاد ولكنه مريح للغاية. إن الإشارة إلى طبيعة الأولويات ، عندما تكون العمليات أكثر من مجرد مضاعفة تصبح مشكوك فيها للغاية. بعد أن علمت ذات مرة أنه لا توجد أولويات ، ليست هناك حاجة لتذكر أولوياتها بشكل مؤلم ، وإذا حدث شيء ما في الوثائق. بشكل عام ، هذه مسألة العادة.

الكائنات


إن وجود الأشياء في لغات البرمجة الحديثة هو شكل جيد. في الحالة العامة ، تتكون الأشياء من جزأين. أجزاء من الوصف التعريفي وأجزاء من التنفيذ. في أنظمة MUMPS ، لا تحتوي المتغيرات على الجزء التعريفي من تعريف النوع. الفصول هي في الأساس أنواع بيانات المستخدم. لكي لا تنتهك مبادئ MUMPS ، تفتقر MSH إلى الجزء التعريفي من وصف الصف. وكما اتضح ، يمكنك الاستغناء عنه تمامًا. لم يبق سوى جزء من التطبيق من الفصل. يمكن تمثيل تنفيذ الفصل بشكل مثالي من خلال الوحدة القياسية. فقط للفئة يجب أن تقدم اصطلاحات إضافية مرتبطة بوصف خصائص الكائن. يمكن أن تكون الكائنات في الشجرة فقط. سيفشل وضع كائن في مصفوفة لأنه لا يوجد مكان لتخزين خصائص الكائن. على الرغم من أن الكائن لا يحتوي على خصائص ، يمكنك المحاولة.على الرغم من نوع الكائن.
لوصف ملكية عامة ، أنت بحاجة إلى وظيفة تُرجع قيمة هذه الخاصية. يجب أن يكون له اسم خاصية وأن يكون في الوحدة النمطية باسم الفئة. برنامج للكتابة على الممتلكات. هذا البرنامج له اسم خاصية مسبوق بـ ".". وبرنامج إزالة الملكية. هذا البرنامج له اسم خاصية مسبوق بـ "..".

قد يتوافق اسم الوظيفة في الوحدة مع الملكية العامة للقراءة. في هذه الحالة ، يتم تمرير القيمة المرجعة لهذه الدالة إلى برنامج الاستدعاء كقيمة الملكية العامة.

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

يتم الوصول إلى الخصائص المحمية للفئة من خلال خاصية النظام ٪ هذا .

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

على سبيل المثال:
// Class Person
// Property Age
// اقرأ الملكية العامة Age
Age: RETURN [٪ this، Age]؛
// سجل الملكية العامة العمر. العمر
: SET [٪ this، Age] = A $ 1؛
إرجاع
النهاية

ستظهر المناشدة من البرامج إلى كائن وممتلكاته العامة على النحو التالي.
// إنشاء كائن يقوم شخص
SET بنا [1،2].٪ objNew = Person؛
// اكتب القيمة 50 إلى خاصية العمر
SET us [1،2] .Age = 50؛
// اقرأ خاصية Age
SET u $ 1 = us [1،2] .Age + 5؛
// delete property Age
KILL us [1،2] .Age؛

وراثة الكائن


تدعم فئات MSH الوراثة المتعددة. يقوم الأمر PARENT بتعيين جميع أسلاف هذه الفئة. علاوة على ذلك ، فإن ترتيب أسماء أسلاف هذه الفئة في وسيطات الأمر يحدد أولوية الميراث. كلما ذكر الفصل الدراسي لاحقًا ، قلت أولويته.

على سبيل المثال:
PARENT USER، BOX؛
يرث الفصل من أسلاف USER و BOX . أولوية سلف المستخدم أعلى. ما هي الأولوية. عند الوصول إلى كائن ما ، سيتم البحث عن الملكية العامة أو طريقة الفصل في الفئة نفسها ، إذا لم يتم العثور عليها هناك ، فسيتم البحث عنها في الجد ذي الأولوية الأعلى ، ثم في أسلاف هذه الفئة وما إلى ذلك حسب الأولوية.

مشاركة الملفات

في MSH ، يتم تنظيم مشاركة الملفات على المستوى الأكثر بدائية. تلعب الملفات في MSH دورًا داعمًا. يتم تنظيم التبادل فقط مع الملفات النصية. بنية الملف هي حقول نصية مفصولة بفاصل محدد. المحدد في متغير النظام ٪ dlmIO . بشكل افتراضي ، هذا المتغير هو " ، ". وهي متاحة للقراءة والكتابة. عند الكتابة إلى ملف ، يتم تحويل المتغيرات إلى نوع سلسلة وكتابتها في الملف من خلال المحدد. عند القراءة من ملف ، يتم تحديد المتغيرات من خلال فاصل ويتم إحضارها إلى شكل عادي. إذا كان الحقل عبارة عن رقم ، فسيتم وضع رقم في المتغير. يحدث التبادل مع الملف من خلال المصفوفة B $ . عند الكتابة ، الصفيف هو B $مكتوب على الملف من خلال المحدد. عند القراءة من ملف ، يتم تحديد الحقول في صفيف B $ .

تأخذ أوامر تبادل الملفات مسار الملف كوسيطات.
على سبيل المثال:
من مصفوفة بيانات B $ مكتوبة على ملف. يتم فتح الملف عن طريق الكتابة. يتم استبدال البيانات الموجودة في الملف.
اكتب "txt / tt1.txt" ؛
تتم قراءة البيانات في صفيف B $ . تم مسح الصفيف مسبقًا.
قراءة "txt / tt1.txt" ؛
txt / tt1.txt - مسار الملف.

استنتاج


هذا المستند ليس بديلاً عن وصف لغة MSH ، ولكنه يكمله فقط. هنا ، لا يتم النظر في جميع ميزات لغة MSH ، ولكن فقط تلك التي أود أن ألفت انتباهك إليها.

المؤلف: شريموف ميخائيل ألكسيفيتش. البريد الإلكتروني: misha_shar53@mail.ru

عند استخدام هذه المواد ، يلزم وجود رابط للمصدر والمؤلف.

All Articles