CALM/arwiki huggingface dataset:
المنطقيات (وتسمى القيم الموثوق فيها في ممبس): في أوامر IF والبنيات الأخرى التي بها تعبيرات مقيمة كشروط، فإن أي قيمة مسلسلة يتم تقييمها باعتبارها قيمة عددية، وإذا لم تكون ذات قيمة صفرية فإنها تفسر عندئذ على أنها حقيقة a100 PRINTERR وظيفة PRINTERR إذا كانت N أكبر من 100. ويقدم هذا البناء حالة اشتراطية يكون نطاقها أقل من الخط الكامل.
الاختصار: يمكنك اختصار جميع الأوامر تقريبا والوظائف الأصيلة إلى حرف واحد أو اثنين أو ثلاثة.
الكلمات المحجوزة: لا توجد. لأن ممبس تفسر الشيفرة المصدرية من خلال السياق، فإنه ليست هناك حاجة لكلمات محجوزة. ويمكنك استخدام أسماء أوامر اللغات كمتغيرات. وليس هناك مسابقة مثل مسابقة كود سي الدولية the International Obfuscated C Code Contestلممبس، بالرغم من إمكانية الأمثلة كما يلي، وهي قانونية تماما ومتعلقة بشفرة ممبس:
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&amp;KILL SET SET=SET+KILL QUIT
ويمكن جعل ممبس أكثر غموضا باستخدام بنية المشغل المتعاقد، كما يتضح في هذا المثال المشتق من المثال السابق:
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&amp;K S S=S+K Q
المصفوفات: وتصنع ديناميكيا، وتخزن على أنها بي-تريز، ويتم تحليلها (على سبيل المثال لا يتم في الغالب استخدام فراغ للعقد المفقودة)، ويمكنها استخدام أي رقم من المسجلات، ويمكن أن تكون هذه المسجلات سلاسل أو رقمية (بما فيها النقطة العائمة). وتكون المصفوفات دائما مخزنة آليا في نظام مصنف، لذل لا توجد أية فرصة للتصنيف والتعبئة أو إعادة الطلب أو إعادة تنظيم قاعدة البيانات. إن الوظائف الداخلية مثل $DATA, $ORDER, $NEXT, $QUERY تعتبر وظائف تقدم تناولا كافيا لبنية المصفوفة الأساسية أو القرص أو الذاكرة.
for i=10000:1:12345 set sqtable(i)=i*i
set address("Smith","Daniel")="dpbsmith@world.std.com"
المصفوفات المحلية: إن الأسماء المتغيرة لا تبدأ بقبعة (مثل "^") يتم تخزينها في الذاكرة من خلال العملية، هي أسماء خاصة بعملية التكوين، وتنتهي صلاحيتها عندما تنتهي عملية التكوين. إن التخزين المتاح يعتمد على التطبيق. ومن أجل هذه التطبيقات باستخدام الأقسام، فإنها تكون محدودة بحجم القسم، (القسم الصغير A يمكن أن تكون سعته 32 ك). وبالنسبة للتطبيقات الأخرى فإنها يمكن أن تكون العديد من الميجابايت
المصفوفات العالمية: ^abc, ^def ويتم تخزينها على القرص، وتكون متاحة لجميع العمليات وتكون مستمرة عندما تنتهي عملية التكوين. إن الجلوبالز الكبيرة للغاية (على سبيل المثال مئات الجيجابايت) تكون عملية وكافية في غالبية التطبيقات. وهذه هي آلية "قاعدة بيانات" الرئيسية. وهي مستخدمة بدلا من استدعاء نظام التشغيل لتكوين الملفات وكتابتها وقراءتها.
عدم التوجيه: في العديد من السياقات يمكن استخدام codice_4 كما يمكن التخصيص بفاعلية لمحتويات VBL في بيان ممبس آخر. وتضع SET XYZ="ABC" SET @XYZ=123 المتغير ABC لـ 123. ويؤدي SET SUBROU="REPORT" DO @SUBROU النظام الفرعي المعروف باسم REPORT. ويسمح مثل هذا الاستبدال بالتقييم البطئ والإلزام المتأخر وكذلك فاعلية المكافئ التشغيلي "للمؤشرات" في اللغات الأخرى.
وظيفة القطعة: تقسم هذه الوظيفة المتغيرات إلى قطع متفرقة تستدل بسلسلة المشغل المحددة للمستخدم (وتسمى أحيانا "محدد"). وسيجد الذين يعرفون awk أن ذلك أمرا معتادا لديهم. وتعني $PIECE(STRINGVAR,"^",3) أن "قطعة ثالثة من STRINGVAR". ويمكن أن تظهر وظيفة القطعة أيضا بوصفها هدف واجب (أمر SET). بعد
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، ويمكن أن تكتب هكذا).
وظيفة الأمر
Set stuff(6)="xyz",stuff(10)=26,stuff(15)=""
$codice_5 yields 6, $codice_6 yields 10, $codice_7 yields 10, $codice_8 yields 15, $codice_9 yields ".
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")، والذي يمكن أن يسمح لك بالولوج إلى البيانات من آلات بعيدة.
وبالنسبة للإدراج المتواصل لبقية أوامر، ومشغلو، ووظائف، والمتغيرات الخاصة لممبس، انظر هذه المصادر على الإنترنت:
سجال ممبس ضد تسمية 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 ويستغل ويجسد العديد من مميزات ممبس
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&gt;k Do ; print number of execution streams, optionally corrected
.. Write " (",$FNumber(k,",",0)
.. Set k=streams
.. Write "-&gt;",$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&amp;(blk'&gt;tmp) Write " ",$FNumber(blk,",",0) ; print block size, optionally corrected
. Else Do
.. Write " (",$FNumber(blk,",",0)
.. Set blk=tmp
.. Write "-&gt;",$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&gt;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 &amp; 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
dbinit ; Entryref dbinit clears database between lines
Kill ^count,^highest,^reads,^result,^step,^updates
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)
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
doblk(allfirst)
Set (reads,updates,highest)=0 ; Start with zero reads, writes and highest number
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 &amp; write performed by this process to the
; number of reads &amp; 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)&amp;$Increment(^updates,updates)&amp;(highest&gt;$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)&amp;($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&gt;highest highest=n ; see if we have a new highest number reached
. Do:0&lt;i ; if 0=i we already have an answer for n, nothing to do here
.. If 1&lt;n Set i=i+$$strtoint(^step($$inttostr(n)))
.. TStart () ; Atomically set maximum
.. Set:i&gt;$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)
وفيما يلي، فإن هناك مثال لأسلوب التشفير M "التقليدي"، وهو نظام التشفير المصدري VistA منذ أواخر السبعينيات (آخر تعديل له في 1992)، وقد كتبه في صورته الأصلية جورج تيمسون في الوقت الذي كانت فيه المعايرة اللغوية غير ذات مميزات متطورة مثل التأطير المتغير. ومن المعترف به على وجه العموم أن هذا التشفير ليس قابلا للقراءة بصورة قوية بالنسبة للعديد من مبرمجي اليوم. ومع ذلك فإنه يجب أن نذكر أن هذا التشفير مقبول للخبراء، (على سبيل المثال بالنسبة لمبرمجي VistA المتكيفين معه فإنه يكون مقروئا ومبنيا بشكل مناسب)- إن هذا التشفير مثال للتشفير الذي كان يستخدم بفاعلية لمدة سنوات عديدة. إن هذه الثقافة والأسلوب لتشفير تطبيق طويل الأمد لا يمكن ولا يجب أن تتغير بين ليلة وضحاها، وعندما يستمر التشفير في العمل فإن مثل هذه الثقافات تركز على إضافة وظيفية جديدة بدر من تحديث التشفير ببساطة لأسباب واقعية.
وبسبب الطبيعية المقتضبة لتشفير ممبس المختصر تماما، فإن حجم التشفير المشابه في لغات البرمجة الأخرى التي تقدم نفس الوظيفية يمكن أن تكون أكبر بصورة كبيرة.
%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&amp;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&lt;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&gt;2&amp;'(%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&gt;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&lt;0 X="" Q
7 S %=%H&gt;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&lt;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("&gt; &lt;",X+2)_"$E(%(9),4,7)") S %I(3)=%I(3)+X
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)
COMMA ;
S %D=X&lt;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
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
وفيما يلي تطبيقا ثانيا والذي يجسد إمكانات الإيجاز في ممبس.
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.
s A="String" F i=1:1:$L(A) W $c($S($A($E(A,i))&lt;91:$A($E(A,i))-52#26+65,1:$A($E(A,i))-84#26+97))
أخيرا فإن أحد أقصر البرامج التي كتبت من قبل بلغة رفيعة المستوى، مظهرا الإيجاز المطلق الذي تكون ممبس قادرة عليه
s x="x x" x x
ويقوم نفس اللوغاريتم باستخدام متغير موسع وأسماء أوامر
Set X="Xecute X" Xecute X
ويقوم هذا البرنامج بوضع قيمة "xx" للاسم المتغير x، ثم يبدأ تنفيذا مطلقا لـ x يمكن أن يسفر عن تدفق مفرط في التكويم. وعند مجرد 13 حرف، بما فيها الفراغات وعلامة نهاية السطر (لأن معايرة ممبس تحدد السعة التخزينية بالحروف وليس بالبايت)، باستخدام حرفين، يظهر المتغير الأول أنه من الممكن أيضا كتابة تشفير موجز في M.
هندسة الأداء التي هي جزء من هندسة أنظمة، تشمل مجموعة من الأدوار، والمهارات، والأنشطة، والممارسات، والأدوات، والتسلميات المُطبقة في كل مرحلة من مراحل دورة حياة تطوير الأنظمة التي تضمن تصميم حل وتنفيذه، ويتم دعمه عمليًا لتلبية متطلبات الأداء الغير وظيفية المحددة من أجل الحل.
وقد يشار إليها كهندسة أداء البرمجيات ضمن هندسة البرمجيات، ولكن حيث أن هندسة الأداء تشمل أكثر من البرمجيات، فمصطلح هندسة الأداء هو الأفضل. وقد أُيد الالتزام بالمتطلبات الغير وظيفية من خلال رصد نظم الإنتاج. وهو جزء من إدارة خدمات تقنية المعلومات (انظر أيضا مكتبة البنية التحتية لتقنية المعلومات).
وقد أصبحت هندسة الأداء نظام منفصل في عدد من الشركات الكبيرة، ويمكن أن تكون مندمجة مع مجموعة المشروع المعماري. ومن المنتشر، أن تجمع أشخاص من وحدات تنظيمية متعددة؛ ولكن في الغالب داخل منظمة تقنية المعلومات.
نهج هندسة الأداء.
ولأن هذا النظام يتم تطبيقه داخل منهجيات متعددة، سوف تحدث الأنشطة التالية خلال مراحل محددة مختلفة. ولكن في حالة استخدام مراحل العملية العقلانية الموحدة (RUP) كإطار، فمن ثم ستحدث الأنشطة على النحو التالي:
الاستهلال.
خلال هذه المرحلة المفاهيمية الأولى من برنامج أو مشروع، يتم تحديد العمليات التجارية الهامة. وعادة ما يتم تصنيفهم على أساس قيمة الإيرادات، أو وفورات التكاليف، أو غيرها من قيم الأعمال المسندة. ويتم هذا التصنيف من قبل وحدة الأعمال، وليس منظمة تقنية المعلومات.
يتم تحديد ووصف المخاطر رفيعة المستوى التي قد تؤثر على أداء النظام في هذا الوقت. قد يكون مثال مخاطر الأداء معروف لنظام بائع معين.
وأخيرا يتم تحديد أداء الأنشطة، والأدوار، والتسلميات لمرحلة الاسترسال. وقد تم دمج الأنشطة وتحميل الموارد في خطط مرحلة الاسترسال بالمشروع.
الاسترسال.
وخلال هذه المرحلة الحاسمة، يتم تحليل العمليات التجارية الحرجة إلى حالات الاستخدام الحرجة. وسيتم تحليل مثل حالات الاستخدام هذه، حسب الحاجة، لتحولات صفحة واحدة (شاشة). وهذه هي حالات الاستخدام التي ستخضع لـاختبار الأداء النصي.
ونوعية المتطلبات التي تتعلق بهندسة الأداء هي متطلبات غير وظيفية، أو NFR. في حين أن المتطلب الوظيفي يتعلق بماهي العمليات التجارية التي يتعين القيام بها، والأداء المتعلق بالمتطلبات الغير وظيفية سوف يتعلق بمدى سرعة أداء هذه العملية التجارية في ظل ظروف محددة.
مفهوم "ظروف محددة" هو أمر ضروري. وسوف يتجلى ذلك في المثال:
لاحظ الاختلافات الحاسمة بين مواصفات الاثنين. المثال الأول لا يقدم أي شروط. والثاني يحدد بوضوح الشروط التي بموجبها يعمل النظام. المثال الثاني قد يكون له اتفاق مستوى الخدمة، ولكن لا يجب أن يكون للأول. ويمكن لمخططين القدرة والمعماريين أن يصمموا ويقوموا ببناء نظام لتلبية متطلبات المعايير الغير وظيفية الصالحة—ولكن ليس لتلك الغير صالحة. وقد يقوم المختبرون ببناء اختبار أداء موثوق به لالمثال الثاني، ولكن ليس لالمثال الغير صالح.
ويجب أن يكون لكل حالة استخدام حرجة NFR المرتبط بها. إذا، بالنسبة لحالة استخدام معينة، لا ينطبق عليها NFR موجود، لا بد من إنشاء NFR جديد محدد لحالة الاستخدام تلك.
لا تقتصر المتطلبات الغير وظيفية عن حالات الاستخدام. فيجب تحديد أحجام النظام العامة. وستصف هذه تحميل النظام العام خلال فترة زمنية محددة، وتحديد عدد كل نوع من المعاملات التجارية التي سيتم تنفيذه في كل وحدة من الوقت. الأحجام العامة عادة ماتصف يوم عمل نموذجي، ومن ثم يتم تقسيمها لكل ساعة. وهذا يصف كيفية اختلاف تحميل النظام على مدار اليوم. فعلى سبيل المثال: 1200 معاملة ألف، و300 معاملة باء، و3300 معاملة جيم، وغيرها في يوم عمل معين؛ ثم في ساعة 1 سيتم تنفيذ عدد معين من ألف وباء وجيم وغيرها، وفي ساعة 2 سيتم تنفيذ عدد معين، وهلم جرا. وغالبا ما يتم تنسيق المعلومات في شكل جداول للتوضيح. إذا نفذ المعاملات طبقات مستخدمين مختلفة، سيتم دمج هذه المعلومات أيضا في توثيق NFR. وأخيرا، يمكن تصنيف المعاملات إلى نوع عام، عادة كتفاعل المستخدم، وتوليد التقرير، وتجهيز الدفعات.
وسيتم استخدام أحجام النظام الموثقة في وثائق NFR كمدخلات لكلا من اختبار تحميل واختبار تحمل النظام من خلال اختبار الأداء.
من المقترح عند هذه النقطة أن يتم تنفيذ نماذج الأداء باستخدام معلومات حالة الاستخدام كإدخال. قد يحدث هذا باستخدام مختبر الأداء، وباستخدام النماذج الأصلية ونماذج النظام "الذي سيكون" بالأحجام الطبيعية، أو استخدام أداة النمذجة المقدمة من قبل البائع، أو حتى مجرد دفتر عمل الجداول، حيث يتم تشكيل كل حالة استخدام في ورقة واحدة، ويستخدم ورقة موجزة لتوفير معلومات عالية المستوى لكافة حالات الاستخدام.
من المستحسن أن يتم إنشاء مخطط تسلسلي لـ لغة موحدة للنمذجة على مستوى الطبقة المادية لاستخدام كل حالة. وتتمثل الطبقات المادية في أعمدة الكائن العمودي، والاتصال الرسائلي بين الطبقات المادية بواسطة الأسهم الأفقية. وينبغي أن يرتبط توقيت المعلومات مع كل سهم أفقي؛ ويجب أن يرتبط هذا مع نموذج الأداء.
يجب أن يتم تنفيذ بعض الأنشطة الهندسية الأداء ذات الصلة باختبار الأداء في هذه المرحلة. وهي تشمل التأكد من صحة إستراتيجية اختبار الأداء، ووضع خطة اختبار الأداء، وتحديد حجم مجموعات بيانات الاختبار، ووضع خطة أداء بيانات الاختبار، وتحديد سيناريوهات اختبار الأداء.