MUMPSのMSHプログラミング言語の機能と違い

MSH言語の基礎はMUMPS言語でした。 MUMPSは、前世紀の80年代のどこかで開発され、他の多くの現代言語も開発されました。 当初から、大規模な分散データを処理する大規模な情報システムを作成するための言語として開発されました。 これに関連して、いくつかの詳細があります。 この言語でのプログラミングは、他の言語でのプログラミングとは多少異なります。 普及率は低いものの、世界のさまざまな地域で情報システムを開発しているプログラマーのコミュニティはかなり安定しています。 MUMPSが存在する間、ほとんど変化していません。 言語の一部の要素は関連性を失っています。 そして、現在の言語はやや古風です。 MUMPSのような、より現代的な言語が欲しいです。 この目的のために、MSH言語が作成されました。 一部のMSHの概念は、MUMPS言語では異なるか、存在しません。 この資料は主にMUMSプログラマーの読者を対象に書かれていますが、他の人にとっては興味深いかもしれません。

定数

MUMPSには定数はありません。 MSHではそれらが導入されています。 しかし、言語の仕様により、プログラム実行時間の不変変数の形で存在することはできません。 したがって、MSHでは、それらはコンパイル時オブジェクトとして導入されます。 C言語を最も単純化された形式で定義するようなものです。 MSH言語のPiへの翻訳時に、仮想マシンコードはソーステキスト内のすべての定数をその値に置き換えます。 つまり、Piコードには含まれていません。 定数は、変数値、インデックス、または変数名として使用できます。 コマンド形式:定数nameConst = valConst <、nameConst = valConst>;等号の右側にあるのは定数のみで、式は使用できません。 定数の名前は一意でなければならず、変数の名前と重複してはなりません。

変数

MUMPSでは、グローバルまたはロケールに関係なく、変数は木製構造に格納されます。 確かに、MUMPSのグローバルにはわずかな違いがあり、構文が短縮されています。 MSHには短縮構文はありません。 ツリーのみの形式でデータを保存すると、データアクセスを統合できます。 任意のデータツリーを処理するプログラムを作成できます。 しかし、プログラムでは、多くの場合、さまざまな中間値を操作し、それらを効率的にツリーに保存する必要があります。 ツリーへのアクセスには、このアクセスをどのように最適化しても、常に追加コストがかかります。 MSHでは、データは木製構造と1次元配列の両方に保存できます。 任意のデータを保存できますが、中間データを1次元配列に保存することをお勧めします。 配列へのアクセスは、ツリーへのアクセスよりもはるかに高速です。 ツリーには、いわゆる放電データが保存されます。 つまり、既存の頂点のみがツリーに保存されます。 たとえば、ツリー[1] [5] [78]があります。 これらのピークのみがツリーに保存されます。 配列には、すべての中間値が格納されます。 たとえば、78ドルの配列に78個の要素を作成しました。 この配列のすべての要素は、78まで作成されます。ツリーを作成すると、空の配列も作成され、逆の場合も同様です。配列が作成されると、空のツリーも作成されます。 もちろん、これは現在のMSH実装に適用されますMUMPSの変数の可視性には独自の特性があります。 MUMPSの他の言語でグローバルと呼ばれるものは、データベースへのアクセスです。 しかし、ロケールは他の言語の変数に似ています。 まあ、グローバルでは、すべてが明確です。 これは外部データであり、このアプリケーションの任意のタスクと他のアプリケーションの両方から利用できます。 それらはファイルの形式で保存され、通常、1つのファイルに複数のグローバルが保存されます。 MSHでは、一般に、1つの点を除いてすべてが同じです。 各グローバルは個別のファイルに保存されます。 より正確には、同じディレクトリの複数のファイルに。 この点は、情報システム構築の技術的観点から重要です。 そしてもう一つの発言。 MSHのグローバルは、循環的に同期されます。 これは、追加の同期なしで異なるタスクから同時にアクセスできることを意味します。 次に、ロケールをより詳細に扱います。 一般に、MUMPSのロケールは、C言語の意味でのトップレベルのグローバル変数です。 MUMPSのC言語のヒープからの変数に類似しています。 しかし、C言語の自動変数に類似しています。 これらは、コマンドの形式に応じて、Newコマンドにリストされている(またはリストされていない)ロケールです。 NewコマンドからQuitブロック補完コマンドまでの、そのようなロケールの範囲。 もちろん、元の解決策は、MUMPSの性質とその中の変数宣言の不足によるものです。 私の意見では、ロケールのデフォルトのグローバルな範囲は、致命的ではありませんが、議論の余地がある決定です。 私が主にグローバルを直接操作するMUMPSでは、ローカル変数はそれほど多くなく、名前の競合は頻繁に発生しませんが、頻繁に発生します。 しかし、これはプログラミング時に便利ではありません。 MSHは別のアプローチを採用しています。 新しいものはここにはありません。 また、変数のローカライズには接頭辞が付きます。 プレフィックスが%の変数は、ジョブ内でローカライズされます。 ^ tmpで始まる変数は、アプリケーション内でローカライズされます。 これらのプレフィックスのない変数は、Doブロック内にローカライズされます。 これは、ツリーと配列に等しく適用されます。

オブジェクト

MUMPSにはオブジェクトがありません。 しかし、OOPはどこにでもあります。 現代のプログラミング言語の大部分は、何らかの方法でOOPをサポートしています。 MSHも例外ではありません。 OOPが存在するためには、言語にスターターのオブジェクトが必要です。 一般に、オブジェクトの記述は、宣言部と実装部で構成されます。 MSHは変数宣言をサポートしていません。つまり、オブジェクト記述の宣言部分はありません。 実装の一部として、MSHにオブジェクトの説明があります。 MUMPSでは、プログラムコードはプログラムモジュールの形式で表示されます。 モジュールのエントリポイントは、ルーチンと関数です。 ソフトウェアモジュールはMSHにあり、オブジェクト(クラス)の説明として使用されます。 モジュールラベルは、このモジュールのエントリポイントです。 この場合のエントリポイントは、このクラスのパブリックgetプロパティです。 このクラスのパブリックセットプロパティは、特定の文字で変更された場合と同じエントリポイントになります。 そのため、MSHではドット記号「。」が選択されています。 アクセスの取得と設定に加えて、MSHのプロパティには、Kill操作(プロパティの削除)もあります。 この場合、プロパティの名前は接頭辞「..」で変更されます。 MSHのクラス継承は複数であり、Extendコマンドを使用して実装されます。 このコマンドに順番にリストされているクラスは、このクラスの祖先です。 プログラムの実行中、オブジェクトプロパティにアクセスする場合、その説明は最初にソースモジュールで検索され、次にExtentコマンドにリストされているモジュールで順番に検索されます。 チーム内のモジュールの以前の位置は、より高い優先度を与えます。 保護されたプロパティは、このシステムプロパティを使用して実装されます。 MSHのオブジェクトは、ツリーにのみ存在できます。 配列に格納できるのはプリミティブデータ型のみで、クラスメソッドはクラスモジュールのエントリポイントでもあります。 オブジェクトは、standard%newプロパティを使用して作成されます(たとえば、Ageプロパティを持つPersonクラスがあります)。 クラスモジュールにはエントリポイント「年齢」と「。年齢」があります変数[1,2]でオブジェクトを作成しますSet [1,2]。%New = Person;レコードによってPersonオブジェクトのAgeプロパティにアクセスします。 2] .Age = 50; reading.SetでPersonオブジェクトのAgeプロパティにアクセスします。Set$ 1 = [1,2] .Age;これらのコマンドは、これらのコマンドをサブルーチンの呼び出しに変換します。 しかし、これはプロパティにアクセスする唯一の方法ではありません。 記録することにより、Ageプロパティは.Do [1,2] .Age(50)メソッドからもアクセスできます; MSHでは、モジュールは二重の役割を果たします。 クラスモジュールに加えて、プログラムモジュールとして解釈できます。 この場合、エントリポイントはサブプログラムと呼ばれます。 PersonモジュールにABCラベルがあるとします。 その後、それをプログラムとして参照できます。 確かに、この場合、%この変数は空になりますDo Person.ABC(125、D、25.6);したがって、クラスメソッドを整理できます。

イベント。

別の効果的なプログラミングパラダイムはイベントです。 原則として、プログラミング言語にはイベント処理ツールが含まれていません。 通常、標準ライブラリに配置されます。 MUMPSでは、イベント処理はまだ初期段階であり、エラー処理になります。 MSHでは、イベントは言語に含まれています。 イベントは、システムによって生成されたシステムの場合があります。 したがって、EventTrapコマンドを使用してユーザーが生成したユーザー。 このコマンドの引数はこのイベントのハンドラーに渡され、EventCallコマンドはプログラムをイベントハンドラーに割り当てます。 イベントが発生すると、現在のタスクが中断され、ハンドラープログラムが新しいDoブロックで実行されます。 この時点で、Doコマンドがこのハンドラーの呼び出しに会ったかのように。 これは、イベントハンドラーで実行中のプログラムのローカル変数が使用できないことを意味しますEventWaitコマンドは、現在のプログラムの実行を停止し、イベントが発生するのを待ちます。 イベントが発生すると、現在のプログラムは引き続き動作し、その時点から、渡された引数はプログラムで使用可能になります。 新しいDoブロックは作成されないため、EventCallおよびEventWaitコマンドが表示される前にイベントが発生した場合、このDoブロックのすべてのローカル変数はEventWaitコマンドの後に使用可能になります。 そのイベントは、最初に検出されたEventCallまたはEventWaitコマンドによって処理されます。 処理後、イベントは削除されます。 EventDeleteコマンドは、ハンドラーとともにイベントを削除します。



All Articles