ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

MUMPS好き好き。コミュのMUMPSとCache'(キャシエー)

  • mixiチェック
  • このエントリーをはてなブックマークに追加
インターシステムズ社が
http://www.intersystems.com
http://www.intersystems.co.jp
DSM(Digital Standard Mumps), MSM(Micronetics Standard Mumps),DTM(Datatree Standard Mumps) を買収し、ユーザ+ベンダーのMUMSP言語標準化(Standard)委員会(MUMPS Development Committee)の言語装備の縛り(ANSI/ISO/JIS)から(良かったか悪かったかは別にして)開放され、自社ISM(InterSystems Standard Mumps)/OpenMをベースに新たに Cache'(キャシエー)という名前でMUMSP資産を継承し(買収したMUMPSの互換にも配慮して)、オブジェクトデータベースとして変身をとげようとしてから6−7年になります。

1970代前半、コンピュータ自体が貴重な資源であった時代、TSS(Time Sharing System)で、処理+入出力+DB+(OS)を一体化したSimple簡易(ある意味でルーズなハードルの低い)言語としてMUMSPが誕生してから約35年が経ちます。

処理形態は集中から分散、Client(GUI)/Server、Web/Internetへ、DBではリレーショナルDB、オブジェクトDBへ、言語では、4GL、手続型、関数型などからオブジェクト型へ大きく変遷して来た中で、ニッチにしろMUMSPはよく生き残っていると思います。その理由、そのシンプルさだと思っています。

しかし、処理+入出力+DBを自前でやるMUMPSのシンプルさの利点が逆に弱点となり、外部との連携を難しくして来たのも事実だっと思います。

インターシステムズ社は、Client/Server時代に、VSM(ビズム)(Visual M)というCOM(ActiveX)で、VBとMUMPSとの連携をスマートに行いました。さらに、Internet時代に入ると、MUMPSの文字列処理の強さとHTMLのシンプルさ(文字列処理)、HTTPサーバのレイトバインディングとMUMPS言語のインタプリター性を組み合わせて、ダイナミックなWebアプリケーションが簡単に作れる Weblink/Weblink Developer(開発元http://www.mgateway.tzo.com )を提供しました。残念ながら、このすばらしいWeblink/Weblink Developerはインターシステムズ社ではレガシー化されています。

その後、製品はCache'(キャシエー)と改名され、DB(グローバル)のSQLマッピング、その成果としての外部からのMUMPS DBへのODBCアクセス、UNICODE対応、言語/DBのオブジェクト化、自社CSP(Cache' Server Page)等々、インターシステムズ社は開発の努力を続けて来ました。

特にDB/言語のオブジェト化は、それまでMUMSPの特徴、使いやすさの根本であった(同時に野放図なDB設計の元にもなる)DB宣言不要、メタデータなしという特徴を捨てて、メタ(Class,Property,Method等)情報の登録を前提とするオブジェクトDBへと大きく脱皮を図りました。確かに、メタ情報がないと外部との連携は難しいと思います。

こうした変化は、MUMPSのもつ良さを継承し残すために必要な進化だったと思いますがそのために、MUMPSのシンプルさは失われ、あるいは意図的に隠蔽され、言語、ツール、クラス等の全体システムが複雑になり、学習曲線が高くなてしまったように思えます。

簡単で柔軟で高速な階層構造DBも、(標準の)オブジェクトDBとして定義すると直接MUMPSのSETコマンドで実質的にはアクセス出来なくなります。オブジェクトDBが実MUMPS DB(グローバル)上でどうマッピング実装されているかの情報がインターシステムズ社の内部情報であり、バージョンアップ実装改良時の足かせになるためユーザには公開しないからです。

こうした簡易言語としてのMUMPSから、専門プログラマー向き(オブジェクト?)への方向性は、シンプルなMUMPSの良さ、エンドユーザ言語としてのMUMSPを知るものにとっては、考えさせられるところです。

MUMPSのシンプルさと、新しいCache'の機能をいかに有効に組み合わせて使うかという知恵が必要だと思います。

他の言語と差別化したCache'の良さ、これだ、と思わせるものは何か?
新しい利用者を得るための魅了は何か?
何でしょう?

コメント(3)

何でしょう?(笑)

私の希望は、MUMPSにSQLやオブジェクトの考え方を入れる(今のCache'の方向)のと同時に、Javaや.Netなどのプラットフォームや、PyhonやRuby、Perlなどのスクリプト言語にMUMPSの考え方(グローバル変数:DB)を取り入れてほしいと思います。

VisM(VBなど)やWebLink(Web)、m_php(php)では、MUMPS(グローバル変数)の柔軟さシンプルさを失わずに新しいツールと統合出来ているのですから・・・

オブジェクト指向の言語を使っても最後はRDBとのマッチングで苦労するらしいですから、いっそDBはMUMPSのグローバル変数を使えばいいと思うのですが・・・なにか問題ありますでしょうか?(笑)
Cache'データベースのクラスを定義する場合、
%Library.Persistent
という永続型クラスを継承させます。
スーパークラスPersistentは、メモリー上のインスタンスでなく、Close(インスタンス消去)しても、そのまなディスクに残るという意味で、要はDBですな。
しかし、当然メモリーインスタンスからDBへは %Saveメソッドを実行しないとだめです。
DBからメモリーインスタンスへ読み込む %Openメソッドや新規にDBインスタンスを作る(DBインスタンスのオブジェクトID=まあユニーク連番です=を採番する)%Newメソッドなど一連のDBアクセスのためのMethod,Property,Query,Parameterがすでに定義されています。
%Library.Persistentは、スーパークラス%RegisteredObjectを継承していて、インメモリーインスタンスの処理を行います。

%Library.Persistentスーパークラスには、StotageStratageというクラスキーワードがあり、DBに格納するときの方式(MUMPSのグローバルにどうインスタンスPropertyデータをマッピング格納するか)を決めます。

実DB(Persistent)クラスを定義する際、Storage(DB格納方法)を、これもスーパークラス
1) %Library.CacheStorage
2) %Library.CacheSQLStorage
3) %Library.CustomStorage
の3つから選びます。1)がデフォルト。

この選択がDBの構造、使い方、後の変更容易性・柔軟性、PureMUMPSからアクセスできるかを決めます。

1) CacheStorageは、Cache'おまかせで、Propertyの型(データ型、Single/Multi value、リストアレイ、キーワードアレイ、他のDBオブジェクトへのポインター=相手のオブジェクトIDをデータにもつ)により、$list関数(レコード構造体を文字ビット列に構成する関数)を使って複雑にネストしたレコード構造にした文字(バイナリー)列値をもつMUMPSのグロ−バルを作ってくれます。

DBのアクセスは、その格納構造を意識しなくてもよく、%Openでメモリーインスタンスにもってくると、そのメモリー参照オブジェクト oref.property でアクセス出来ます。 しかし、ここでは、PureMUMPSのコマンドでグローバルをアクセスすることはあきらめるしかなく、DB内部構造はブラックボックスです。クラスコンパイル時に生成されたMUMPSコード(InterSystems社)に頼るしかない世界です。
Cache'のクラス・スーパークラスは、基本的にクラスコンパイル時に、MUMSPコードを生成(Genereate)するジェネレーターの塊のようなもので、生成されたコードはPureMUMPSです(MUMSPをうまくラッピングしてますが実態はMUMPSです)。
この CacheStorage がデフォルトのStotageStratageで、MUMPSグローバルの設計は不要です。そのかわり、Propertyとそのタイプ、DB間リレーション、インデックス、パラメータ等は最初に相当正確に決めておかないと、DB内部構造がブラックボックだけに、一旦データベースが蓄えられだすと、DBだけに(Persistentなだけに)、その変更は厄介です。
プログラムクラスの柔軟性・再利用とDBオブジェクトの構造変更・柔軟性は違うもので、MUMPSグローバルの持っていた、DBの構造柔軟性は失われると考えていいし、MUMPSグローバルのシンプルさも利用者からみて無くなると考えていいと思います(InterSystems社はそれをフルに利用出来ますが)。
そのかわり、グローバル設計不要、グローバルアクセスコーディング不要、オブジェクト的シンタックス set oref.property="..." が可能、もちろんSQLアクセスも出来ます。
このメリット、デメリットをどう判断するかです。

2)の CacheSQLStorageは、Cache'の前身ISM/OpenM のMSQL(M=MUMPSグローバルのSQLマッピング)をべースにするものです。MSQLは、PureMUMPSで作ったグローバルを&SQL(sql文)マクロコマンド(これもPureMUMPSコードに展開される)で利用(コーディング)するためと、ODBCでMUMPS外部からグローバルをアクセスするために開発されたものです。
したがて、このStorage方式を採用すると、グローバルはPureMUMPSベースですので、自分でMUMPSグローバルの設計を行い、アクセスも出来ます。MUMPSグローバルをSQLやオブジェクトとしてみせるために、MUMPSグローバルの構造(メタ)データをStorageマップ情報として登録する作業が必要となります(この作業、1)では不要。Cache'が決めている、たぶん最適に)。
しかし、これを使えば、オブジェクトアクセス、SQLアクセスに加え、PureMUMPSアクセスが可能になります。
残念なことに、Cache'5以降では、1) CacheStorage がデフィルトというより、それが前提という感じで、2)の CacheSQLStorage はレガシー化させようというInterSystems社の意向が見えます。2) で一番厄介な、Storageマップ情報の登録方法やそのドキュメントが、ISM/OpenM の時代のMSQLではそれがメインであったのに、Cache'5以降、意図的か隠され見えにくくなって来ています。

3) CustomStorageは、%New,%Open,%Saveや、DBデータ(ポインター)から他DBデータ読み込み(Swizzling)、データバリデート(チェック)等全てのMethodを自前のMUMPSコードで書くタイプです(提供スーパークラスの助けなし)。MUMPS時代からCache'オブジェクトへの移行時にユーザが最後に何でも**やれば**出来る方式を用意くれたのでしょう(この考えすばらしいです)。

つーさん、したがって、PureMUMPSでのグローバルアクセスを行いたい場合は、2),3)しかないが、SQL(ODBC)アクセスを考えると、2)しかありません。

2)のメリットは、DBグローバルが自分でコントロール出来、MUMPSグローバルのシンプルさ、柔軟性が享受できること、最適化が必要な場合、PureMUMPSで性能をあげられることです。

1)も2)もオブジェクトシンタックスでDBアクセスが出来ますが、その生成されたコードを見ると PureMUMPS で set name=^AAA(ID,"Name") でアクセスできるのに、コードは約10-100倍大きくなりオーバーヘッドがあります。それは当然で、まず、DBのオブジェクトIdを得て、%Open でメモリインスタンスに展開し("Name"しかいらないのにそのオブジェクトIdのデータが全部(リファレンスオブジェクトIdのデータは除く)もってこられる)、そこで、set name=oref.Name でさらに展開コードが走る。簡単なテストで、PureMUMPSとオブジェクトアクセスは場合により100倍ぐらいの差出る。

当然、クラスの実装内部構造を隠蔽し、アクセス制限を行うオブジェクト志向は賛成だが、ことDBオブジェクトとその性能に関しては、2)は、業務性能の最適化のために必要な場合、DBアクセスのPureMUMPSコードで書けば高速化が可能という選択枝がある、また、グローバル構造がホワイトボックスなので、開発者から見るととても心強く安心感がある。さらに、ベースが MSQLなので、&SQL( )でデータが取れる(READ)。このSQLアクセスは、MUMPSグローバルの構造を知らなくても、ロジカルにグローバルデータが取れる。READ時は登録時のバリデーションがいらないので&SQL() で十分で、オブジェクトのインスタンスを作らないので性能もいい(簡単なテストでSQLアクセスはオブジェクトより3倍SEQが早い、当然PureMUMPSがもっと早いが)。
READ時はSQLで、WEITE時には、バリデーションがいるし、インデックスの整合性配慮もいるので、オブジェクトを使う。これが、前回スレの知恵の一端です。

デメリットは、オブジェクトDBの戦略のため、Intersytems社がそれをオブソリート化していることです。

WebアプリとDBオブジェクト(リレーションナルDBでも同じですが)とは相性的に難点があります。
セッションレス・ステートレスのWebアプリの場合、オブジェクトを使うと、セッション毎、DBオブジェクトのOpen・Closeを行う必要があり、無駄が多い。
DBオブジェクトをセッション継続領域(ステートあり)でもつと同オブジェクトがロックされた状態のままとなる。また、利用者はブラウザーxボタンで終了した場合、それを早く検知する方法を作っておかないとロックがかかりぱなしとなる等々。


最近読んでいる本で、

軽快なJava

http://www.amazon.co.jp/exec/obidos/ASIN/487311201X/250-5666742-8066612

があり、面白いです。

複雑巨大なエンタープライズフレームワークとの付き合いがつらくて、Java嫌いになりそうな人や、今のJavaの世界に面倒で重苦しいものの気配を感じていてJavaを敬遠している人びとに、涼しい酸素の深呼吸をプレゼントする。

とあります。

Cache'もJava・.NETフレームワークの方向にあり、面倒で重苦しいものを少し感じています。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

MUMPS好き好き。 更新情報

MUMPS好き好き。のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング