| おたふく風邪 | |
|---|---|
| パラダイム | 命令形、手続き型 |
| デザイン: | ニール・パパラルド、カート・マーブル、ロバート・A・グリーンズ |
| 初登場 | 1966 (1966年) |
| 安定版リリース | ANSI X11.1-1995 / 1995 年 12 月 8 日 (1995年12月8日) |
| タイピングの規律 | タイプレス |
| OS | クロスプラットフォーム |
| 影響を受けた | |
| ジョス | |
| 影響を受けた | |
| PSL、Caché ObjectScript、GT.M | |
MUMPS(マサチューセッツ総合病院ユーティリティ・マルチプログラミングシステム)、略称Mは、トランザクション処理とキーバリューデータベースを統合した命令型の高水準プログラミング言語です。元々はマサチューセッツ総合病院で患者の医療記録と病院の検査情報システムを管理するために開発されました。
MUMPS技術は、その後、米国における医療情報システムおよび電子医療記録の主要なデータベースとして拡大しました。Epic SystemsなどのMUMPSベースの情報システムは、米国全土の患者の78%以上に医療情報サービスを提供しています[ 1 ] 。
MUMPS技術のユニークな特徴は統合データベース言語であり、これにより永続的なディスクストレージへの直接かつ高速な読み書きアクセスが可能になる。[ 2 ]
MUMPSは、1966年から1967年にかけてボストンのマサチューセッツ総合病院(MGH)のオクト・バーネット博士の研究室で、ニール・パパラルド、ロバート・A・グリーンズ、カート・マーブルによって開発されました。 [ 3 ] MUMPSは、国立衛生研究所(NIH)がMGHで支援していた病院情報システム・プロジェクトで、主契約者のボルト、ベラネック、ニューマン(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言語とは異なり、メモリを直接参照する標準的な方法が全くありませんでした。そのため、マルチタスクは言語によって強制され、言語で書かれたプログラムによって強制されたわけではないため、他のシステムに存在するようなリスクは存在し得ませんでした。
Dan Brevik の 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の技術リーダーであるデニス「ダン」ブレビックとポール・スタイロス[ 6 ]によって書き直されました。1970年代初頭までに、さまざまなハードウェアプラットフォーム上にMUMPSのさまざまな実装が存在していました。もう1つの注目すべきプラットフォームは、PDP-11上のポール・スタイロス[ 6 ]のDEC MUMPS-11と、 MEDITECHのMIISでした。1972年の秋、多くのMUMPSユーザーがボストンで開催された会議に出席し、当時は断片的だった言語を標準化し、そのためにMUMPSユーザーグループとMUMPS開発委員会(MDC)が設立されました。これらの努力は成功し、1974年までに標準が完成し、1977年9月15日にANSI標準X11.1-1977として承認されました。ほぼ同時期に、DECはPDP-11向けにDSM-11(Digital Standard MUMPS)をリリースしました。これは瞬く間に市場を席巻し、当時のリファレンス実装となりました。また、インターシステムズ社はPDP-11向けにISM-11(DSM-11と同一)を販売しました。
1980年代初頭、複数のベンダーがANSI規格に準拠したMUMPSベースのプラットフォームを市場に投入しました。中でも特に注目すべきものは以下のとおりです。
この時期にはMDCの活動も活発に行われました。MUMPSのANSI規格の第2版(X11.1-1984)は、1984年11月15日に承認されました。
インターシステムズの最高経営責任者はMUMPSという名称を嫌い、それがマーケティング上の大きな障害になると感じていました。そのため、ある程度Mを支持することはインターシステムズとの提携と見なされるようになりました。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 ジョブを収めることができたためです。マルチユーザー システムを提供できることも、この言語設計のもう 1 つの特徴でした。頭字語の「M ulti- P rogramming」という言葉がこれを示しています。MUMPS が動作していた初期のマシンでも、複数のジョブの同時実行をサポートしていました。数年後、ミニコンピュータからマイクロコンピュータへの移行により、1 つの 8 ビット CPU と 16K または 64K のメモリを搭載した「シングル ユーザー PC」でも、(非グラフィカルな)ビデオ ディスプレイ ターミナルから接続できる複数のユーザーをサポートできるようになりました。
もともとメモリに余裕がなかったため、MUMPS の言語設計では非常に簡潔なコードが重視されました。そのため、すべての MUMPS コマンドまたは関数名は 1 ~ 3 文字に省略できました。たとえば、 Quit (プログラム終了) はQ、$P = $Piece関数、R = Readコマンド、$TR = $Translate関数となります。行スコープによって同じ簡潔な言語設計が促進されるため、スペースと行末マーカーは MUMPS では重要です。そのため、他のプログラミング言語では 5 ~ 10 倍の文字数が必要となるアイデアを、1 行のプログラム コードでわずかな文字数で表現できます。省略形はこの時期に設計された言語の一般的な機能でした (たとえば、FOCAL-69 、 Tiny BASICなどの初期の BASICなど)。このことの残念な副作用は、最小限のコードを記述するという初期の必要性と相まって、MUMPS プログラマーが日常的にコードにコメントを付けず、省略形を多用していたことです。つまり、熟練した MUMPS プログラマーであっても、コード 1 ページをざっと読んでその機能を確認することはできず、行ごとに分析する必要があるということです。
データベースとのやり取りは言語に透過的に組み込まれています。MUMPS言語は、永続的なスパース配列で構成される階層型データベースを提供します。このデータベースは、すべてのMUMPSアプリケーションに対して暗黙的に「開かれる」ものです。キャレット文字()で始まるすべての変数名は、RAMではなく永続的なストレージを使用し、アプリケーション終了後も値を維持し、実行中の他のアプリケーションから参照(および変更)できます。この共有された永続ストレージを使用する変数は、 MUMPSではグローバルと呼ばれます。これは、これらの変数のスコープがシステム上のすべてのジョブで「グローバルに利用可能」であるためです。他の言語で最近よく使われる「グローバル変数」という名称は、スコープのない変数は同じプロセスで実行されているすべてのプログラムで「グローバルに」利用可能であるものの、複数のプロセス間で共有されないという事実に由来し、名前のスコープがより限定されています。MUMPSストレージモード(つまり、永続的なスパース配列として保存されるグローバル)により、MUMPSデータベースはドキュメント指向データベースの特性を備えています。[ 18 ]^
キャレット文字( )が先頭に付かない変数名はすべて、^一時的かつプライベートです。グローバル変数と同様に、階層的な記憶モデルを持ちますが、単一のジョブに対してのみ「ローカル」に利用可能であるため、「ローカル」と呼ばれます。「グローバル」と「ローカル」はどちらも子ノード( MUMPS用語では添え字と呼ばれます)を持つことができます。添え字は数字に限定されず、任意のASCII文字または文字グループを添え字識別子として使用できます。これはPerlやJavaScriptなどの現代の言語では珍しくありませんが、1970年代後半には非常に珍しい機能でした。この機能は、1984年のANSI規格以前のMUMPSシステムでは普遍的に実装されていませんでした。ANSI規格では、標準的な数値添え字のみが許可されていたためです。[ 19 ]したがって、「Car」という名前の変数には、「Door」、「Steering Wheel」、「Engine」という添え字が付けられ、それぞれに値と添え字を持つことができます。^Car("Door")例えば、 変数には「Color」という変数の添え字が入れ子になっている可能性があります。つまり、次のように記述できます。
SET ^Car("ドア","色")="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<b0 以外の値である場合は True として解釈されます。a が b より小さい場合は 1 を、それ以外の場合は 0 を生成します。SET:N<10 A="FOO"10 未満の場合は A を "FOO" に設定し、DO:N>100 PRINTERR,N が 100 より大きい場合は PRINTERR を実行します。この構造は、スコープが完全な行よりも短い条件を提供します。グレプティス() NEW SET、NEW、THEN、IF、KILL、QUIT SET IF="KILL",SET="11",KILL="11",QUIT="RETURN",THEN="KILL" IF IF=THEN ならば、DO THEN QUIT:$QUIT QUIT QUIT ; (終了) その後、IF IF、SET&KILL SET SET=SET+KILL QUIT グレプティス() 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 と設定します。 アドレスを("Smith","Daniel")="dpbsmith@world.std.com"に設定します ^abc, ^defこれらはディスクに保存され、すべてのプロセスで利用可能であり、作成プロセスが終了しても永続的に保持されます。非常に大きなグローバル(例えば数百ギガバイト)は、ほとんどの実装において実用的かつ効率的です。これがMUMPSの主要な「データベース」メカニズムです。ファイルの作成、書き込み、読み取りをオペレーティングシステムに呼び出す代わりに使用されます。@VBL使用可能であり、VBLの内容を別のMUMPS文に効果的に置換します。SET XYZ="ABC" SET @XYZ=123変数ABCを123に設定します。REPORTSET 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と同等であり、そのように記述できることに注意してください)。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))収穫「」。i を "" に設定します。Set i=$O(stuff(i)) の場合、Quit:i を "" に設定します。!,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 と評価されます)。「以下」および「以上」の演算子は'>and '<(つまり、ブール否定演算子と、反対方向の厳密な比較演算子)ですが、バージョンによっては、より標準的なand'をそれぞれ使用できる場合もあります。DO ブロック内の行をインデントするには、ピリオド()を使用し、空白文字は使用しません。ELSE コマンドは、組み込みシステム変数 の値を調べて動作するため、対応する IF は必要ありません。 <=>=.$test
MUMPS のスコープ規則は、他の現代言語よりも寛容です。宣言されたローカル変数のスコープは、スタックを使用して決定されます。ルーチンは通常、呼び出しスタック上の自分より下位のルーチンの宣言されたローカル変数すべてを参照できます。また、呼び出し元が手動で新しいスタック レベル ( do) を作成し、子ルーチンを呼び出す前に保護する各変数にエイリアス ( . new x,y) を付けない限り、ルーチンは、呼び出すルーチンが宣言されたローカル変数を変更するのを防ぐことはできません。対照的に、宣言されていない変数 (宣言ではなく使用によって作成された変数) は、同じプロセスで実行されているすべてのルーチンのスコープ内にあり、プログラムが終了するまでスコープ内に残ります。
MUMPSデータベース参照は内部変数参照とキャレット接頭辞のみが異なるため、意図せずデータベースを編集したり、データベースの「テーブル」を削除してしまう危険性が非常に高い。[ 21 ]
米国退役軍人省(旧称:退役軍人局)は、MUMPS 言語を最も早く採用した主要組織の 1 つです。彼らの開発作業 (およびその後のフリーの MUMPS アプリケーション コードベースへの貢献) は、世界中の多くの医療ユーザーに影響を与えました。1995 年、退役軍人省の患者入院/追跡/退役システムである分散型病院コンピュータ プログラム(DHCP) は、医療における情報技術の最優秀活用に対して Computerworld Smithsonian Awardを受賞しました。2006 年 7 月、退役軍人省 (VA) /退役軍人保健局(VHA) は、ハーバード大学ジョン F. ケネディ行政大学院の Ash 研究所より、DHCP を Veterans Health Information Systems and Technology Architecture ( VistA ) に拡張した功績により、アメリカ政府イノベーション賞を受賞しました。米国の 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の実装として最も普及しているのは、フィデリティ・ナショナル・インフォメーション・サービスのGreystone Technology MUMPS (GT.M)と、インターシステムズ・コーポレーションのCachéです。欧州宇宙機関(ESA)は2010年5月13日、ガイア計画を支援するためにインターシステムズのCachéデータベースを使用すると発表しました。このミッションは、これまでにない精度で天の川銀河の地図を作成することを目指しています。 [ 28 ]インターシステムズは現在、Cachéを段階的に廃止し、Irisへの移行を進めています。[ 29 ]
その他の現在の実装は次のとおりです。