MUMPS(「マサチューセッツ総合病院ユーティリティマルチプログラミングシステム」)、略してMは、トランザクション処理機能を備えたキーバリューデータベースを統合した、命令型の高水準プログラミング言語です。元々はマサチューセッツ総合病院で、患者の医療記録や病院検査情報システムの管理のために開発されました。
MUMPS技術はその後、米国における医療情報システムおよび電子カルテの主要なデータベースとして拡大しました。Epic SystemsなどのMUMPSベースの情報システムは、米国の患者の78%以上に医療情報サービスを提供しています[ 1 ] 。
MUMPSテクノロジーのユニークな特徴は、統合されたデータベース言語であり、永続的なディスクストレージへの直接的かつ高速な読み書きアクセスを可能にすることです。[ 2 ]
MUMPSは、1966年から1967年にかけて、ボストンのマサチューセッツ総合病院(MGH)のオクト・バーネット博士の研究室で、ニール・パッパラルド、ロバート・A・グリーン、カート・マーブルによって開発されました。 [ 3 ]これは、 MGHで国立衛生研究所(NIH)が支援する病院情報システムプロジェクト中に、主要請負業者であるボルト、ベラネク、ニューマン(BBN)が時分割方式のPDP-1上でアセンブリ言語で開発していたことに対する不満から生まれました。MUMPSは、パッパラルド、グリーン、マーブルによるMGHの内部「秘密工作」プロジェクトから生まれ、代替の開発環境を作成しました。初期の機能実証の結果、1967年にバーネット博士が病院コンピュータプロジェクトの助成金更新のためにNIHに提出した提案では、BBN方式に頼るのではなく、今後はMUMPSでシステムを構築するという大胆な提案がなされました。プロジェクトは資金提供を受け、MUMPSにおけるシステムの本格的な導入が開始された。
オリジナルのMUMPSシステムは、数年後のUnixと同様に、 DEC PDP-7をベースに構築されました。Octo BarnettとNeil Pappalardoは後方互換性のあるPDP-9を入手し、入院サイクルと臨床検査レポートでMUMPSの使用を開始しました。当時のMUMPSはインタプリタ型言語でしたが、それでも階層型データベースファイルシステムを組み込んでデータとのやり取りを標準化し、ディスク操作を抽象化してMUMPS言語自体のみが実行するようにしました。MUMPSは初期の頃、実験的な臨床経過記録入力システム[ 4 ]や放射線レポート入力システム[ 5 ]にも使用されました。
MUMPSのいくつかの側面は、 RAND CorporationのJOSSからBBNのTELCOMPとSTRINGCOMPを経て辿ることができる。MUMPSチームは、マシン間の移植性を設計目標の一つとして採用した。
MUMPS言語の高度な機能の一つに、当時のオペレーティングシステムやコンピュータハードウェアでは広くサポートされていなかったマルチタスク処理があった。メインフレームコンピュータにおけるタイムシェアリングはMulticsなどのシステムで普及しつつあったものの、ほとんどのミニコンピュータは並列プログラムを実行できず、スレッド処理は全く利用できなかった。メインフレームにおいても、プログラムを最後まで実行するバッチ処理の方式が、オペレーティングシステムにおけるマルチプログラミングの最も一般的な実装方法であった。
Unixが開発されるまでには数年を要しました。メモリ管理ハードウェアがなかったため、マルチプロセッシングではメモリポインタが他のプロセスを変更してしまう可能性が常にありました。MUMPSプログラムはC言語とは異なり、メモリを直接参照する標準的な方法を一切持っていません。そのため、マルチタスクは言語自体によって強制され、その言語で書かれたプログラムによって強制されるわけではないため、他のシステムで存在していたようなリスクは発生しませんでした。
ダン・ブレヴィックの DEC MUMPS-15 システムは、DEC PDP-15に適合され、しばらくの間そこで稼働しました。最初にインストールされたのは、1971 年 5 月のデンバーの Health Data Management Systems でした。[ 6 ]移植性が有用であることが証明され、MUMPS は政府の研究助成金を授与され、助成金の要件であったパブリック ドメインに公開されました。MUMPS はすぐに、人気の DEC PDP-8、Data General Nova、DEC PDP-11、Artronix PC12 ミニ コンピュータなど、他の多くのシステムに移植されました。MUMPS の評判は主に医療コミュニティを通じて広まり、広く使用され、多くの場合、独自のニーズに合わせてローカルに修正されました。
MUMPS システムのバージョンは、 1970 年と 1971 年にDECの技術リーダーである Dennis "Dan" Brevik と Paul Stylos [ 6 ]によって書き直されました。1970 年代初頭までに、さまざまなハードウェア プラットフォーム上で MUMPS のさまざまな実装が多数存在しました。注目すべきプラットフォームとしては、Paul Stylos [ 6 ]のPDP-11 上の DEC MUMPS-11 とMEDITECHのMIISがありました。1972 年秋、多くの MUMPS ユーザーがボストンで開催された会議に出席し、当時断片化されていた言語を標準化し、そのためにMUMPS ユーザー グループとMUMPS 開発委員会(MDC) を設立しました。これらの取り組みは成功し、1974 年までに標準が完成し、1977 年 9 月 15 日にANSI標準 X11.1-1977 として承認されました。ほぼ同時期に、DECはPDP-11向けにDSM-11(デジタル標準MUMPS)を発売した。これは瞬く間に市場を席巻し、当時の標準実装となった。また、InterSystemsもPDP-11向けにISM-11(DSM-11と同一)を販売した。
1980年代初頭、複数のベンダーがANSI規格に準拠したMUMPSベースのプラットフォームを市場に投入した。中でも特に重要なものは以下の通りである。
この時期にはMDCの活動も活発に行われた。MUMPSに関するANSI規格の第2版(X11.1-1984)は1984年11月15日に承認された。
InterSystemsの最高経営責任者はMUMPSという名称を嫌い、それが深刻なマーケティング上の障害になると考えていた。そのため、ある程度Mを支持することは、InterSystemsとの連携を示すものとみなされるようになった。1990年のANSI規格はMとMUMPSの両方を認めており、1992年に「世界規模」での議論を経て、Mumpsユーザーグループは正式に名称をMに変更した。この論争は、言語の「公式」名称を誰が決定するかという組織間(Mテクノロジー協会、MUMPS開発委員会、ANSIおよびISO標準化委員会)の対立も反映していた。
2020年現在、ISOはMとMUMPSの両方を公式に認められた名称として言及している。[ 16 ]
マサチューセッツ総合病院は、1971年11月28日に米国特許商標庁に「MUMPS」を商標登録し、1992年11月16日に更新したが、2003年8月30日に失効させた。[ 17 ]
MUMPSは、データベースアプリケーションの構築を目的として設計された言語です。プログラマが最小限のコンピューティングリソースでアプリケーションを作成できるように、補助的な言語機能が追加されました。初期の実装はインタプリタ型でしたが、現代の実装は完全にコンパイルされるか部分的にコンパイルされます。個々の「プログラム」はメモリの「パーティション」内で実行されます。初期のMUMPSのメモリパーティションは2048バイトに制限されていたため、積極的な省略形は、当時のハードウェアに存在した非常に小さなメモリに複数のMUMPSジョブを収めることができたため、リソースが極めて限られたハードウェアでのマルチプログラミングに大いに役立ちました。マルチユーザーシステムを提供できることも、この言語設計の特徴の一つでした。頭字語の「M ulti- P rogramming」という言葉がそれを指しています。MUMPSを実行する最も初期のマシンでさえ、複数のジョブを同時に実行することをサポートしていました。数年後、ミニコンピュータからマイクロコンピュータへの移行に伴い、8ビットCPUと16Kまたは64Kのメモリを搭載した「シングルユーザーPC」でも、複数のユーザーをサポートできるようになり、ユーザーは(非グラフィックの)ビデオディスプレイ端末から接続することができた。
当初メモリが限られていたため、MUMPSの言語設計では簡潔なコードが重視されました。そのため、MUMPSのコマンドや関数名はすべて1~3文字に短縮でき、例えばQ(プログラム終了)はQ、$Pは$Piece関数、RはReadコマンド、$TRは$Translate関数と表記されます。行スコープが簡潔な言語設計を促進したため、MUMPSではスペースや行末マーカーが重要視されました。そのため、他のプログラミング言語では5~10倍の文字数を必要とするようなアイデアを、わずか1行のプログラムコードで表現することができました。この時期に設計された言語(FOCAL-69 、 Tiny BASICなどの初期のBASICなど)では、省略形がよく使われていました。しかし、初期の頃は最小限のコードを書く必要があったため、MUMPSプログラマーはコードにコメントを付けず、省略形を多用するという残念な副作用が生じました。つまり、熟練したMUMPSプログラマーであっても、コードのページをざっと見てその機能を把握することはできず、一行ずつ分析する必要があったということだ。
データベースとのやり取りは言語に透過的に組み込まれています。MUMPS 言語は、永続的なスパース配列で構成される階層型データベースを提供し、これはすべての MUMPS アプリケーションに対して暗黙的に「開かれます」。キャレット文字 ( ) で始まるすべての変数名は、(RAM ではなく) 永続ストレージを使用し、アプリケーション終了後も値を保持し、他の実行中のアプリケーションから参照可能 (および変更可能) になります。この共有された永続ストレージを使用する変数は、 MUMPS ではグローバル変数と呼ばれます。これは、これらの変数のスコープがシステム上のすべてのジョブに対して「グローバルに利用可能」であるためです。他の言語でより最近一般的に使用されている「グローバル変数」という名称は、スコープのない変数が同じプロセスで実行されているすべてのプログラムに対して「グローバルに」利用可能であるものの、複数のプロセス間で共有されないという事実から、名前のスコープがより限定されています。MUMPS ストレージ モード (つまり、グローバル変数が永続的なスパース配列として格納される) により、MUMPS データベースはドキュメント指向データベースの特性を持ちます。[ 18 ]^
キャレット文字 ( ) で始まる変数名はすべて^一時的でプライベートです。グローバル変数と同様に階層的なストレージ モデルを持ちますが、単一のジョブに対してのみ「ローカルで使用可能」であるため、「ローカル」と呼ばれます。「グローバル」と「ローカル」の両方に子ノード ( MUMPS 用語では添え字と呼ばれます) を持たせることができます。添え字は数字に限定されず、任意のASCII文字または文字のグループを添え字識別子にすることができます。これは Perl や JavaScript などの現代の言語では珍しくありませんが、1970 年代後半には非常に珍しい機能でした。この機能は、1984 年の ANSI 標準以前の MUMPS システムでは普遍的に実装されていませんでした。標準では、正規の数値添え字のみが許可されることが要求されていたためです。[ 19 ]したがって、「Car」という名前の変数には、「Door」、「Steering Wheel」、「Engine」という添え字を持たせることができ、それぞれに値を含めることができ、独自の添え字を持つことができます。変数に^Car("Door")は、たとえば「Color」というネストされた変数添え字が含まれる可能性があります。したがって、次のように言うことができます。
SET ^Car("Door","Color")="BLUE" のネストされた子ノードを変更します^Car。MUMPS の用語では、「Color」は変数の 2 番目の添え字です^Car(子ノードの名前と子ノード自体も同様に添え字と呼ばれます)。階層変数は、多くのオブジェクト指向言語のプロパティを持つオブジェクトに似ています。さらに、MUMPS 言語設計では、変数のすべての添え字が自動的にソートされた順序で保持されることが求められます。数値添え字 (浮動小数点数を含む) は、小さい順から大きい順に格納されます。すべての非数値添え字は、数値の後にアルファベット順で格納されます。MUMPS の用語では、これは正規順序です。負でない整数添え字のみを使用することで、MUMPS プログラマは他の言語の配列データ型をエミュレートできます。MUMPS は必須スキーマなどのDBMS機能の完全なセットをネイティブに提供していませんが、アプリケーション開発者にフラットファイル、リレーショナル、およびネットワーク データベース機能を提供するいくつかの DBMS システムが MUMPS 上に構築されています。
さらに、区切り文字付き文字列(例えば、カンマ区切り値)を配列として扱う組み込み演算子も用意されています。初期のMUMPSプログラマーは、関連情報の構造を区切り文字付き文字列として格納し、読み込んだ後に解析することがよくありました。これにより、ディスクアクセス時間を節約でき、一部のハードウェアでは処理速度が大幅に向上しました。
MUMPSにはデータ型がありません。数値は数字の文字列として扱うことも、数値演算子によって文字列を数値として扱うこともできます( MUMPSの用語では「強制」)。ただし、強制には奇妙な副作用が生じる場合があります。たとえば、文字列が強制されると、パーサーは文字列の左端から可能な限り多くの部分を数値に変換し、残りを破棄します。したがって、このステートメントはMUMPSのIF 20<"30 DUCKS"ように評価されます。TRUE
この言語のその他の機能は、マルチユーザー環境においてMUMPSアプリケーション同士が連携しやすくすることを目的としています。データベースロック、プロセス識別子、およびデータベース更新トランザクションのアトミック性は、標準的なMUMPS実装に必須の機能です。
C やWirth系の言語とは対照的に、MUMPS ステートメント間のスペース文字には意味があります。1 つのスペースはコマンドとその引数を区切り、スペースまたは改行は各引数と次の MUMPS トークンを区切ります。引数を取らないコマンド (例: ELSE) には、2 つのスペースが必要です。これは、1 つのスペースがコマンドと (存在しない) 引数を区切り、次のスペースが「引数」と次のコマンドを区切るという概念に基づいています。改行も意味があります。IF、ELSEまたはFORコマンドは、行末まで他のすべてを処理 (またはスキップ) します。これらのステートメントで複数行を制御するには、DOコマンドを使用してコード ブロックを作成する必要があります。
MUMPSにおける簡単な「Hello, World!」プログラムの例は次のとおりです。
「Hello, World!」と書いてください。 そして、ディスクに保存された後にコマンドとともに実行されますdo ^hello 。コードを直接実行するには、プログラム行の最初の位置に、mumpsインタープリタに実行開始位置を伝えるための「ラベル」(任意の英数字文字列)が必要です。MUMPSではコマンドを同じ行に連結でき、コマンドを1文字に短縮できるため、このルーチンをより簡潔にすることができます。
w 「こんにちは、世界!」 テキストの後の「,!」は改行を生成します。このコードはプロンプトに戻ります。
ANSI X11.1-1995 は、言語の完全かつ正式な説明を提供します。この規格の注釈付きバージョンはオンラインで入手可能です。[ 20 ]
言語機能には以下が含まれます。
a<ba が b より小さい場合は 1、それ以外の場合は 0 を返します。SET:N<10 A="FOO"が10未満の場合はAを「FOO」に設定し、DO:N>100 PRINTERR,Nが100より大きい場合はPRINTERRを実行します。この構造は、1行未満の範囲で条件分岐を提供します。GREPTHIS() NEW SET,NEW,THEN,IF,KILL,QUIT SET IF="KILL",SET="11",KILL="11",QUIT="RETURN",THEN="KILL" もし、もし=ならば、以下を実行する 終了:$終了 終了 終了 ; (終了) THEN IF IF,SET&KILL SET SET=SET+KILL QUIT GREPTHIS() NS、N、T、I、K、QSI="K",S="11",K="11",Q="R",T="K" II=TDT Q:$QQQ TII、S&K SS=S+KQ i=10000:1:12345 に対して sqtable(i)=i*i と設定する set address("Smith","Daniel")="dpbsmith@world.std.com" ^abc, ^defこれらはディスクに保存され、すべてのプロセスからアクセス可能であり、作成プロセスが終了しても保持されます。非常に大きなグローバル変数(例えば、数百ギガバイト)は、ほとんどの実装において実用的かつ効率的です。これはMUMPSの主要な「データベース」メカニズムです。オペレーティングシステムを呼び出してファイルを作成、書き込み、読み取る代わりに、このメカニズムが使用されます。@VBL使用でき、VBL の内容を別の MUMPS ステートメントに効果的に置き換えます。SET XYZ="ABC" SET @XYZ=123変数 ABC を 123 に設定します。REPORTという名前のサブルーチンを実行します。この置換により、遅延評価SET SUBROU="REPORT" DO @SUBROUと遅延バインディングが可能になり、他の言語の「ポインタ」と実質的に同等の操作が可能になります。$PIECE(STRINGVAR,"^",3)の 3 番目のキャレットで区切られた部分」を意味します。piece 関数は、代入(SET コマンド)のターゲットとしても使用できます。$PIECE("world.std.com",".",2)収量標準。SET X="dpbsmith@world.std.com"、SET $P(X,"@",1)="office"これにより、X は "office@world.std.com" になります ( $Pは$PIECEと同等であり、そのように記述することもできます)。set stuff(6)="xyz",stuff(10)=26,stuff(15)="" $Order(stuff(""))収量6、$Order(stuff(6))収量10、$Order(stuff(8))収量10、$Order(stuff(10))収量15、$Order(stuff(15))収量「」。Set i="" For Set i=$O(stuff(i)) Quit:i="" Write !,i,10,stuff(i) stuff(i)GTM>S n="" GTM>S n=$order(^nodex(n)) GTM>zwr n n="建物" GTM>S n=$order(^nodex(n)) GTM>zwr n n=" 名前:gd" GTM>S n=$order(^nodex(n)) GTM>zwr n n="%kml:guid" MUMPSは、基盤となるオペレーティングシステムが対応していない場合でも(例:MS-DOS )、複数の同時ユーザーとプロセスをサポートします。さらに、変数にマシン名を指定するなどして(例SET ^|"DENVER"|A(1000)="Foo":)、変数の環境を指定する機能があり、これによりリモートマシン上のデータにアクセスできます。
MUMPS構文のいくつかの側面は、より現代的な言語の構文とは大きく異なり、混乱を招く可能性がありますが、これらの側面は言語のバージョンによって異なります。一部のバージョンでは、式の中に空白文字を入れると文が終了してしまうため、空白文字は許可されていません。2 + 3はエラーとなり、 と記述する必要があります2+3。すべての演算子は同じ優先順位を持ち、左結合です(2+3*10は50と評価されます)。「以下」と「以上」の演算子は'>と'<(つまり、ブール否定演算子'と反対方向の厳密な比較演算子)ですが、一部のバージョンでは、より標準的な<=と を>=それぞれ使用できます。DOブロックでは、空白文字ではなく、ピリオド(.)を使用して行をインデントします。ELSEコマンドは、組み込みシステム変数 の値を調べることで動作するため、対応するIFは必要ありません$test。
MUMPS のスコープ規則は、他の現代的な言語よりも寛容です。宣言されたローカル変数はスタックを使用してスコープされます。ルーチンは通常、呼び出しスタック上の下位ルーチンのすべての宣言されたローカル変数を参照できます。また、呼び出し元が子ルーチンを呼び出す前に手動で新しいスタック レベル ( do) を作成し、保護したい各変数にエイリアス ( . new x,y) を付けない限り、ルーチンは呼び出したルーチンが宣言されたローカル変数を変更するのを防ぐことはできません。対照的に、宣言されていない変数 (宣言ではなく、使用によって作成された変数) は、同じプロセスで実行されているすべてのルーチンのスコープ内にあり、プログラムが終了するまでスコープ内に残ります。
MUMPSデータベース参照は、キャレット接頭辞のみが内部変数参照と異なるため、意図せずデータベースを編集したり、データベースの「テーブル」を削除したりすることが非常に容易である。[ 21 ]
米国退役軍人省(旧退役軍人局)は、MUMPS言語をいち早く採用した主要な組織の一つです。同省の開発活動(およびその後のMUMPSアプリケーションコードベースへの貢献)は、世界中の多くの医療ユーザーに影響を与えました。1995年、退役軍人省の患者入院・追跡・退院管理システムである分散型病院コンピュータプログラム(DHCP)は、医療における情報技術の最優秀活用として、コンピュータワールド・スミソニアン賞を受賞しました。2006年7月、退役軍人省(VA)/退役軍人保健局(VHA)は、DHCPを退役軍人保健情報システムおよび技術アーキテクチャ(VistA )に拡張した功績により、ハーバード大学ジョン・F・ケネディ行政大学院アッシュ研究所からアメリカ政府イノベーション賞を受賞しました。米国のVA病院システムのほぼ全体、インディアン保健サービス、および国防総省CHCS病院システムの主要部分は、臨床データ追跡にMUMPSデータベースを使用しています。
MUMPSを使用しているその他の医療IT企業には、以下のような企業があります。
DASA、 Quest Diagnostics、[ 23 ] 、Dynacareなどの多くの検査機関は、Antrim Corporationのコードに基づいて作成された、またはそれを基に作成されたMUMPSソフトウェアを使用しています。Antrimは2001年にMisys Healthcare(現在のSunquest Information Systems)に買収されました。 [ 24 ]
MUMPSは金融アプリケーションでも広く使用されています。MUMPSは金融セクターで早くから支持を集め、多くの銀行や信用組合で使用されています。イングランド銀行やバークレイズ銀行でも使用されています。[ 25 ] [ 26 ] [ 27 ]
2005 年以降、MUMPS の最も人気のある実装は、Fidelity National Information Services の Greystone Technology MUMPS (GT.M) と Intersystems Corporation の Caché です。欧州宇宙機関は 2010 年 5 月 13 日に、ガイアミッションをサポートするためにInterSystems の Cachéデータベースを使用すると発表した。このミッションは、天の川を前例のない精度でマッピングすることを目的としている。[ 28 ] InterSystems は、Iris に置き換えるために Caché を段階的に廃止している。[ 29 ]
その他の現在の実装例は以下のとおりです。