ممبس
المحتويات
- New m,s
- The Annotated M{UMPS} Standards
- . Else Do
- for i=10000:1:12345 set sqtable(i)=i*i
- Use "cpus" Read streams Use $PRINCIPAL
- YX D YMD S Y=X_% G DD^%DT
- اختيار الفترة
- I %DT'["T",%DT'["R" G 0
- THEN IF IF,SET&KILL SET SET=SET+KILL QUIT
- I Y="" S %H=$H G RT
- ملخص للميزات الرئيسية للغة
- IF IF=THEN DO THEN
- PM S @("%H=$H"_Y_X) D TT G 1^%DT:%I(3)'?3N,D^%DT
- ; call from your program with
- GREPTHIS
- ;
- لمزيد من القراءة
- . For s=1:1:k Do
- COMMA ;
- . ; Calculate duration
- . Set startat=$HOROLOG ; Get starting time
- نظرة عامة
- hello w "Hello, World!",! q
- .. Set blk=tmp
- ; K.S. Bhaskar 2010612
- ;
- المستخدمون الحاليون لتطبيقات ممبس
- برامج عينات
- Q R
- التاريخ
- Set X="Xecute X" Xecute X
- New m,n
- TCommit
- وظيفة الأمر
- Q:'$D(%(0)) S Y=% G E^%DT
- H I X<1410000 S %H=0,%Y=-1 Q
- ROT(R) ;
- ;
- Quit
- سجال ممبس ضد تسمية M
- s x="x x" x x
- New m,x
- For current=first:1:last Do
- quit
- InterSystems M Technologies DSM, MSM and OpenM
- .. TCommit
- hello
- T I I,S&K S S=S+K Q
- .. Set:tmp>j (tmp,^limits(count))=j
- M Links at Hardhats.org
- Q
- IDEA-Technology for Caché and GT.M
- MiniM Database Server, A MUMPS Implementation
- Quit
- GREPTHIS
- Quit ; Jobbed processes terminate here
- ; This is where Jobbed processes start
- . For count=1:1 Quit:tmp=j Do
- %DTC
- Quit
- S DDH=DDH+1,DDH(DDH,"T")=" "_A1 Q
- D I 'X1!'X2 S X="" Q
- Quit
- ;
- Q
- threeen1f
- ;
- .. Set k=streams
بدايةً، إن ممبس MUMPS (وهو اختصار لاسم نظام البرمجة المتعدد لتشغيل مستشفى ماساتشوسيتس العام (Massachusetts General Hospital Utility Multi-Programming System) أو اختصارا بحرف إم هو لغة برمجة ظهرت في أواخر ستينيات القرن العشرين من أجل أن تستعمل في صناعة الرعاية الصحية. وكانت مصممة لإنتاج تطبيقات قائمة على قاعدة البيانات متعددة المستعملين. وهي تسبق لغة سيC واللغات الأكثر شعبية الأخرى في الاستخدام الحالي، ولها بنية ومصطلحات مختلفة تماما. ونتناول فيما يلي مزيدًا من التفاصيل.
إضافةً إلى ذلك، وقد تم تبنيها على نطاق واسع خلال السبعينيات والثمانينيات في نظم معلومات/ وقواعد بيانات الرعاية الصحية والنواحي المالية، ولا تزال تستعمل من قبل الكثير من نفس المستعملين إلى اليوم. وتستعمل هذه اللغة في الوقت الحالي في نظم التسجيل الصحي الإلكترونية وكذلك من قبل الكثير من الشبكات المصرفية وخدمات التجارة / والاستثمار الإلكترونية.
New m,s
- Set s=ds($Extract(n,1))
- For m=2:1:$Length(n) Set s=s_" "_ds($Extract(n,m))
- Quit s
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
. Else Do
.. Write " (",$FNumber(blk,",",0)
for i=10000:1:12345 set sqtable(i)=i*i
SET X="dpbsmith@world.std.com"
علاوةً على ذلك، المصفوفات العالمية: ^abc, ^def ويتم تخزينها على القرص، وتكون متاحة لجميع العمليات وتكون مستمرة عندما تنتهي عملية التكوين. إن الجلوبالز الكبيرة للغاية (مثلًا مئات الجيجابايت) تكون عملية وكافية في غالبية التطبيقات. وهذه هي آلية «قاعدة بيانات» الرئيسية. وهي مستعملة بدلا من استدعاء نظام التشغيل لتكوين الملفات وكتابتها وقراءتها.
وفي هذا الصدد، $PIECE("world.std.com",".",2) تحقق yields "std" SET $P(X,"@",1)="office" وتؤدي إلى أن تصبح Xما يلي "office@world.std.com" (لاحظ أن $P تكافئ $PIECE، ويمكن أن تكتب هكذا).
set address("Smith","Daniel")="dpbsmith@world.std.com"
كذلك، وظيفة القطعة: تقسم هذه الوظيفة المتغيرات إلى قطع متفرقة تستدل بسلسلة المشغل المحددة للمستعمل (وتسمى أحيانا «محدد»). وسيجد الذين يعرفون awk أن ذلك أمرا معتادا لديهم. وتعني $PIECE(STRINGVAR,"^",3) أن «قطعة ثالثة من STRINGVAR». ويمكن أن تظهر وظيفة القطعة كذلك بوصفها هدف واجب (أمر SET). بعد
وعلى صعيد آخر، عدم التوجيه: في الكثير من السياقات يمكن استخدام @VBL كما يمكن التخصيص بفاعلية لمحتويات VBL في بيان ممبس آخر. وتضع SET XYZ="ABC" SET @XYZ=123 المتغير ABC لـ 123. ويؤدي SET SUBROU="REPORT" DO @SUBROU النظام الفرعي المعروف باسم REPORT. ويسمح مثل هذا الاستبدال بالتقييم البطئ والإلزام المتأخر وكذلك فاعلية المكافئ التشغيلي «للمؤشرات» في اللغات الأخرى.
من جهة ثانية، المصفوفات المحلية: إن الأسماء المتغيرة لا تبدأ بقبعة (مثل "^") يتم تخزينها في الذاكرة من خلال العملية، هي أسماء خاصة بعملية التكوين، وتنتهي صلاحيتها عندما تنتهي عملية التكوين. إن التخزين المتاح يعتمد على التطبيق. ومن أجل هذه التطبيقات باستخدام الأقسام، فإنها تكون محدودة بحجم القسم، (القسم الصغير A يمكن أن تكون سعته 32 ك). وبالنسبة للتطبيقات الأخرى فإنها يمكن أن تكون الكثير من الميجابايت
Use "cpus" Read streams Use $PRINCIPAL
علاوةً على ذلك، . Set k=$Piece(input," ",3) ; k - third number on input line is number of parallel streams
في هذا الإطار، Set streams=2*streams ; At least two execution streams per CPU
Close "cpus"
.
- ; 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
- .
إضافةً إلى ذلك، ; one problem to solve. Since the program is designed to resume after a crash and reuse partial
ومن جهة أخرى، ; At the top level, the program reads and processes input lines, one at a time. Each line specifies
كذلك، . 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(k,",",0)
في هذا الإطار، . Write $FNumber(i,",",0)," ",$FNumber(j,",",0) ; print starting and ending integers, formatting with commas
كذلك، . If streams>k Do ; print number of execution streams, optionally corrected
في هذا الإطار، ; 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
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
اختيار الفترة
من جهة ثانية، في ممبس فإن التاريخ والوقت الحاليين محتويين في متغير نظام خاص، $H(اختصارا لـ ‘HOROLOG’). ويكون التنسيق زوجا من المكملات مفصول بينهما بواسطة فاصلة، مثال. "54321,12345" والرقم الأول هو رقم الأيام منذ 31 ديسمبر 1840، مثل رقم اليوم 1 وهو 1 يناير 1841؛ ويشير الرقم الثاني للثواني منذ منتصف الليل.
من جهة ثانية، وقد كتب جيمس م. بوتراس أنه قد اختار هذه الفترة لطرق التاريخ ولاوقت في المجموعة التي طورها من قبل مجموعته في MGH في سنة 1969:
من جهة ثانية، (وهناك نسخ أكثر روعة تم نشرها في الفولكلور، وتشير، مثلًا، إلى أن 31 ديسمبر 1840 كان هو التاريخ الدقيق لأول إدخال لسجلات MGH، لكن يبدو أن ذلك محض مزاعم. وهناك زعم آخر بأن التاريخ قد تم اختياره للاحتفاء بذكرى أول استخدام للأثير كمخدر كظاهرة جماهيرية.
I %DT'["T",%DT'["R" G 0
- 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 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 %
THEN IF IF,SET&KILL SET SET=SET+KILL QUIT
في هذا الإطار، ويمكن جعل ممبس أكثر غموضا باستخدام بنية المشغل المتعاقد، كما يتضح في هذا المثال المشتق من المثال السابق:
I Y="" S %H=$H G RT
وفي هذا الصدد، 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
وعلى صعيد آخر، RT D TT S %=$P(%H,",",2) D S S %=X_% I %DT'["S" S %=+$E(%,1,12)
S X=$E(X,%+1,99)
D DMW G 1^%DT:'% S @("%H=$H"_Y_%),%H=%H_","_$P($H,",",2)
ملخص للميزات الرئيسية للغة
ومن ناحية أخرى، أنواع البيانات: هناك نوع بيانات عالمي واحد، وهو ملزم بأن يكون قاعدة بيانات من النوع المسلسل أوالمتكامل أو ذو الفاصلة العائمة وفقما يحتاج السياق إليه.
من جهة ثانية، المنطقيات (وتسمى القيم الموثوق فيها في ممبس): في أوامر IF والبنيات الأخرى التي بها تعبيرات مقيمة كشروط، فإن أي قيمة مسلسلة يتم تقييمها باعتبارها قيمة عددية، وإذا لم تكون ذات قيمة صفرية فإنها تفسر عندئذ على أنها حقيقة a<b yields 1 إذا كانت أقل من b، أو صفر.
ومن جهة أخرى، إعلانات: لا يوجد أحد. جميع المتغيرات يتم عملها بديناميكية في المرة الأولى من القيمة المحددة.
وفي السياق ذاته، الكلمات المحجوزة: لا توجد. لأن ممبس تفسر الشيفرة المصدرية من خلال السياق، فإنه ليست هناك حاجة لكلمات محجوزة. ويمكنك استخدام أسماء أوامر اللغات كمتغيرات. وليس هناك مسابقة مثل مسابقة كود سي الدولية the International Obfuscated C Code Contestلممبس، بالرغم من إمكانية الأمثلة كما يلي، وهي قانونية تماما ومتعلقة بشفرة ممبس:
في هذا الإطار، ما بعد الاشتراطات: إن تنفيذ أغلب جميع الأوامر يمكن التحكم فيه بمتابعته بنقطتين وتعبيرا بالقيمة الموثوق فيها: وتضع SET:N<10 A="FOO" الرمز A لـ "FOO" إذا كانت N أقل من 10؛ وتؤدي DO:N>100 PRINTERR وظيفة PRINTERR إذا كانت N أكبر من 100. ويقدم هذا البناء حالة اشتراطية يكون نطاقها أقل من الخط الكامل.
من جانب آخر، يعمل الملخص التالي على جعل المبرمجين المعتادين على اللغات الأخرى يشعرون بماهية ممبس. وهي ليست خاصية لغوية رسمية، وقد تم محو الكثير من المميزات والمؤهلات من أجل الإيجاز. وتقدم ANSI X11.1-1995 وصفا كاملا ورسميا للغة؛ وهناك نسخة مشروحة من هذه المعايرة متاحة على الإنترنت.
كذلك، حساسية الحال: إن الوامر والوظائف الجوهرية تتسم بكونها غير ذات حساسية الحالة. وعلى العكس من ذلك فإن الأسماء والتصانيف المتغيرة تكون ذات حساسية حال. وليس هناك معنى خاص للحالة العليا مقارنة بالدنيا وهناك عدد قليل من الاتفاقات المتبعة. إن علامة النسبة (%) تعتبر قانونية باعتبارها الحرف الأول للمتغيرات والتصانيف.
من جهة ثانية، الاختصار: يمكنك اختصار جميع الأوامر على وجه التقريب والوظائف الأصيلة إلى حرف واحد أو اثنين أو ثلاثة.
وفي السياق ذاته، الخطوط: وهي كيانات بنيوية هامة، ولا تشبه وضعها في اللغات في C أو باسكال. ويسمح بالعديد من البيانات لكل خط وهو أمر شائع. إن نطاق أي IF، و ELSE، وأمر FOR هو "مذكر الخط الحالي".
IF IF=THEN DO THEN
QUIT:$QUIT QUIT QUIT ; (quit)
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
; call from your program with
- ; S A="String"
- ; S A=$$ROT^ROT13(.A)
- ;
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
;
ومن جهة أخرى، 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
لمزيد من القراءة
وعلى صعيد آخر، Kirsten, Wolfgang, et al. (2003) Object-Oriented Application Development Using the Caché Postrelational Database ISBN 3-540-00960-4
كذلك، 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.; A language for implementing information retrieval software, Online Review, Vol 16, No 3, pp 127–137 (1992).
كذلك، O'Kane, K.C., The Mumps Programming Language, Createspace, ISBN 1-4382-4338-3, 120 pages (2010).
من جهة ثانية، Walters, Richard (1989). "ABCs of MUMPS. 1989: Butterworth-Heinemann, ISBN 1-55558-017-3.
وفي هذا الصدد، 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)
وعلى صعيد آخر، Lewkowicz, John. The Complete MUMPS : An Introduction and Reference Manual for the MUMPS Programming Language. ISBN 0-13-162125-4
من جانب آخر، 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).
من جانب آخر، Walters, Richard (1997). M Programming: A Comprehensive Guide. Digital Press. ISBN 1-55558-167-6.
. For s=1:1:k Do
.. Job @cmd ; Job child process for next block of numbers
ومن ناحية أخرى، .. 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
علاوةً على ذلك، .. Set c=$Increment(^count) ; Atomic increment of counter in database for process synchronization
. Lock -l1 ; Release lock so processes can run
إضافةً إلى ذلك، .. 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
ومن جهة أخرى، . For Quit:'^count Hang 0.1 ; Wait for processes to start (^count goes to 0 when they do)
COMMA ;
F %=%:-3 Q:$E(X,%)="" S X=$E(X,1,%)_","_$E(X,%+1,99)
علاوةً على ذلك، 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)
في هذا الإطار، S:$D(X2) X=$E("$",X2["$")_X S X=$J($E("(",%D)_X_$E(")",%D+1),%L) K %,%D,%L
. ; Calculate duration
علاوةً على ذلك، . Write " ",$FNumber(^highest,",",0) ; Show the highest number reached during the computation
من جهة ثانية، . Set duration=(86400*($Piece(endat,",",1)-$Piece(startat,",",1)))+$Piece(endat,",",2)-$Piece(startat,",",2)
- . 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 " ",$FNumber(^result,",",0) ; Show largest number of steps for the range i through j
ومن ناحية أخرى، . 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
. Set startat=$HOROLOG ; Get starting time
.
كذلك، . set endat=$HOROLOG ; Get ending time - time between startat and endat is the elapsed time
وعلى صعيد آخر، . ; When parent gets lock l2, child processes have completed and parent gathers and reports results.
. Lock +l2 ; Wait for processes to finish
نظرة عامة
من جهة ثانية، وعلى العكس من اللغات في سي أو تقاليد ويرث Wirth، فإن بعض الحروف الفارغة بين بيانات ممبس تعتبر مميزة. إن فراغ واحد يفصل الأمر عن المعطيات الخاصة به، وفراغ أو خط جديد ويفصل كل معطيات عن الممبس المأخوذة التالية. إن الأوامر التي لا تأخذمعطيات (مثل ELSE) تتطلب فراغين متاليين. إن المفهوم هو أن فراغ واحد يفصل الأمر عن المعطي (غير الموجود)، ويفصل التالي «المعطى» عن الأمر التالي. كما أن السطور الجديدة هامة كذلك؛ فإن أوامر (أو قفزات) IF أو ELSE أو FOR تعالج كل شيء آخر حتى نهاية السطر. ومن أجل جعل هذه البيانات تتحكم في السطور المتعددة فإنه عليك استخدام الأمر DO لتكوين كتلة شفرة.
كذلك، إن جميع الحروف المتغيرة التي لا تكون مسبوقة بحرف بقبعة ("^") تكون مؤقتة وخاصة. ومثل المتغيرات العالمية فإنها كذلك تكون لديها نموذج تخزين تراتبي، لكنها لا تكون «متاحة إلا محلية» فقط لوظيفة مفردة، لذلك فغنها تسمى «محليات» Locals. وكل من جلوبالز ولوكالز يمكن أن تكون لديهم عقدات صغيرة (تسمى منخفضات subscripts في مفردات ممبس). ولا تكون المنخفضات محدودة بالأرقام – أي حرف ASCII أو مجموعة من الحروف يمكن أن تكون محددا منخفضا. وبينما ذلك لا يكون شائعا للغات الحديثة مثل بيرل أو جافاسكربت، فإن هناك ميزة غير معتادة للغاية في أواخر السبعينيات. إن هذه القدرة لم تطبق على مستوى العالم في نظم ممبس قبل عام معايرة أنسي في عام 1984.) وهكذا فإن المتغير المسمى «كار» Car يمكن أن يكون لديه منخفضات مثل «باب»، «محرك» ويمكن أن تحتوي كل منهم على قيمة لديها مخفضات خاصة بها. إن المتغير ^Car("Door") يمكن أن يضع منخفضا متغيرا «للون» مثلًا. وهكذا فإنه يمكنك أن تقول
علاوةً على ذلك، إن تفاعل قاعدة البيانات مبنية بشفافية في لغة. وتقدم لغة ممبس قاعدة بيانات تراتبية مصنوعة من مصفوفات مستمرة، وتكون «مفتوحة» لكل تطبيق لممبس. إن كل الأسماء المتغيرة التي تسبق بحرف ذو قبعة ("^")تستعمل تخزينا دائما (بدلا من الرامات)، وسوف تبقي قيمها بعد تواجد التطبيق وسوف تكون مرئية لتطبيقات العاملة الأخرى. إن المتغيرات باستخدام هذا التخزين المشارك والدائم تسمي جلوبالز في ممبس بسبب أن تأطير هذه المتغيرات «متاح عالميا» لجميع الوظائف على النظام. إن الاستخدام الأكثر حداثة وشيوعا لاسم «المتغيرات العالمية» في اللغات الأخرى أكثر تحديدا في تأطير الأسماء، وتأتي من حقيقة أن المتغيرات غير المؤطرة متاحة «عالميا» لأي برامج تشغيل في نفس العملية، لكنها ليست متشاركة بين عمليات متعددة. إن وضع تخزين ممبس (مثلًا فإن جلوبالز خزنت في مصفوفات دائمة)، وتطرح قاعدة ممبس سمات قاعدة البيانات القائمة على النصوص.
في هذا الإطار، ونظرا لأن الذاكرة كانت محدودة بالأصل، فإن تصميم اللغة لممبس يقيم بكود مقتضب للغاية. وهكذا فإن كل أمر أو اسم وظيفة لممبس يمكن أن تختصر من حرف إلى ثلاثة أحرف في الطول مثلًا. إغلاق (برنامج الخروج) مثل وظيفة Q $P== $Piece، وأمر R = Read، ووظيفة $TR == $Translate. إن الفراغات وعلامات نهاية السطور أمر كبير في ممبس لأن نطاق السطر يدعم نفس تصميم اللغة المقتضبة. ومن ثم فإن سطر إدخال كود البرنامج يمكن أن يعبر عن نفس الفكرة بعدد صغير من الحروف التي يمكن للغات البرمجية الأخرى أن تأخذ من 5 إلى 10 أضعاف من الحروف للتعبير عنها. إن الاختصار كان ميزة شائعة في اللغات المصممة في تلك الفترة (مثلًا FOCAL-69، ولغات البيسك المبكرة مثل Tiny BASIC، الخ). وهناك لسوء الحظ أثر جانبي لهذه الازدواجية مع الحاجة المبكرة لكتابة كود في أقل سعة ممكنة وهو أن مبرمجي ممبس لا يقومون بالتعليق على الكود واستعملوا اختصارات موسعة، مما يعني أنه حتى خبير ممبس المبرمج لا يمكنه مجرد طوي صفحة الكود لرؤية وظيفته لكن عليه تحليله سطر وراء سطر.
وفي هذا الصدد، إضافة إلى ذلك فإنه هناك مشغلون مدمجون يتعاملون مع سلسلة غير محدودة (مثلًا قيم الفاصلة المفصولة) كمصفوفة. وسيقوم مبرمجو ممبس الأوائل بتخزين بنية المعلومات المرتبطة باعتبارها سلسلة غير محدودة، وتحليلها بعد قراءتها؛ ويلج القرص الحفوظ هذا على الوقت ويقدم ميزات سرعة كبيرة على بعض المعدات.
SET ^Car("Door","Color")="BLUE"
كذلك، إن ممبس هي لغة عمدت إلى وصممت من أجل بناء تطبيقات قاعدة بيانات. وتضمنت مميزات اللغة الثانوية من أجل المساعدة المبرمجين في صنع التطبيقات باستخدام الموارد الحوسبية الدنيا. وكانت التطبيقات الأصلية مفسرة، بالرغم من أن التطبيقات الحديثة يمكن أن تكون مكتملة أو جزئية التنفيذ. إن «البرامج» المفردة تشغل في «تقسيمات» الذاكرة. وكانت تقسيمات الذاكرة المبكرة لممبس محدودة بقيمة 2048 بايت وكانت مختصرة للغاية ومساعدة للبرمجة المتعددة على المعدات المحدودة الموارد بشدة، ونظرا لأن أكثر من وظيفة لممبس يمكنها أن تناسب الذاكرات الصغيرة للغاية الموجودة في المعدات في ذلك الوقت. إن القدرة على تقديم نظم متعددة المستعملين كانت تصميم لغوية آخر. إن البرمجة المتعددة في اختصار اسم اللغة. وحتى الآلات المبكرة التي كانت تشغل ممبس الداعمة لوظائف متعددة وتعمل في ذات الوقت. ومع التغيير من الكمبيوترات الصغيرة إلى الكمبيوترات الدقيقة لاحقًا بسنوات، فإنه حتى «المستعمل المفرد لجهاز الكمبيوتر»، الذي لديه جهاز 8-بيت 8-bit بذاكرة 64 ك أو 64ك للذاكرة يمكنه أن يدعم المستعملين المتعددين، وتشغيل الطرفيات الخرساء في وضع خط الأوامر (وبدون أي أثر لواجهة المستعمل الرسومية).
نموذج «مرحبا أيها العالم»
وهناك نموذج مرحبا أيها العالم البسيط في ممبس ويمكن أن يكون
كذلك، ومن أجل تعديل العقدة الصغيرة المتوطنة لـ ^Car. وفي مصطلحات ممبس فإن «اللون» في المنخفض الثاني للمتغير ^Car (وكلاهما اسمين للعقد الصغيرة وتسمى العقد الصغيرة نفسها بالمسجلات). إن المتغيرات التراتبية مشابهة للكائنات التي بها خصائص في اللغات العديدة القائمة على الكائن. إضافة إلى ذلك فإن تصميم لغة ممبس يتطلب أن جميع المسجلات للمتغيرات تحفظ تلقائيا في نظام تخزين. إن المسجلات الرقمية (بما فيها أرقام النقط العائمة) تكون مخزنة من أدناها إلى أعلاها. وتكون جميع المسجلات غير الرقمية مخزنة بترتيب أبجدي يتبع الأرقام. وفي مصطلحات ممبس فإن هذا النظام هو نظام كنسي (تراتبي). ومن خلال استخدام المسجلات المكملة غير السلبية فحسب فإنه يمكن لمبرمج ممبس أن يحاكي نوع بيانات المصفوفات من اللغات الأخرى. وبالرغم من أن ممبس لا تقدم بالأساس مجموعة تامة من مميزات DBMS مثل المخططات الإلزامية، وكانت الكثير من نظم DBMS مبنية على قمتها والتي تزود مطوري التطبيق بملف مسطح ومميزات قاعدة بيانات علائقية وشبكية.
وفي السياق ذاته، إن المميزات الأخرى للغة أنها عمدت إلى مساعدة تطبيقات ممبس في التفاعل مع بعضها البعض في بيئة متعددة المستعملين. إن أقفال قواعد البيانات، ومحددات العملية، وعمليات تححديث قاعدة البيانات تتطلب جميعا معايرة تطبيقات ممبس.
من جانب آخر، وليس لممبس أنواع من البيانات. ويمكن معاملة الأرقام على أنها مسلاست من الأرقام، أو سلسلة يمكن التعامل معها على أنها أرقام من خلال المشغلون الرقميون (القسريون بلغة ممبس). وبأي حال فإنه يمكن أن يكون للقسر بعض الآثار الجانبية الضارة. مثلًا فإنه عندما تكون سلسلة ما قسرية، فإن المحلل يتحول بدرجة كبيرة لعمل سلسلة (بادئا من اليسار) في رقم بقدر الإمكان، ثم التخلص من الباقي. وهكذا فإن البيان IF 20<"30 DUCKS يتم تقيمه على أنه حقيقي وفق ممبس.
hello w "Hello, World!",! q
وفي السياق ذاته، إن',!'بعد النص تولد خطا جديدا. إن 'quit' ليست حاسمة بالضرورة في نهاية وظيفة مثل هذه، لكنها جيدة في ممارسة البرمجة في حالة أن الوظائف الأخرى تضاف أسفل 'hello' فيما بعد.
.. Set blk=tmp
- .. Write "->",$FNumber(blk,",",0),")"
- .
- . ; Define blocks of integers for child processes to work on
- . Kill ^limits
- . Set tmp=i-1
; K.S. Bhaskar 2010612
ومن جهة أخرى، ; Get number of CPUs from /proc/cpuinfo and calculate minimum number of execution streams
وعلى صعيد آخر، ; No claim of copyright is made with respect to this program.
; do not conflict with names in the caller.
ومن ناحية أخرى، ; Variables do not have to be declared before use, but are New'd in subprograms to ensure that they
من جانب آخر، ; The program reads the program source at the label digits to get strings (separated by ;) for each language used.
ومن ناحية أخرى، Do digitsinit ; Initialize data for conversion between integers and strings
digits ;zero;eins;deux;tres;quattro;пять;ستة;सात;捌;ஒன்பது
;
strtoint(s) ; Convert a string to an integer
المستخدمون الحاليون لتطبيقات ممبس
في هذا الإطار، وفي عام 2005 فإن غالبية استخدام M كان إما في شكل GT.M أو InterSystems Caché. وكان النوع الأخير قد سوق على نطاق كبير من قبل إنترسيستمز وكان قد حقق نجاحا في التوغل في أسواق جديدة، مثل الاتصالات، إضافة إلى الأسواق القائمة.
من جهة ثانية، كما استعملت ممبس على نطاق واسع في التطبيقات المالية. وقد حققت ممبس سبقا مبكرا في القطاع المالي، وكانت تطبيقات ممبس محل استخدام في الكثير من البنوك والاتحادات الائتمانية. كما كانت تستعمل من قبل أميريتريد، أكبر مقدم لخدمة التجارة عبر الإنترنت في الولايات المتحدة مع أكثر من 12 مليار عملية في اليوم، وكذلك من قبل بنك أوف إنجلاند وباركليز بنك من بين آخرين.
علاوةً على ذلك، وتستعمل الشركات الكبيرة في الوقت الحالي ممبس بما فيها أميريباث AmeriPath (وهي الآن جزء من كويست للتشخيصات)، وكير سنتريك، وإيبك سيستم كوربوريشن، وEMIS، وشركاء الرعاية الصحية، وميديتك، وج إي للرعاية الصحية (سابقا نظم IDXو سنتريسيتي). وهناك الكثير من المعامل المرجعية، مثل كويست للتشخيصات ودايناكير، تستعمل برمجيات ممبس المكتوبة أو القائمة على كود أنتريم كوربوريشن. وكان قم تم الاستحواذ على أنتريم، وشركتها الأم صنكويست، من قبل ميسيس في عام 2001.
إضافةً إلى ذلك، كانت وزارة شئون المحاربون القدماء بالولايات المتحدة (سابقا إدارة المحاربون القدماء) من أوائل من تبنوا لغة ممبس. وكان عملهم التنموي (وإسهاماتهم المتوالية في قاعدة تشفير تطبيق ممبس المجانية) ذو تأثير على الكثير من المستعملين الطبيين في أنحاء العالم. وفي سنة 1995 مان قد تم تطبيق نظام مرضي شئون المحاربين القدماء في الدخول والتتبع والصرف، من خلال برنامج الكمبيوتر الصحي غير المركزي Decentralized Hospital Computer Program قد تلقى جائزة سميثونيان العالمية لأفضل استخدام لتكنولوجيا المعلومات في مجال الطب. وبعد قرابة العقد (في يوليو 2006) تلقت وزارة شئون المحاربون القدماء (من خلال إدارة صحة المحاربون القدماء) جائزة الحكومة الأمريكية للابتكارات والتي قدمها معهد أش بمدرسة ج. ف. كينيدي الحكومية في جامعة هارفارد بسبب توفيرها لبرنامج الكمبيوتر الصحي في نظم معلومات صحة المحاربين القدماء وبينتها التكنولوجية VistA في يوليو 2006. وتقريبا فإن جميع نظم صحة المحاربين القدماء في الولايات المتحدة وفي الخدمة الصحية الهندية، وكذلك أجزاء رئيسية من وزارة الدفاع، فإن جميع هذه النظم تتم بتشغيل قواعد بيانات تتبع البيانات العيادية.
في هذا الإطار، وقد أعلنت وكالة الفضاء الأوروبية في 13 مايو 2010 أنها سوف تستعمل ممبس (InterSystems Caché) من أجل دعم بعثة جايا Gaia mission. وكانت هذه البعثة تهدف إلى وضع خريطة لدرب اللبانة بدقة غير مسبوقة.
من جانب آخر، كما ورد أن Coventry Healthcare ومستشفى ماساشستس يستعملان ممبس.
برامج عينات
في هذا الإطار، إن التنفيذ المباشر للشيفرة المصدرية على منصات الحوسبة التاريخية في عهد الأقراص الدقيقة، والرامات صغيرة ووصلات 300 بود التسلسلية قد أدت إلى أسلوب تشفير تاريخي كان مكثفا ومصاحبا للخبراء، حتى أن أساليب التشفير المعاصرة لممبس تنتج في الوقت الحالي تشفيرا أكثر قابلية للقراءة.
وعلى صعيد آخر، أولا، كمثال لشيفرة M من عام 2010، فإن حلا لتدريب قياسي قائم على حساب المتوالية الأطول المتحققة عند حساب المتوالية الأطول حدس كولاتز لمجموعة من المكملين. وهذا المثال مكتوب بلغة GT.M ويستغل ويجسد الكثير من مميزات ممبس
Q R
إضافةً إلى ذلك، أخيرا فإن أحد أقصر البرامج التي كتبت من قبل بلغة رفيعة المستوى، مظهرا الإيجاز المطلق الذي تكون ممبس قادرة عليه
كذلك، A second implementation is below, which illustrates the possibilities of concision in MUMPS.
إضافةً إلى ذلك، 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))
التاريخ
من جانب آخر، وخلال أوائل الثمانينيات قدم الكثير من المصنعين للبرامج عددا من المنصات القائمة على ممبس والتي تلبي معايرة أنسي ANSI للسوق. وكان الأكثر أهمية هي مؤسسة المعدات الرقمية Digital Equipment Corporation التي قدمت المعايرة الرقمية لممبس DSM، وإنترسيستم InterSystem التي قدمت انترسيستم إم على VMS ويونكسUNIX، و M/11+ على منصة PDP-11. وطورت الشركات الأخرى الكثير من تطبيقات ممبس الهامة الأخرى:
ومن ناحية أخرى، كما كان كل من نيل بابالاردو وأوكتو بارنيت مشاركين في التخطيط لمستشفى ماساشستس العام من خلال وضع نظام الملعومات بالمستشفى، وحصلا على PDP-9 المتوافق بأثر رجعي، وبدءا في استخدام ممبس في دورة admissions وتقرير الاختبارات المعملية. وكان ممبس حينذاك لغة مفسرة، ولم يكن حتى عند ذلك الوقت متضمنا نظام ملفات قاعدة بيانات تراتبية من أجل معايرة التفاعل مع البيانات. ويمكن تتبع بعض أوجه ممبس من جوس JOSS التابع لراند كوربوريشن من خلال BBN، وتيلكومب TELCOMP وسترينجكومب STRINGCOMP. وقد اختار فريق ممبس مضطرا أن يتضمن قدرة على الانتقال بين الآلات كهدف تصميمي. وهناك خاصية أخرى، لم تكن داعمة على نطاق واسع لآلات هذه المرحلة، في نظم التشغيل أو في المعدات، وأنها كانت متعددة المهام، وكانت كذلك مبنية في اللغة نفسها.
ومن ناحية أخرى، شركة داتا تري التي قدمت منتجا قائما على أجهزة إنتل وعرف باسم DTM.
في هذا الإطار، وأحد المصنعين الأصليين للغة ممبس هو نيل بابالاردو الذي أسس في البداية شركة سماها ميديتك. وقاموا بالتوسع والبناء على لغة ممبس، وسموا اللغة الجديدة باسم MIIS (ولاحقا سميت لغة أخرى ماجيك MAGIC). وعلى غير ما هو عليه حال إنترسيستمز، فإن ميديتك لم تعد تبيع المعدات الوسيطة، لذلك فإن MIIS و MAGIC لا تستعملان إلا على مستوى داخلي في ميديتك.
مؤسسة جرايستون تكنولوجي مع النسخة المنجزة المسماة GT.M.
وفي السياق ذاته، كومب للاستشارات (اعيد تسميتها لاحقا باسم إم جلوبال)، وهي شركة مقرها هيوستن والتي أنتجت أصلا CCSM على معالجات 6800 ثم 6809، والتي أصبحت فيما بعد ماكممبس، وهو منتج قائم على نظام تشغيل ماك Mac OS. كما عملوا كذلك على تطبيق MGM MUMPS. كما وصل إم جلوبال تطبيقه على منصة دوس حيث يتم تشغيلها كنظام تشغيل ضيف بدءا من الدوس.
كذلك، وكان تطبيق GT.M التابع لجراستون تكنولوجي كوربوريشن قد تم بيعه إلى سانشيز كومبيوتر أسوشيتس إنك (وهي الآن جزء من فيداليتي ناشيونال فاينانشيال إنك) في منتصف التسعينيات. وفي السابع من نوفمبر 2000 صنعت سانشيز GT.M للينوكس وجعلته متاحا بترخيص من GPL وفي 28 أكتوبر 2005 صعنت GT.M من أجل OpenVMS و Tru64 UNIX وكانت كذلك متاحة بترخيص AGPL. وتواصل GT.M كونها متاحة لمنصات يونكس الأخرى بحسب الترخيص التقليدي.
كذلك، وبحلول عام 2000، أصبح مقدم المعدات الوسيطة إنترسيستمز InterSystems اللاعب المهيمن في سوق ممبس من خلال شراءها للعديد من الفاعلين في الصناعة. ومبدئيا فإنها استحوذت على داتاتري إنك في أوائل التسعينيات. وفي 30 ديسمبر 1995 استحوذت إنترسيستمز على خط إنتاج DSM من DEC. وقد دمجت إنترسيستمز هذه المنتجات في خط إنتاج واحد، وحملت علامات اسماءهم التجارية وفي الكثير من منصات المعدات بلفظ OpenM. وفي سنة 1997 فإن إنتر سيستمز أكملت بصورة كبيرة هذا الدمج من خلال توحيد وريثها الذي حمل اسم كاشيه Cache. وكان ذلك قائما على منتجهم الخاص بمدير نظم المعلومات ISM، لكن بتأثيرات من التطبيقات الأخرى. كما تم الاستحواذ على أصول مؤسسة مايكرونيتكس ديزين من قبل إنتر سيستمز في 21 يونيو 1998. ولا تزال إنترسيستمز اليوم (2007) هي المهيمن على منتجات ممبس، وكان بيع كاشيه لمطوري ممبس الذي يكتب تطبيقات لمجموعة من نظم التشغيل.
من جهة ثانية، كما شهدت هذه الفترة نشاطا كبيرا لـ 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.
في هذا الإطار، وكان التطبيق الأحدث لممبس، والذي صدر في أبريل 2002، مشتقا من MSM يسمى M21 من شركة رجبي ريل للبرمجيات بالمملكة المتحدة.
في هذا الإطار، وكانت إم جلوبال هي أو ممبس تجارية لأجهزة آي بي إم وتطبيق ماك الوحيد. وقد سبق DSM-11 إصدار VAX/DSM لمنصة VAX/VM، وكانت موصلة بألفا في نوعيها: DSM لـ OpenVMS و DSM لـ Ultrix.
وفي السياق ذاته، طورت ممبس على يد نيل بابالاردو N. Pappalardo ورفاقه في معمل حيوانات د. أوكتو بارنيت في مستشفى ماساتشوستس العام في بوسطن خلال عامي 1966-1967. وكان نظام ممبس الأصلي مبنيا على قطع DEC PDP-7، مثلما كان عليه حال يونكسUnix بعد سنوات قليلة.
من جانب آخر، وبحلول أوائل السبعينيات كانت هناك العديد والأنواع المختلفة من تطبيقات ممبس على مجموعة من منصات المعدات. وكان أكثرها انتشارا ممبس -11 على PDP-11، وMIIS التابع لـ ميديتك. وفي سنة 1972 شارك الكثير من المستعملي ممبس في مؤتمر كان يقوم بمعايرة اللغة الهشة حينذاك، وكونوا مجموعة مستعملي ممبس ولجنة تطوير ممبس (MDC) من أجل القيام بذلك. وقد أثبتت هذه المجهودات نجاحها؛ وقد اكتملت المعايرة في سنة 1974، وتم التصديق عليها، في 15 سبتمبر 1977 مثل معايرة ANSI، و X11.1-1977. وفي نفس الوقت على وجه التقريب دشنت DEC ما عرف باسم DSM-11 (أي معايرة ممبس الرقمية Digital Standard MUMPS) من أجل PDP-11. وسرعان ما سيطر ذلك على السوق وأصبح التطبيق المرجعي لتلك الفترة.
علاوةً على ذلك، وكانت القدرة على التنقل مفيدة في أقرب وقت، لأن ممبس سرعان ما أن تم تكييفها للتوافق مع DEC PDP-15، حيث استمرت لفترة من الزمن. وقد تم تطويرممبس بدعممن منحة بحثية حكومية، وهكذا تم إصدار ممبس أما ناق عام (ولم تعد هناك حاجة لمزيد من المنح)، وسرعان ما وصلت بعدد من النظم الأخرى بما فيها النظم الشهيرة DEC PDP-8، ونوفا العامة للبيانات the Data General Nova، و the DEC PDP-11، والكمبيوترات الدقيقة PC12 طراز أترونيكس.وقد انتشرت كلمة ممبس بقوة في المجتمع الطبي وبحلول أوائل السبعينيات كان مستعملا على نطاق واسع، وكان غالبا ما يتم تعديله محليا للتوفيق بينه وبين احتياجاتهم الخاصة.
من جهة ثانية، وهناك كذلك الكثير من تطبيقات المصادر المفتوحة لممبس بما فيها بعض المشروعات البحثية. ومن أبرز هذه التطبيقات والمشروعات هو Mumps/II من قبل البروفيسور كيفن أوكين (يعمل الآن بجامعة نورثرن إيوا) ومشروع للطلبة. كما وصل كل من د. أوكين وريان ميرفي إلى توصيل المترجم لنظام تشغيل ماك.
من جانب آخر، مؤسسة مايكرونيتكس ديزين والتي قدمت خطا للإنتاج يحمل اسم MSM لمنصتي يونيكس وأجهزة انتل (ووصل لاحقا بنظام تشغيل VM التابع لآي بي إم).
Set X="Xecute X" Xecute X
من جهة ثانية، ويقوم هذا البرنامج بوضع قيمة "xx" للاسم المتغير x، ثم يبدأ تنفيذا مطلقا لـ x يمكن أن يسفر عن تدفق مفرط في التكويم. وعند مجرد 13 حرف، بما فيها الفراغات وعلامة نهاية السطر (لأن معايرة ممبس تحدد السعة التخزينية بالحروف وليس بالبايت)، باستخدام حرفين، يظهر المتغير الأول أنه من الممكن كذلك كتابة تشفير موجز في M.
المراجع
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
TCommit
وفي السياق ذاته، Lock -l1($JOB),-l2($JOB) ; Release locks to tell parent this parent is done
وظيفة الأمر
إضافةً إلى ذلك، وبالنسبة للإدراج المتواصل لبقية أوامر، ومشغلو، ووظائف، والمتغيرات الخاصة لممبس، انظر هذه المصادر على الإنترنت:
ومن ناحية أخرى، Set i="" For Set i=$O(stuff(i)) Quit:i="" Write !,i,10,stuff(i)
Set stuff(6)="xyz",stuff(10)=26,stuff(15)=""
وفي هذا الصدد، The Annotated MUMPS Language Standard، والذي يظهر ثورة اللغة والاختلافات بين نسخ معايرة ANSI.
ومن جهة أخرى، MUMPS by Example، أو الكتاب (الذي نفدت نسخه) بنفس العنوان من تأليف إد دي مويل. وهناك تفصيل للكثير من بنية اللغة في هذا المصدر، مع أمثلة للاستخدام.
وفي السياق ذاته، $Order(stuff("")) yields 6, $Order(stuff(6)) yields 10, $Order(stuff(8)) yields 10, $Order(stuff(10)) yields 15, $Order(stuff(15)) yields "".
إضافةً إلى ذلك، وهنا فإن المعطيات كانت أقل تكرارا حتى توقفها من خلال إنهاء غلق Quit. ويطبع هذا الخط جدول من i وأشياء (i) حيث تكون i هي على التوالي 6، 10، 15.
وعلى صعيد آخر، المستعملون المتعددون/ المهام المتعدد/ المعالجات المتعددة: تدعم ممبس مستعملين وعمليات متعددون في وقت واحد حتى عندما لا يكون نظام التشغيل القائم (E.g. MS-DOS).. إضافة إلى ذلك فإنه هناك القدرة على تخصيص البيئة لمتغير ما، مثل من خلال تخصيص اسم الآلة في المتغير (كما في SET ^|"DENVER"|A(1000)="Foo")، والذي يمكن أن يسمح لك بالولوج إلى البيانات من آلات بعيدة.
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
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
ROT(R) ;
- S S1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- S S2="NOPQRSTUVWXYZABCDEFGHIJKLM"
- S s1="abcdefghijklmnopqrstuvwxyz"
- S s2="nopqrstuvwxyzabcdefghijklm"
- S R=$TR(R,S1_s1,S2_s2)
;
كذلك، ; 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))
Quit
inttostr(n) ; Convert an integer to a string
سجال ممبس ضد تسمية M
- أصبح اسم اللغة M في عام 1993 عندما تبنته مؤسسة إم للتكنولوجيا.
- وقد أصبح الاسم M في 8 ديسمبر 1995 بعد التصديق على ANSI X11.1-1995.
- وكل من M وممبس هما اسمان مقبولان رسميا.
- إن M هي فقط «اسم بديل» أو «كنية» للغة، ولا تزال ممبس هي الاسم الرسمي.
من جهة ثانية، إن المعيار الأكثر حداثة (ISO/IEC 11756:1999، والمعاد توكيده في 25 يونيو 2010) لا يزال يذكر كل من إم وممبس كاسمين مقبولين رسميا.
من جهة ثانية، إن جميع المواضع التالية يمكن أن يتم دعمها من خلال ناس قادرون على التحصيل المعرفي في أوقات مختلفة:
من جانب آخر، بينما لا يحظى هذا العنوان إلا باهتمام محدود خارج مجتمع ممبس/ M، فإن هذا الموضوع متواصل هناك.
من جهة ثانية، وتظهر بعض الخلافات ردا على دعوة M القوية من جانب أحد ذوي المصالح التجارية، وهم إنترسيستمز، والذين لم يحب كبير موظفيهم اسم ممبس وشعروا أنه يمثل عقبة كبيرة أمام التسويق. وهكذا فإن تفضيل M إلى درجة ما أصبح أمرا محددا مع إنترسيستمز. كما عكس النزاع تنافسا بين المنظمات (مؤسسة إم تكنولوجي، ولجنة تنمية ممبس، وأنسي، ولجان معايير أيزو) بخصوص من يحدد الاسم "الرسمي للغة. وقد حاول بعض الكتاب نزع فتيل هذه القضية من خلال الإشارة إلى اللغة باسم M[UMPS]، وكانت الأقواس المربعة شرحا معتادا لعناصر البنية الاختيارية. وهناك سلطة رئيسة، وكان كاتب تطبيق ممبس المصدري المفتوح، وهو البروفيسور كيفن أوكين، لا يستعمل سوى كلمة "ممبس".
s x="x x" x x
ويقوم نفس اللوغاريتم باستخدام متغير موسع وأسماء أوامر
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)
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
quit
في هذا الإطار، ويمكن أن يتم تشغيله من خط أمر ممبس بالأمر 'do ^hello'. ولأن ممبس تسمح للأوامر بان تكون مسلسلة معا على نفس الخط، ولأن الأوامر يمكن اختصارها في خطاب مفرد، ويمكن لهذا النظام أن يصنع بطريقة أكثر تحجيما:
InterSystems M Technologies DSM, MSM and OpenM
علاوةً على ذلك، M/DB An Open Source MUMPS-based API-compatible alternative to SimpleDB
.. TCommit
وفي هذا الصدد، .. Set n="" For Set n=$Order(currpath(n)) Quit:""=n Set:$Increment(updates) ^step($$inttostr(currpath(n)))=$$inttostr(i-n)
hello
write "Hello, World!",!
T I I,S&K S S=S+K Q
إضافةً إلى ذلك، المصفوفات: وتصنع ديناميكيا، وتخزن على أنها بي-تريز، ويتم تحليلها (مثلًا لا يتم في الغالب استخدام فراغ للعقد المفقودة)، ويمكنها استخدام أي رقم من المسجلات، ويمكن أن تكون هذه المسجلات سلاسل أو رقمية (بما فيها النقطة العائمة). وتكون المصفوفات دائما مخزنة آليا في نظام مصنف، لذل لا توجد أية فرصة للتصنيف والتعبئة أو إعادة الطلب أو إعادة تنظيم قاعدة البيانات. إن الوظائف الداخلية مثل $DATA, $ORDER, $NEXT, $QUERY تعتبر وظائف تقدم تناولا كافيا لبنية المصفوفة الأساسية أو القرص أو الذاكرة.
.. Set:tmp>j (tmp,^limits(count))=j
من جهة ثانية، . Set ^count=0 ; Clear ^count - may have residual value if restarting from crash
وعلى صعيد آخر، . ; When counter is zero, all jobs have started. Parent releases lock l1 and tries to grab lock l2.
ومن جهة أخرى، . ; 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).
. Lock +l1 ; Set lock for process synchronization
وفي هذا السياق، . ; When all children have released their l2(pid) locks, they're done and parent can gather & report results.
.
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é
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
IDEA-Technology for Caché and GT.M
من جهة ثانية، MUMPS documentation, topics, and resources (mixed Czech and English)
MiniM Database Server, A MUMPS Implementation
إضافةً إلى ذلك، Development and Operation of a MUMPS Laboratory Information System: A Decade's Experience
Quit
dbinit ; Entryref dbinit clears database between lines
Kill ^count,^highest,^reads,^result,^step,^updates
GREPTHIS
علاوةً على ذلك، NEW SET,NEW,THEN,IF,KILL,QUIT SET IF="KILL",SET="11",KILL="l1",QUIT="RETURN",THEN="KILL"
Quit ; Jobbed processes terminate here
New current,currpath,i,n
إضافةً إلى ذلك، dostep(first,last) ; Calculate the maximum number of steps from first through last
; This is where Jobbed processes start
ومن جهة أخرى، 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
في هذا الإطار، Lock +l2($JOB) ; Get lock l2 that parent will wait on till this Jobbed processes is done
إضافةً إلى ذلك، Set (reads,updates,highest)=0 ; Start with zero reads, writes and highest number
كذلك، Do digitsinit ; Initialize data for conversion between integers and strings
doblk(allfirst)
. For count=1:1 Quit:tmp=j Do
.. Set ^limits(count)=$increment(tmp,blk)
%DTC
%DTC ; SF/XAK - DATE/TIME OPERATIONS ;1/16/92 11:36 AM
;;19.0;VA FileMan;;Jul 14, 1992
Quit
ومن جهة أخرى، digitsinit ; Initialize arrays to convert between strings and integers
S DDH=DDH+1,DDH(DDH,"T")=" "_A1 Q
- وفيما يلي تطبيقا ثانيا والذي يجسد إمكانات الإيجاز في ممبس.
- ST ; ROT13 ; Gunter Rensch ; 2000-01-03 ; Encrypt/Decrypt ROT13
- Q ; no direct execution
- ;
D I 'X1!'X2 S X="" Q
K %H,X1,X2 Q
S X=X1 D H S X1=%H,X=X2,X2=%Y+1 D H S X=X1-%H,%Y=%Y+1&X2
Quit
من جانب آخر، وبسبب الطبيعية المقتضبة لتشفير ممبس المختصر تماما، فإن حجم التشفير المشابه في لغات البرمجة الأخرى التي تقدم نفس الوظيفية يمكن أن تكون أكبر بصورة كبيرة.
كذلك، وفيما يلي، فإن هناك مثال لأسلوب التشفير M «التقليدي»، وهو نظام التشفير المصدري VistA منذ أواخر السبعينيات (آخر تعديل له في 1992)، وقد كتبه في صورته الأصلية جورج تيمسون في الوقت الذي كانت فيه المعايرة اللغوية غير ذات مميزات متطورة مثل التأطير المتغير. ومن المعترف به على وجه العموم أن هذا التشفير ليس قابلا للقراءة بصورة قوية بالنسبة للعديد من مبرمجي اليوم. ومع ذلك فإنه يجب أن نذكر أن هذا التشفير مقبول للخبراء، (مثلًا بالنسبة لمبرمجي VistA المتكيفين معه فإنه يكون مقروئا ومبنيا بشكل مناسب)- إن هذا التشفير مثال للتشفير الذي كان يستعمل بفاعلية لمدة سنوات عديدة. إن هذه الثقافة والأسلوب لتشفير تطبيق طويل الأمد لا يمكن ولا يجب أن تتغير بين ليلة وضحاها، وعندما يستمر التشفير في العمل فإن مثل هذه الثقافات تركز على إضافة وظيفية جديدة بدر من تحديث التشفير ببساطة لأسباب واقعية.
;
من جهة ثانية، ; number of reads & writes performed by all processes, and sets the highest for all processes if the
وفي هذا الصدد، ; The following line unconditionally adds the number of reads & write performed by this process to 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
TStart ; Update global statistics inside a transaction
Q
إضافةً إلى ذلك، I %DT'["X" S A1="You may omit the precise day, as: JAN, 1957" D %
- 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 %
threeen1f
كذلك، ; number of CPUs or cores, the parameter is modified to that value. An optional fourth integer is the
وفي هذا السياق، ; each subscript and value is spelled out using the strings in the program source line labelled "digits".
وفي هذا السياق، ; Although the problem can be solved by using strictly integer subscripts and values, this program is
وفي هذا الصدد، ; sizes of blocks of integers on which spawned child processes operate. If it is not specified, the
ومن ناحية أخرى، ; The third integer is the number of parallel computation streams. If it is less than twice the
; No input error checking is done.
إضافةً إلى ذلك، ; Assumes input format is 3 integers separated by a space with the first integer smaller than the second.
من جانب آخر، ; written to show that the GT.M key-value store can use arbitrary strings for both keys and values -
وفي السياق ذاته، ; block size is approximately the range divided by the number of parallel streams. If the block size is
ومن ناحية أخرى، ; Furthermore, the strings are in a number of international languages when GT.M is run in UTF-8 mode.
إضافةً إلى ذلك، ; Find the maximum number of steps for the 3n+1 problem for all integers through two input integers.
ومن جهة أخرى، ; larger than the range divided by the number of execution streams, it is reduced to that value.
;
- 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
- ;
.. Set k=streams
ومن جهة أخرى، . If blk&(blk'>tmp) Write " ",$FNumber(blk,",",0) ; print block size, optionally corrected
إضافةً إلى ذلك، . Set blk=+$Piece(input," ",4) ; blk - size of blocks of integers is optional fourth piece
- .. Write "->",$FNumber(k,",",0),")"
- . Else Write " ",$FNumber(k,",",0)
- .
. Set tmp=(j-i+k)\k ; default / maximum block size
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟