[BACK]Return to genkou19991125.tex CVS log [TXT][DIR] Up to [local] / OpenXM / doc

Annotation of OpenXM/doc/genkou19991125.tex, Revision 1.120

1.1       tam         1: \documentclass{jarticle}
                      2:
1.120   ! tam         3: %% $OpenXM: OpenXM/doc/genkou19991125.tex,v 1.119 2000/01/05 14:12:05 tam Exp $
1.51      ohara       4:
1.52      tam         5: \usepackage{jssac}
                      6:
1.94      ohara       7: \title{OpenXM プロジェクトの現状について}
1.67      tam         8: \author{奥 谷   行 央\affil{神戸大学大学院自然科学研究科}
                      9:                \mail{okutani@math.sci.kobe-u.ac.jp}
                     10:   \and 小 原   功 任\affil{金沢大学理学部}
1.53      tam        11:                \mail{ohara@kappa.s.kanazawa-u.ac.jp}
1.67      tam        12:   \and 高 山   信 毅\affil{神戸大学理学部}
1.53      tam        13:                \mail{takayama@math.sci.kobe-u.ac.jp}
1.67      tam        14:   \and 田 村   恭 士\affil{神戸大学大学院自然科学研究科}
1.52      tam        15:                \mail{tamura@math.sci.kobe-u.ac.jp}
1.67      tam        16:   \and 野 呂   正 行\affil{富士通研究所}
                     17:                \mail{noro@para.flab.fujitsu.co.jp}
                     18:   \and 前 川   将 秀\affil{神戸大学理学部}
                     19:                \mail{maekawa@math.sci.kobe-u.ac.jp}
1.1       tam        20: }
1.89      tam        21: \art{}
1.1       tam        22:
                     23: \begin{document}
                     24: \maketitle
                     25:
1.30      ohara      26: \section{OpenXMとは}
                     27:
1.90      ohara      28: OpenXM は数学プロセス間でメッセージを交換するための規約である.  数学プロ
                     29: セス間でメッセージをやりとりすることにより, ある数学プロセスから他の数学
                     30: プロセスを呼び出して計算を行なったり, 他のマシンで計算を行なわせたりする
                     31: ことが目的である.  なお, OpenXM とは Open message eXchange protocol for
1.100     ohara      32: Mathematics の略である.  OpenXM の開発の発端は野呂と高山により, asir と
1.90      ohara      33: kan/sm1 を相互に呼び出す機能を実装したことである.
                     34:
                     35: 初期の実装では, 相手側のローカル言語の文法に従った文字列を送っていた.
                     36: この方法では相手側のソフトが asir なのか kan/sm1 なのかを判別するなどし
                     37: て, 相手側のローカル言語の文法に合わせた文字列を作成しなければならない.
                     38: このローカル言語の文法に従った文字列を送る方法は, 効率的であるとはいい難
                     39: いが, 使いやすいとも言える.
                     40:
                     41: 現在の OpenXM 規約では共通表現形式によるメッセージを用いている.  上記の
                     42: 文字列を送る方法の利点を生かすため, OpenXM 規約では共通表現形式の中の文
                     43: 字列として, ローカル言語の文法に従った文字列を用いたメッセージの交換も可
                     44: 能となっている.
                     45:
1.100     ohara      46: OpenXM 規約では通信の方法に自由度があるが, 現在のところは TCP/IP を用い
                     47: た通信しか実装されていない.
                     48: \footnote{ただし asir には MPI を用いた実装もある.}
                     49: そこで, この論文では TCP/IP を用いた実装に準拠してOpenXM の説明をする.
1.97      tam        50:
1.88      tam        51:
1.116     tam        52: \section{OpenXM のメッセージの構造}\label{sec:messages}
1.30      ohara      53:
1.90      ohara      54: 通信の方法によってメッセージの構造は変わる.  この論文では TCP/IP の場合
                     55: についてのみ説明を行なう.
1.61      tam        56:
1.90      ohara      57: OpenXM 規約で規定されているメッセージはバイトストリームとなっており, 次
                     58: のような構造になっている.
1.94      ohara      59: \begin{center}
1.50      ohara      60: \begin{tabular}{|c|c|}
                     61: \hline
1.100     ohara      62: ヘッダ & \hspace{10mm} ボディ \hspace{10mm} \\
1.50      ohara      63: \hline
1.36      tam        64: \end{tabular}
1.94      ohara      65: \end{center}
1.90      ohara      66: ヘッダの長さは 8 バイトであると定められている.  ボディの長さはメッセージ
                     67: ごとに異なっているが, 長さは $0$ でもよい.
1.38      tam        68:
1.82      tam        69: ヘッダは次の二つの情報を持っている.
1.30      ohara      70: \begin{enumerate}
1.90      ohara      71: \item
1.100     ohara      72: 前半の 4 バイト.  メッセージの種類を表す識別子であり, タグと呼ばれる.
1.90      ohara      73: \item
1.100     ohara      74: 後半の 4 バイト.  メッセージにつけられた通し番号である.
1.30      ohara      75: \end{enumerate}
1.82      tam        76: それぞれの 4 バイトは 32 ビット整数とみなされて扱われる.
1.88      tam        77:
1.90      ohara      78: この場合に用いられる 32 ビット整数の表現方法について説明しておこう.  問
                     79: 題になるのは負数の表現とバイトオーダーの問題である.  まず, 負数を表す必
                     80: 要があるときには2の補数表現を使うことになっている.  次にバイトオーダーで
                     81: あるが, OpenXM 規約は複数のバイトオーダーを許容する.  ただし一つの通信路
1.100     ohara      82: ではひとつのバイトオーダーのみが許され, 通信路の確立時に一度だけ選ばれる.
1.88      tam        83:
                     84: 現在のOpenXM 規約では, タグ(整数値)として以下のものが定義されている.
1.45      tam        85:
                     86: \begin{verbatim}
1.100     ohara      87: #define        OX_COMMAND               513
                     88: #define        OX_DATA                  514
                     89: #define OX_SYNC_BALL             515
                     90: #define OX_DATA_WITH_LENGTH      521
                     91: #define OX_DATA_OPENMATH_XML     523
                     92: #define OX_DATA_OPENMATH_BINARY  524
                     93: #define OX_DATA_MP               525
1.45      tam        94: \end{verbatim}
1.30      ohara      95:
1.90      ohara      96: ボディの構造はメッセージの種類によって異なる.  OX\_COMMAND で識別される
                     97: メッセージはスタックマシンへの命令であり, それ以外のメッセージは何らかの
                     98: オブジェクトを表している.  この論文では OX\_DATA と OX\_COMMAND で識別さ
                     99: れるメッセージについてのみ, 説明する.
1.50      ohara     100:
1.82      tam       101: 既存のメッセージでは対応できない場合は, 新しい識別子を定義することで新し
1.100     ohara     102: い種類のメッセージを作成することができる.  この方法は各数学ソフトウェア
                    103: の固有の表現を含むメッセージを作成したい場合などに有効である.  新しい識
                    104: 別子の定義方法については, \cite{OpenXM-1999} を参照すること.
1.42      tam       105:
1.88      tam       106:
1.42      tam       107: \section{OpenXM の計算モデル}
                    108:
1.100     ohara     109: OpenXM 規約での計算とはメッセージを交換することである.  また, OpenXM 規
1.82      tam       110: 約ではクライアント・サーバモデルを採用しているので, メッセージの交換はサー
1.98      tam       111: バとクライアントの間で行なわれる.
1.100     ohara     112: \footnote{現在, 主に野呂が OpenXM の計算モデルの拡張を考えている.  効率
                    113: 的な分散計算のアルゴリズムの多くはサーバ同士の通信も要求するからである.}
                    114: クライアントからサーバへメッセージを送り, クライアントがサーバからメッセー
                    115: ジを受け取ることによって計算の結果が得られる.  このメッセージのやりとり
                    116: はクライアントの主導で行われる.  つまり, クライアントは自由にメッセージ
                    117: をサーバに送付してもよいが, サーバからは自発的にメッセージが送付されるこ
                    118: とはない.  この原理はサーバはスタックマシンであることで実現される.  スタッ
                    119: クマシンの構造については \ref{sec:oxsm} 節で述べる.
1.70      ohara     120:
                    121: サーバがクライアントから受け取ったオブジェクト(つまり OX\_COMMAND でない
1.100     ohara     122: メッセージのボディ)はすべてスタックに積まれる.  スタックマシンへの命令
1.70      ohara     123: (OX\_COMMAND で識別されるメッセージのボディ)を受け取ったサーバは命令に対
1.100     ohara     124: 応する動作を行なう.  このとき, 命令によってはスタックからオブジェクトを
                    125: 取り出すことがあり, また(各数学システムでの)計算結果をスタックに積むこと
                    126: がある.  もし, 与えられたデータが正しくないなどの理由でエラーが生じた場
                    127: 合にはサーバはエラーオブジェクトをスタックに積む.  計算結果をクライアン
                    128: トが得る場合にはスタックマシンの命令 SM\_popCMO または SM\_popString を
                    129: サーバに送らなければならない.  これらの命令を受け取ってはじめて, サーバ
                    130: からクライアントへメッセージが送られる.
1.50      ohara     131:
1.90      ohara     132: まとめると, クライアントがサーバへメッセージを送り, 計算の結果を得るとい
                    133: う手順は以下のようになる.
1.3       tam       134:
                    135: \begin{enumerate}
1.90      ohara     136: \item
                    137: まず, クライアントがサーバへオブジェクトを送る.  サーバは送られてきたオ
                    138: ブジェクトをスタックに積む.
                    139: \item
                    140: クライアントがサーバに計算の命令を送ると, サーバはあらかじめ定めれらた動
1.100     ohara     141: 作を行う.  一部の命令はスタックの状態を変更する.  例えば
1.90      ohara     142: SM\_executeFunction, \\ SM\_executeStringByLocalParser などの命令は, ス
1.100     ohara     143: タック上のオブジェクトから計算を行う.  SM\_popCMO もしくは SM\_popString
1.90      ohara     144: は, スタックの最上位のオブジェクトを取りだし, クライアントに送り返す.
1.4       tam       145: \end{enumerate}
1.2       tam       146:
1.82      tam       147:
1.73      ohara     148: \section{OpenXM スタックマシン}\label{sec:oxsm}
1.68      ohara     149:
1.100     ohara     150: OpenXM 規約ではサーバはスタックマシンであると定義している.  以下, OpenXM
                    151: スタックマシンと呼ぶ.  この節ではOpenXM スタックマシンの構造について説明
1.82      tam       152: しよう.
                    153:
                    154: まず, OpenXM 規約は通信時にやりとりされる共通のデータ形式については規定
                    155: するが, OpenXM スタックマシンがスタックに積む, オブジェクトの構造までは
1.100     ohara     156: 規定しない.  つまり, オブジェクトの構造は各数学システムごとに異なってい
                    157: るということである.  このことは通信路からデータを受け取った際に, 各数学
                    158: システムが固有のデータ構造に変換してからスタックに積むことを意味する.
                    159: この変換は1対1対応である必要はない.  もちろん, 恣意的に変換してよいわけ
                    160: ではなく, 数学システムごとに変換方法をあらかじめ定めておく必要がある.
                    161: このような共通のデータ形式と各システムでの固有のデータ形式との変換の問題
                    162: は OpenXM に限ったことではない.  OpenMath (\ref{sec:other} 節を参照のこ
                    163: と) ではこの変換を行うソフトウェアを Phrasebook と呼んでいる.
                    164:
                    165: 次に OpenXM スタックマシンの命令コードについて説明する.  OpenXM スタック
                    166: マシンにおけるすべての命令は 4 バイトの長さを持つ.  OpenXM 規約の他の規
                    167: 定と同様に, 4 バイトのデータは32ビット整数と見なされるので, この論文でも
                    168: その表記にしたがう.  OpenXM スタックマシンに対する命令はスタックに積まれ
                    169: ることはない.  現在のところ, OpenXM 規約では以下の命令が定義されている.
1.68      ohara     170:
                    171: \begin{verbatim}
1.69      tam       172: #define SM_popSerializedLocalObject               258
                    173: #define SM_popCMO                                 262
                    174: #define SM_popString                              263
                    175: #define SM_mathcap                                264
                    176: #define SM_pops                                   265
                    177: #define SM_setName                                266
                    178: #define SM_evalName                               267
1.100     ohara     179: #define SM_executeStringByLocalParser             268
1.69      tam       180: #define SM_executeFunction                        269
                    181: #define SM_beginBlock                             270
                    182: #define SM_endBlock                               271
                    183: #define SM_shutdown                               272
                    184: #define SM_setMathCap                             273
                    185: #define SM_executeStringByLocalParserInBatchMode  274
                    186: #define SM_getsp                                  275
                    187: #define SM_dupErrors                              276
                    188: #define SM_DUMMY_sendcmo                          280
                    189: #define SM_sync_ball                              281
                    190: #define SM_control_kill                          1024
                    191: #define SM_control_to_debug_mode                 1025
                    192: #define SM_control_exit_debug_mode               1026
                    193: #define SM_control_ping                          1027
                    194: #define SM_control_start_watch_thread            1028
                    195: #define SM_control_stop_watch_thread             1029
                    196: #define SM_control_reset_connection              1030
1.68      ohara     197: \end{verbatim}
                    198:
1.100     ohara     199: スタックマシンに対する命令の中には実行によって結果が返ってくるものがある.
                    200: 結果が返ってくる命令を実行した場合, サーバはその結果をスタックに積む.
1.90      ohara     201: たとえば, 命令 SM\_executeStringByLocalParser はスタックに積まれているオ
                    202: ブジェクトをサーバ側のローカル言語の文法に従った文字列とみなして計算を行
                    203: なうが, 行なった計算の結果はスタックに積まれる.
1.81      ohara     204:
1.82      tam       205: なお, 命令の実行中にエラーが起こり, 結果が得られなかった場合には,
                    206: エラーオブジェクトがスタックに積まれる.
1.75      tam       207:
1.73      ohara     208: \section{CMO のデータ構造}\label{sec:cmo}
1.4       tam       209:
1.82      tam       210: OpenXM 規約では, 数学的オブジェクトを表現する方法として CMO 形式(Common
1.100     ohara     211: Mathematical Object format)を定義している.  この CMO 形式にしたがったデー
1.82      tam       212: タは, 識別子が OX\_DATA であるようなメッセージのボディになることを想定し
                    213: ている.
1.68      ohara     214:
1.82      tam       215: CMO 形式におけるデータ構造は次のような構造をもつ.
1.94      ohara     216: \begin{center}
                    217: \begin{tabular}{|c|c|}
                    218: \hline
                    219: ヘッダ        & \hspace{10mm} ボディ \hspace{10mm} \\
                    220: \hline
1.72      tam       221: \end{tabular}
1.94      ohara     222: \end{center}
1.100     ohara     223: ヘッダは4バイトである.  ボディの長さはそれぞれのデータによって異なるが,
1.82      tam       224: 0でもよい.
1.68      ohara     225:
1.100     ohara     226: メッセージと同様にヘッダは4バイト単位に管理される.  すなわち, CMO では
                    227: ヘッダは一つだけの情報を含む.  この4バイトのヘッダのことをタグともいう.
                    228: さて, CMO では, タグによってボディの論理的構造が決定する.  すなわち, タ
                    229: グはそれぞれのデータ構造と1対1に対応する識別子である.  それぞれの論理的
                    230: 構造は\cite{OpenXM-1999} に詳述されている.  現在の OpenXM 規約では以下の
                    231: CMO が定義されている.
1.30      ohara     232:
1.47      tam       233: \begin{verbatim}
1.94      ohara     234: #define CMO_ERROR2                         0x7f000002
                    235: #define CMO_NULL                           1
                    236: #define CMO_INT32                          2
                    237: #define CMO_DATUM                          3
                    238: #define CMO_STRING                         4
                    239: #define CMO_MATHCAP                        5
                    240: #define CMO_ARRAY                          16
                    241: #define CMO_LIST                           17
                    242: #define CMO_ATOM                           18
                    243: #define CMO_MONOMIAL32                     19
                    244: #define CMO_ZZ                             20
                    245: #define CMO_QQ                             21
                    246: #define CMO_ZERO                           22
                    247: #define CMO_DMS_GENERIC                    24
                    248: #define CMO_DMS_OF_N_VARIABLES             25
                    249: #define CMO_RING_BY_NAME                   26
                    250: #define CMO_RECURSIVE_POLYNOMIAL           27
                    251: #define CMO_LIST_R                         28
                    252: #define CMO_INT32COEFF                     30
                    253: #define CMO_DISTRIBUTED_POLYNOMIAL         31
                    254: #define CMO_POLYNOMIAL_IN_ONE_VARIABLE     33
                    255: #define CMO_RATIONAL                       34
1.74      tam       256: #define CMO_64BIT_MACHINE_DOUBLE           40
                    257: #define CMO_ARRAY_OF_64BIT_MACHINE_DOUBLE  41
                    258: #define CMO_128BIT_MACHINE_DOUBLE          42
                    259: #define CMO_ARRAY_OF_128BIT_MACHINE_DOUBLE 43
1.94      ohara     260: #define CMO_BIGFLOAT                       50
                    261: #define CMO_IEEE_DOUBLE_FLOAT              51
                    262: #define CMO_INDETERMINATE                  60
                    263: #define CMO_TREE                           61
                    264: #define CMO_LAMBDA                         62
1.47      tam       265: \end{verbatim}
1.72      tam       266:
1.75      tam       267: この中で CMO\_ERROR2, CMO\_NULL, CMO\_INT32, CMO\_DATUM, CMO\_STRING,
                    268: CMO\_MATHCAP, CMO\_LIST で識別されるオブジェクトは最も基本的なオブジェ
1.82      tam       269: クトであって, すべての OpenXM 対応システムに実装されていなければならない.
1.48      tam       270:
1.94      ohara     271: これらについての解説を行う前に記法について, 少し説明しておく.  この論文
1.100     ohara     272: では, 大文字で CMO\_INT32 と書いた場合には, 上記で定義した識別子を表す.
                    273: また CMO\_INT32 で識別されるオブジェクトのクラス(あるいはデータ構造) を
1.94      ohara     274: cmo\_int32 と小文字で表すことにする.
1.82      tam       275:
1.100     ohara     276: さて cmo を表現するための一つの記法を導入する.  この記法は CMO expression
                    277: と呼ばれている.  その正確な形式的定義は \cite{OpenXM-1999} を参照すること.
1.82      tam       278:
1.94      ohara     279: CMO expssion は Lisp 風表現の一種で, cmo を括弧で囲んだリストとして表現
1.100     ohara     280: する.  それぞれの要素はカンマで区切る.  例えば,
1.73      ohara     281: \begin{quote}
                    282: (17, {\sl int32}, (CMO\_NULL), (2, {\sl int32} $n$))
                    283: \end{quote}
1.100     ohara     284: は CMO expression である.  ここで, 小文字の斜体で表された``{\sl int32}''
                    285: は 4 バイトの任意のデータを表す記号であり, ``{\sl int32} $n$'' は同じく
                    286: 4 バイトのデータであるが以下の説明で $n$ と表すことを示す.  また数字 17,
                    287: 2 などは 4 バイトのデータで整数値としてみたときの値を意味する.  CMO\_NULL
                    288: は識別子(すなわち数字 1 と等価)である.  この記法から上記のデータは 20 バ
1.94      ohara     289: イトの大きさのデータであることが分かる.  なお, CMO expression は単なる表
                    290: 記法であることに特に注意してほしい.
1.81      ohara     291:
1.90      ohara     292: さて, この記法のもとで cmo\_int32 を次のデータ構造であると定義する.
1.73      ohara     293: \begin{quote}
1.81      ohara     294: cmo\_int32 := (CMO\_INT32,  {\sl int32})
1.73      ohara     295: \end{quote}
1.82      tam       296: 同様に, cmo\_null, cmo\_string, cmo\_list, cmo\_mathcap のシンタッ
                    297: クスは次のように定義される.
1.81      ohara     298: \begin{quote}
                    299: cmo\_null := (CMO\_NULL) \\
                    300: cmo\_string := (CMO\_STRING, {\sl int32} $n$, {\sl string} $s$) \\
                    301: cmo\_list := (CMO\_LIST, {\sl int32} $m$, {\sl cmo} $c_1$, $\ldots$,
                    302: {\sl cmo} $c_m$) \\
                    303: cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
                    304: \end{quote}
1.100     ohara     305: ただし, {\sl string}は適当な長さのバイト列を表す.  $s$ のバイト長は $n$
1.82      tam       306: と一致することが要求される.
1.76      tam       307:
1.50      ohara     308: \section{mathcap について}
1.30      ohara     309:
1.82      tam       310: OpenXM 規約では, 通信時に用いられるメッセージの種類を各ソフトウェアが制
1.100     ohara     311: 限する方法を用意している.  これは各ソフトウェアの実装によってはすべての
                    312: メッセージをサポートするのが困難な場合があるからである.  また, 各ソフト
                    313: ウェアでメッセージの種類を拡張したい場合にも有効である.  この制限(あるい
                    314: は拡張) は mathcap と呼ばれるデータ構造によって行われる.  この節では
                    315: mathcap のデータ構造と, 具体的なメッセージの制限の手続きについて説明する.
1.82      tam       316:
1.94      ohara     317: まず, 手続きについて説明しよう.
1.82      tam       318:
1.100     ohara     319: 第一にサーバの機能を制限するには次のようにする.  クライアントが mathcap
                    320: オブジェクトをサーバへ送ると, サーバは受け取ったmathcap をスタックに積む.
1.82      tam       321: 次にクライアントが命令 SM\_setMathCap を送ると, サーバはスタックの最上位
                    322: に積まれている mathcap オブジェクトを取り出し, mathcap で設定されていな
                    323: いメッセージをクライアントへ送らないように制限を行う.
                    324:
1.100     ohara     325: 第二にクライアントを制限するには次のようにする.  まず, クライアントがサー
                    326: バに命令 SM\_mathcap を送ると, サーバは mathcap オブジェクトをスタックに
                    327: 積む.  さらに命令 SM\_popCMO を送ると, サーバはスタックの最上位のオブジェ
                    328: クト(すなわち mathcap オブジェクト)をボディとするメッセージをクライアン
                    329: トに送付する.  クライアントはそのオブジェクトを解析して, 制限をかける.
1.50      ohara     330:
1.82      tam       331: 次に mathcap のデータ構造について説明する.
1.90      ohara     332: mathcap は cmo の一種であるので, すでに説明したように
                    333: \begin{quote}
                    334: cmo\_mathcap := (CMO\_MATHCAP, {\sl cmo\_list})
                    335: \end{quote}
                    336: の構造をもつ(\ref{sec:cmo} 節を参照のこと).
1.82      tam       337: ボディは cmo\_list オブジェクトでなければならない.
1.67      tam       338:
1.90      ohara     339: さて, mathcap オブジェクトのボディの cmo\_list オブジェクトは以下の条件
                    340: を満たすことを要求される.  まず, その cmo\_list オブジェクトは少なくとも
                    341: リスト長が 3 以上でなければならない.
1.77      tam       342: \begin{quote}
1.90      ohara     343: (CMO\_LIST, {\sl int32}, {\sl cmo} $a$, {\sl cmo} $b$, {\sl cmo} $c$, $\ldots$)
1.77      tam       344: \end{quote}
1.56      tam       345:
1.100     ohara     346: 第一要素 $a$ はまた cmo\_list であり, リスト長は 4 以上, $a_1$ は
                    347: cmo\_int32 でバージョンを表す.  $a_2$, $a_3$, $a_4$ は cmo\_string であ
                    348: り, それぞれ数学システムの名前, バージョン, HOSTTYPE を表すことになって
                    349: いる.
1.77      tam       350: \begin{quote}
1.81      ohara     351: (CMO\_LIST, {\sl int32},
                    352: {\sl cmo\_int32} $a_1$, {\sl cmo\_string} $a_2$, {\sl cmo\_string}
                    353: $a_3$, {\sl cmo\_string} $a_4$, $\ldots$)
1.77      tam       354: \end{quote}
1.56      tam       355:
1.94      ohara     356: 第二要素 $b$ も cmo\_list であり, OpenXM スタックマシンを制御するために
                    357: 用いられる.  各 $b_i$ は cmo\_int32 であり, ボディはスタックマシンの命令
                    358: コードである.  \ref{sec:oxsm} 節で説明したが, スタックマシンへの命令はす
                    359: べて {\sl int32} で表されていたことに注意しよう.
1.77      tam       360: \begin{quote}
1.90      ohara     361: (CMO\_LIST, {\sl int32} $n$,
1.94      ohara     362: {\sl cmo\_int32} $b_1$, $\ldots$, {\sl cmo\_int32} $b_n$)
1.77      tam       363: \end{quote}
1.58      tam       364:
1.94      ohara     365: 第三要素 $c$ は以下のような cmo\_list であり, オブジェクトの送受信を制御
1.100     ohara     366: するために用いられる.  送受信の制御はメッセージの種類ごとに行われる.
1.77      tam       367: \begin{quote}
1.100     ohara     368: (CMO\_LIST, {\sl int32} $m$, {\sl cmo\_list} $\ell_1$, $\ldots$,
1.94      ohara     369: {\sl cmo\_list} $\ell_m$)
1.77      tam       370: \end{quote}
1.94      ohara     371: 各 $\ell_i$ が制御のための情報を表す.  どの $\ell_i$ も一つ以上の要素を
                    372: 持っており, 第一要素は必ず cmo\_int32 となっていなければならない.  これ
                    373: は制御すべきメッセージの識別子を入れるためである.
                    374:
1.100     ohara     375: 各 $\ell_i$ の構造はメッセージの種類によって異なる.  ここでは, OX\_DATA
                    376: の場合についてのみ説明する.  第一要素が OX\_DATA の場合, リスト $\ell_i$
1.94      ohara     377: は以下のような構造となっている.  各 $c_i$ は cmo\_int32 であり, そのボディ
                    378: は CMO の識別子である.  $c_i$ で指示された CMO のみが送受信することを許
                    379: される.
1.79      tam       380: \begin{quote}
1.93      tam       381: (CMO\_LIST, 2, (CMO\_INT32, OX\_DATA), \\
1.100     ohara     382: \ \ (CMO\_LIST, {\sl int32} $k$, {\sl cmo\_int32} $c_1$,
1.94      ohara     383: $\ldots$, {\sl cmo\_int32} $c_k$))
1.79      tam       384: \end{quote}
1.50      ohara     385:
1.90      ohara     386: 具体的な mathcap の例をあげよう.  名前が ``ox\_test'', バージョンナンバー
1.94      ohara     387: が 199911250 のサーバで, Linux 上で動いており, このサーバのスタックマシ
                    388: ンが命令 SM\_popCMO, SM\_popString, SM\_mathcap,
1.100     ohara     389: SM\_executeStringByLocalParser を利用可能で, かつ オブジェクトを
                    390: cmo\_int32, cmo\_string, cmo\_mathcap, cmo\_list のみに制限したいときの
1.94      ohara     391: mathcap は
1.91      tam       392: \begin{quote}
1.95      tam       393: (CMO\_MATHCAP, (CMO\_LIST, 3, \\
1.94      ohara     394: $\quad$ (CMO\_LIST, 4, (CMO\_INT32, $199911250$), (CMO\_STRING, 7, ``ox\_test''), \\
                    395: $\qquad$ (CMO\_STRING, 9, ``199911250''), (CMO\_STRING, 4, ``i386'')) \\
                    396: $\quad$ (CMO\_LIST, $5$, (CMO\_INT32, SM\_popCMO), \\
                    397: $\qquad$ (CMO\_INT32, SM\_popString), (CMO\_INT32, SM\_mathcap), \\
                    398: $\qquad$ (CMO\_INT32, SM\_executeStringByLocalParser)) \\
                    399: $\quad$ (CMO\_LIST, $1$, (CMO\_LIST, $2$, (CMO\_INT32, OX\_DATA), \\
                    400: $\qquad$ (CMO\_LIST, $4$, (CMO\_INT32, CMO\_INT32), \\
                    401: $\qquad\quad$ (CMO\_INT32, CMO\_STRING), (CMO\_INT32, CMO\_MATHCAP), \\
1.95      tam       402: $\qquad\quad$ (CMO\_INT32, CMO\_LIST))))))
1.79      tam       403: \end{quote}
1.91      tam       404: になる.
1.31      tam       405:
                    406:
                    407: \section{セキュリティ対策}
                    408:
1.100     ohara     409: OpenXM 規約は TCP/IP を用いて通信を行うことを考慮している.  したがって
                    410: ネットワークによって接続される現代の多くのソフトウェアと同様, OpenXM 規
                    411: 約もまた通信時のセキュリティについて注意している.  以下, このことについ
                    412: て説明しよう.
1.82      tam       413:
1.90      ohara     414: 第一に OpenXM では侵入者に攻撃の機会をできるだけ与えないようにするため,
                    415: サーバは接続が必要になった時のみ起動している.  しかし, これだけでは接続
                    416: を行なう一瞬のすきを狙われる可能性もある.  そこで接続を行なう時に, 接続
                    417: を行なうポート番号を毎回変えている.  こうすることで, 特定のポート番号を
                    418: 狙って接続を行なう手口を防ぐことができる.
                    419:
                    420: さらにもう一段安全性を高めるために, 接続時に一時パスワードをクライアント
                    421: が作成し, そのパスワードを使って認証を行なう.  このパスワードは一旦使用
                    422: されれば無効になるので, もし仮になんらかの手段でパスワードが洩れたとして
                    423: も安全である.
                    424:
                    425: なお, メッセージ自体には特に暗号化などの処置を行っていないので, そのまま
1.100     ohara     426: ではパケット盗聴などを受ける可能性がある.  現在の実装では, 必要ならば
1.90      ohara     427: ssh を利用して対応している.
1.80      tam       428:
1.31      tam       429:
1.100     ohara     430: \section{OpenXM 以外のプロジェクト}\label{sec:other}
1.31      tam       431:
1.100     ohara     432: OpenXM 以外にも数式処理システム間の通信や数学データの共通表現を目指した
                    433: プロジェクトは存在する.  ここでは他のプロジェクトについても触れておこう.
1.31      tam       434:
1.66      tam       435: \begin{itemize}
1.90      ohara     436: \item ESPRIT OpenMath Project
1.31      tam       437:
1.90      ohara     438: http://www.openmath.org/omsoc/
1.85      tam       439:
1.100     ohara     440: 数学的対象の SGML 的表記の標準化を目指した大規模なプロジェクト.  このプ
                    441: ロジェクトでは数学データを数学的意味を保ったままで如何に表現すべきかとい
                    442: う問題を追求している.  したがって既存の表現, 例えば \TeX による数式の表
                    443: 現と OpenMath による数式の表現とでは, 本質的に意味が異なる.  OpenMath で
                    444: 定義された表現は, 異なる種類の数式処理システムの間で情報を交換するときに
                    445: 利用することができる.  しかしながら, 数学システム同士の通信, 例えばある
                    446: 数学システムから別の数学システムを呼び出して計算させる方法などは, このプ
1.118     tam       447: ロジェクトの対象外である. OpenXM における共通データ形式と数学システム固
                    448: 有のオブジェクトとの変換は OpenMath 規約の Phrasebook と同じアイデアを用
                    449: いている.
                    450:
                    451: % ここは書かなくてもいいように思えてきたので削除しました。
                    452: %OpenXM 規約の CMO 形式の定義は OpenMath 規約の content dictionary の概念
                    453: %に似ている(もちろん OpenMath の方がもっと大掛かりで厳密な規定である).
1.85      tam       454:
1.114     tam       455:
1.66      tam       456: \item NetSolve
1.31      tam       457:
                    458: http://www.cs.utk.edu/netsolve/
1.85      tam       459:
1.90      ohara     460: NetSolve はクライアント・サーバ型の分散システムであり, 単なる計算システ
                    461: ム以上のものを目指している.  クライアントは必要に応じて, サーバを呼び出
                    462: して計算をさせる.  NetSolve の特徴は, サーバの呼び出しに Agent というソ
                    463: フトウェアを介在させることである.  Agent は呼び出し先などを決定するデー
                    464: タベース的役割を果たす.  また Agent によって負荷分散が可能になる.  現在
                    465: の NetSolve は RPC を基礎にして実装されている.
1.31      tam       466:
1.114     tam       467:
1.105     tam       468: \item MP (Multi Project)
1.31      tam       469:
1.94      ohara     470: http://symbolicnet.mcs.kent.edu/SN/areas/protocols/mp.html
1.31      tam       471:
1.116     tam       472: 数学的なデータの共通表現を提供するプロジェクト.  MP の主な関心は, この
                    473: 共通表現の最適化である.  数学システム間で, 命令を送信したりデータを受
                    474: け渡す仕組み(control integration)は, このプロジェクトの対象外である.
1.118     tam       475: MP は既存の control integration に対して補完的役割を果たす.
1.116     tam       476:
                    477: MP では数式を構文木の一種(annotated syntax tree)と捉える.  annotated
                    478: syntax tree には数学的な意味を保ったまま表現されているという特徴がある
1.117     ohara     479: (この点は OpenMath と似ている).  MP が提供する共通表現とは, この構文木の
                    480: バイナリエンコーディング, つまりバイト列での表現のことである.  MP の定義
                    481: する表現ではバイト列の長さが最適化されている.  また, バイトオーダーの選
                    482: 択も可能である(\ref{sec:messages} 節参照のこと).
1.116     tam       483:
                    484: このプロジェクトでは C 言語および GNU Common Lisp で実装を行なっている.
1.117     ohara     485: C 言語による実装(MP-C ライブラリ)は上記のウェブページから収得可能である.
                    486: このライブラリを用いて通信を行なうには, なんらかの control integration
                    487: が必要である.  control integration としては, ソケット, MPI, PVM などが利
                    488: 用できる.
1.86      tam       489:
1.119     tam       490:
1.96      ohara     491: \item MCP (Mathematical Computation Protocol)
1.31      tam       492:
1.92      tam       493: http://horse.mcs.kent.edu/\~{}pwang/
                    494:
1.119     tam       495: HTTP に似せた数学的な計算を行なうためのプロトコル.
1.120   ! tam       496: MCP は control integration を規定しており,
1.119     tam       497: クライアント・サーバ型の通信を行なう.
                    498: MCP のメッセージはヘッダとボディから構成されている.
                    499: ヘッダはテキストであり, 最初に現れる空行でヘッダとボディは
                    500: 区切られている.
                    501: ボディの形式は固定ではなく,
                    502: ヘッダを見ればボディの形式が分かるようになっている.
                    503:
                    504: 数式はボディに記述されて送られるが,
1.120   ! tam       505: このプロトコルでは数式の表現方法についての規定はなく,
1.119     tam       506: そのため, オブジェクトの表現には MP や OpenMath で定められたものを
                    507: 使用することが考えられている.
                    508: 実際, 数式の表現に OpenMath 規約の XML 表現を用いた実装があり,
                    509: GAP と Axiom の間で通信が行なわれている.
                    510: この場合, MCP によって送信されるメッセージは
                    511: ボディに OpenMath 形式で数式を記述したテキストである.
1.96      ohara     512:
1.66      tam       513: \end{itemize}
1.31      tam       514:
                    515:
                    516: \section{現在提供されているソフトウェア}
                    517:
1.94      ohara     518: 現在 OpenXM 規約に対応しているクライアントにはasir, sm1, Mathematica が
                    519: ある.  これらのクライアントから OpenXM 規約に対応したサーバを呼び出すこ
                    520: とができる.  また OpenXM 規約に対応しているサーバには, asir, sm1,
                    521: Mathematica, gnuplot, PHC pack などがあり, それぞれ ox\_asir, ox\_sm1,
1.100     ohara     522: ox\_math, ox\_sm1\_gnuplot, ox\_sm1\_phc という名前で提供されている.
1.94      ohara     523: さらに OpenMath 規約の XML 表現で表現されたオブジェクトと CMO 形式のオブ
                    524: ジェクトを相互変換するソフトウェアが JAVA によって実装されており,
                    525: OMproxy という名前で提供されている.
1.33      tam       526:
1.50      ohara     527: \begin{thebibliography}{99}
1.66      tam       528: \bibitem{Ohara-Takayama-Noro-1999}
                    529: 小原功任, 高山信毅, 野呂正行:
1.96      ohara     530: {Open asir 入門}, 1999, 数式処理,
                    531: Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).
1.86      tam       532:
1.50      ohara     533: \bibitem{OpenXM-1999}
1.53      tam       534: 野呂正行, 高山信毅:
1.96      ohara     535: {Open XM の設計と実装
                    536: --- Open message eXchange protocol for Mathematics},
                    537: 1999/11/22
1.49      tam       538: \end{thebibliography}
1.1       tam       539:
                    540: \end{document}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>