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>