ممبس

إن **ممبس MUMPS **(وهو اختصار لاسم نظام البرمجة المتعدد لتشغيل مستشفى ماساتشوسيتس العام (Massachusetts General Hospital Utility Multi-Programming System) أو اختصارا بحرف إم هو لغة برمجة ظهرت في أواخر ستينيات القرن العشرين من أجل أن تستخدم في صناعة الرعاية الصحية. وكانت مصممة لإنتاج تطبيقات قائمة على قاعدة البيانات متعددة المستخدمين. وهي تسبق لغة سيC واللغات الأكثر شعبية الأخرى في الاستخدام الحالي، ولها بنية ومصطلحات مختلفة تماما.
وقد تم تبنيها على نطاق واسع خلال السبعينيات والثمانينيات في نظم معلومات/ وقواعد بيانات الرعاية الصحية والنواحي المالية، ولا تزال تستخدم من قبل العديد من نفس المستخدمين إلى اليوم. وتستخدم هذه اللغة حاليا في نظم التسجيل الصحي الإلكترونية وكذلك من قبل العديد من الشبكات المصرفية وخدمات التجارة / والاستثمار الإلكترونية.

## التاريخ
طورت ممبس على يد نيل بابالاردو N. Pappalardo ورفاقه في معمل حيوانات د. أوكتو بارنيت في مستشفى ماساتشوستس العام في بوسطن خلال عامي 1966-1967. وكان نظام ممبس الأصلي مبنيا على قطع DEC PDP-7، مثلما كان عليه حال يونكسUnix بعد سنوات قليلة.
كما كان كل من نيل بابالاردو وأوكتو بارنيت مشاركين في التخطيط لمستشفى ماساشستس العام من خلال وضع نظام الملعومات بالمستشفى، وحصلا على PDP-9 المتوافق بأثر رجعي، وبدءا في استخدام ممبس في دورة admissions وتقرير الاختبارات المعملية. وكان ممبس حينذاك لغة مفسرة، ولم يكن حتى عند ذلك الوقت متضمنا نظام ملفات قاعدة بيانات تراتبية من أجل معايرة التفاعل مع البيانات. ويمكن تتبع بعض أوجه ممبس من جوس JOSS التابع لراند كوربوريشن من خلال BBN، وتيلكومب TELCOMP وسترينجكومب STRINGCOMP. وقد اختار فريق ممبس مضطرا أن يتضمن قدرة على الانتقال بين الآلات كهدف تصميمي. وهناك خاصية أخرى، لم تكن داعمة على نطاق واسع لآلات هذه المرحلة، في نظم التشغيل أو في المعدات، وأنها كانت متعددة المهام، وكانت أيضا مبنية في اللغة نفسها.

وكانت القدرة على التنقل مفيدة في أقرب وقت، لأن ممبس سرعان ما أن تم تكييفها للتوافق مع DEC PDP-15، حيث استمرت لفترة من الزمن. وقد تم تطويرممبس بدعممن منحة بحثية حكومية، وهكذا تم إصدار ممبس أما ناق عام (ولم تعد هناك حاجة لمزيد من المنح)، وسرعان ما وصلت بعدد من النظم الأخرى بما فيها النظم الشهيرة DEC PDP-8، ونوفا العامة للبيانات the Data General Nova، و the DEC PDP-11، والكمبيوترات الدقيقة PC12 طراز أترونيكس.وقد انتشرت كلمة ممبس بقوة في المجتمع الطبي وبحلول أوائل السبعينيات كان مستخدما على نطاق واسع، وكان غالبا ما يتم تعديله محليا للتوفيق بينه وبين احتياجاتهم الخاصة.

وبحلول أوائل السبعينيات كانت هناك العديد والأنواع المختلفة من تطبيقات ممبس على مجموعة من منصات المعدات. وكان أكثرها انتشارا ممبس -11 على PDP-11، وMIIS التابع لـ ميديتك. وفي عام 1972 شارك العديد من المستخدمي ممبس في مؤتمر كان يقوم بمعايرة اللغة الهشة حينذاك، وكونوا مجموعة مستخدمي ممبس ولجنة تطوير ممبس (MDC) من أجل القيام بذلك. وقد أثبتت هذه المجهودات نجاحها؛ وقد اكتملت المعايرة في عام 1974، وتم التصديق عليها، في 15 سبتمبر 1977 مثل معايرة ANSI، و X11.1-1977. وفي نفس الوقت تقريبا دشنت DEC ما عرف باسم DSM-11 (أي معايرة ممبس الرقمية Digital Standard MUMPS) من أجل PDP-11. وسرعان ما سيطر ذلك على السوق وأصبح التطبيق المرجعي لتلك الفترة.

وخلال أوائل الثمانينيات قدم العديد من المصنعين للبرامج عددا من المنصات القائمة على ممبس والتي تلبي معايرة أنسي ANSI للسوق. وكان الأكثر أهمية هي مؤسسة المعدات الرقمية Digital Equipment Corporation التي قدمت المعايرة الرقمية لممبس DSM، وإنترسيستم InterSystem التي قدمت انترسيستم إم على VMS ويونكسUNIX، و M/11+ على منصة PDP-11. وطورت الشركات الأخرى العديد من تطبيقات ممبس الهامة الأخرى:
* مؤسسة جرايستون تكنولوجي مع النسخة المنجزة المسماة GT.M.
* شركة داتا تري التي قدمت منتجا قائما على أجهزة إنتل وعرف باسم DTM.
* مؤسسة مايكرونيتكس ديزين والتي قدمت خطا للإنتاج يحمل اسم MSM لمنصتي يونيكس وأجهزة انتل (ووصل لاحقا بنظام تشغيل VM التابع لآي بي إم).
* كومب للاستشارات (اعيد تسميتها لاحقا باسم إم جلوبال)، وهي شركة مقرها هيوستن والتي أنتجت أصلا CCSM على معالجات 6800 ثم 6809، والتي أصبحت فيما بعد ماكممبس، وهو منتج قائم على نظام تشغيل ماك Mac OS. كما عملوا أيضا على تطبيق MGM MUMPS. كما وصل إم جلوبال تطبيقه على منصة دوس حيث يتم تشغيلها كنظام تشغيل ضيف بدءا من الدوس.
وكانت إم جلوبال هي أو ممبس تجارية لأجهزة آي بي إم وتطبيق ماك الوحيد. وقد سبق DSM-11 إصدار VAX/DSM لمنصة VAX/VM، وكانت موصلة بألفا في نوعيها: DSM لـ OpenVMS و DSM لـ Ultrix.

كما شهدت هذه الفترة نشاطا كبيرا لـ MDC. وكان الإصدار الثاني من معايرة أنسي ANSI Standard لممبس (X11.1-1984) قد تمت الموافقة عليها في 15 نومفبر 1984. وفي 11 نوفمبر 1990 تم التصديق على الإصدار الثالث من معايرة أنسي (X11.1-1990). وفي عام 1992 تم تبني نفس المعايرة كمعايرة أيزو ISO 11756-1992. وكان استخدام M كاسم بديل للغة قد تمت الموافقة عليه في نفس الوقت تقريبا. وفي 8 ديسمبر 1995 كان الإصدار الرابع من معايرة (X11.1-1995) قد تم التصديق عليه من معايرة أنسي، ومن قبل أيزو في عام 1999 باعتبارها ISO 11756-1999. وقامت MDC بتطوير نسخة أكثر تقدما للمعايرة في عام 1998 لكن ذلك لم يكن مقدما لأنسي لكي تصدق عليها. وفي 6 يناير 2005 ولاحقا في 25 يونيو 2010، واعادت أيزو تأكيدها على أن المعايير المرتبطة بممبس هي: : ISO/IEC 11756:1999, language standard, ISO/IEC 15851:1999, Open MUMPS Interconnect و ISO/IEC 15852:1999, MUMPS Windowing Application Programmers Interface.

وبحلول عام 2000، أصبح مقدم المعدات الوسيطة إنترسيستمز InterSystems اللاعب المهيمن في سوق ممبس من خلال شراءها للعديد من الفاعلين في الصناعة. ومبدئيا فإنها استحوذت على داتاتري إنك في أوائل التسعينيات. وفي 30 ديسمبر 1995 استحوذت إنترسيستمز على خط إنتاج DSM من DEC. وقد دمجت إنترسيستمز هذه المنتجات في خط إنتاج واحد، وحملت علامات اسماءهم التجارية وفي العديد من منصات المعدات بلفظ OpenM. وفي عام 1997 فإن إنتر سيستمز أكملت بصورة كبيرة هذا الدمج من خلال توحيد وريثها الذي حمل اسم كاشيه Cache. وكان ذلك قائما على منتجهم الخاص بمدير نظم المعلومات ISM، لكن بتأثيرات من التطبيقات الأخرى. كما تم الاستحواذ على أصول مؤسسة مايكرونيتكس ديزين من قبل إنتر سيستمز في 21 يونيو 1998. ولا تزال إنترسيستمز اليوم (2007) هي المهيمن على منتجات ممبس، وكان بيع كاشيه لمطوري ممبس الذي يكتب تطبيقات لمجموعة من نظم التشغيل.

وكان تطبيق GT.M التابع لجراستون تكنولوجي كوربوريشن قد تم بيعه إلى سانشيز كومبيوتر أسوشيتس إنك (وهي الآن جزء من فيداليتي ناشيونال فاينانشيال إنك) في منتصف التسعينيات. وفي السابع من نوفمبر 2000 صنعت سانشيز GT.M للينوكس وجعلته متاحا بترخيص من GPL وفي 28 أكتوبر 2005 صعنت GT.M من أجل OpenVMS و Tru64 UNIX وكانت أيضا متاحة بترخيص AGPL. وتواصل GT.M كونها متاحة لمنصات يونكس الأخرى وفقا للترخيص التقليدي.

وكان التطبيق الأحدث لممبس، والذي صدر في أبريل 2002، مشتقا من MSM يسمى M21 من شركة رجبي ريل للبرمجيات بالمملكة المتحدة.
وهناك أيضا العديد من تطبيقات المصادر المفتوحة لممبس بما فيها بعض المشروعات البحثية. ومن أبرز هذه التطبيقات والمشروعات هو Mumps/II من قبل البروفيسور كيفن أوكين (يعمل الآن بجامعة نورثرن إيوا) ومشروع للطلبة. كما وصل كل من د. أوكين وريان ميرفي إلى توصيل المترجم لنظام تشغيل ماك.

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

## المستخدمون الحاليون لتطبيقات ممبس
كانت وزارة شئون المحاربون القدماء بالولايات المتحدة (سابقا إدارة المحاربون القدماء) من أوائل من تبنوا لغة ممبس. وكان عملهم التنموي (وإسهاماتهم المتوالية في قاعدة تشفير تطبيق ممبس المجانية) ذو تأثير على العديد من المستخدمين الطبيين في أنحاء العالم. وفي عام 1995 مان قد تم تطبيق نظام مرضي شئون المحاربين القدماء في الدخول والتتبع والصرف، من خلال برنامج الكمبيوتر الصحي غير المركزي Decentralized Hospital Computer Program قد تلقى جائزة سميثونيان العالمية لأفضل استخدام لتكنولوجيا المعلومات في مجال الطب. وبعد قرابة العقد (في يوليو 2006) تلقت وزارة شئون المحاربون القدماء (من خلال إدارة صحة المحاربون القدماء) جائزة الحكومة الأمريكية للابتكارات والتي قدمها معهد أش بمدرسة ج. ف. كينيدي الحكومية في جامعة هارفارد بسبب توفيرها لبرنامج الكمبيوتر الصحي في نظم معلومات صحة المحاربين القدماء وبينتها التكنولوجية VistA في يوليو 2006. وتقريبا فإن جميع نظم صحة المحاربين القدماء في الولايات المتحدة وفي الخدمة الصحية الهندية، وكذلك أجزاء رئيسية من وزارة الدفاع، فإن جميع هذه النظم تتم بتشغيل قواعد بيانات تتبع البيانات العيادية.

وتستخدم الشركات الكبيرة حاليا ممبس بما فيها أميريباث AmeriPath (وهي الآن جزء من كويست للتشخيصات)، وكير سنتريك، وإيبك سيستم كوربوريشن، وEMIS، وشركاء الرعاية الصحية، وميديتك، وج إي للرعاية الصحية (سابقا نظم IDXو سنتريسيتي). وهناك العديد من المعامل المرجعية، مثل كويست للتشخيصات ودايناكير، تستخدم برمجيات ممبس المكتوبة أو القائمة على كود أنتريم كوربوريشن. وكان قم تم الاستحواذ على أنتريم، وشركتها الأم صنكويست، من قبل ميسيس في عام 2001.

كما ورد أن Coventry Healthcare ومستشفى ماساشستس يستخدمان ممبس.

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

وقد أعلنت وكالة الفضاء الأوروبية في 13 مايو 2010 أنها سوف تستخدم ممبس (InterSystems Caché) من أجل دعم بعثة جايا Gaia mission. وكانت هذه البعثة تهدف إلى وضع خريطة لدرب اللبانة بدقة غير مسبوقة.

وفي عام 2005 فإن غالبية استخدام M كان إما في شكل GT.M أو InterSystems Caché. وكان النوع الأخير قد سوق على نطاق كبير من قبل إنترسيستمز وكان قد حقق نجاحا في التوغل في أسواق جديدة، مثل الاتصالات، إضافة إلى الأسواق القائمة.

## نظرة عامة
إن ممبس هي لغة عمدت إلى وصممت من أجل بناء تطبيقات قاعدة بيانات. وتضمنت مميزات اللغة الثانوية من أجل المساعدة المبرمجين في صنع التطبيقات باستخدام الموارد الحوسبية الدنيا. وكانت التطبيقات الأصلية مفسرة، بالرغم من أن التطبيقات الحديثة يمكن أن تكون مكتملة أو جزئية التنفيذ. إن «البرامج» المفردة تشغل في «تقسيمات» الذاكرة. وكانت تقسيمات الذاكرة المبكرة لممبس محدودة بقيمة 2048 بايت وكانت مختصرة للغاية ومساعدة للبرمجة المتعددة على المعدات المحدودة الموارد بشدة، ونظرا لأن أكثر من وظيفة لممبس يمكنها أن تناسب الذاكرات الصغيرة للغاية الموجودة في المعدات في ذلك الوقت. إن القدرة على تقديم نظم متعددة المستخدمين كانت تصميم لغوية آخر. إن البرمجة المتعددة في اختصار اسم اللغة. وحتى الآلات المبكرة التي كانت تشغل ممبس الداعمة لوظائف متعددة وتعمل في ذات الوقت. ومع التغيير من الكمبيوترات الصغيرة إلى الكمبيوترات الدقيقة بعد ذلك بسنوات، فإنه حتى «المستخدم المفرد لجهاز الكمبيوتر»، الذي لديه جهاز 8-بيت 8-bit بذاكرة 64 ك أو 64ك للذاكرة يمكنه أن يدعم المستخدمين المتعددين، وتشغيل الطرفيات الخرساء في وضع خط الأوامر (وبدون أي أثر لواجهة المستخدم الرسومية).
 
ونظرا لأن الذاكرة كانت محدودة بالأصل، فإن تصميم اللغة لممبس يقيم بكود مقتضب للغاية. وهكذا فإن كل أمر أو اسم وظيفة لممبس يمكن أن تختصر من حرف إلى ثلاثة أحرف في الطول على سبيل المثال. إغلاق (برنامج الخروج) مثل وظيفة Q $P== $Piece، وأمر R = Read، ووظيفة $TR == $Translate. إن الفراغات وعلامات نهاية السطور أمر كبير في ممبس لأن نطاق السطر يدعم نفس تصميم اللغة المقتضبة. ومن ثم فإن سطر إدخال كود البرنامج يمكن أن يعبر عن نفس الفكرة بعدد صغير من الحروف التي يمكن للغات البرمجية الأخرى أن تأخذ من 5 إلى 10 أضعاف من الحروف للتعبير عنها. إن الاختصار كان ميزة شائعة في اللغات المصممة في تلك الفترة (على سبيل المثال FOCAL-69، ولغات البيسك المبكرة مثل Tiny BASIC، الخ). وهناك لسوء الحظ أثر جانبي لهذه الازدواجية مع الحاجة المبكرة لكتابة كود في أقل سعة ممكنة وهو أن مبرمجي ممبس لا يقومون بالتعليق على الكود واستخدموا اختصارات موسعة، مما يعني أنه حتى خبير ممبس المبرمج لا يمكنه مجرد طوي صفحة الكود لرؤية وظيفته لكن عليه تحليله سطر وراء سطر.

إن تفاعل قاعدة البيانات مبنية بشفافية في لغة. وتقدم لغة ممبس قاعدة بيانات تراتبية مصنوعة من مصفوفات مستمرة، وتكون «مفتوحة» لكل تطبيق لممبس. إن كل الأسماء المتغيرة التي تسبق بحرف ذو قبعة ("^")تستخدم تخزينا دائما (بدلا من الرامات)، وسوف تبقي قيمها بعد تواجد التطبيق وسوف تكون مرئية لتطبيقات العاملة الأخرى. إن المتغيرات باستخدام هذا التخزين المشارك والدائم تسمي جلوبالز في ممبس بسبب أن تأطير هذه المتغيرات «متاح عالميا» لجميع الوظائف على النظام. إن الاستخدام الأكثر حداثة وشيوعا لاسم «المتغيرات العالمية» في اللغات الأخرى أكثر تحديدا في تأطير الأسماء، وتأتي من حقيقة أن المتغيرات غير المؤطرة متاحة «عالميا» لأي برامج تشغيل في نفس العملية، لكنها ليست متشاركة بين عمليات متعددة. إن وضع تخزين ممبس (على سبيل المثال فإن جلوبالز خزنت في مصفوفات دائمة)، وتطرح قاعدة ممبس سمات قاعدة البيانات القائمة على النصوص.

إن جميع الحروف المتغيرة التي لا تكون مسبوقة بحرف بقبعة ("^") تكون مؤقتة وخاصة. ومثل المتغيرات العالمية فإنها أيضا تكون لديها نموذج تخزين تراتبي، لكنها لا تكون «متاحة إلا محلية» فقط لوظيفة مفردة، لذلك فغنها تسمى «محليات» Locals. وكل من جلوبالز ولوكالز يمكن أن تكون لديهم عقدات صغيرة (تسمى منخفضات subscripts في مفردات ممبس). ولا تكون المنخفضات محدودة بالأرقام – أي حرف ASCII أو مجموعة من الحروف يمكن أن تكون محددا منخفضا. وبينما ذلك لا يكون شائعا للغات الحديثة مثل بيرل أو جافاسكربت، فإن هناك ميزة غير معتادة للغاية في أواخر السبعينيات. إن هذه القدرة لم تطبق على مستوى العالم في نظم ممبس قبل عام معايرة أنسي في عام 1984.) وهكذا فإن المتغير المسمى «كار» Car يمكن أن يكون لديه منخفضات مثل «باب»، «محرك» ويمكن أن تحتوي كل منهم على قيمة لديها مخفضات خاصة بها. إن المتغير ^Car("Door") يمكن أن يضع منخفضا متغيرا «للون» على سبيل المثال. وهكذا فإنه يمكنك أن تقول


```text
SET ^Car("Door","Color")="BLUE"
```


ومن أجل تعديل العقدة الصغيرة المتوطنة لـ ^Car. وفي مصطلحات ممبس فإن «اللون» في المنخفض الثاني للمتغير ^Car (وكلاهما اسمين للعقد الصغيرة وتسمى العقد الصغيرة نفسها بالمسجلات). إن المتغيرات التراتبية مشابهة للكائنات التي بها خصائص في اللغات العديدة القائمة على الكائن. إضافة إلى ذلك فإن تصميم لغة ممبس يتطلب أن جميع المسجلات للمتغيرات تحفظ تلقائيا في نظام تخزين. إن المسجلات الرقمية (بما فيها أرقام النقط العائمة) تكون مخزنة من أدناها إلى أعلاها. وتكون جميع المسجلات غير الرقمية مخزنة بترتيب أبجدي يتبع الأرقام. وفي مصطلحات ممبس فإن هذا النظام هو نظام كنسي (تراتبي). ومن خلال استخدام المسجلات المكملة غير السلبية فحسب فإنه يمكن لمبرمج ممبس أن يحاكي نوع بيانات المصفوفات من اللغات الأخرى. وبالرغم من أن ممبس لا تقدم بالأساس مجموعة تامة من مميزات DBMS مثل المخططات الإلزامية، وكانت العديد من نظم DBMS مبنية على قمتها والتي تزود مطوري التطبيق بملف مسطح ومميزات قاعدة بيانات علائقية وشبكية.

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

وليس لممبس أنواع من البيانات. ويمكن معاملة الأرقام على أنها مسلاست من الأرقام، أو سلسلة يمكن التعامل معها على أنها أرقام من خلال المشغلون الرقميون (القسريون بلغة ممبس). وبأي حال فإنه يمكن أن يكون للقسر بعض الآثار الجانبية الضارة. على سبيل المثال فإنه عندما تكون سلسلة ما قسرية، فإن المحلل يتحول بدرجة كبيرة لعمل سلسلة (بادئا من اليسار) في رقم بقدر الإمكان، ثم التخلص من الباقي. وهكذا فإن البيان IF 20
hello() 
       write "Hello, World!",!
       quit


ويمكن أن يتم تشغيله من خط أمر ممبس بالأمر 'do ^hello()'. ولأن ممبس تسمح للأوامر بان تكون مسلسلة معا على نفس الخط، ولأن الأوامر يمكن اختصارها في خطاب مفرد، ويمكن لهذا النظام أن يصنع بطريقة أكثر تحجيما:


```text
hello() w "Hello, World!",! q
```


إن'`,!`'بعد النص تولد خطا جديدا. إن '`quit`' ليست حاسمة بالضرورة في نهاية وظيفة مثل هذه، لكنها جيدة في ممارسة البرمجة في حالة أن الوظائف الأخرى تضاف أسفل '`hello()`' فيما بعد.

## ملخص للميزات الرئيسية للغة

يعمل الملخص التالي على جعل المبرمجين المعتادين على اللغات الأخرى يشعرون بماهية ممبس. وهي ليست خاصية لغوية رسمية، وقد تم محو العديد من المميزات والمؤهلات من أجل الإيجاز. وتقدم ANSI X11.1-1995 وصفا كاملا ورسميا للغة؛ وهناك نسخة مشروحة من هذه المعايرة متاحة على الإنترنت.

**أنواع البيانات:** هناك نوع بيانات عالمي واحد، وهو ملزم بأن يكون قاعدة بيانات من النوع المسلسل أوالمتكامل أو ذو الفاصلة العائمة وفقما يحتاج السياق إليه.

**المنطقيات (وتسمى القيم الموثوق فيها في ممبس):** في أوامر IF والبنيات الأخرى التي بها تعبيرات مقيمة كشروط، فإن أي قيمة مسلسلة يتم تقييمها باعتبارها قيمة عددية، وإذا لم تكون ذات قيمة صفرية فإنها تفسر عندئذ على أنها حقيقة a100 PRINTERR وظيفة PRINTERR إذا كانت N أكبر من 100. ويقدم هذا البناء حالة اشتراطية يكون نطاقها أقل من الخط الكامل.

**الاختصار:** يمكنك اختصار جميع الأوامر تقريبا والوظائف الأصيلة إلى حرف واحد أو اثنين أو ثلاثة.
الكلمات المحجوزة: لا توجد. لأن ممبس تفسر الشيفرة المصدرية من خلال السياق، فإنه ليست هناك حاجة لكلمات محجوزة. ويمكنك استخدام أسماء أوامر اللغات كمتغيرات. وليس هناك مسابقة مثل مسابقة كود سي الدولية the International Obfuscated C Code Contestلممبس، بالرغم من إمكانية الأمثلة كما يلي، وهي قانونية تماما ومتعلقة بشفرة ممبس:


```text
GREPTHIS()
       NEW SET,NEW,THEN,IF,KILL,QUIT SET IF="KILL",SET="11",KILL="l1",QUIT="RETURN",THEN="KILL"
       IF IF=THEN DO THEN
       QUIT:$QUIT QUIT QUIT ; (quit)
THEN IF IF,SET&KILL SET SET=SET+KILL QUIT
```


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


```text
GREPTHIS()
       N S,N,T,I,K,Q S I="K",S="11",K="l1",Q="R",T="K"
       I I=T D T
       Q:$Q Q Q
T I I,S&K S S=S+K Q
```


**المصفوفات:** وتصنع ديناميكيا، وتخزن على أنها بي-تريز، ويتم تحليلها (على سبيل المثال لا يتم في الغالب استخدام فراغ للعقد المفقودة)، ويمكنها استخدام أي رقم من المسجلات، ويمكن أن تكون هذه المسجلات سلاسل أو رقمية (بما فيها النقطة العائمة). وتكون المصفوفات دائما مخزنة آليا في نظام مصنف، لذل لا توجد أية فرصة للتصنيف والتعبئة أو إعادة الطلب أو إعادة تنظيم قاعدة البيانات. إن الوظائف الداخلية مثل $DATA, $ORDER, $NEXT, $QUERY تعتبر وظائف تقدم تناولا كافيا لبنية المصفوفة الأساسية أو القرص أو الذاكرة.


```text
for i=10000:1:12345 set sqtable(i)=i*i
set address("Smith","Daniel")="dpbsmith@world.std.com"
```


**المصفوفات المحلية:** إن الأسماء المتغيرة لا تبدأ بقبعة (مثل "^") يتم تخزينها في الذاكرة من خلال العملية، هي أسماء خاصة بعملية التكوين، وتنتهي صلاحيتها عندما تنتهي عملية التكوين. إن التخزين المتاح يعتمد على التطبيق. ومن أجل هذه التطبيقات باستخدام الأقسام، فإنها تكون محدودة بحجم القسم، (القسم الصغير A يمكن أن تكون سعته 32 ك). وبالنسبة للتطبيقات الأخرى فإنها يمكن أن تكون العديد من الميجابايت

**المصفوفات العالمية:** ^abc, ^def ويتم تخزينها على القرص، وتكون متاحة لجميع العمليات وتكون مستمرة عندما تنتهي عملية التكوين. إن الجلوبالز الكبيرة للغاية (على سبيل المثال مئات الجيجابايت) تكون عملية وكافية في غالبية التطبيقات. وهذه هي آلية «قاعدة بيانات» الرئيسية. وهي مستخدمة بدلا من استدعاء نظام التشغيل لتكوين الملفات وكتابتها وقراءتها.

**عدم التوجيه:** في العديد من السياقات يمكن استخدام `@VBL` كما يمكن التخصيص بفاعلية لمحتويات VBL في بيان ممبس آخر. وتضع SET XYZ="ABC" SET @XYZ=123 المتغير ABC لـ 123. ويؤدي SET SUBROU="REPORT" DO @SUBROU النظام الفرعي المعروف باسم REPORT. ويسمح مثل هذا الاستبدال بالتقييم البطئ والإلزام المتأخر وكذلك فاعلية المكافئ التشغيلي «للمؤشرات» في اللغات الأخرى.

**وظيفة القطعة:** تقسم هذه الوظيفة المتغيرات إلى قطع متفرقة تستدل بسلسلة المشغل المحددة للمستخدم (وتسمى أحيانا «محدد»). وسيجد الذين يعرفون awk أن ذلك أمرا معتادا لديهم. وتعني $PIECE(STRINGVAR,"^",3) أن «قطعة ثالثة من STRINGVAR». ويمكن أن تظهر وظيفة القطعة أيضا بوصفها هدف واجب (أمر SET). بعد


```text
SET X="dpbsmith@world.std.com"
```


$PIECE("world.std.com",".",2) تحقق yields "std" SET $P(X,"@",1)="office" وتؤدي إلى أن تصبح Xما يلي "office@world.std.com" (لاحظ أن $P تكافئ $PIECE، ويمكن أن تكتب هكذا).

**وظيفة الأمر**


```text
Set stuff(6)="xyz",stuff(10)=26,stuff(15)=""
```


$`Order(stuff(""))` yields 6, $`Order(stuff(6))` yields 10, $`Order(stuff(8))` yields 10, $`Order(stuff(10))` yields 15, $`Order(stuff(15))` yields "".


```text
Set i="" For Set i=$O(stuff(i)) Quit:i="" Write !,i,10,stuff(i)
```


وهنا فإن المعطيات كانت أقل تكرارا حتى توقفها من خلال إنهاء غلق Quit. ويطبع هذا الخط جدول من i وأشياء (i) حيث تكون i هي على التوالي 6، 10، 15.

**المستخدمون المتعددون/ المهام المتعدد/ المعالجات المتعددة:** تدعم ممبس مستخدمين وعمليات متعددون في وقت واحد حتى عندما لا يكون نظام التشغيل القائم (E.g. MS-DOS).. إضافة إلى ذلك فإنه هناك القدرة على تخصيص البيئة لمتغير ما، مثل من خلال تخصيص اسم الآلة في المتغير (كما في SET ^|"DENVER"|A(1000)="Foo")، والذي يمكن أن يسمح لك بالولوج إلى البيانات من آلات بعيدة.
وبالنسبة للإدراج المتواصل لبقية أوامر، ومشغلو، ووظائف، والمتغيرات الخاصة لممبس، انظر هذه المصادر على الإنترنت:
 
* MUMPS by Example، أو الكتاب (الذي نفدت نسخه) بنفس العنوان من تأليف إد دي مويل. وهناك تفصيل للكثير من بنية اللغة في هذا المصدر، مع أمثلة للاستخدام.
* The Annotated MUMPS Language Standard، والذي يظهر ثورة اللغة والاختلافات بين نسخ معايرة ANSI.

## سجال ممبس ضد تسمية M
بينما لا يحظى هذا العنوان إلا باهتمام محدود خارج مجتمع ممبس/ M، فإن هذا الموضوع متواصل هناك.
إن جميع المواضع التالية يمكن أن يتم دعمها من خلال ناس قادرون على التحصيل المعرفي في أوقات مختلفة:
* أصبح اسم اللغة M في عام 1993 عندما تبنته مؤسسة إم للتكنولوجيا.
* وقد أصبح الاسم M في 8 ديسمبر 1995 بعد التصديق على ANSI X11.1-1995.
* وكل من M وممبس هما اسمان مقبولان رسميا.
* إن M هي فقط «اسم بديل» أو «كنية» للغة، ولا تزال ممبس هي الاسم الرسمي.

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

إن المعيار الأكثر حداثة (ISO/IEC 11756:1999، والمعاد توكيده في 25 يونيو 2010) لا يزال يذكر كل من إم وممبس كاسمين مقبولين رسميا.

## اختيار الفترة
في ممبس فإن التاريخ والوقت الحاليين محتويين في متغير نظام خاص، $H(اختصارا لـ ‘HOROLOG’). ويكون التنسيق زوجا من المكملات مفصول بينهما بواسطة فاصلة، مثال. "54321,12345" والرقم الأول هو رقم الأيام منذ 31 ديسمبر 1840، مثل رقم اليوم 1 وهو 1 يناير 1841؛ ويشير الرقم الثاني للثواني منذ منتصف الليل.

وقد كتب جيمس م. بوتراس أنه قد اختار هذه الفترة لطرق التاريخ ولاوقت في المجموعة التي طورها من قبل مجموعته في MGH في عام 1969:
 (وهناك نسخ أكثر روعة تم نشرها في الفولكلور، وتشير، على سبيل المثال، إلى أن 31 ديسمبر 1840 كان هو التاريخ الدقيق لأول إدخال لسجلات MGH، لكن يبدو أن ذلك محض مزاعم. وهناك زعم آخر بأن التاريخ قد تم اختياره للاحتفاء بذكرى أول استخدام للأثير كمخدر كظاهرة جماهيرية.
 
## برامج عينات
إن التنفيذ المباشر للشيفرة المصدرية على منصات الحوسبة التاريخية في عهد الأقراص الدقيقة، والرامات صغيرة ووصلات 300 بود التسلسلية قد أدت إلى أسلوب تشفير تاريخي كان مكثفا ومصاحبا للخبراء، حتى أن أساليب التشفير المعاصرة لممبس تنتج حاليا تشفيرا أكثر قابلية للقراءة.
أولا، كمثال لشيفرة M من عام 2010، فإن حلا لتدريب قياسي قائم على حساب المتوالية الأطول المتحققة عند حساب المتوالية الأطول حدس كولاتز لمجموعة من المكملين. وهذا المثال مكتوب بلغة GT.M ويستغل ويجسد العديد من مميزات ممبس


```text
threeen1f
        ; Find the maximum number of steps for the 3n+1 problem for all integers through two input integers.
        ; See http://docs.google.com/View?id=dd5f3337_24gcvprmcw
        ; Assumes input format is 3 integers separated by a space with the first integer smaller than the second.
        ; The third integer is the number of parallel computation streams.  If it is less than twice the
        ; number of CPUs or cores, the parameter is modified to that value.  An optional fourth integer is the
        ; sizes of blocks of integers on which spawned child processes operate.  If it is not specified, the
        ; block size is approximately the range divided by the number of parallel streams.  If the block size is
        ; larger than the range divided by the number of execution streams, it is reduced to that value.
        ; No input error checking is done.

        ; Although the problem can be solved by using strictly integer subscripts and values, this program is
        ; written to show that the GT.M key-value store can use arbitrary strings for both keys and values -
        ; each subscript and value is spelled out using the strings in the program source line labelled "digits".
        ; Furthermore, the strings are in a number of international languages when GT.M is run in UTF-8 mode.

        ; K.S. Bhaskar 2010612

        ; No claim of copyright is made with respect to this program.

        ; Variables do not have to be declared before use, but are New'd in subprograms to ensure that they
        ; do not conflict with names in the caller.

        ; The program reads the program source at the label digits to get strings (separated by ;) for each language used.
digits ;zero;eins;deux;tres;quattro;пять;ستة;सात;捌;ஒன்பது
        Do digitsinit                           ; Initialize data for conversion between integers and strings

        ; Get number of CPUs from /proc/cpuinfo and calculate minimum number of execution streams
        Open "cpus":(SHELL="/bin/sh":COMMAND="grep -i ^processor /proc/cpuinfo|wc -l":READONLY)::"PIPE"
        Use "cpus" Read streams Use $PRINCIPAL
        Close "cpus"
        Set streams=2*streams                   ; At least two execution streams per CPU

        ; At the top level, the program reads and processes input lines, one at a time.  Each line specifies
        ; one problem to solve.  Since the program is designed to resume after a crash and reuse partial
        ; results computed before the crash, data in the database at the beginning is assumed to be partial
        ; results from the previous run.  After computing and writing results for a line, the database is
        ; cleared for next line of input or next run of the program.

        ; Loop for ever, read a line (quit on end of file), process that line
        For  Read input Quit:$ZEOF!'$Length(input)  Do      ; input has entire input line
      .
      . Set i=$Piece(input," ",1)                         ; i - first number on line is starting integer for the problem
      . Set j=$Piece(input," ",2)                         ; j - second number on line is ending integer for the problem
      . Write $FNumber(i,",",0)," ",$FNumber(j,",",0)     ; print starting and ending integers, formatting with commas
      .
      . Set k=$Piece(input," ",3)                         ; k - third number on input line is number of parallel streams
      . If streams>k Do                                   ; print number of execution streams, optionally corrected
      ..  Write " (",$FNumber(k,",",0)
      ..  Set k=streams
      ..  Write "->",$FNumber(k,",",0),")"
      . Else  Write " ",$FNumber(k,",",0)
      .
      . Set blk=+$Piece(input," ",4)                          ; blk - size of blocks of integers is optional fourth piece
      . Set tmp=(j-i+k)\k                                     ; default / maximum block size
      . If blk&(blk'>tmp) Write " ",$FNumber(blk,",",0)       ; print block size, optionally corrected
      . Else  Do
      ..  Write " (",$FNumber(blk,",",0)
      ..  Set blk=tmp
      ..  Write "->",$FNumber(blk,",",0),")"
      .
      . ; Define blocks of integers for child processes to work on
      . Kill ^limits
      . Set tmp=i-1
      . For count=1:1 Quit:tmp=j  Do
      ..  Set ^limits(count)=$increment(tmp,blk)
      ..  Set:tmp>j (tmp,^limits(count))=j
      .
      . ; Launch jobs.  Grab lock l1, atomically increment counter, compute and launch one job for each block of numbers.
      . ; Each child job locks l2(pid), decrements the counter and tries to grab lock l1(pid).
      . ; When counter is zero, all jobs have started.  Parent releases lock l1 and tries to grab lock l2.
      . ; When all children have released their l2(pid) locks, they're done and parent can gather & report results.
      . Set ^count=0                                  ; Clear ^count - may have residual value if restarting from crash
      . Lock +l1                                      ; Set lock for process synchronization
      . For s=1:1:k Do
      ..  Set c=$Increment(^count)                    ; Atomic increment of counter in database for process synchronization
      ..  Set def=$ZTRNLNM("gtm_tmp") Set:'$Length(def) def=$ZTRNLNM("PWD")     ; Working directory for Jobbed process
      ..  Set err=$Text(+0)_"_"_$Job_"_"_s_".mje"                               ; STDERR for Jobbed process
      ..  Set out=$Extract(err,1,$Length(err)-1)_"o"                            ; STDOUT for Jobbed process
      ..  Set cmd="doblk(i):(ERROR="""_err_""":OUTPUT="""_out_""":DEFAULT="""_def_""")"     ; Command to Job
      ..  Job @cmd                             ; Job child process for next block of numbers
      . For  Quit:'^count  Hang 0.1            ; Wait for processes to start (^count goes to 0 when they do)
      . Lock -l1                               ; Release lock so processes can run
      . Set startat=$HOROLOG                   ; Get starting time
      . Lock +l2                               ; Wait for processes to finish
      .
      . ; When parent gets lock l2, child processes have completed and parent gathers and reports results.
      . set endat=$HOROLOG                     ; Get ending time - time between startat and endat is the elapsed time
      . ; Calculate duration
      . Set duration=(86400*($Piece(endat,",",1)-$Piece(startat,",",1)))+$Piece(endat,",",2)-$Piece(startat,",",2)
      . Write " ",$FNumber(^result,",",0)     ; Show largest number of steps for the range i through j
      . Write " ",$FNumber(^highest,",",0)    ; Show the highest number reached during the computation
      . Write " ",$FNumber(duration,",",0)    ; Show the elapsed time 
      . Write " ",$FNumber(^updates,",",0)    ; Show number of updates
      . Write " ",$FNumber(^reads,",",0)      ; Show number of reads
      . ; If duratation is greater than 0 seconds, display update and read rates
      . Write:duration " ",$FNumber(^updates/duration,",",0)," ",$FNumber(^reads/duration,",",0)
      . Write !
      . Lock -l2                               ; Release lock for next run
      . Do dbinit                              ; Initialize database for next run
        Quit

dbinit ; Entryref dbinit clears database between lines
        Kill ^count,^highest,^reads,^result,^step,^updates
        Quit

digitsinit ; Initialize arrays to convert between strings and integers
        New m,x
        Set x=$Text(digits)
        For m=0:1:9 Set di($Piece(x,";",m+2))=m,ds(m)=$Piece(x,";",m+2)
        Quit

inttostr(n) ; Convert an integer to a string
        New m,s
        Set s=ds($Extract(n,1))
        For m=2:1:$Length(n) Set s=s_" "_ds($Extract(n,m))
        Quit s
        ;
strtoint(s) ; Convert a string to an integer
        New m,n
        Set n=di($Piece(s," ",1))
        For m=2:1:$Length(s," ") Set n=10*n+di($Piece(s," ",m))
        Quit n

; This is where Jobbed processes start
doblk(allfirst)
        Set (reads,updates,highest)=0           ; Start with zero reads, writes and highest number
        Do digitsinit                           ; Initialize data for conversion between integers and strings
        Lock +l2($JOB)                          ; Get lock l2 that parent will wait on till this Jobbed processes is done
        If $Increment(^count,-1)                ; Decrement ^count to say this process is alive
        Lock +l1($JOB)                          ; This process will get lock l1($JOB) only parent has released lock on l1
        ;
        ; Process the next block in ^limits that needs processing; quit when done
        For  Quit:'$Data(^limits($increment(tmp)))  Do:1=$increment(^limits(tmp,1)) dostep($select($data(^limits(tmp-1)):^limits(tmp-1)+1,1:allfirst),^limits(tmp))
        ;
        TStart ()                               ; Update global statistics inside a transaction
        ; The following line unconditionally adds the number of reads & write performed by this process to the
        ; number of reads & writes performed by all processes, and sets the highest for all processes if the
        ; highest calculated by this process is greater than that calculated so far for all processes
        Set:$Increment(^reads,reads)&$Increment(^updates,updates)&(highest>$Get(^highest)) ^highest=highest
        TCommit
        Lock -l1($JOB),-l2($JOB)                ; Release locks to tell parent this parent is done
        Quit                                    ; Jobbed processes terminate here

dostep(first,last) ; Calculate the maximum number of steps from first through last
        New current,currpath,i,n
        For current=first:1:last Do
      . Set n=current                          ; Start n at current
      . Kill currpath                          ; Currpath holds path to 1 for current
      . ; Go till we reach 1 or a number with a known number of steps
      . For i=0:1 Quit:$Increment(reads)&($Data(^step($$inttostr(n)))!(1=n))  Do
      ..  Set currpath(i)=n                     ; log n as current number in sequence
      ..  Set n=$Select('(n#2):n/2,1:3*n+1)     ; compute the next number
      ..  Set:n>highest highest=n             ; see if we have a new highest number reached              
      . Do:0<i                                 ; if 0=i we already have an answer for n, nothing to do here
      ..  If 1<n Set i=i+$$strtoint(^step($$inttostr(n)))
      ..  TStart ()                             ; Atomically set maximum
      ..  Set:i>$Get(^result) ^result=i
      ..  TCommit
      ..  Set n="" For  Set n=$Order(currpath(n)) Quit:""=n  Set:$Increment(updates) ^step($$inttostr(currpath(n)))=$$inttostr(i-n)
        Quit
```


وفيما يلي، فإن هناك مثال لأسلوب التشفير M «التقليدي»، وهو نظام التشفير المصدري VistA منذ أواخر السبعينيات (آخر تعديل له في 1992)، وقد كتبه في صورته الأصلية جورج تيمسون في الوقت الذي كانت فيه المعايرة اللغوية غير ذات مميزات متطورة مثل التأطير المتغير. ومن المعترف به على وجه العموم أن هذا التشفير ليس قابلا للقراءة بصورة قوية بالنسبة للعديد من مبرمجي اليوم. ومع ذلك فإنه يجب أن نذكر أن هذا التشفير مقبول للخبراء، (على سبيل المثال بالنسبة لمبرمجي VistA المتكيفين معه فإنه يكون مقروئا ومبنيا بشكل مناسب)- إن هذا التشفير مثال للتشفير الذي كان يستخدم بفاعلية لمدة سنوات عديدة. إن هذه الثقافة والأسلوب لتشفير تطبيق طويل الأمد لا يمكن ولا يجب أن تتغير بين ليلة وضحاها، وعندما يستمر التشفير في العمل فإن مثل هذه الثقافات تركز على إضافة وظيفية جديدة بدر من تحديث التشفير ببساطة لأسباب واقعية.
وبسبب الطبيعية المقتضبة لتشفير ممبس المختصر تماما، فإن حجم التشفير المشابه في لغات البرمجة الأخرى التي تقدم نفس الوظيفية يمكن أن تكون أكبر بصورة كبيرة.


```text
%DTC
%DTC ; SF/XAK - DATE/TIME OPERATIONS ;1/16/92 11:36 AM
     ;;19.0;VA FileMan;;Jul 14, 1992
     D    I 'X1!'X2 S X="" Q
     S X=X1 D H S X1=%H,X=X2,X2=%Y+1 D H S X=X1-%H,%Y=%Y+1&X2
     K %H,X1,X2 Q
     ;
C S X=X1 Q:'X D H S %H=%H+X2 D YMD S:$P(X1,".",2) X=X_"."_$P(X1,".",2) K X1,X2 Q
S S %=%#60/100+(%#3600\60)/100+(%\3600)/100 Q
     ;
H I X<1410000 S %H=0,%Y=-1 Q
     S %Y=$E(X,1,3),%M=$E(X,4,5),%D=$E(X,6,7)
     S %T=$E(X_0,9,10)*60+$E(X_"000",11,12)*60+$E(X_"00000",13,14)
TOH S %H=%M>2&'(%Y#4)+$P("^31^59^90^120^151^181^212^243^273^304^334","^",%M)+%D
     S %='%M!'%D,%Y=%Y-141,%H=%H+(%Y*365)+(%Y\4)-(%Y>59)+%,%Y=$S(%:-1,1:%H+4#7)
     K %M,%D,% Q
     ;
DOW D H S Y=%Y K %H,%Y Q
DW D H S Y=%Y,X=$P("SUN^MON^TUES^WEDNES^THURS^FRI^SATUR","^",Y+1)_"DAY"
     S:Y<0 X="" Q
7 S %=%H>21608+%H-.1,%Y=%\365.25+141,%=%#365.25\1
     S %D=%+306#(%Y#4=0+365)#153#61#31+1,%M=%-%D\29+1
     S X=%Y_"00"+%M_"00"+%D Q
     ;
YX D YMD S Y=X_% G DD^%DT
YMD D 7 S %=$P(%H,",",2) D S K %D,%M,%Y Q
T F %=1:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("TODAY",%)'=Y
     S X=$E(X,%+1,99) G PM:Y="" I +X'=X D DMW S X=%
     G:'X 1^%DT
PM S @("%H=$H"_Y_X) D TT G 1^%DT:%I(3)'?3N,D^%DT
N F %=2:1 S Y=$E(X,%) Q:"+-"[Y G 1^%DT:$E("NOW",%)'=Y
     I Y="" S %H=$H G RT
     S X=$E(X,%+1,99)
     I X?1.N1"H" S X=X*3600,%H=$H,@("X=$P(%H,"","",2)"_Y_X),%=$S(X<0:-1,1:0)+(X\86400),X=X#86400,%H=$P(%H,",")+%_","_X G RT
     D DMW G 1^%DT:'% S @("%H=$H"_Y_%),%H=%H_","_$P($H,",",2)
RT D TT S %=$P(%H,",",2) D S S %=X_% I %DT'["S" S %=+$E(%,1,12)
     Q:'$D(%(0))  S Y=% G E^%DT
PF S %H=$H D YMD S %(9)=X,X=%DT["F"*2-1 I @("%I(1)*100+%I(2)"_$E("> <",X+2)_"$E(%(9),4,7)") S %I(3)=%I(3)+X
     Q
TT D 7 S %I(1)=%M,%I(2)=%D,%I(3)=%Y K %M,%D,%Y Q
NOW S %H=$H,%H=$S($P(%H,",",2):%H,1:%H-1)
     D TT S %=$P(%H,",",2) D S S %=X_$S(%:%,1:.24) Q
DMW S %=$S(X?1.N1"D":+X,X?1.N1"W":X*7,X?1.N1"M":X*30,+X=X:X,1:0)
     Q
COMMA ;
     S %D=X<0 S:%D X=-X S %=$S($D(X2):+X2,1:2),X=$J(X,1,%),%=$L(X)-3-$E(23456789,%),%L=$S($D(X3):X3,1:12)
     F %=%:-3 Q:$E(X,%)=""  S X=$E(X,1,%)_","_$E(X,%+1,99)
     S:$D(X2) X=$E("$",X2["$")_X S X=$J($E("(",%D)_X_$E(")",%D+1),%L) K %,%D,%L
     Q
HELP S DDH=$S($D(DDH):DDH,1:0),A1="Examples of Valid Dates:" D %
     S A1="  JAN 20 1957 or 20 JAN 57 or 1/20/57"_$S(%DT'["N":" or 012057",1:"") D %
     S A1="  T   (for TODAY),  T+1 (for TOMORROW),  T+2,  T+7,  etc." D %
     S A1="  T-1 (for YESTERDAY),  T-3W (for 3 WEEKS AGO), etc." D %
     S A1="If the year is omitted, the computer "_$S(%DT["P":"assumes a date in the PAST.",1:"uses the CURRENT YEAR.") D %
     I %DT'["X" S A1="You may omit the precise day, as:  JAN, 1957" D %
     I %DT'["T",%DT'["R" G 0
     S A1="If the date is omitted, the current date is assumed." D %
     S A1="Follow the date with a time, such as JAN 20@10, T@10AM, 10:30, etc." D %
     S A1="You may enter a time, such as NOON, MIDNIGHT or NOW." D %
     I %DT["S" S A1="Seconds may be entered as 10:30:30 or 103030AM." D %
     I %DT["R" S A1="Time is REQUIRED in this response." D %
0 Q:'$D(%DT(0))
     S A1=" " D % S A1="Enter a date which is "_$S(%DT(0)["-":"less",1:"greater")_" than or equal to " D %
     S Y=$S(%DT(0)["-":$P(%DT(0),"-",2),1:%DT(0)) D DD^%DT:Y'["NOW"
     I '$D(DDS) W Y,"." K A1 Q
     S DDH(DDH,"T")=DDH(DDH,"T")_Y_"." K A1 Q
     ;
% I '$D(DDS) W !," ",A1 Q
     S DDH=DDH+1,DDH(DDH,"T")="     "_A1 Q
```


وفيما يلي تطبيقا ثانيا والذي يجسد إمكانات الإيجاز في ممبس.


```text
ST ; ROT13 ; Gunter Rensch ; 2000-01-03 ; Encrypt/Decrypt ROT13
        Q ; no direct execution
        ;
        ; call from your program with
        ;       S A="String"
        ;       S A=$$ROT^ROT13(.A)
        ;
ROT(R) ;
        S S1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        S S2="NOPQRSTUVWXYZABCDEFGHIJKLM"
        S s1="abcdefghijklmnopqrstuvwxyz"
        S s2="nopqrstuvwxyzabcdefghijklm"
        S R=$TR(R,S1_s1,S2_s2)
        Q R
```


A second implementation is below, which illustrates the possibilities of concision in MUMPS.


```text
s A="String" F i=1:1:$L(A) W $c($S($A($E(A,i))<91:$A($E(A,i))-52#26+65,1:$A($E(A,i))-84#26+97))
```


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

```text
s x="x x" x x
```

ويقوم نفس اللوغاريتم باستخدام متغير موسع وأسماء أوامر

```text
Set X="Xecute X" Xecute X
```

ويقوم هذا البرنامج بوضع قيمة "xx" للاسم المتغير x، ثم يبدأ تنفيذا مطلقا لـ x يمكن أن يسفر عن تدفق مفرط في التكويم. وعند مجرد 13 حرف، بما فيها الفراغات وعلامة نهاية السطر (لأن معايرة ممبس تحدد السعة التخزينية بالحروف وليس بالبايت)، باستخدام حرفين، يظهر المتغير الأول أنه من الممكن أيضا كتابة تشفير موجز في M.

## المراجع

## لمزيد من القراءة
* Walters, Richard (1989). "ABCs of MUMPS. 1989: Butterworth-Heinemann, ISBN 1-55558-017-3.
* Walters, Richard (1997). *M Programming: A Comprehensive Guide.* Digital Press. ISBN 1-55558-167-6.
* Lewkowicz, John. *The Complete MUMPS : An Introduction and Reference Manual for the MUMPS Programming Language.* ISBN 0-13-162125-4
* Kirsten, Wolfgang, et al. (2003) *Object-Oriented Application Development Using the Caché Postrelational Database* ISBN 3-540-00960-4
* Martínez de Carvajal Hedrich, Ernesto (1993). "El Lenguaje MUMPS". Completa obra en castellano sobre el lenguaje Mumps. ISBN 84-477-0125-5. Distribuido exclusivamente por su author (ecarvajal@hedrich.es)
* O'Kane, K.C.; *A language for implementing information retrieval software,* Online Review, Vol 16, No 3, pp 127–137 (1992).
* O'Kane, K.C.; and McColligan, E. E., *A case study of a Mumps intranet patient record,* Journal of the Healthcare Information and Management Systems Society, Vol 11, No 3, pp 81–95 (1997).
* O'Kane, K.C.; and McColligan, E.E., *A Web Based Mumps Virtual Machine,* Proceedings of the American Medical Informatics Association 1997
* O'Kane, K.C., The Mumps Programming Language, Createspace, ISBN 1-4382-4338-3, 120 pages (2010).

## وصلات خارجية
* M Technology and MUMPS Language FAQ (1999) General source; also specific source for the Poitras quote re the origin of the 1840 epoch.
* Open Source (GPL/LGPL), Kevin O'Kane Univ Northern Iowa
* Information Retrieval in Mumps (book)
* MDH Database Toolkit C++ class library to access O'Kane's Open Source Mumps
* MDC - MUMPS Development Committee
* The Annotated M{UMPS} Standards
* Caché & MUMPS Technology Association of UK & Ireland
* GT.M Open Source MUMPS System - Fidelity/Sanchez/Greystone
* MUMPS Systems - Source Forge index
* Globals: a primer for Relational Programmers
* The M Technology Resource Center
* M Links at Hardhats.org
* A case of MUMPS A MUMPS story at The Daily WTF
* M21 - An ANSI M(UMPS) Implementation
* EsiObjects An Object Oriented extension of MUMPS
* InterSystems Caché
* InterSystems M Technologies DSM, MSM and OpenM
* M/DB  An Open Source MUMPS-based API-compatible alternative to SimpleDB
* MiniM Database Server, A MUMPS Implementation
* Development and Operation of a MUMPS Laboratory Information System: A Decade's Experience
* IDEA-Technology for Caché and GT.M
* MUMPS documentation, topics, and resources (mixed Czech and English)

تصنيف:ديجيتال إكوبمينت
تصنيف:لغات برمجة ديناميكية النمط
تصنيف:لغات برمجة نصية
تصنيف:مستشفى ماساتشوستس العام
تصنيف:معايير آي إي سي
تصنيف:معايير الأيزو
تصنيف:معلوماتية صحية
تصنيف:لغات برمجة أنشئت في 1966