MUMPS
MUMPS (Massachusetts General Hospital Utility Multi-Programming System), oder alternativ M, ist eine ursprünglich auf DEC PDP- und VAX-Computern entwickelte Programmiersprache (genauer eine Interpretersprache, die selbst Multitasking ermöglicht) mit integrierter Datenbank, die heute für fast alle gängigen Computer-Plattformen erhältlich ist.
MUMPS wurde 1966 auf die Initiative von Octo Barnett entwickelt. 1977 wurde die im Programmiersystem enthaltene gleichnamige Programmiersprache MUMPS ANSI-Standard (ANSI/MDC X11.1-1977), 1992 auch ISO-Standard (ISO/IEC 11756). Etwa zur gleichen Zeit setzte sich mehr und mehr der Begriff „M“ oder „M-Technologie“ (bzw. „M Technology“ im englischen Sprachraum) durch.
Das Programmiersystem wurde ursprünglich überwiegend für Krankenhaus-Anwendungen verwendet. Typisch für Anwendungen aus dieser Zeit sind Programme, die auf einem Terminal laufen, ohne den Komfort grafischer Benutzeroberflächen und ohne Maus-Unterstützung. Zur Zeit seiner Entstehung war MUMPS den konkurrierenden Programmiersprachen in vieler Hinsicht überlegen – vor allem wegen des Multitaskings und des Gebrauchs geringer System-Ressourcen – und wurde bald auch in anderen Branchen (z. B. Handel, Banken und Logistik) eingesetzt. Aufgrund der extremen Langlebigkeit vieler betrieblicher IT-Systeme, bei denen eine Komplettablösung nicht nur teuer, sondern auch sehr riskant ist, werden heute noch immer zahlreiche MUMPS-Systeme betrieben und weiterentwickelt. In dieser Beziehung besteht große Ähnlichkeit zu COBOL.
Sprachsyntax
Wie bei den meisten gängigen Programmiersprachen üblich, beginnt eine syntaktische Einheit mit einem Befehl bzw. einer Anweisung gefolgt von zumeist einem oder mehreren Parametern. Mehrere syntaktische Einheiten können in einer Befehlszeile durch die Trennung mit Leerzeichen aneinandergefügt werden. Kommentare innerhalb des Programmcodes werden mittels Semikolon eingeleitet. Innerhalb einer Befehlszeile gilt die strikte links/rechts-Abarbeitung, dies bezieht sich auch auf mathematische Konstrukte. Punktrechnung vor Strichrechnung greift innerhalb von MUMPS nicht (2 + 3 * 10 = 50).
Variablen müssen innerhalb von MUMPS initialisiert, aber nicht deklariert werden und sind innerhalb einer Programmausführung gültig. Selbst der Aufruf eines verzweigenden Programmes ändert nicht die Gültigkeit der Variablen. Eine Organisation der Gültigkeiten obliegt ausschließlich dem Programmierer.
Eine wesentliche Stärke der Programmiersprache MUMPS ist die Subskribierung und automatische Sortierung von variablen Arrays. Diese steht sowohl im lokalen, flüchtigen Bereich wie auch im globalen, nichtflüchtigen Bereich in nahezu gleicher Syntax zur Verfügung. Da globale Variablen in so genannten Datenfiles sortiert abgelegt werden, wird MUMPS auch häufig als Datenhaltesystem bezeichnet.
Ein wesentliches Merkmal der Programmiersprache MUMPS ist die ausgeprägte Möglichkeit der Verwendung von Abkürzungen der sprachsyntaktischen Elemente. Während dies zu Zeiten begrenzter Speichermöglichkeiten durchaus sinnvoll war, führte die intensive Nutzung dieser Möglichkeit zur Entstehung von schwer lesbarem und somit schwer pflegbarem Programmcode. Da sowohl lokale Variablen als auch syntaktische Elemente gleich benannt werden können, ist MUMPS-Programmcode in vielen Fällen nur nach intensiver Einarbeitung und Übung überhaupt lesbar.
Weitere Merkmale der Programmiersprache MUMPS sind:
- Postkonditionierungen
- Variablenindirektionen
- Ausführung von Variableninhalten als Programmcode
- Minimaler mathematischer syntaktischer Funktionsumfang
- Mehrdimensionale Arrayvariablen
- Ausgeprägter Mustervergleich
- Keine unterschiedlichen Datentypen
- Befehle und Anweisungen sind nicht case sensitive
Programmaufbau
Für den Programmaufbau gelten feste Regeln:
- Jede Variable wird als Zeichenkette behandelt und je nach Kontext umgewandelt.
- Eine Programmzeile beginnt entweder mit einem Statement / Tag oder einem Leerzeichen oder einem TAB
- Ein alphanumerisches Statement / Tag muss zwingend mit einem Buchstaben beginnen
- Statement / Tags werden mittels eines Leerzeichen oder TABS vom Code getrennt. Leerzeichen innerhalb eines Ausdrucks (z. B.
x = 2 * 3
) sind nicht zulässig, auch wenn sie in anderen Sprachen die Lesbarkeit deutlich erhöhen können. - Die erste Zeile eines Programmes muss mit einem Statement / Tag beginnen, der dem Programmnamen entspricht
- Statements / Tags sind case sensitive, Befehle sind case insensitive.
- Statements / Tags sind entweder absolut oder relativ zu erreichen
- Sprünge innerhalb eines Programmes sind über den Befehl 'GO' bzw. 'g' einzuleiten
- Statements / Tags werden, wie in den meisten Programmiersprachen üblich, mittels Klammern zur Parameterübergabe deklariert
- Innerhalb eines Programmes ist sowohl die einfache wie auch mehrfache Punktnotation möglich
- Unterprogramme innerhalb eines Programmes können entweder als Programm oder/und als Funktion aufgerufen werden
- MUMPS kennt keine reservierten Ausdrücke, während es in anderen Sprachen verboten ist, eine Variable zum Beispiel
if
zu nennen.
Schematischer Programmaufbau
Prog ;Erste Zeile des MUMPS-Programmes, der Programmname 'Prog' bildet das erste Statement / Tag
;... Programmcode ...
Tag1 ;Statement / Tag, beeinflusst den Programmablauf nicht, dient ausschließlich als Sprungmarke
;... Programmcode ...
do
. ;Einfache Punktnotation
. do
.. ;Mehrfache Punktnotation
. ;Zurück zur einfachen Punktnotation
q ;Programmende
Tag2 ;Unterprogramm, wird nur ausgeführt wenn der Programmcode hierhin verzweigt
;... Programmcode ...
q ;Entweder Ende des Unterprogrammes oder Programmende, abhängig vom Aufruf des Unterprogrammes
T3() ;Unterprogramm oder/und Funktion, abhängig vom Aufruf
q ;Ende des Unterprogrammes
T4() ;Funktion, da das Funktionsende mit einem Rückgabewert definiert ist
q "" target="_blank" rel="nofollow" ;Ende mit Wertrückgabe als Funktion
Beispielcode
Dieses Beispiel stammt aus einer Anwendung des Kriegsveteranenministeriums der Vereinigten Staaten, das Kliniken zur medizinischen Versorgung von ehemaligen Soldaten betreibt.
%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="" target="_blank" rel="nofollow" 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="" target="_blank" rel="nofollow" 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
;
Kodierung
Das klassische Beispiel
write "Hello world",!
Selbiges in Kurzform
w "Hello world",!
Unter Verwendung der Variable 'write', die durch 'set' dotiert wird
set write="Hello world"
write write,!
Das gleiche in Kurzform, 'set' wird durch 's', 'write' wird durch 'w' abgekürzt
s w="Hello world"
w w,!
In einer Zeile geschrieben
s w="Hello world" w w,!