Annotation of OpenXM/src/kxx/openxxx.tex, Revision 1.3
1.2 takayama 1: %% $OpenXM$
1.1 maekawa 2: %\documentclass{jarticle}
3: \documentstyle{jarticle}
4: \title{{\bf Open XM の設計と実装} \\
5: --- Open message eXchange protocol for Mathematics }
6: \author{ 野呂正行\thanks{富士通研究所
7: } ,
8: 高山信毅\thanks{神戸大学理学部数学教室}
9: }
1.3 ! takayama 10: \date{ 1999年, 11月2日}
1.1 maekawa 11: \begin{document}
12: \maketitle
13:
14: \def\noroa#1{ }
15: \def\remove#1{ }
16:
17: {\tt kxx/openxxx.tex}. {\bf Draft} 1997, 11/20 --- .
18: この文書は open XM の設計用のメモとしての役目もあるので,
19: 一部のファイル名は開発者のみが参照できる.
20:
21: \section{はじめに}
22:
23: Open XM は, おなじタイプまたは異なるタイプの数学プロセス間の
24: メッセージのやりとりの規約である.
25: 開発の動機は, 手作り(または研究的な)数学ソフトの相互乗り入れの実現
26: および分散計算の実装が
27: 第一であったが, もちろん数学ソフト間だけでなく, ワープロソフトや,
28: インタラクティブな数学本,
29: さらには数学デジタル博物館用のソフトがこの規約に従い,
30: 数学ソフトを呼び出すことなどにも利用できる.
31: 当面の目標は openXM 数学ソフトパッケージを作ることである.
32: これはさまざまな数学ソフトを一つのパッケージとして
33: 簡単に好きな言語より使えるようにするプロジェクトである.
34: 現在 openXM.tar.gz には,
35: asir, sm1, phc, gnuplot, tigers が入っている.
36: OpenXM 数学ソフトパッケージプロジェクトに
37: 参加できるように CMO の
38: 規約を拡張していくための規約も定めるものとする.
39:
40: 現在専門的な数学ソフトが多数開発
41: されているが, 次世代の数学ソフトは他のソフトよりサブルーチンとして
42: 呼び出せる機能をもつべきである.
43: このように協調機能にすぐれたプログラムを書くための設計の
44: ガイドライン, プログラム作法のようなものを提案するのも,
45: このプロジェクトの目的である.
46: このようなガイドラインにそってプログラムすることにより,
47: 数学アルゴリズム自体に集中できる環境が実現できることを
48: 期待している.
49:
50: 設計の方針として, (1) 単純 (2) 拡張性 (3) 実装の簡便さ (4) 実用性
51: (5) 高信頼性(robustness),
52: に重きをおいている.
53: Open XM はなにも考えずに簡単に接続できるシステムを作ろう,
54: というまで野心的ではない.
55: 数学的な object は一筋縄ではいかないし, 完全な統一規格をつくるというのは
56: 気が遠くなる仕事である.
57: そのかわり, 今よりすこしだけこういったデータ交換や分散システム構築の仕事を楽に
58: したいというのがささやかな第1目標である.
59:
60: 数学的な Object をどのように表現するのか, どう伝えるのかを考えることは
61: 決してつまらない問題ではない.
62: このような問題は, 新しい数学記号を創造する問題と似ているかもしれない.
63: 我々は, 数字を $0$ を含んだ10進数で表記し,
64: 微分を $dx$ と書き, 写像を $ \longrightarrow $ であらわす.
65: これらの記号法からどれだけ多くの利益を得ているか, 思いをはせて欲しい.
66: また, Mathematica や Maple といった巨大な統合ソフトを,
67: Free Mathematical Softwares としてわれわれ自身の
68: 手でつくっていくための基礎でもある.
69:
70: %% 変数名をどうするか悩むのにも似てる.
71:
72: Open XM に準拠したシステム xxx を, open xxx とよぶ.
73: たとえば, open XM 対応の asir は open asir であり,
74: open XM 対応の kan/sm1 は open sm1 である.
75:
76: Open XM は, データ型をきめている部分と,
77: 共通スタック言語を定めている部分にわかれる.
78: よいたとえかどうか自信がないが,
79: Open XM を定義する作業は, unicode を定める作業に似ている部分もある.
80: たとえば, 漢字は東アジアで共通に使用されているが, 国や地方単位で
81: 形がすこしづつ違うものがある.
82: unicode では, 似た漢字を同じ code におしこんだ.
83: Open XM でも, システム毎にことなるが似ているデータ型を
84: 同じ型としてあつかう.
85: たとえば, ``分散多項式'' の意味は, asir と kan/sm1 で異なるが,
86: Open XM では, 同じ型としてあつかわれる.
87: ただしこれでは不十分な場合があるので,システム固有のデータ型も扱える
88: ような仕組みも用意している.
89: (さっきのたとえでは, こちらは, unicode でなく, ISO の文字符号系に対応するか.)
90: 共通スタック言語は, ごく小数の共通コマンドをのぞき
91: 基本的にシステム毎に固有の関数により実行される.
92: これにより, open xxx のサーバの実装およびマニュアルの記述は
93: いちじるしく簡単になる.
94: システム毎に固有の関数を共通の関数名にするプロジェクトも
95: 考えているが, 共通の関数名は OpenMath のものを利用する予定である.
96:
97: Open XM は論理的には
98: OX 層, SM 層, CMO 層にわかれる.
99: OX Object は, データ, コマンドに大別できる.
100: データはこのプロジェクトのオリジナルのデータ形式
101: である CMO (Common Mathematical Object Format) で
102: 送出してもよいし, MP や Open MATH などの形式を用いてもよい.
103: SM 層は (スタックマシン)サーバを制御するための命令の
104: あつまりであり, サーバは非同期的に動作させることが可能である.
105: 柔軟性が高いので, IMC などのリモートプロシージャコール系の
106: プロトコルもエミュレートできる.
107:
108:
109:
110:
111:
112: \section{CMO Basic0 の object}
113: CMO (Common Mathematical Object format) グループ Basic0 の Object は,
114: 多くの計算機言語が標準としてもつ
115: ローレベルのデータ型, {\tt int} , {\tt string}
116: などに タグ付けした object である.
117: この CMO はすべての open xxx が実装していると仮定される.
118: この節では, イントロダクションとして, グループ Basic0 に属する CMObject
119: (Common Mathematical Object) を形式的な方法をつかわず導入しよう.
120: このグループの正式な名前は,
121: CMObject/Basic0 である.
122: 以下, {\tt int32} で2の補数表現された
123: network byte order の 32 bit integer をあらわす.
124: {\tt byte} で 8 bit データをあらわす.
125: CMO の object は \\
126: \begin{tabular}{|c|c|}
127: \hline
128: {\tt cmo\_tag}& {\tt cmo\_body} \\
129: \hline
130: \end{tabular} \\
131: なる形をしている.
132: ここで, {\tt cmo\_tag} は, 正の
133: {\tt int32} で表現するものと規約する.
134:
135: {\tt cmo\_tag} は object のタイプをあらわすタグであり,
136: 以下のように決めている.
137: @../SSkan/plugin/cmotag.h
138: \begin{verbatim}
139: #define LARGEID 0x7f000000
140: #define CMO_ERROR2 (LARGEID+2)
141: #define CMO_NULL 1
142: #define CMO_INT32 2
143: #define CMO_DATUM 3
144: #define CMO_STRING 4
145: #define CMO_MATHCAP 5
146: #define CMO_LIST 17
147: \end{verbatim}
148:
149: 以下, 各 object の フォーマットを説明する.
150: サーバはすべての object の CMO 形式をサポートする必要はないが,
151: mathcap (後述) 問い合わせに対して,
152: サポートしている CMO 形式データをクライアントに知らせる必要が
153: ある.
154: {\tt CMO\_ERROR2}, {\tt CMO\_NULL},
155: {\tt CMO\_INT32}, {\tt CMO\_STRING}, {\tt CMO\_MATHCAP}, {\tt CMO\_LIST}
156: は最も基本的なデータであり,
157: また全てのサーバ, クライアントが実装すべき CMO データである.
158:
159:
160: CMObject Error2 は \\
161: \begin{tabular}{|c|c|}
162: \hline
1.3 ! takayama 163: {\tt int32 CMO\_ERROR2} & {\sl CMObject} {\rm ob} \\
1.1 maekawa 164: \hline
165: \end{tabular} \\
166: なる形で表現する.
167: エラーの時に投げる object であり, {\it CMObject} ob の
168: 部分に詳細なエラー情報がはいる.
169: ob はリストであり, 最初の成分はエラーを起こした OX メッセージ(後述)
170: のシリアル番号でないといけない.
171: シリアル番号は Integer32 で表現する.
172:
173:
174: CMObject Null は \\
175: \begin{tabular}{|c|c|}
176: \hline
177: {\tt int32 CMO\_NULL} \\
178: \hline
179: \end{tabular} \\
180: なる形で表現する.
181:
182: 32 bit integer n は CMObject としては Integer32 と呼ばれ, \\
183: \begin{tabular}{|c|c|}
184: \hline
1.3 ! takayama 185: {\tt int32 CMO\_INT32}& {\tt int32} {\rm n} \\
1.1 maekawa 186: \hline
187: \end{tabular} \\
188: なる形で表現する.
189:
190:
191: 長さ n の バイト列 data は CMObject としては, Datum 型とよばれ \\
192: \begin{tabular}{|c|c|c|c|}
193: \hline
1.3 ! takayama 194: {\tt int32 CMO\_DATUM}& {\tt int32} {\rm n} & {\tt byte} {\rm data[0]}
! 195: & {\tt byte} {\rm data[1]} \\
1.1 maekawa 196: \hline
1.3 ! takayama 197: $\cdots$ & {\tt byte} {\rm data[n-1]} \\
1.1 maekawa 198: \cline{1-2}
199: \end{tabular} \\
200: と表現する.
201: data の部分に直列化 (serialized) された CMO が入ることもありうる.
202:
203: 長さ n の 文字列 data は, CMObject としては, Cstring 型とよばれ \\
204: \begin{tabular}{|c|c|c|c|}
205: \hline
1.3 ! takayama 206: {\tt int32 CMO\_STRING}& {\tt int32} {\rm n} & {\tt byte} {\rm data[0]}
! 207: & {\tt byte} {\rm data[1]} \\
1.1 maekawa 208: \hline
1.3 ! takayama 209: $\cdots$ & {\tt byte} {\rm data[n-1]} \\
1.1 maekawa 210: \cline{1-2}
211: \end{tabular} \\
212: と表現する. C 言語で普通用いられる, 文字列のおわりの {\tt 0} は文字列
213: に含めない.
214:
215: \remove{
216: 長さ n の 32bit network byte order の data の array は \\
217: \begin{tabular}{|c|c|c|c|c|c|}
218: \hline
1.3 ! takayama 219: {\tt int32 CMO\_ARRAYOFINT32}& {\tt int32} {\rm n} &
! 220: {\rm data[0]} & {\rm data[1]}&$\cdots$
! 221: & {\rm data[n-1]} \\
1.1 maekawa 222: \cline{1-2}
223: \end{tabular} \\
224: と表現する. 各 {\tt data[i]} の部分は 4 byte の大きさを持つ.
225: }
226:
227: \noindent
228: CMObject Mathcap は \\
229: \begin{tabular}{|c|c|}
230: \hline
1.3 ! takayama 231: {\tt int32 CMO\_MATHCAP} & {\it CMObject} {\rm ob} \\
1.1 maekawa 232: \hline
233: \end{tabular} \\
234: なる形で表現する.
235: {\tt ob} はリストであり少なくとも2つの要素をもつ.
236: 0 番目の要素は, Integer32 で表した Version number と,
237: Cstring で表したシステム名, Version number, CPUtype, その他の情報
238: のリストである.
239: 1 番目の要素は, システム xxx が扱うことの可能な
240: CMO タグを, Integer32 で表現したものを集めたリストである.
241:
242: \noindent
1.3 ! takayama 243: 長さ m のリストは \\
1.1 maekawa 244: \begin{tabular}{|c|c|c|c|c|}
245: \hline
1.3 ! takayama 246: {\tt int32 CMO\_LIST}& {\tt int32} {\rm m} & {\tt CMObject}\, ob[0] & $\cdots$ &
1.1 maekawa 247: {\tt CMObject}\, ob[$m-1$] \\
248: \hline
249: \end{tabular}\\
250: で表現する.
251:
252:
253: \section{ CMO の表現方法 }
254:
255: 前の節で CMO の表現方法を形式的に定義せず,
256: CMO のBasic0 の表現法を説明したが,
257: ここでは, CMO の Lisp 風表現 (Lisp-like expression)
258: である
259: CMOexpression
260: および CMO の標準 encoding 法を説明する.
261: (タグの省略記法がほしい.)
262: 前の節ではこの 標準 encoding 法を用いて CMO の表現方法を説明した.
263:
264: まず, CMOexpression を形式的に 拡張 BNF 記法を用いて定義しよう.
265: タイプライタフォントでかかれた記号は終端記号を意味する.
266: ``:'' は定義を意味する. ``$|$'' は''または''を意味する.
267: \{ X \} は X の 0 回以上の繰り返しを表す.
268: [ x ] は X が 0 回または 1 回出現することを表す.
269:
270: \begin{eqnarray*}
271: \mbox{CMOexpression}
272: &:& \quad
273: \mbox{\tt (} \mbox{\tt cmo\_tag} \
274: \{ \mbox{ expression} \} \mbox{\tt )}\\
275: \mbox{expression}
276: &:& \quad \mbox{CMOexpression} \\
277: & &|\ \mbox{\tt int32} \\
278: & &|\ \mbox{\tt string} \\
279: & &|\ \mbox{\tt byte} \\
280: \end{eqnarray*}
281: 終端記号 {\tt int32} は, 32 bit integer を表す, 10 進または 16 進の数字の
282: 列である.
283: 終端記号 {\tt string} は''文字''の列である.
284: 終端記号 {\tt byte} は 8 bit データを表す, 10 進または 16 進の数字の列である.
285:
286: CMOexpression にあらわれる各要素を区切るために {\tt ,} (コンマ) を用いてもよい.
287: {\tt cmo\_tag} は {\tt CMO\_} で始まる定数である.
288: CMOexpression で表現される object を CMObject と呼ぶ.
289:
290: この表記法 CMOexpression を利用して, CMO Basic0 の object を記述
291: してみよう.
292: Object 自体の構造を説明するため,
293: BNF をもうすこし拡張して, 非終端記号, 終端記号名のみならず, 変数の
294: 名前も書くことにする. こうすることにより, object の意味の説明も容易になる
295: からである. また ``---'' でコメントのはじまりを表すものとする.
296: たとえば, (CMObject の) 32 bit integer である integer32 を
297: BNFで定義すれば,
298: \begin{center}
299: Integer32 \ : \ ({\tt CMO\_INT32}, {\tt int32})
300: \end{center}
301: と書くのが本来の書き方による記法であるが, ここでは,
302: \begin{eqnarray*}
303: \mbox{Integer32} \ &:& \ ({\tt CMO\_INT32}, {\sl int32}\ n) \\
304: & & \ \mbox{--- 32 bit integer $n$ を表す. } \\
305: \end{eqnarray*}
306: と書くことを許すことにする.
307: このように書くことにより, 非終端記号 Integer32 は,
308: \begin{center}
309: Integer32 \ : \ ({\tt CMO\_INT32}, {\tt int32})
310: \end{center}
311: のように, 終端記号 {\tt CMO\_INT32} と {\tt int32} を成分にもち,
312: CMObject の
313: ({\tt CMO\_INT32}, {\sl int32}\ n)
314: は,
315: 32 bit integer $n$ を表現しているんだということが, 1 行でわかる.
316: この記法を用いて, 前節で導入した, Basic0 の CMObject を
317: 形式的に定義しよう.
318:
319: \bigbreak
320: \noindent
321: Group CMObject/Basic0 requires nothing. \\
322: Error2, Null, Integer32, Datum, Cstring, Mathcap, List $\in$ CMObject/Basic0. \\
323: Document of CMObject/Basic0 is at {\tt http://www.math.kobe-u.ac.jp/openxxx}
324: (in Japanese) \\
325: \begin{eqnarray*}
326: \mbox{Error2}&:& ({\tt CMO\_ERROR2}, {\sl CMObject}\, \mbox{ob}) \\
327: \mbox{Null} &:& ({\tt CMO\_NULL}) \\
328: \mbox{Integer32}
329: &:& ({\tt CMO\_INT32}, {\sl int32}\ \mbox{n}) \\
330: \mbox{Datum} &:& ({\tt CMO\_DATUM}, {\sl int32}\, \mbox{n}, {\sl byte}\,
331: \mbox{data[0]},
332: \ldots , {\sl byte}\, \mbox{data[n-1]}) \\
1.3 ! takayama 333: \mbox{Cstring}&:& ({\tt CMO\_STRING},{\sl int32}\, \mbox{ n},
1.1 maekawa 334: {\sl string}\, \mbox{s}) \\
335: \mbox{Mathcap}&:& ({\tt CMO\_MATHCAP},{\sl CMObject}\, \mbox{ob} ) \\
336: \mbox{List} &:&
337: \mbox{({\tt CMO\_LIST}, {\sl int32}\, m, {\sl CMObject}\, ob[0], $\ldots$,
338: {\sl CMObject}\, ob[m-1])} \\
339: & & \mbox{--- m is the length of the list.}
340: \end{eqnarray*}
341:
342: Cstring で, {\sl string} s の部分を {\tt byte} に分解すれば,
343: \begin{eqnarray*}
1.3 ! takayama 344: \mbox{Cstring}&:& ({\tt CMO\_STRING},{\sl int32}\, \mbox{ n},
1.1 maekawa 345: {\sl byte}\, \mbox{s[0]},
346: \ldots, {\sl byte}\ \mbox{s[n-1]})
347: \end{eqnarray*}
348: となる.
349: また,
350: ``Group CMObject/Basic0 requires nothing''
351: は, 以下は, グループ CMObject/Basic0 の定義であり,
352: このグループの CMObject を定義するのに, 要請される CMObject のグループは
353: ないことを示す.
354: ``Error2, Null, Integer32, Datum, Cstring, Mathcap, List
355: $\in$ CMObject/Basic0''
356: は, グループ CMObject/Basic0 には, Error2, Null, Integer32,
357: Datum, Cstring なるクラスの object が属することを示す.
358:
359:
360: では, 実際のデータの表現の例をみてみよう.
361: たとえば, 32 bit integer の 1234 は,
362: \begin{center}
363: ({\tt CMO\_INT32}, 1234)
364: \end{center}
365: とかく.
366: 文字列 ``Hello'' は
367: \begin{center}
368: ({\tt CMO\_STRING}, 5, "Hello")
369: \end{center}
370: と書く.
371:
372: CMOexpression と, CMObject の区別を理解しておくのは重要である.
373: たとえば
374: \begin{center}
375: ({\tt CMO\_INT32}, 234, "abc",({\tt CMO\_STRING}))
376: \end{center}
377: は CMOexpression ではあるが, CMObject ではない.
378: これは, 文法的には正しいプログラムだが, なにをやるのかは全く不明な
379: プログラムと似ている.
380:
381: さて, Open math 風 (\cite{openmath})
382: の SGML 表現法も可能であり, その場合は, 上の二つの例は次のように
383: 書く.
384: \begin{verbatim}
385: <CMO_INT32>
386: 1234
387: </CMO_INT32>
388:
389: <CMO_STRING>
390: 5
391: "Hello"
392: </CMO_STRING>
393: \end{verbatim}
394:
395: 次に, 標準 encoding 法を説明しよう.
396: 標準 encoding 法では, cmo\_tag を ネットワークバイトオーダーの
397: 32 bit integer {\tt int32} に,
398: その他のフィールドは, 定義に記述されているデータ型に従い,
399: byte データ {\tt byte} かまたは
400: ネットワークバイトオーダーの 32 bit integer {\tt int32} に, 変換する.
401:
402: 高速の通信方法を用いて
403: 効率を重視する接続の場合には, {\tt int32} を network byte order
404: に変換する操作がおおきなオーバヘッドとなることが
405: 報告されている.
406: 100Mbps の通信路で 12Mbytes の {\tt CMO\_ZZ} の転送では
407: 約 90\% の時間が network byte order への変換についやされているという
408: 実験データもある.
409: 効率を重視した encoding 法については後述する.
410:
411:
412: 標準 encoding 法は全てのシステムが基礎として備えるべき変換法である.
413: 標準 encoding と CMOexpression の間の変換は容易である.
414: 前節で用いたデータの表記法,
415: たとえば,
416: \begin{center}
417: \begin{tabular}{|c|c|}
418: \hline
419: {\tt int32 CMO\_INT32}& {\tt int32 1234} \\
420: \hline
421: \end{tabular}
422: \end{center}
423: は, CMOexpression
424: \begin{center}
425: ({\tt CMO\_INT32}, 1234)
426: \end{center}
427: の 標準 encoding 法による表現である.
428:
429:
430:
431: \section{ Open XM の通信モデル}
432:
433: われわれは, 数学プロセスがメッセージを
434: 交換しながら計算が進行していくというモデルを想定して設計をすすめている.
435: 各プロセスはスタックマシンであり, これを OX スタックマシンとよぶ.
436: 数学プロセスの間の通信路の確保の仕方としては以下のように
437: いろいろな実現方法を想定している.
438: \begin{enumerate}
439: \item ファイルを介して通信する.
440: \item Library として直接リンクして通信する.
441: \item TCP/IP ソケットの利用.
442: \item Remote Procedure call の利用.
443: \item マルチスレッドの利用.
444: \item PVM ライブラリの利用.
445: \item MPI ライブラリの利用.
446: \end{enumerate}
447:
448: 通信とはプロセス間のメッセージのやりとりである.
449: メッセージは論理的に次のような構造をもつ:
450: \begin{center}
451: \begin{tabular}{|c|c|c|}
452: \cline{1-2}
453: {\tt destination} & {\tt origin} & \multicolumn{1}{}{} \\ \hline
454: {\tt extension}&{\tt ox message\_tag}&{\tt message\_body} \\
455: \hline
456: \end{tabular}
457: \end{center}
458: このメッセージを, OXobject (Open XM message object) とよぶ.
459: OXobject はトップレベルのメッセージ object であり,
460: 仕様書では, さまざまなグループに属する object が登場する.
461: グループ名は, たとえば, OXobject/TCPIP/Basic0 などと書く.
462: {\tt message\_body} の部分の仕様は, OXobject
463: の上位に位置する部分であり, SMobject または CMObject がくる.
464: これらの object はタグをもち, そのタグ定数は {\tt SM\_} または
465: {\tt CMO\_} ではじまる.
466: SMobject は, スタックマシンコマンドメッセージ object であり,
467: やはり, グループ分けされている.
468: 各グループ名は,
469: SMobject/Basic0, SMobject/Basic1 などと書く.
470: SMobject の構造は
471: サーバスタックマシンの節で詳しく説明する.
472: CMObject についてはすでに Basic0 の CMObject の説明をしたが,
473: あとで CMObject レベル 1の説明をする.
474: OXobject の
475: {\tt ox message\_tag} の定数は {\tt OX\_} で始まる.
476:
477: \subsection{ OXobject の 表現方法 }
478:
479: Open XM で各プロセスは
480: \begin{center}
481: (OXexpression を理解するスタックマシン) $+$ (xxx 言語で動くエンジン)
482: \end{center}
483: なるハイブリッド構成である.
484: このプロセスを, OX スタックマシンと呼ぶ.
485: ここでは, OX スタックマシンとやりとりするメッセージである,
486: OXobject を表現するための OXexpression, および,
487: スタックマシンの operator に対応する, SMobject を表現するための SMexpression
488: を定義しよう.
489: OXobject を スタックマシンコマンド,
490: SMobject を スタックマシンオペレータともよぶ.
491:
492:
493: \begin{eqnarray*}
494: \mbox{OXexpression}
495: &:& \quad
496: \mbox{\tt (} \mbox{\tt OX\_tag} \
497: [\mbox{ expression}] \mbox{\tt )}\\
498: \mbox{expression}
499: &:& \quad \mbox{SMexpression} \\
500: & &|\ \mbox{CMOexpression} \\
501: \mbox{SMexpression}
502: &:& \mbox{\tt (} \mbox{\tt SM\_tag} \
503: \{ \mbox{CMOexpression} \} \mbox{\tt )}\\
504: \end{eqnarray*}
505: expression の各要素を区切るために {\tt ,} (コンマ) を用いてもよい.
506: {\tt OX\_tag} は {\tt OX\_} で始まる定数である.
507: {\tt SM\_tag} は {\tt SM\_} で始まるスタックマシンオペレータを識別する定数である.
508: 発信元 AAA, 受信先 BBB を書く必要があるときは,
509: From AAA, To BBB, を OXexpression の前に書く.
510: 必要なければ省略する.
511:
512: たとえば, あとで説明する, CMO string ``Hello'' を スタックにプッシュする
513: 表現は次のように書く:
514: \begin{center}
515: (OX\_DATA, (CMO\_STRING, 5, "Hello"))
516: \end{center}
517:
518:
519: あとで説明するように, local 関数 ``hoge'' を実行する スタックマシンコマンドは
520: 次のように表現する:
521: \begin{center}
522: (OX\_DATA, (CMO\_STRING, 5, "hoge"))
523: \end{center}
524: \begin{center}
525: (OX\_COMMAND, SM\_executeStringByLocalParser)
526: \end{center}
527:
528: 標準 encoding 法では, 各 タグを ネットワークバイトオーダーの
529: 32 bit integer で表現する.
530:
531:
532: \subsection{OXexpression の 標準 encoding と TCP/IP ソケットによる実装法}
533: 通信の実現方法は通信路のとりかたによりかわるが,
534: 論理構造は統一的にあつかわないといけない.
535: OXexpression はその論理構造を記述している.
536:
537: ここでは OXexpression の標準 encoding の概略を説明する.
538: この encoding 法はTCP/IP ソケット用の encoding 法として
539: 現在存在しているサーバに使用されている.
540: さらにOX スタックマシンの計算状態を制御するための, コントロールメッセージに
541: ついても説明する.
542:
543:
544: {\tt destination}, {\tt origin} の部分は, ソケットによる
545: peer to peer の接続なので省略する.
546: {\tt extension} フィールドは
547: {\tt message\_tag} フィールドの次にくる.
548: {\tt extension} フィールドは OX パケットのシリアル番号がはいる.
549: シリアル番号は {\tt int32} である.
550: この番号は, サーバがエラーを起こした場合, エラーをおこした,
551: OX パケットの番号を戻すのに主に利用される.
552: 以下 {\tt extension} フィールドは, {\tt message\_tag} の
553: に含まれると理解し {\tt extension} フィールドは省略する.
554: したがってパケットは
555: 次のように記述する
556: \begin{center}
557: \begin{tabular}{|c|c|}
558: \hline
559: {\tt ox message\_tag}&{\tt message\_body} \\
560: \hline
561: \end{tabular}
562: \end{center}
563: が, もっとこまかく見ると,
564: \begin{center}
565: \begin{tabular}{|c|c|}
566: \hline
567: {\tt ox message\_tag}, \ {\tt packet number}&{\tt message\_body} \\
568: \hline
569: \end{tabular}
570: \end{center}
571: となっている.
572:
573: グループ OXobject/TCPIP/Basic0 の
574: {\tt ox message\_tag} としては次のものが用意されている.
575:
576: @plugin/oxMessageTag.h
577: \begin{verbatim}
578: #define OX_COMMAND 513
579: #define OX_DATA 514
580:
581: #define OX_DATA_WITH_LENGTH 521
582: #define OX_DATA_OPENMATH_XML 523
583: #define OX_DATA_OPENMATH_BINARY 524
584: #define OX_DATA_MP 525
585:
586: #define OX_SYNC_BALL 515
587: \end{verbatim}
588:
589:
590: 通信路は 2 つ用意する.
591: 1番目の通信路は
592: \verb+ OX_COMMAND +
593: および
594: \verb+ OX_DATA +
595: がながれる.
596: 2番目の通信路 ({\tt control}と呼ぶ) には,
597: \verb+ OX_COMMAND + およびそれに続くコントロールコマンド
598: \verb+ SM_control_* +
599: またはコントロール関係のデータ, つまり header
600: \verb+ OX_DATA + ではじまりそれに続く CMO データ
601: がながれる.
602: これらをコントロールメッセージおよびコントロールメッセージの結果
603: メッセージと呼ぶ.
604: サンプルサーバでは, この 2 つの通信路を, 2 つのポートを用いて
605: 実現している.
606:
607:
608: \verb+ OX_COMMAND + メッセージは次の形のパケット: \\
609: \begin{tabular}{|c|c|}
610: \hline
611: {\tt OX\_COMMAND} & {\tt int32 function\_id} \\ \hline
612: {\it message\_tag} & {\it message\_body}
613: \\ \hline
614: \end{tabular}, \quad
615: ({\tt OX\_COMMAND}, ({\tt SM\_*}))
616: \\
617:
618: \verb+ OX_DATA + メッセージは次の形のパケット: \\
619: \begin{tabular}{|c|c|}
620: \hline
621: {\tt OX\_DATA} & {\tt CMO data} \\ \hline
622: {\it message\_tag} & {\it message\_body}\\ \hline
623: \end{tabular}, \quad
624: ({\tt OX\_DATA}, {\sl CMObject} data)
625: \\
626: データは CMO を用いて表現する.
627:
628: コントロールメッセージは次の形のパケット: \\
629: \begin{tabular}{|c|c|}
630: \hline
631: {\tt OX\_COMMAND} & {\tt int32 function\_id} \\ \hline
632: \end{tabular}, \quad
633: ({\tt OX\_COMMAND},({\tt SM\_control\_*}))
634: \\
635: コントロールメッセージは, 計算を中断したい, debug 用の スレッドを起動する,
636: debug モードを抜けたい, などの用途に利用する.
637:
638: コントロールメッセージの結果メッセージは次の形のパケット: \\
639: \begin{tabular}{|c|c|l|}
640: \hline
641: {\tt OX\_DATA} & {\tt CMO\_INT32} & {\tt int32 data} \\ \hline
642: \end{tabular}, \quad
643: ({\tt OX\_DATA}, {\sl Integer32 } n)
644: \\
645:
646:
647:
648: {\tt int32 function\_id}
649: の部分に, サーバスタックマシン の operator に対応する番号がはいる.
650: グループ SMobject/Basic0 および SMobject/Basic1 に属する
651: タグとして以下のものがある.
652: @plugin/oxFunctionId.h
653: \begin{verbatim}
654: #define SM_popSerializedLocalObject 258
655: #define SM_popCMO 262
656: #define SM_popString 263
657:
658: #define SM_mathcap 264
659: #define SM_pops 265
660: #define SM_setName 266
661: #define SM_evalName 267
662: #define SM_executeStringByLocalParser 268
663: #define SM_executeFunction 269
664: #define SM_beginBlock 270
665: #define SM_endBlock 271
666: #define SM_shutdown 272
667: #define SM_setMathCap 273
668: #define SM_executeStringByLocalParserInBatchMode 274
669: #define SM_getsp 275
670: #define SM_dupErrors 276
671:
672:
673: #define SM_control_kill 1024
674: #define SM_control_reset_connection 1030
675: \end{verbatim}
676:
677: たとえば,
678: \begin{center}
679: (OX\_COMMAND, SM\_pops)
680: \end{center}
681: は
682: \begin{center}
683: \begin{tabular}{|c|c|}
684: \hline
685: {\tt int32} 513 & {\tt int32} 265 \\
686: \hline
687: \end{tabular}
688: \end{center}
689: とエンコードされる.
690:
691: operator の詳細は次の節で説明する.
692: これらの定数の名前はインプリメントのとき短縮形で表現してもよい.
693:
694:
695:
696: \section{ OX サーバスタックマシン }
697:
698: この節では, OX スタックマシン operator の説明
699: (TCP/IP ソケット上での標準 encoding 法 を用いる),
700: および, サンプルサーバとリンクする場合または
701: open XM ライブラリとしてリンクして使用する場合の
702: ための C の関数の仕様を説明する.
703:
704: 説明の前に, OX サーバスタックマシンの動作の原則を
705: 説明しておく.
706: サーバスタックマシンは,
707: {\tt SM\_pop*} 系のスタックマシンコマンドがこないかぎり,
708: 自発的にメッセージを送信することはない.
709: この原則に基づいて分散計算のプログラミングをおこなう.
710: イベントドリブンなプログラム法とはちがうことに
711: 注意しよう.
712:
713:
714: \subsection{サーバスタックマシン }
715:
716: サンプルサーバである {\tt oxserver00.c}
717: は以下の仕様の C の関数を用意して,
718: {\tt nullstackmachine.c } を置き換えれば一応動作するはずである.
719:
720:
721: \noindent
722: \subsubsection{サーバスタックマシンのグループ SMobject/Basic0
723: に属するオペレータ}
724:
725:
726: \noindent
727: サーバスタックマシンは最低で1本のスタック
728: \begin{verbatim}
729: Object xxx_OperandStack[SIZE];
730: \end{verbatim}
731: をもつ.
732: ここで, {\tt Object} はそのシステム固有の Object 型で構わない.
733: CMObject は各サーバ固有のローカルオブジェクトに変換して
734: スタックへプッシュしてよい.
735: ただし変換, 逆変換を合成したものは恒等写像であることがのぞましい.
736: CMObject をどのように (local) Object に変換するか,
737: Object が受け付けるメッセージの定義は,
738: 各システムが独自にきめて文書化しておくものとする.
739: つまりすべてのメッセージは, private である.
740: たとえば, {\tt add } のような基本的な メッセージにたいしても,
741: OX スタックマシンはなにもきめていない.
742: 将来的には open math \cite{openmath} のように
743: CMObject に対する最大公約数的なメッセージの仕様を
744: content dictionary (CD) の形で定義したい.
745:
746:
747: 以下, \verb+ xxx_ + は誤解の恐れがないときは省略する.
748: \verb+ xxx_ + は local サーバシステムに固有の識別子である.
749: {\tt Asir} の場合は \verb+ Asir_ + を用いる.
750: {\tt kan/sm1} の場合は \verb+ Sm1_ + を用いる.
751: 関数名, タグ名は長いので省略形を用いてもよい.
752:
753: 以下では次のようにパケットを記述する.
754: 各フィールドは,
755: \fbox{データ型 \quad データ} なる形式で書く.
756: たとえば,
757: {\tt int32 OX\_DATA}
758: は 32 bit network byte order の数字 {\tt OX\_DATA}
759: という意味である.
1.3 ! takayama 760: ``イタリックで書かれているフィールドは,
1.1 maekawa 761: 定義が別のところでなされているか解釈に誤解のないような自然言語
1.3 ! takayama 762: で説明されている object を表す.''
1.1 maekawa 763: たとえば,
764: {\it String commandName}
765: は, String データ型の local object {\it commandName}
766: を意味する.
1.3 ! takayama 767: (サーバスタックマシン上の object は, CMO 形式の object
! 768: とは限らないことに注意.
! 769: CMO 形式で書いてあっても, それはサーバスタックマシンの
! 770: local 形式でスタック上にあると解釈して下さい.)
1.1 maekawa 771:
772: すべてのサーバスタックマシンは
773: 以下の関数を実装していないといけない.
774: \begin{enumerate}
775:
776: \item
777: CMObject/Basic0 の CMO データのうち必須のもの,
778: {\tt CMO\_ERROR2}, {\tt CMO\_NULL}, {\tt CMO\_INT32},
779: {\tt CMO\_STRING}, {\tt CMO\_LIST}
780: がおくられて来た場合
781: それをスタックに push する.
782: たとえば, {\tt CMO\_NULL} の場合次のようになる.
783: \\ Request:
784: \begin{tabular}{|c|c|} \hline
785: {\tt int32 OX\_DATA} & {\tt int32 CMO\_NULL} \\
786: \hline
787: \end{tabular}
788: \\ Stack after the request:
789: \begin{tabular}{|c|} \hline
790: {\it NULL} \\
791: \hline
792: \end{tabular}
793: \\ Result: なし.
794:
795: たとえば, {\tt CMO\_String} の場合次のようになる.
796: \\ Request:
797: \begin{tabular}{|c|c|c|c|c|c|} \hline
1.3 ! takayama 798: {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}
! 799: &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\
1.1 maekawa 800: \hline
801: \end{tabular}
802: \\ Stack after the request:
803: \begin{tabular}{|c|} \hline
804: {\it String s} \\
805: \hline
806: \end{tabular}
807: \\ Result: なし.
808:
809: CMO データの受け取りに失敗した時のみ \\
810: \begin{tabular}{|c|c|c|} \hline
811: {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\
812: \hline
813: \end{tabular}
814: \\
815: をスタックへ push する.
816: 現在のところ, ob には, \\
817: \centerline{
1.3 ! takayama 818: [{\sl Integer32} OX パケット番号, {\sl Integer32} エラー番号,
! 819: {\sl CMObject} optional 情報]
1.1 maekawa 820: }
1.3 ! takayama 821: なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい.
! 822: CMO として送出されるときこのような形式でないといけないという意味である.)
! 823:
1.1 maekawa 824:
825:
826: \item
827: \begin{verbatim}
828: void *xxx_mathCap()
829: \end{verbatim}
830: このサーバの mathcap をもどす (termcap のまね).
831: サーバのタイプ, サーバスタックマシンの能力を知ることができる.
832: C 言語で実装する場合は, mathCap の構造体をシステム毎にきめるものとし,
833: この関数はその構造体へのポインタを戻す.
834: (open sm1 では {\tt struct mathCap} を用いている.
835: @plugin/mathcap.h)
836: \\ Request:
837: \begin{tabular}{|c|c|} \hline
838: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_mathcap} \\
839: \hline
840: \end{tabular}
841: \\ Result:
842: \begin{tabular}{|c|c|} \hline
843: {\tt int32 OX\_DATA} & {\sl Mathcap} mathCapOb \\
844: \hline
845: \end{tabular}
846:
847: \item
848: \begin{verbatim}
849: xxx_setMathCap(void *m)
850: \end{verbatim}
851: 受け取った Mathcap {\tt m} を
852: 自分のシステムに設定して, 相手側が理解不能な CMO をおくらないように
853: する.
854: C 言語で実装する場合は, mathCap の構造体をシステム毎にきめるものとし,
855: この関数はその構造体へのポインタを引数とする.
856: (open sm1 では {\tt struct mathCap} を用いている.
857: @plugin/mathcap.h)
858: \\ Request:
859: \begin{tabular}{|c|c|} \hline
860: {\tt int32 OX\_DATA} & {\sl Mathcap} m \\ \hline
861: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathCap} \\
862: \hline
863: \end{tabular}
864: \\ Result: なし. \\
865: 注意: mathcap は一般にクライアント主体で設定する.
866: クライアントがサーバに {\tt SM\_mathcap} をおくり,
867: サーバ側の mathcap を得る.
868: それを, クライアントはそのサーバに付随した mathcap として
869: 設定する.
870: 次に, クライアントはサーバに自分の mathcap を
871: {\tt SM\_setMathCap} でおくり, 自分の mathcap を設定させる.
872:
873:
874: \item
875: \begin{verbatim}
876: int xxx_executeStringByLocalParser(char *s)
877: \end{verbatim}
878: 文字列 $s$ をシステム xxx の文法(サーバスタックマシンの組み込みローカル
879: 言語)にしたがったコマンドとして実行する.
880: ただし, コマンドの実行の結果の最後に戻り値があるときは,
881: {\tt OperandStack} に戻り値を push する.
882: 正常終了なら 0 を, 異常終了なら -1 をもどす.
883: debug モードにはいった場合, -2 を戻す.
884: エラーの時 Error2 Object
885: を stack へ push する.\\
886: {\tt kan/sm1} の場合, サーバスタックマシンの組み込みローカル言語は
887: {\tt sm1} ポストスクリプト言語である.
888: サーバスタックマシンと, {\tt sm1} ポストスクリプト言語はスタックを
889: 共有するように実装されている.
890: 実際の計算は
891: {\tt executeStringByLocalParser} により実行される.
892: open XM では, 現在のところ関数名の標準化はおこなっていない.
893: したがって, 実際の計算コマンドの送出は mathcap をみてクライアントが
894: 正しいコマンドを選択する必要がある.
895: (しかしながら, 共通関数名がないために, 共通仕様のサーバスタックマシンの
896: 実装はきわめて簡単である. 関数名の共通化は将来の課題.) \\
897: 割込みに関しては, -1 を戻すように ハンドラを書く.
898: executeStringByLocalParser() を再帰的に呼んだときも 割り込みのハンドラが
899: 正しく動作するようにこの関数は書かれるべきである.
900: この関数を呼び出したのち, signal, setjmp の再設定を呼び出し側でやらないと
901: いけない. \\
902: この関数および {\tt popString} の機能を実現すれば, 最低限の
903: open XM のサーバになれる. 実装では, まずこの二つの関数の機能を
904: 実現すべきである.
905: \\ Stack before the request:
906: \\
907: \begin{tabular}{|c|} \hline
908: {\it String commandString} \\
909: \hline
910: \end{tabular}
911: \\Request:
912: \begin{tabular}{|c|c|} \hline
913: {\tt int32 OX\_COMMAND}& {\tt int32 SM\_executeStringByLocalParser} \\
914: \hline
915: \end{tabular}
916: \\ Result: なし.
917: \\ 参考: \ 実行前のスタックのデータは,
918: {\it String commandString} なる local stackmachine の object として
919: スタック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて
920: {\it commandName} がスタックに push される:
921: \\
922: \begin{tabular}{|c|c|c|} \hline
923: {\tt int32 OX\_DATA} & {\tt int32 CMO\_string} & {\it size and the string commandString} \\
924: \hline
925: \end{tabular}
926:
927: \item
928: \begin{verbatim}
929: int xxx_executeStringByLocalParserInBatchMode(char *s)
930: \end{verbatim}
931: スタックに副作用がない(スタックにたいしてなんの操作もしない)
932: ことを除き上とまったく同じ関数である.
933: エラーの時のみ, Error2 Object をスタックへプッシュする.
934:
935: \item
936: \begin{verbatim}
937: char *xxx_popString(void)
938: void xxx_popString(ox_stream out)
939: \end{verbatim}
940: 最初の関数はライブラリとしてリンクして使用する場合の関数である.
941: {\tt OperandStack} より Object を pop し, それを xxx の出力
942: 規則にしたがい文字列型に変換して戻す.
943: スタックが空のときは, {\tt (char *)NULL} を戻す.
944: 呼出側の関数は, 戻り値のメモリー領域を操作してはいけない.
945: また, 再度 サーバスタックマシンが呼ばれたときは, 戻り値のメモリ領域
946: は変更されているかもしれない.
947:
948: 2 番目の関数は, TCP/IP を用いて通信する場合の関数である.
949: 変換されてでてきた文字列を値として返すのではなく,
950: {\tt ox\_stream out}
951: へ CMO のデータとして送信する.
952: エラーの場合は {\tt CMO\_ERROR2} を戻すべきである.
953: \\ Stack before the request:
954: \begin{tabular}{|c|} \hline
955: {\it Object} \\
956: \hline
957: \end{tabular}
958: \\ Request:
959: \begin{tabular}{|c|c|} \hline
960: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_popString} \\
961: \hline
962: \end{tabular}
963: \\ Result:
964: \begin{tabular}{|c|c|c|} \hline
965: {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\
966: \hline
967: \end{tabular}
968:
969: \item
970: \begin{verbatim}
971: int xxx_getsp(void)
972: \end{verbatim}
973: 現在のスタックポインタの位置をもどす.
974: スタート時点での位置は 0 であり, object が push されたばあい,
975: 1 づつ増えるものとする.
976: \\ Stack before the request:
977: \begin{tabular}{|c|} \hline
978: {\it Object} \\
979: \hline
980: \end{tabular}
981: \\ Request:
982: \begin{tabular}{|c|c|} \hline
983: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_getsp} \\
984: \hline
985: \end{tabular}
986: \\ Result:
987: \begin{tabular}{|c|c|c|} \hline
988: {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\
989: \hline
990: \end{tabular}
991:
992: \item
993: \begin{verbatim}
994: object xxx_dupErrors(void)
995: \end{verbatim}
996: スタック上のエラーオブジェクトをリストにして戻す.
997: スタック自体は変化させない.
998: \\ Stack before the request:
999: \begin{tabular}{|c|} \hline
1000: {\it Object} \\
1001: \hline
1002: \end{tabular}
1003: \\ Request:
1004: \begin{tabular}{|c|c|} \hline
1005: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\
1006: \hline
1007: \end{tabular}
1008: \\ Result:
1009: \begin{tabular}{|c|c|c|} \hline
1.3 ! takayama 1010: {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\
1.1 maekawa 1011: \hline
1012: \end{tabular}
1013:
1014: \item
1015: \begin{verbatim}
1016: int xxx_start()
1017: \end{verbatim}
1018: xxx の初期化をおこなう.
1019:
1020: \end{enumerate}
1021:
1022: \noindent
1023: {\bf 例}: \
1024: 次は, 標準入力よりの入力を asir に送り評価した結果を表示するプログラム
1025: である.
1026: \begin{verbatim}
1027: #include <stdio.h>
1028:
1029: main() {
1.3 ! takayama 1030: char tmp[1024];
! 1031: Asir_start();
! 1032: while (gets(tmp) != NULL) {
! 1033: if (Asir_executeStringByLocalParser(tmp) != 0) {
! 1034: printf("%s\n",Asir_popString());
! 1035: }
! 1036: }
1.1 maekawa 1037: }
1038:
1039: \end{verbatim}
1040:
1041: \medbreak
1042: \noindent
1043: {\bf 例}: \
1044: mathcap の問い合わせに対して, {\tt ox\_sm1} は次のように答える.
1045: %%Prog: [(cmoMathCap)] extension ::
1046: \begin{verbatim}
1047: Class.mathcap
1048: [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,
1049: $HOSTTYPE=i386$ ] ,
1050: [262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , 276 ] ,
1051: [[514] , [2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 ,
1052: 25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 34 ]]]
1053: \end{verbatim}
1054:
1055: mathcap は 3つの要素をもつリストである.
1056: まづ, 最初の要素を見よう.
1057: Ox\_system は open xxx システム名である.
1058: 読み込むライブラリがちがっていて, 関数名(または シンボル)の意味がちがうときは
1059: この名前もかえる.
1060: たとえば, open math の basic content dictionary 対応の関数定義マクロを
1061: 読みこんだ sm1 は,
1062: ox\_sm1\_basicCD なる名前にする.
1063: HOSTTYPE値は, CPU の種類をあらわし
1064: unix では環境変数\verb+$HOSTTYPE+ の値である.
1065: 2 番目の要素は 利用可能な SM コマンドをあつめたリストである.
1066: 3 番目のリストは, 処理可能な数学データの形式, およびCMOの場合なら
1067: 処理可能なCMOのタグのリストが続く.
1068: 上の例では, 514 は {\tt OX\_DATA} をあらわし, 数学データのフォマットは
1069: (サイズ情報なしの) CMO であることを示す.
1070:
1071:
1072: \medbreak
1073: \noindent
1074: {\bf 例}: \
1075: %%Prog: (ox.sm1) run sm1connectr [(oxWatch) ox.ccc] extension
1076: %%Prog: ox.ccc (122345; ) oxsubmit ;
1077: {\tt message\_body} の実例をあげる. シリアル番号部は除いてある.
1078: \begin{enumerate}
1079: \item {\tt executeStringByLocalParser("12345 ;");}
1080: は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.
1081: {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.
1082: \begin{verbatim}
1083: 0 0 2 2 0 0 0 4 0 0 0 7
1084: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;)
1085: 0 0 2 1 0 0 1 c
1086: \end{verbatim}
1087: ここで,
1088: \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,
1089: 順番に {\tt OX\_DATA} それから,
1090: CMO のタグの, {\tt CMO\_STRING} を表す.
1091: \verb+ 0 0 0 7 + は文字数,
1092: 最後に 文字列 {\tt 12345 ;} が来る.
1093: ここで, \verb+ 0 0 1 c + は, network byte order で,
1094: {\tt OX\_executeString} を表す.
1095:
1096: まとめると次のようになる.
1097: \begin{verbatim}
1098: 0 0 2 2 (OX_DATA) 0 0 0 4 (CMO_STRING)
1099: 0 0 0 7 (size)
1100: 31(1) 32(2) 33(3) 34(4) 35(5) 20 3b(;) (data)
1101: 0 0 2 1 (OX_COMMAND)
1102: 0 0 1 c (SM_executeStringByLocalParser)
1103: \end{verbatim}
1104: これを OXexpression で表記すると次のようになる.
1105: \begin{center}
1106: (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))
1107: \end{center}
1108: \begin{center}
1109: (OX\_COMMAND, (SM\_executeStringByLocalParser))
1110: \end{center}
1111:
1112: \item {\tt popString()} を要請するメッセージ:
1113: \begin{verbatim}
1114: 0 0 2 1 (OX_COMMAND)
1115: 0 0 1 7 (SM_popString)
1116: \end{verbatim}
1117: OXexpression では
1118: (OX\_COMMAND, (SM\_popString)).
1119:
1120: \noindent
1121: これにたいして次の返答メッセージがくる.
1122: \begin{verbatim}
1123: 0 0 2 2 (OX_DATA)
1124: 0 0 0 4 (CMO_STRING) 0 0 0 5 (size)
1125: 31(1) 32(2) 33(3) 34(4) 35(5)
1126: \end{verbatim}
1127: OXexpression でかくと,
1128: (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).
1129:
1130:
1131:
1132: \end{enumerate}
1133:
1134: \subsubsection{グループ SMobject/Basic1 に属するオペレータ}
1135:
1136:
1137: \begin{enumerate}
1138:
1139: \item
1140: \begin{verbatim}
1141: void xxx_pops(int n)
1142: \end{verbatim}
1143: operand stack より, {\it n} 個の元
1144: ({\it obj1, obj2, $\ldots$, objn}) を pop して捨てる.
1145: \\ Stack before the request: (右が stack のトップである.) \\
1146: \begin{tabular}{|c|c|c|c|c|} \hline
1147: {\it obj1} & {\it obj2} & $\cdots$ & {\it objn} &{\it INT32 n} \\
1148: \hline
1149: \end{tabular}
1150: \\ Request:
1151: \begin{tabular}{|c|c|} \hline
1152: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_pops } \\
1153: \hline
1154: \end{tabular}
1155: \\ Result: なし.
1156:
1157:
1158: \item
1159: \begin{verbatim}
1160: int xxx_setName(char *name)
1161: \end{verbatim}
1162: (これは本当に必要な関数??)
1163: {\tt OperandStack} より {\it name} を pop し, つぎに
1164: {\tt OperandStack} より {\it obj} を pop し, それを
1165: 現在の名前空間で変数 {\it name} に bind する.
1166: 正常終了なら 0 を, 異常終了なら -1 をもどす.
1167: TCP/IP による通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} を
1168: stack へ push する.
1169: \\ Stack before the request: (右が stack の top.)
1170: \begin{tabular}{|c|c|} \hline
1171: {\it obj} & {\it String name} \\
1172: \hline
1173: \end{tabular}
1174: \\ Request:
1175: \begin{tabular}{|c|c|} \hline
1176: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setName} \\
1177: \hline
1178: \end{tabular}
1179: \\ Result: なし.
1180:
1181: \item
1182: \begin{verbatim}
1183: int xxx_evalName(char *name)
1184: \end{verbatim}
1185: (これは本当に必要な関数??)
1186: 現在の名前空間で変数 {\it name} を評価する.
1187: 評価の結果 {\it resultObj} をスタックへ戻す.
1188: 関数自体は正常終了なら 0 を, 異常終了なら -1 をもどす.
1189: TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2} を stack へ push する.
1190: \\ Stack before the request: (右が stack の top.)
1191: \begin{tabular}{|c|} \hline
1192: {\it String name} \\
1193: \hline
1194: \end{tabular}
1195: \\ Request:
1196: \begin{tabular}{|c|c|} \hline
1197: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_evalName} \\
1198: \hline
1199: \end{tabular}
1200: \\ Stack after the request: (右が stack の top.)
1201: \begin{tabular}{|c|} \hline
1202: {\it resultObj} \\
1203: \hline
1204: \end{tabular}
1205: \\ Result: なし.
1206:
1207: \item
1208: \begin{verbatim}
1209: int xxx_executeFunction(char *s, int n)
1210: \end{verbatim}
1211: スタックより {\it n} 個のデータを pop して, サーバのローカル関数
1212: {\it s} を実行する.
1213: エラーのときのみ {\tt CMO\_ERROR2} を stack へ push する.
1214: \\ Stack before the request: (右が stack の top.) \\
1215: \begin{tabular}{|c|c|c|c|c|} \hline
1216: {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\
1217: \hline
1218: \end{tabular}
1219: \\ Request:
1220: \begin{tabular}{|c|c|} \hline
1221: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_executeFunction} \\
1222: \hline
1223: \end{tabular}
1224: \\ Stack after the request:
1225: 関数実行の結果.
1226: \\ Result: なし.
1227:
1228:
1229:
1230:
1231:
1232: \item
1233: \begin{verbatim}
1234: bytes *xxx_popSerializedLocalObject(void)
1235: void popSerializedLocalObject(ox_stream out)
1236: \end{verbatim}
1237: 最初の関数はライブラリとしてリンクして使用するための関数である.
1238: スタックより pop した object を local 形式の serialization して
1239: byte 列で戻す.
1240: 2 番目の関数は Socket で通信するための同機能の関数であり,
1241: serialization された byte 列を
1242: {\tt ox\_stream out} へ出力する.
1243: この場合,
1244: header
1245: {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT}
1246: をつけてから, byte 列を送る.
1247: この関数はおもに, homogeneous な分散システムで用いる.
1248: 次に, サーバスタックマシンの関数が実行されるまでは,
1249: 戻り object の内容は保証されないといけない.
1250:
1251: \item
1252: local serialized object, および サポートする CMO object を
1253: {\tt OX\_DATA} として受信した場合, {\tt OperandStack} へ
1254: push する.
1255: 受信エラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.
1256:
1257:
1258: \item
1259: \begin{verbatim}
1260: bytes *xxx_popCMO(void)
1261: void xxx_popCMO(ox_stream out)
1262: \end{verbatim}
1263:
1264: 最初の関数はライブラリとしてリンクして使用するための関数である.
1265: {\tt OperandStack} より object を pop し CMO 形式の
1266: serialized object を byte 列として戻す.
1267: 2 番目の関数は Socket で通信するための同機能の関数であり,
1268: {\tt ox\_stream out } へ, そのデータを header
1269: {\tt OX\_DATA} をつけてながす.
1270: この関数はおもに, heterotic な分散システムで用いる.
1271: 次に, サーバスタックマシンの関数が実行されるまでは,
1272: 戻り object の内容は保証されないといけない.
1273: \\ Request:
1274: \begin{tabular}{|c|c|} \hline
1275: {\tt int32 OX\_COMMAND} & {\tt int32 OX\_popCMO} \\
1276: \hline
1277: \end{tabular}
1278: \\ Result:
1279: \begin{tabular}{|c|c|} \hline
1280: {\tt int32 OX\_DATA} & {\it Serialized CMO} \\
1281: \hline
1282: \end{tabular}
1283:
1284: 以下で, {\tt ox\_stream} はサンプルサーバの場合,
1285: \begin{verbatim}
1286: typedef FILE2 * ox_stream;
1287: \end{verbatim}
1288: である (cf. {\tt file2.h}). これは処理系によりちがってよい.
1289: {\tt ox\_asir} では, {\tt FILE *} を用いている.
1290:
1291: \end{enumerate}
1292:
1293: \section{現在検討中の機能}
1294:
1295: \subsection{ OX DATA with Length の構造 }
1296:
1297: Digital signature 付の {\tt OX\_DATA} は
1298: ヘッダ {\tt OX\_DATA\_WITH\_LENGTH }で, はじまり, CMO がきて,
1299: それから, 終りのマークおよびデジタル署名がくる.
1300: この形のデータを {\it secured OX DATA} と呼ぶ.
1301: \begin{verbatim}
1302: #define OX_SECURED_DATA 521
1303: \end{verbatim}
1304:
1305: \noindent
1306: \begin{tabular}{|c|c|c|c|c|} \hline
1.3 ! takayama 1307: {\tt int32 OX\_DATA\_WITH\_LENGTH} & {\tt int32} {\rm serial}
! 1308: & {\tt int32} {\rm size}
! 1309: & {\sl CMObject} {\rm o} & {\it tail} \\
1.1 maekawa 1310: \hline
1311: \end{tabular}
1312:
1313: {\tt size} フィールドに 値 -1 が入っている場合この情報を無視する.
1314:
1315: {\it tail } は次のように定義する.
1316: \\ \noindent
1317: \begin{tabular}{|c|c|c|} \hline
1.3 ! takayama 1318: {\tt int32 CMO\_START\_SIGNATURE} & {\tt int32} {\rm size}
1.1 maekawa 1319: & {\it signature} \\
1320: \hline
1321: \end{tabular}
1322:
1.3 ! takayama 1323: ここで, {\tt size} はバイト列 {\it signature} 部の長さ.
1.1 maekawa 1324: {\it signature} は, Hash 関数を用いた, {\it CMO data}
1325: にたいする, デジタル署名をいれ, 不正な serialized object
1326: を検出する.
1327: Tail の {\tt size} フィールドが 0 の場合, デジタル署名部はない.
1328:
1329: クライアント, サーバの実装には次の3つの選択がある.
1330: \begin{enumerate}
1.3 ! takayama 1331: \item {\tt OX\_DATA} のみを用いて CMObject を送る (mathcap 付).
1.1 maekawa 1332: \item {\tt OX\_SECURED\_DATA} のみを用いて CMObject を送る.
1333: \item {\tt OX\_DATA} および
1334: {\tt OX\_SECURED\_DATA} を混在して
1335: 使用できるようにする.
1336: \item {\tt OX\_DATA} のみを用いてかつ mathcap も用いない(一番高速).
1337: \end{enumerate}
1338: 1 の短所は, mathcap の実装が不十分で,
1339: 理解できない CMObject をうけとると,
1340: 以後の CMObject は理解できなくなる.
1341: 1 の長所は, 長さフィールドの計算を
1342: おこなわないため, データを送り出す側に負担がかからないことである.
1343: 2 の長所は, mathcap の実装が不十分で,
1344: 理解できない CMObject をうけとっても,
1345: 長さフィールドを用いて, 通信回線のダウンを
1346: 防ぐことができる.
1347: 2 の短所は, 長さフィールドの計算を
1348: おこなうため, データを送り出す側に負担がかかることである.
1349:
1350: 現在のすべてのサンプルサーバは, 1, 4 のみを実装している.
1351:
1.3 ! takayama 1352: mathcap の交換はセッションの開始時点で必須という訳ではない
! 1353: ことに注意されたい.
! 1354: たとえば,
! 1355: モード 4 で通信して,
! 1356: それから,
! 1357: mathcap を交換して,
! 1358: モード 1 へ移行することも可能なように実装すべきである.
! 1359:
1.1 maekawa 1360:
1361: \subsection{サーバスタックマシンはローカルな拡張機能をもってよい}
1362:
1363: \begin{verbatim}
1364: #define CMO_PRIVATE 0x7fff0000
1365: \end{verbatim}
1366:
1367: {\tt CMO\_PRIVATE} = {\tt OX\_PRIVATE} = {\tt SM\_PRIVATE}
1368: よりはじまる, 0x10000 個の ID は, private 領域として予約されている.
1369: 各サーバの開発者間で表現方法につきまだ合意がないような, CMObject,
1370: OXobject, SMobject を表現するために使用する.
1371:
1372: \subsection{MathLink や open math などの通信規約の実装}
1373:
1374: Open asir, open sm1 と Mathematica の用いている MathLink や
1375: Open Math (\cite{openmath})
1376: プロトコルを変換するための
1377: ライブラリやサーバを用意すれば, {\tt asir} や {\tt kan/sm1} の
1378: 内部構造を理解することなしに, これらに準拠したシステムと通信できる.
1379:
1380: \subsection{共通スタックマシン言語}
1381:
1382: CMO に付随した, たとえば, Integer 32 に対する,
1383: add, sub, mul, などの基本的な計算は {\tt SM\_executeFunction}
1384: で全てのシステムで実行できるように検討している.
1385: スタックマシンの制御構造についても検討している.
1386:
1387:
1388:
1389: \section{コントロールメッセージ (SMObject/TCPIP/Control)}
1390:
1391: \begin{enumerate}
1392: \item
1393: サーバは {\tt SM\_control\_reset\_connection}
1394: メッセージを受信したら, 現在の計算を中断する.
1395: 中断操作は細心の注意をもって行なわないといけない.
1396: サンプルサーバ ({\tt oxmain.c})では, コントロールメッセージの
1397: 処理は別のプロセスがおこなっており, SIGUSR1 割り込みをスタックマシンへ
1398: かける.
1399: もしサーバがメッセージの通信中であれば, このコントロールメッセージ
1400: をすぐには実行せず, メッセージ通信を終了するのを待つ.
1401: 当然, メッセージを発信中に, このメッセージを送信してもいけない.
1402: (Java 風にいえば, すべての メッセージは synchronized object である.)
1403: また, たとえば file IO なども, 中断をうけてはならない, synchronized な
1404: 操作であろう.
1405: クライアントがサーバに controlResetConnection コントロールメッセージを
1406: おくったら, サーバは, 現在の受信バッファをすべてクリアし,
1407: クライアントへ
1408: {\tt OX\_SYNC\_BALL}
1409: を送る.
1410: クライアントは, コントロールメッセージをおくったあと,
1411: 待機モードに入り, {\tt OX\_SYNC\_BALL}
1412: をうけとるまですべてのメッセージを読み飛ばす.
1413: クライアントは {\tt OX\_SYNC\_BALL} をうけとったら,
1414: サーバに {\tt OX\_SYNC\_BALL} を送る.
1415: サーバは, 最初の {\tt OX\_SYNC\_BALL} を投げたあと,
1416: 待機モードに入り,
1417: {\tt OX\_SYNC\_BALL}
1418: をうけとるまですべてのメッセージを読み飛ばす.
1419: %% 最後に, サーバ
1420: %% はすべての操作が終了したことを通知するため,
1421: %% クライアントに
1422: %% {\tt OX\_SYNC\_BALL} を投げる.
1423: \\ Request:
1424: \begin{tabular}{|c|c|} \hline
1425: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection} \\
1426: \hline
1427: \end{tabular}
1428: \\ Result:
1429: \begin{tabular}{|c|c|} \hline
1.3 ! takayama 1430: {\tt int32 OX\_DATA} & {\tt CMO\_INT32} {\rm result} \\
1.1 maekawa 1431: \hline
1432: \end{tabular}
1433:
1.3 ! takayama 1434: @@@
1.1 maekawa 1435:
1436: \item
1437: サーバはこのメッセージを受信したらただちにコントロールメッセージへの
1438: 返答をおくり, すべてのファイルをクローズして終了する.
1439: \\ Request:
1440: \begin{tabular}{|c|c|} \hline
1441: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_kill} \\
1442: \hline
1443: \end{tabular}
1444: \\ Result:
1445: Empty \\
1446:
1447:
1448: \end{enumerate}
1449:
1450: \medbreak
1451: \noindent
1452: {\bf 例}: (シリアル番号は省略してある.)\
1453: \begin{verbatim}
1454: 0 0 2 01 (OX_COMMAND)
1455: 0 0 4 06 (SM_control_reset_connection)
1456: \end{verbatim}
1457:
1458: Reset に対する返事.
1459: \begin{verbatim}
1460: 0 0 2 02 (OX_DATA)
1461: 0 0 0 2 (CMO_INT32)
1462: 0 0 0 0 ( 0 )
1463: \end{verbatim}
1464:
1465:
1466: 第1のチャンネルでは次の {\tt OX\_SYNC\_BALL} が交換されて同期が
1467: 取られる.
1468: \begin{verbatim}
1469: 0 0 2 03 (OX_SYNC_BALL)
1470: \end{verbatim}
1471:
1472: \section{TCP/IP でのセッションのスタート}
1473: コントロールプロセス, 計算プロセス
1474: ともに, 起動直後に
1475: 1 byte のデータを書き出し flush する.
1476: そのあと, 1 byte のデータを読み込む.
1477: クライアントはコントロールプロセス, 計算プロセス
1.2 takayama 1478: につながるファイルディスクリプタの両方から
1479: まず 1 byte のデータを読む.
1480: そのあと
1.1 maekawa 1481: 1 byte のデータを書き出し flush する.
1482: 1 byte のデータは,
1483: {\tt 0}, {\tt 1}, {\tt FF} のどれかであり,
1484: {\tt 0} は以下の通信において {\tt int32} をおくるのに,
1485: network byte order を使用したい,
1486: {\tt 1} は以下の通信において {\tt int32} をおくるのに,
1.3 ! takayama 1487: little endian を使用したい,
1.1 maekawa 1488: {\tt FF} は以下の通信において {\tt int32} をおくるのに,
1.3 ! takayama 1489: big endian を使用したい,
1.1 maekawa 1490: という意味である.
1491: 両者の希望が一致しない場合はつねに {\tt 0} (network byte order)
1492: を使用する.
1493: Network byte order しか実装していないシステムでは,
1.2 takayama 1494: {\tt 0} をおくればよい.
1.1 maekawa 1495: ただし効率が問題となる通信において, network byte order への変換は
1496: おおきなボトルネックとなることがあることを了解しておくべきである.
1497:
1498: \begin{verbatim}
1499: #define OX_BYTE_NETWORK_BYTE_ORDER 0
1.3 ! takayama 1500: #define OX_BYTE_LITTLE_ENDIAN 1
! 1501: #define OX_BYTE_BIG_ENDIAN 0xff
1.1 maekawa 1502: \end{verbatim}
1503:
1.2 takayama 1504:
1505: 注意: {\tt OpenXM/src/kxx} に含まれる, {\tt ox} (コントロールプロセス,
1506: 計算プロセスをたちあげるローンチャ)は, 標準で One Time Password
1507: の機能をもっています.
1508: この機能を OFF にするには {\tt -insecure} option を使用して下さい.
1509: One Time Password は 0 で終了するバイト列であり,
1.3 ! takayama 1510: コントロール, 計算双方のプロセスをたちあげるまえに,
! 1511: {\tt ox} はコントロール, 計算双方のプロセスに対応する,
! 1512: ふたつのポートに
! 1513: One Time Password バイト列を送出しています.
1.2 takayama 1514:
1515: {\tt ox} (ソースは {\tt oxmain.c}, {\tt kan96xx/plugin/oxmisc.c})においては
1516: {\tt oxTellMyByteOrder()} が, サーバについての byte order 情報の
1517: 送出, 読み込みをやっている.
1518: クライアントについては,
1519: {\tt oxSetByteOrder()} が, byte order 情報の読み込み, 送出をおこなっている.
1.1 maekawa 1520:
1.3 ! takayama 1521: One time パスワードは安全な通信路で配送される必要があります.
! 1522: また, 現在の {\rm ox} の実装では, One time パスワードを
! 1523: サーバ, クライアントに login している人はすべて見ることが
! 1524: できますので, サーバ, クライアントには悪意のある人はいないと
! 1525: 仮定しないといけません.
! 1526: One time パスワードを安全に配送し, リモートマシンの {\rm ox}
! 1527: を立ち上げるには
! 1528: たとえば
! 1529: {\tt ssh} を {\tt -f } オプションを用いて使用します.
! 1530:
! 1531: 以下は {\rm sm1} での実装, 動作例です.
! 1532: ここでは, {\tt yama} の {\tt sm1} より {\tt dc1} の {\tt ox}
! 1533: を立ち上げています.
! 1534: {\footnotesize
! 1535: \begin{verbatim}
! 1536: yama% sm1
! 1537: sm1>(ox.sm1) run ;
! 1538: ox.sm1, --- open sm1 protocol module 10/1,1999 (C) N.Takayama. oxhelp for help
! 1539: sm1>[(dc1.math.kobe-u.ac.jp) (taka)] sm1connectr-ssh /ox.ccc set ;
! 1540: Hello from open. serverName is yama.math.kobe-u.ac.jp and portnumber is 0
! 1541: Done the initialization. port =1024
! 1542: Hello from open. serverName is yama.math.kobe-u.ac.jp and portnumber is 0
! 1543: Done the initialization. port =1025
! 1544: [ 4 , 1025 , 3 , 1024 ]
! 1545: Executing the command : ssh -f dc1.math.kobe-u.ac.jp -l taka
! 1546: "/home/taka/OpenXM/bin/oxlog /usr/X11R6/bin/xterm -icon
! 1547: -e /home/taka/OpenXM/bin/ox -reverse -ox /home/taka/OpenXM/bin/ox_sm1
! 1548: -host yama.math.kobe-u.ac.jp -data 1025 -control 1024 -pass 518158401 "
! 1549: [
! 1550: taka@dc1.math.kobe-u.ac.jp's password:
! 1551: Trying to accept... Accepted.
! 1552: Trying to accept... Accepted.
! 1553:
! 1554: Control port 1024 : Connected.
! 1555:
! 1556: Stream port 1025 : Connected.
! 1557: Byte order for control process is network byte order.
! 1558: Byte order for engine process is network byte order.
! 1559: \end{verbatim}
! 1560: }
! 1561:
1.1 maekawa 1562: \section{ オブジェクトの文字列表現 }
1563:
1564: 文字列表現は, システム xxx のマニュアルに記述されている一次元的入出力形式に
1565: したがう.
1566:
1567:
1568: \section{ 数, 多項式 の CMO 表現 }
1569:
1570:
1571: タグの種類.
1572: @../SSkan/plugin/cmotag.h
1573: \begin{verbatim}
1574: #define CMO_MONOMIAL32 19
1575: #define CMO_ZZ 20
1576: /* #define CMO_ZZ 32 */
1577: #define CMO_QQ 21
1578: #define CMO_ZERO 22
1579: /* #define CMO_DMS 23 Distributed monomial system */
1580: #define CMO_DMS_GENERIC 24
1581: #define CMO_DMS_OF_N_VARIABLES 25
1582: #define CMO_RING_BY_NAME 26
1583: #define CMO_DISTRIBUTED_POLYNOMIAL 31
1584: #define CMO_RATIONAL 34
1585:
1586:
1587: #define CMO_INDETERMINATE 60
1588: #define CMO_TREE 61
1589: #define CMO_LAMBDA 62 /* for function definition */
1590: \end{verbatim}
1591:
1592: 以下, グループ CMObject/Basic1, CMObject/Tree
1593: および CMObject/DistributedPolynomial
1594: に属する CMObject の形式を説明する.
1595: \noroa{ tagged list を導入すべきか? cf. SSkan/plugin/cmo.txt }
1596:
1597: 拡張 BNF 記法と CMOexpression をまぜた記法で定義する.
1598: --- ではじまる文はコメントである.
1599:
1600: \bigbreak
1601: \noindent
1602: Group CMObject/Basic1 requires CMObject/Basic0. \\
1603: ZZ, QQ, Zero, Rational, Indeterminate,$\in$ CMObject/Basic1. \\
1604: \begin{eqnarray*}
1605: \mbox{Zero} &:& ({\tt CMO\_ZERO}) \\
1606: & & \mbox{ --- ユニバーサルな ゼロを表す. } \\
1.3 ! takayama 1607: \mbox{ZZ} &:& ({\tt CMO\_ZZ},{\sl int32}\, {\rm f}, {\sl byte}\, \mbox{a[1]}, \ldots
1.1 maekawa 1608: {\sl byte}\, \mbox{a[m]} ) \\
1609: &:& \mbox{ --- bignum をあらわす. a[i] についてはあとで説明}\\
1.3 ! takayama 1610: \mbox{QQ} &:& ({\tt CMO\_QQ}, {\sl ZZ}\, {\rm a}, {\sl ZZ}\, {\rm b}) \\
1.1 maekawa 1611: & & \mbox{ --- 有理数 $a/b$ を表す. } \\
1.3 ! takayama 1612: \mbox{Rational} &:& ({\tt CMO\_RATIONAL}, {\sl CMObject}\, {\rm a}, {\sl CMObject}\, {\rm b}) \\
1.1 maekawa 1613: & & \mbox{ --- $a/b$ を表す. } \\
1.3 ! takayama 1614: \mbox{Indeterminate} &:& ({\tt CMO\_INDETERMINATE}, {\sl Cstring}\, {\rm v}) \\
1.1 maekawa 1615: & & \mbox{ --- 変数名 $v$ . } \\
1616: \end{eqnarray*}
1617:
1618: Indeterminate は変数名をあらわす.
1619: v はバイト列であればなにを用いてもよいが,
1620: システム毎に変数名として用いられるバイト列は制限がある.
1621: 各システム xxx は任意の文字列を各システム固有の変数名へ1対1に変換できるように
1622: 実装しないといけない.
1623: (これを
1624: {\tt Dx} は {\tt \#dx} と変換するなどの
1625: escape sequence を用いて実現するのは, 無理があるようである.
1626: テーブルを作成する必要があるであろう.)
1627:
1628: \noindent
1629: Group CMObject/Tree requires CMObject/Basic1. \\
1630: Tree, Lambda $\in$ CMObject/Basic1. \\
1631: \begin{eqnarray*}
1.3 ! takayama 1632: \mbox{Tree} &:& ({\tt CMO\_TREE}, {\sl Cstring}\, {\rm name},
! 1633: {\sl Cstring}\, {\rm cdname}, {\sl List}\, {\rm leaves}) \\
1.1 maekawa 1634: & & \mbox{ --- 名前 name の定数または関数. 関数の評価はおこなわない. } \\
1.3 ! takayama 1635: & & \mbox{ --- cdname は空文字列でなければ name の意味が説明されている }\\
! 1636: & & \mbox{ --- OpenMath CD (content dictionary) の名前. } \\
! 1637: \mbox{Lambda} &:& ({\tt CMO\_LAMBDA}, {\sl List}\, {\rm args},
! 1638: {\sl Tree} {\rm body}) \\
1.1 maekawa 1639: & & \mbox{ --- body を args を引数とする関数とする. } \\
1640: & & \mbox{ --- optional な引数が必要なときは, leaves の後へつづける.} \\
1641: \end{eqnarray*}
1.3 ! takayama 1642:
! 1643: --------------------- 修正ここまで --------------------------
1.1 maekawa 1644:
1645: 数式を処理するシステムでは, Tree 構造が一般にもちいられる.
1646: たとえば, $\sin(x+e)$ は,
1647: {\tt (sin, (plus, x, e))}
1648: なる Tree であらわすのが一般的である.
1649: Tree の表現を スタックマシンのレベルでおこなうとすると,
1650: {\tt ox\_BEGIN\_BLOCK}, {\tt ox\_END\_BLOCK} で評価を抑制するのが
1651: 一つの方法である (cf. Postscript の {\tt \{ }, {\tt \} }).
1652: たとえば上の方法では
1653: {\tt x, e, plus, sin } を begin block, end block でかこめばよろしい.
1654: われわれはスタックマシンの実装をなるべく簡単にするという立場をとりたい,
1655: また数学オブジェクトを OX スタックマシンと CMObject を混在して表現したく
1656: ない.
1657: したがって,
1658: Tree 構造は Open Math 風の表現をもちいた CMO を導入することにした.
1659: またこのほうが, われわれの想定するシステム xxx において, Open XM 対応が
1660: はるかに容易である.
1661: なお, Tree は, Open Math では, Symbol, Application のメカニズムに相当する.
1662:
1663: Lambda は関数を定義するための関数である.
1664: Lisp の Lambda 表現と同じ.
1665:
1666:
1667: \bigbreak
1668: 次に, 分散表現多項式に関係するグループを定義しよう.
1669:
1670: \medbreak
1671: \noindent
1672: Group CMObject/DistributedPolynomials requires CMObject/Basic0,
1673: CMObject/Basic1. \\
1674: Monomial, Monomial32, Coefficient, Dpolynomial, DringDefinition,
1675: Generic DMS ring, RingByName, DMS of N variables $\in$
1676: CMObject/DistributedPolynomials. \\
1677: \begin{eqnarray*}
1678: \mbox{Monomial} &:& \mbox{Monomial32}\, |\, \mbox{Zero} \\
1679: \mbox{Monomial32}&:& ({\tt CMO\_MONOMIAL32}, {\sl int32}\, n,
1680: {\sl int32}\, \mbox{e[1]}, \ldots,
1681: {\sl int32}\, \mbox{e[n]}, \\
1682: & & \ \mbox{Coefficient}) \\
1683: & & \mbox{ --- e[i] で, $n$ 変数 monomial
1684: $x^e = x_1^{e_1} \cdots x_n^{e_n}$ の各指数 $e_i$
1685: をあらわす.} \\
1686: \mbox{Coefficient}&:& \mbox{ZZ} | \mbox{Integer32} \\
1687: \mbox{Dpolynomial}&:& \mbox{Zero} \\
1688: & & |\ ({\tt CMO\_DISTRIBUTED\_POLYNOMIAL},{\sl int32} m, \\
1689: & & \ \ \mbox{DringDefinition},
1690: [\mbox{Monomial32}|\mbox{Zero}], \\
1691: & &\ \
1692: \{\mbox{Monomial32}\}) \\
1693: & &\mbox{--- m はモノミアルの個数である.}\\
1694: \mbox{DringDefinition}
1695: &:& \mbox{DMS of N variables} \\
1696: & & |\ \mbox{RingByName} \\
1697: & & |\ \mbox{Generic DMS ring} \\
1698: & & \mbox{ --- 分散表現多項式環の定義. } \\
1699: \mbox{Generic DMS ring}
1700: &:& ({\tt CMO\_DMS\_GENERIC})\ 新版はこちら\\
1701: \mbox{RingByName}&:& ({\tt CMO\_RING\_BY\_NAME}, {\sl Cstring} s) \\
1702: & & \mbox{ --- 名前 s で, 格納された ring 定義.} \\
1703: \mbox{DMS of N variables}
1704: &:& ({\tt CMO\_DMS\_OF\_N\_VARIABLES}, \\
1705: & & \ ({\tt CMO\_LIST}, {\sl int32}\, \mbox{m},
1706: {\sl Integer32}\, \mbox{n}, {\sl Integer32}\,\mbox{p} \\
1707: & & \ \ [,{\sl object}\,\mbox{s}, {\sl Cstring}\,\mbox{c},
1708: {\sl List}\, \mbox{vlist},
1709: {\sl List}\, \mbox{wvec}, {\sl List}\, \mbox{outord}]) \\
1710: & & \mbox{ --- m はあとに続く要素の数} \\
1711: & & \mbox{ --- n は変数の数, p は 標数} \\
1712: & & \mbox{ --- s は ring の名前} \\
1713: & & \mbox{ --- c は係数環, QQ, ZZ の場合は文字列で QQ, ZZ と書く.} \\
1714: & & \mbox{ --- vlist は Indeterminate のリスト(新版)} \\
1715: & & \mbox{ --- wvec は order をきめる weight vector,} \\
1716: & & \mbox{ --- outord は出力するときの変数順序.} \\
1717: \end{eqnarray*}
1718:
1719: 以下, 以上の CMObject にたいする,
1720: xxx = asir, kan の振舞いを記述する.
1721:
1722: \subsection{ Zero}
1723: CMO では ゼロの表現法がなんとうりもあるが,
1724: どのようなゼロをうけとっても,
1725: システムのゼロに変換できるべきである.
1726: (たとえば, asir は 0 はただ一つ.)
1727:
1728:
1729:
1730: \subsection{ 整数 ZZ }
1731:
1732: \begin{verbatim}
1733: #define CMO_ZZ 20
1734: \end{verbatim}
1735:
1736:
1737: この節ではOpen xxx 規約における任意の大きさの整数(bignum)の扱いについて
1738: 説明する.
1739: Open XM 規約における多重精度整数を表すデータ型 CMO\_ZZ は GNU MPライブ
1740: ラリなどを参考にして設計されていて, 符号付き絶対値表現を用いている.
1741: (cf. {\tt kan/sm1} の配布ディレクトリのなかの {\tt plugin/cmo-gmp.c})
1742: CMO\_ZZ は次の形式をとる.\\
1743: \begin{tabular}{|c|c|c|c|c|}
1744: \hline
1745: {\tt int32 CMO\_ZZ} & {\tt int32 $f$} & {\tt int32 $b_0$} & $\cdots$ &
1746: {\tt int32 $b_{n}$} \\
1747: \hline
1748: \end{tabular} \\
1749: $f$ は32bit整数である.
1750: $b_0, \ldots, b_n$ は unsigned int32 である.
1751: $|f|$ は $n+1$ である.
1752: この CMO の符号は $f$ の符号で定める.
1753: 前述したように, 32bit整数の負数は 2 の補数表現で表される.
1754:
1755: Open xxx 規約では上の CMO は以下の整数を意味する.
1756: \[
1757: \mbox{sgn}(f)\times (b_0 R^{0}+ b_1 R^{1} + \cdots + b_{n-1}R^{n-1} + b_n R^n).
1758: \]
1759: ここで $R = 2^{32}$ である.
1760: {\tt int32} を network byte order で表現しているとすると,
1761: 例えば, 整数 $14$ は CMO\_ZZ で表わすと,
1762: \[
1763: \mbox{(CMO\_ZZ, 1, 0, 0, 0, e)},
1764: \]
1765: と表わす.
1766: これはバイト列では
1767: \[
1768: \mbox{\tt 00 00 00 14 00 00 00 01 00 00 00 0e}
1769: \]
1770: となる.
1771:
1772:
1773: なお ZZ の 0 ( (ZZ) 0 と書く ) は,
1774: {\tt (CMO\_ZZ, 00,00,00,00)}
1775: と表現する.
1776:
1777:
1778: \subsection{ 分散表現多項式 Dpolynomial }
1779:
1780: 環とそれに属する多項式は次のような考えかたであつかう.
1781:
1782: Generic DMS ring に属する元は,
1783: 変数を $n$ 個持つ 適当な係数集合 $K$ を持つ多項式環 $K[x_1, \ldots, x_n]$
1784: の元である.
1785: 係数集合 $K$ がなにかは, 実際データを読み込み, Coefficient を見た段階で
1786: わかる.
1787: この環に属する多項式を CMO 形式でうけとった場合, 各サーバはその
1788: サーバの対応する Object に変換しないといけない.
1789: この変換の仕方は, 各サーバ毎にきめる.
1790:
1791: Asir の場合は, $K[x_1, \ldots, x_n]$ の元は分散表現多項式に変換される.
1792: \noroa{ でも, order はどうなるの? }
1793:
1794: {\tt kan/sm1} の場合は事情は複雑である.
1795: {\tt kan/sm1} は, Generic DMS ring にあたる クラスをもたない.
1796: つまり, Default で存在する, $n$ 変数の分散表現多項式環は存在しないわけである.
1797: したがって, {\tt kan/sm1} では, DMS of N variables が来た場合,
1798: これを CurrentRing の元として読み込む. CurrentRing の変数の数が $n'$
1799: で, $n' < n$ だと新しい多項式環を生成してデータを読み込む.
1800: Order その他の optional 情報はすべて無視する.
1801:
1802: DMS の 2 番目のフィールドで,
1803: Ring by Name を用いた場合, 現在の名前空間で変数 yyy に格納された ring object
1804: の元として, この多項式を変換しなさいという意味になる.
1805: {\tt kan/sm1} の場合, 環の定義は ring object として格納されており,
1806: この ring object を 変数 yyy で参照することにより CMO としてうけとった
1807: 多項式をこの ring の元として格納できる.
1808:
1809:
1810:
1811:
1812:
1813: \medbreak \noindent
1814: {\bf Example}:
1815: (すべての数の表記は 16 進表記)
1816: {\footnotesize \begin{verbatim}
1817: Z/11Z [6 variables]
1818: (kxx/cmotest.sm1) run
1819: [(x,y) ring_of_polynomials ( ) elimination_order 11 ] define_ring ;
1820: (3x^2 y). cmo /ff set ;
1821: [(cmoLispLike) 1] extension ;
1822: ff ::
1823: Class.CMO CMO StandardEncoding: size = 52, size/sizeof(int) = 13,
1824: tag=CMO_DISTRIBUTED_POLYNOMIAL
1825:
1826: 0 0 0 1f 0 0 0 1 0 0 0 18 0 0 0 13 0 0 0 6
1827: 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1
1828: 0 0 0 0 0 0 0 2 0 0 0 3
1829:
1830: ff omc ::
1831: (CMO_DISTRIBUTED_POLYNOMIAL[1f],[size=]1,(CMO_DMS_GENERIC[18],),
1832: (CMO_MONOMIAL32[13],3*x^2*y),),
1833: \end{verbatim} }
1834: length は, monomial の数$+2$ である.
1835: $ 3 x^2 y$ は 6 変数の多項式環の元としてみなされている.
1836: %%Prog: (3x^2 y). cmosave ===> debug/cmodata1.cmo
1837: %%\\ 反省: 分散多項式の定義で,
1838: %%{\tt CMO\_LIST} でなく, {\tt CMO\_DMS} がはじめにくるべきだったのでは?
1839: %%あたらしい 分散多項式の定義は次のようにすべき:
1840: %% 修正済み. 1999, 9/13
1841:
1842:
1843:
1844: \section{再帰表現多項式の定義} %% From this/noro/rp.tex
1845:
1846: \begin{verbatim}
1847: #define CMO_RECURSIVE_POLYNOMIAL 27
1848: #define CMO_POLYNOMIAL_IN_ONE_VARIABLE 33
1849: \end{verbatim}
1850:
1851: Group CMObject/RecursivePolynomial requires CMObject/Basic0, CMObject/Basic1.\\
1852: Polynomial in 1 variable, Coefficient, Name of the main variable,
1853: Recursive Polynomial, Ring definition for recursive polynomials
1854: $\in$ CMObject/RecursivePolynomial \\
1855:
1856: \begin{eqnarray*}
1857: \mbox{Polynomial in 1 variable} &:&
1858: \mbox{({\tt CMO\_POLYNOMIAL\_IN\_ONE\_VARIABLE},\, {\sl int32}\, m, } \\
1859: & & \quad \mbox{ Name of the main variable }, \\
1860: & & \quad \mbox{ \{ {\sl int32} e, Coefficient \}} \\
1861: & & \mbox{ --- m はモノミアルの個数. } \\
1862: & & \mbox{ --- e, Coefficieint はモノミアルを表現している. } \\
1863: & & \mbox{ --- 順序の高い順にならべる. 普通は巾の高い順.} \\
1864: & & \mbox{ --- e は 1変数多項式の巾をあらわす. } \\
1865: \mbox{Coefficient} &:& \mbox{ ZZ} \,|\, \mbox{ QQ } \,|\,
1866: \mbox{ integer32 } \,|\,
1867: \mbox{ Polynomial in 1 variable } \\
1868: & & \quad \,|\, \mbox{Tree} \,|\, \mbox{Zero} \,|\,\mbox{Dpolynomial}\\
1869: \mbox{Name of the main variable } &:&
1870: \mbox{ {\sl int32} v } \\
1871: & & \mbox{ --- v は 変数番号 (0 からはじまる) を表す. } \\
1872: \mbox{Recursive Polynomial} &:&
1873: \mbox{ ( {\tt CMO\_RECURSIVE\_POLYNOMIAL}, } \\
1874: & & \quad \mbox{ Ring definition for
1875: recursive polynomials, } \\
1876: & & \quad
1877: \mbox{ Polynomial in 1 variable}\, | \, \mbox{Coefficient} \\
1878: \mbox{Ring definition for recursive polynomials }
1879: & : & \mbox{ {\sl List} v } \\
1880: & & \quad \mbox{ --- v は, 変数名(indeterminate) のリスト. } \\
1881: & & \quad \mbox{ --- 順序の高い順. } \\
1882: \end{eqnarray*}
1883:
1884: \bigbreak
1885: \noindent
1886: 実例:
1887: \begin{verbatim}
1888: (CMO_RECURSIEVE_POLYNOMIAL, ("x","y"),
1889: (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 0, <--- "x"
1890: 3, (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 1, <--- "y"
1891: 5, 1234,
1892: 0, 17),
1893: 1, (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 1, <--- "y"
1894: 10, 1,
1895: 5, 31)))
1896: \end{verbatim}
1897: これは,
1898: $$ x^3 (1234 y^5 + 17 ) + x^1 (y^10 + 31 y^5) $$
1899: をあらわす.
1900: 非可換多項式もこの形式であらわしたいので, 積の順序を上のように
1901: すること. つまり, 主変数かける係数の順番.
1902:
1903: int32 と Integer32 の違い.
1904: 次にくるデータがかならず int32 とわかっておれば,
1905: int32 を用いる.
1906: 次のデータ型がわからないとき Integer32 を用いる.
1907:
1908:
1909: \section{CPU依存の double }
1910:
1911: \begin{verbatim}
1912: #define CMO_64BIT_MACHINE_DOUBLE 40
1913: #define CMO_ARRAY_OF_64BIT_MACHINE_DOUBLE 41
1914: #define CMO_128BIT_MACHINE_DOUBLE 42
1915: #define CMO_ARRAY_OF_128BIT_MACHINE_DOUBLE 43
1916: \end{verbatim}
1917:
1918: \noindent
1919: Group CMObject/MachineDouble requires CMObject/Basic0.\\
1920: 64bit machine double, Array of 64bit machine double
1921: 128bit machine double, Array of 128bit machine double
1922: $\in$ CMObject/MachineDouble \\
1923:
1924: \begin{eqnarray*}
1925: \mbox{64bit machine double} &:&
1926: \mbox{({\tt CMO\_64BIT\_MACHINE\_DOUBLE}, } \\
1927: & & \quad \mbox{ {\sl byte} s1 , \ldots , {\sl byte}} s8)\\
1928: & & \mbox{ --- s1, $\ldots$, s8 は {\tt double} (64bit). } \\
1929: & & \mbox{ --- この表現はCPU依存である.}\\
1930: && \mbox{\quad\quad mathcap に CPU 情報を付加しておく.} \\
1931: \mbox{Array of 64bit machine double} &:&
1932: \mbox{({\tt CMO\_ARRAY\_OF\_64BIT\_MACHINE\_DOUBLE}, {\sl int32} m, } \\
1933: & & \quad \mbox{ {\sl byte} s1[1] , \ldots , {\sl byte}}\, s8[1], \ldots , {\sl byte}\, s8[m])\\
1934: & & \mbox{ --- s*[1], $\ldots$ s*[m] は m 個の double (64bit) である. } \\
1935: & & \mbox{ --- この表現はCPU依存である.}\\
1936: & & \mbox{ \quad\quad mathcap に CPU 情報を付加しておく.} \\
1937: \mbox{128bit machine double} &:&
1938: \mbox{({\tt CMO\_128BIT\_MACHINE\_DOUBLE}, } \\
1939: & & \quad \mbox{ {\sl byte} s1 , \ldots , {\sl byte}} s16)\\
1940: & & \mbox{ --- s1, $\ldots$, s16 は {\tt long double} (128bit). } \\
1941: & & \mbox{ --- この表現はCPU依存である.}\\
1942: && \mbox{\quad\quad mathcap に CPU 情報を付加しておく.} \\
1943: \mbox{Array of 128bit machine double} &:&
1944: \mbox{({\tt CMO\_ARRAY\_OF\_128BIT\_MACHINE\_DOUBLE}, {\sl int32} m, } \\
1945: & & \quad \mbox{ {\sl byte} s1[1] , \ldots , {\sl byte}} s16[1], \ldots , {\sl byte} s16[m])\\
1946: & & \mbox{ --- s*[1], $\ldots$ s*[m] は m 個の long double (128bit) である. } \\
1947: & & \mbox{ --- この表現はCPU依存である.}\\
1948: & & \mbox{ \quad\quad mathcap に CPU 情報を付加しておく.}
1949: \end{eqnarray*}
1950:
1951: \bigbreak
1952: 次に IEEE 準拠の float および Big float を定義しよう.
1953: \begin{verbatim}
1954: #define CMO_BIGFLOAT 50
1955: #define CMO_IEEE_DOUBLE_FLOAT 51
1956: \end{verbatim}
1957:
1958: IEEE 準拠の float については,
1959: IEEE 754 double precision floating-point format
1960: (64 bit) の定義を見よ.
1961:
1962: \noindent
1963: Group CMObject/Bigfloat requires CMObject/Basic0, CMObject/Basic1.\\
1964: Bigfloat
1965: $\in$ CMObject/Bigfloat \\
1966:
1967: \begin{eqnarray*}
1968: \mbox{Bigfloat} &:&
1969: \mbox{({\tt CMO\_BIGFLOAT}, } \\
1970: & & \quad \mbox{ {\sl ZZ} a , {\sl ZZ} e})\\
1971: & & \mbox{ --- $a \times 2^e$ をあらわす. } \\
1972: \end{eqnarray*}
1973:
1974:
1975:
1976: \section{ OX Local Data }
1977:
1978: システム固有の Object の内部表現は,
1979: \begin{verbatim}
1980: #define OX_LOCAL_OBJECT 0x7fcdef30
1981: \end{verbatim}
1982: より増えていく数でタグづけする.
1983: 0x200000 の領域をわりふることとする.
1984: タグはシステムごとに割り振る.
1985: \begin{verbatim}
1986: #define OX_LOCAL_OBJECT_ASIR (OX_LOCAL_OBJECT+0)
1987: #define OX_LOCAL_OBJECT_SM1 (OX_LOCAL_OBJECT+1)
1988: \end{verbatim}
1989: これらは, {\tt OX\_DATA} の代わりとして使用できる.
1990:
1991: \section{ CMO ERROR2 }
1992:
1993: エラー番号 (共通番号)
1994: \begin{verbatim}
1995: #define Broken_cmo 1
1996: #define mathcap_violation 2
1997: \end{verbatim}
1998:
1999:
2000: \section{メンバの再定義に関する注意}
2001:
2002: われわれは,
2003: Coefficient を Group DistributedPolynomials の メンバとして定義した.
2004: これを新しい group のメンバーとして定義を拡張することができる.
2005: たとえば, Coefficient を, 再帰表現多項式のメンバとしても定義できる.
2006: この場合副作用として, DistributedPolynomials のメンバとしての Coeffients
2007: の意味も拡張される.
2008: システムがそのあたらしい DistributedPolynomials をすくなくとも CMO としては
2009: 理解できないといけないが, それを実際にそのシステムのローカルな Object に
2010: 変換できるかはシステム依存である.
2011: このような再定義をゆるすのは, 一般的な実装法がやはりこのような仕組みだから
2012: である.
2013: mathcap にデータ転送の保護機能はこのような再帰的表現もチェックできないと
2014: いけない.
2015:
2016:
2017:
2018: \section{ 実装, デバッグ, 検証 }
2019:
2020: \subsection{ 実装の手順 }
2021:
2022: ソフト xxx を, open XM 対応にするのには以下のような
2023: 手順をふむと開発が容易であろう.
2024: \begin{enumerate}
2025: \item[Step 1.]
2026: {\tt executeStringByLocalParser}
2027: および {\tt popString} の機能を実現して,
2028: xxx をライブラリとしてまとめ, 他のソフトとリンクして
2029: 使用できるかテストする.
2030: C での実現の場合 割り込みの取扱に注意を要する.
2031: これだけの実現でも, サンプルサーバ
2032: ({\tt nullserver00.c}) とリンクすれば,
2033: open XM 対応のクライアントと通信できる.
2034: クライアント側では, このシステムに対応した機能呼び出し
2035: プログラムを書く.
2036: \item[Step 2.]
2037: 次に, CMO を可能な限り実装する.
2038: open sm1 や open asir で, CMO 形式のデータを
2039: 作成して, 読み込めるかテストする.
2040: \item[Step 2'.]
2041: {\tt kan/sm1} の plugin として組み込むとサーバの開発が楽かもしれない.
2042: {\tt kan/sm1} のソースファイルのディレクトリ {\tt plugin} を見よ.
2043: \item[Step 3.]
2044: CMO の stream への転送, stream よりの転送は,
2045: 巨大データの送信受信にきわめて大切である.
2046: これを実装しサンプルサーバとリンクする.
2047: \end{enumerate}
2048:
2049:
2050: kan -- asir 間でも以上のように開発がすすんだ.
2051:
2052: Risa/Asir の開発が沼津の富士フォーラムでおこなわれていた
2053: ころ, 私が沼津を, 1996年, 1月19日に訪問し,
2054: {\tt Asir\_executeString()}
2055: の機能を野呂さんに書いてもらって, kan より asir を文字列で呼び出す
2056: 機能およびその逆を実現したのがことの発端である.
2057: たとえば, asir より kan/sm1 の機能を呼び出すには,
2058: \begin{verbatim}
2059: F = x; G = y;
2060: Ans = kan("(%p). (%p). mul toString",F,G)
2061: \end{verbatim}
2062: と入力すればよい.
2063: {\tt x} と {\tt y} の積が kan で解釈実行されて, 結果を
2064: もどす.
2065: このレベルの結合では kan/sm1 は, 内蔵インタプリタ付の
2066: ライブラリとして利用できてずいぶん便利である.
2067: この関数 {\tt kan} は {\tt builtin/parif.c} に組み込んだ.
2068: {\tt asir} は {\tt pari} の関数を組み込んでいるが, この組み込みの
2069: メカニズムを利用すると容易にリンクできた.
2070: 参照: {\tt noro/src/Old1/parif.c}.
2071:
2072: 次に, CMO Basic0 の機能を
2073: 1997, 5 月, 6 月に実現した.
2074: その後, 1997年 7 月に, SMObject/Basic1 の実装,
2075: 1997年 7 月には, 野呂がイタリアの CoCoA のワークショップにおいて,
2076: 大阿久の b-function を stratification 込みで計算する計算プログラムを
2077: asir, kan を連係してデモした. このときは, {\tt Sm1\_executeStringByLocalParser}
2078: 関数を用いて, ライブラリとしてリンクしてつかった.
2079: 1997 年 11 月に TCP/IP による, サーバスタックマシン間の通信の
2080: 実装をおこなっている.
2081: 通信の実装テストのために, Java および C で null server , null client
2082: を作成した. 以下, これにつき述べる.
2083:
2084:
2085: \subsection{ サンプルサーバ, クライアント }
2086:
2087: Open XM では, 現在のところ,
2088: サンプルサーバとして {\tt oxserver00.c} を提供している.
2089: このサーバをもとにして, {\tt asir} および {\tt kan/sm1}
2090: の open XM サーバを試験中である ({\tt ox\_asir}, {\tt ox\_sm1}).
2091: {\tt ox\_sm1} では, {\tt sm1stackmachine.c} が
2092: open XM スタックマシンを実現している.
2093: サンプルクライアントは, ネットワークにデータを送出および
2094: 受信する機能のみをもつ, {\tt testclient.c} を提供
2095: している.
2096: {\tt asir} および {\tt kan/sm1} には本格的な
2097: クライアント機能(open XM サーバを呼び出す
2098: 機能)を組み込んである.
2099: サーバを起動するプログラムは, {\tt kan/sm1} グループでは,
2100: {\tt ox} なる名前で, {\tt asir} グループでは,
2101: {\tt ox\_lauch} なる名前であるが, 機能は同じである.
2102: {\tt ox} のソースは {\tt oxmain.c} である.
2103:
2104:
2105: \subsubsection{ ox\_null }
2106:
2107: Basic0 のスタックマシンのソケットによる実装.
2108: スタックマシンは {\tt nullstackmachine.c} に実装されており,
2109: {\tt oxserver00.c} にリンクしてサーバとなる.
2110: サンプルサーバであり, これに CMO Basic0 仕様の関数を結合すれば,
2111: 一応 サーバが動作するはずである.
2112: スタックには,CMO の Basic0 の object へのポインタがそのまま push される.
2113: コントロール機能なし. 1997/11/29 版よりコントロール機能追加.
2114: @Old/nullserver00.c.19971122c,
2115: @Old/mytcpip.c.19971122c
2116:
2117: 現在はこのサーバはメンテナンスされていない
2118: (object 関係の関数を追加しないとコンパイルできない.)
2119:
2120: \subsubsection{ testclient }
2121:
2122:
2123: Java による実装:
2124: @Old/client.java.19971122c
2125: これも現在はふるい.
2126: OX パケットのシリアル番号に対応していない.
2127: ちかいうちに改訂する予定.
2128: {\tt executeString} および {\tt popString} を要請する能力しか持たない.
2129: 受信は スレッド {\tt listner} がおこなっている.
2130: 受信は byte データを表示するのみである.
2131: スレッドの優先度をうまくバランスとらないと, 受信データがあるのに
2132: 表示しなかったりする.
2133:
2134: C による {\tt testclient}
2135: 同じような機能をもつプログラムの実装もある.
2136: {\footnotesize \begin{verbatim}
2137: ./ox -ox ox_sm1 -host localhost -data 1300 -control 1200 (サーバの立ち上げ)
2138: ./testclient (testclient の立ち上げ)
2139: \end{verbatim}}
2140: これも現在はふるい.
2141:
2142: 田村 ({\tt tamura@math.kobe-u.ac.jp}) による Java への新しい実装がある
2143: (1999, 3月, 神戸大学修士論文).
2144:
2145: \subsubsection{ {\tt ox} }
2146: {\tt ox} は ox サーバをたちあげるためのプログラムである.
2147: クライアントよりサーバへ接続するには二つの方法がある.
2148: 一つは {\tt ox} で データとコントロール用の二つの
2149: ポート番号を明示的に起動し, クライアントがこのポートへつなぎに
2150: いく方法である.
2151: もう一つは, クライアント側でまず, 空いているポートを二つ
2152: さがし, それから {\tt ox} を {\tt -reverse} で起動して
2153: サーバ側がクライアントにつなぎにくる方法である.
2154: この場合, {\tt ox} はたとえば次のように起動される.
2155: {\footnotesize \begin{verbatim}
2156: /home/nobuki/kxx/ox -reverse -ox /home/nobuki/kxx/ox_sm1
2157: -data 1172 -control 1169 -pass 1045223078
2158: \end{verbatim} }
2159:
2160: {\tt ox} は, 子どもプロセスとして, {\tt ox\_asir}, {\tt ox\_sm1}
2161: などを起動するのであるが,
2162: これらのプロセスは
2163: 3 よりOX データ, コマンドを読み込み, 4 へ OX データを書き出す.
2164: 現在の実装では 3 と 4 は dup して同一視してしまっている.
2165: {\tt ox} はTCP/IP のデータ転送のポートを, 3, 4 へわりあてて,
2166: 子どもプロセスを起動する.
2167: {\footnotesize \begin{verbatim}
2168: close(fdControl); /* close(0); dup(fdStream); */
2169: dup2(fdStream,3);
2170: dup2(fdStream,4);
2171: \end{verbatim}}
2172:
2173:
2174: \subsubsection{ {\tt ox\_asir} phrase book}
2175:
2176: [ この節の記述は古い]
2177: CMObject と asir の object は次の規則にしたがって変換される.
2178: なお asir の object のタグをみるには関数 {\tt type} を用いる.
2179: \begin{enumerate}
2180: \item Null : 0 として使用される.
2181: \item Integer32 : 内部的にのみ使用される. 送出は, ZZ に変換される.
2182: -1 は (unsigned int) -1 に変換されてから, ZZ に変換されるので,
2183: 正の数となる.
2184: \item Cstring : 文字列 (type = 7) に変換される.
2185: \item ZZ : 数 (type = 1 ) に変換される.
2186: \item QQ : 数 (type = 1 ) に変換される.
2187: \item List : リスト (type = 4) に変換される.
2188: \item Dpolynomial : 分散表現多項式 (type = 9) に変換される.
2189: order はうけとったモノミアルのリストと同じ order である.
2190: \item RecursivePolynomial : 再帰表現多項式に変換される.
2191: 内部順序に自動変換される.
2192: \item Indeterminate : 不定元に変換される.
2193: \end{enumerate}
2194: 記述のない CMObject に関しては, 利用できない (cf. mathcap ).
2195:
2196: \noindent
2197: 問題点: 0 の扱いの仕様がまださだまっていない.
2198: Null が数 (type = 1) の 0 に変換される版もある.
2199:
2200: \medbreak
2201: \noindent
2202: 例:
2203: 分散表現多項式の $x^2-1$ の因数分解を asir にやってもらう
2204: OXexpression の列をあげる.
2205: {\footnotesize
2206: \begin{verbatim}
2207: (OX_DATA, (CMO_LIST, 4, CMO_DMS,CMO_DMS_GENERIC,
2208: (CMO_MONOMIAL32,1,2,(CMO_ZZ,1)),
2209: (CMO_MONOMIAL32,1,0,(CMO_ZZ,-1)))),
2210: (OX_DATA, (CMO_INT32,1))
2211: (OX_DATA, (CMO_STRING,"ox_dtop"))
2212: (OX_COMMAND,(SM_executeString))
2213:
2214: (OX_DATA, (CMO_INT32,1))
2215: (OX_DATA, (CMO_STRING,"fctr"))
2216: (OX_COMMAND,(SM_executeString))
2217:
2218:
2219: (OX_DATA, (CMO_INT32,1))
2220: (OX_DATA, (CMO_STRING,"ox_ptod"))
2221: (OX_COMMAND,(SM_executeString))
2222:
2223: (OX_COMMAND,(SM_popCMO))
2224: \end{verbatim}}
2225:
2226: ここで, ZZ の元を普通の整数表記であらわした.
2227: {\tt dtop1} および {\tt ptod1} はそれぞれ, 分散表現多項式を, Asir の再帰表現
2228: 多項式に, 逆に, Asir の再帰表現多項式を, 分散表現多項式に変換する,
2229: ユーザ定義の 1 引数関数である. %% kxx/oxasir.sm1
2230: これらの関数は Asir の リストにも作用させることが可能であり, その場合は
2231: 要素としてでてくる, 分散表現多項式 または Asir の再帰表現多項式
2232: を必要な形に変換する.
2233: {\tt fctr} は因数分解をする組み込み関数である.
2234:
2235: {\tt kxx/oxasir.asir} のソース.
2236: {\footnotesize \begin{verbatim}
2237: OxVlist = [x,y,z]$
2238:
2239: def ox_ptod(F) {
2240: extern OxVlist;
2241: if (type(F) == 4) return(map(ox_ptod,F));
2242: else if (type(F) == 2) return(dp_ptod(F,OxVlist));
2243: else return(F);
2244: }
2245:
2246: def ox_dtop(F) {
2247: extern OxVlist;
2248: if (type(F) == 4) return(map(ox_dtop,F));
2249: else if (type(F) == 9) return(dp_dtop(F,OxVlist));
2250: else return(F);
2251: }
2252:
2253: end$
2254: \end{verbatim}}
2255:
2256: \subsubsection{ {\tt ox\_sm1} phrase book }
2257:
2258: [ この節の記述は古い]
2259: CMObject と kan/sm1 の object は次の規則にしたがい変換される.
2260: なお, kan/sm1 の object のタグをみるには, {\tt tag} または {\tt etag}
2261: を用いる.
2262: \begin{enumerate}
2263: %% \item Error : Error (etag = 257) に変換される.
2264: \item Error2 : Error (etag = 257) に変換される.
2265: \item Null : null (tag = 0) に変換される.
2266: \item Integer32 : integer (tag = 1) に変換される.
2267: \item Cstring : 文字列 (type = 5) に変換される.
2268: \item ZZ : universalNumber (type = 15 ) に変換される.
2269: \item QQ : rational (tag = 16 ) に変換される.
2270: \item List : array (tag = 6) に変換される.
2271: \item Dpolynomial : 多項式 (tag = 9) に変換される.
2272: \end{enumerate}
2273:
2274:
2275: \noroa{ {\tt SS475/memo1.txt} も見よ.}
2276:
2277: 注意: {\tt ReverseOutputOrder = 1} (標準)
2278: のとき, {\tt xn, ..., x0, dn, ..., d0} の順番で
2279: ({\tt show\_ring} の形式) Dpolynomial に変換される
2280: (印刷形式だと,
2281: {\tt xn} は {\tt e}, {\tt d0} は {\tt h},
2282: {\tt x0} は {\tt E}, {\tt dn} は {\tt H}).
2283: たとえば,
2284: {\tt ox\_send\_cmo(id,<<1,0,0,0,0,0>>)} は,
2285: {\tt x2} に変換される.
2286: {\tt ox\_send\_cmo(id,<<0,0,1,0,0,0>>)} は,
2287: {\tt x0} に変換される.
2288:
2289: {\tt OxVersion} 変数で openXM のプロトコルの version を表す.
2290:
2291: \subsection{ 最小の TCP/IP クライアントの例 }
2292:
2293: Java または M2 によるソースコードを掲載の予定.
2294:
2295: \subsection{ クライアント asir, sm1 }
2296:
2297: sm1 については, ox.sm1 , oxasir.sm1 がクライアントパッケージ.
2298: {\tt ox}, {\tt ox\_asir}, {\tt ox\_sm1} の存在するパス,
2299: および sm1 より呼び出すための asir の関数定義である
2300: {\tt oxasir.asir} のあるパスを
2301: これらのパッケージに書き込んでおく必要がある.
2302:
2303: {\tt ox\_asir} は, {\tt asir} なる名前でよばれると
2304: asir として動作し, {\tt ox\_asir} なる名前でよばれると,
2305: open XM サーバとして動作する.
2306: {\tt /usr/local/lib/asir} または
2307: {\tt ASIR\_LIBDIR} へ {\tt ox\_asir} 実体をおき,
2308: {\tt ox\_launch} をおなじディレクトリへ {\tt ox\_asir} へのシンボリックリンク
2309: として作成する.
2310: コマンドサーチパスにあるディレクトリへ {\tt asir} を {\tt ox\_asir}
2311: へのシンボリックリンクとして作成する.
2312: {\footnotesize
2313: \begin{verbatim}
2314:
2315: This is Asir, Version 990413.
2316: Copyright (C) FUJITSU LABORATORIES LIMITED.
2317: 3 March 1994. All rights reserved.
2318: 0
2319: [324] ox_launch(0,"/usr/local/lib/asir/ox_asir");
2320: 1 <=== これがサーバの番号.
2321: [326] ox_execute_string(1,"fctr(x^10-1);");
2322: 0
2323: [327] ox_pop_local(1);
2324: [[1,1],[x-1,1],[x+1,1],[x^4+x^3+x^2+x+1,1],[x^4-x^3+x^2-x+1,1]]
2325: [328] ox_execute_string(1,"dp_ptod((x+y)^5,[x,y]);");
2326: 0
2327: [329] ox_pop_cmo(1);
2328: (1)*<<5,0>>+(5)*<<4,1>>+(10)*<<3,2>>+(10)*<<2,3>>+(5)*<<1,4>>+(1)*<<0,5>>
2329: [330] ox_rpc(1,"fctr",x^10-y^10);
2330: 0
2331: [331] ox_pop_local(1);
2332: [[1,1],[x^4-y*x^3+y^2*x^2-y^3*x+y^4,1],[x^4+y*x^3+y^2*x^2+y^3*x+y^4,1],[x+y,1],[x-y,1]]
2333: [332] ox_rpc(1,"fctr",x^1000-y^1000); ox_cmo_rpc もあり.
2334: 0
2335: [333] ox_flush(1);
2336: 1
2337: [334] ox_pop_local(1);
2338: 0
2339:
2340: ox_sync(1); --- sync ball を送る.
2341:
2342: \end{verbatim}}
2343:
2344: \subsection{開発中のサーバ, クランアント}
2345:
2346: Mathematica サーバ, クライアント : 小原.
2347: Java クライアント, Open Math proxy : 田村.
2348: Gnuplot サーバ, Macaulay 2 クライアント, サーバ,
2349: その他小さいソフト (Toric GB, Grobner fan)のサーバ,
2350: Algebraic equation solver by numerical method: 高山.
2351: Open Asir マニュアル, サンプル: 小原, 高山.
2352:
2353: 数学的におもしろい問題を実際にあつかってみないと
2354: わからない問題点もおおくあると思う.
2355: 現在, ${\cal A}$-超幾何関数の解のグラフ表示,
2356: パラメータ付積分のグラフ表示のソフトをかくことで
2357: さらに問題点をさぐることを
2358: 計画している.
2359: グレブナdeformation による多項式解の導出(線形および非線形方程式)
2360: は OpenXM 的なプログラムのおもしろい練習問題.
2361: Java の並列計算記述能力をつかって ox サーバを使うのもおもしろい.
2362:
2363: 世界中の人につかってもらえる規格にするには
2364: まだまだ実験と経験をかさねないといけない.
2365: Free Mathematical Software Initiative を作るべきだろう.
2366:
2367: \subsection{ Change log }
2368: \begin{enumerate}
2369: \item 1999/07 : {\tt CMO\_ZZ} の形式を変えた.
2370: \item 1999/09/7, 9/8 : 分散表現多項式, Mathcap, RecursivePolynomial,
2371: の形式を変えた. asir, sm1 に実装した. エラー処理のために,
2372: dupErrors, getsp を SM コマンドに加えた.
2373: \end{enumerate}
2374:
2375: \subsection{ }
2376: Java で sm1 サーバをすべて書いてみるか?
2377:
2378: \section{ どのように協調機能にすぐれた Math Soft を書くのか? }
2379:
2380: いくつかの経験的なプログラム作法をメモとしてまとめておく.
2381: \begin{enumerate}
2382: \item 文字列を読み込み, 計算して, また文字列を結果として出力する
2383: プログラムおよび関数は協調機能にすぐれたプログラムの基本である.
2384: グラフィカルインターフェースのみのプログラムは他のソフトと協調
2385: させるのがむずかしい.
2386: \item Output を読むのは人間とは限らない.
2387: Output の読者は, 他のソフトかもしれない.
2388: したがって, Output もやはり, 文法にしたがって出力すべきである.
2389: エラー出力も文法にしたがうべきである.
2390: \end{enumerate}
2391:
2392: \subsection{open gnuplot の実装}
2393: 書いてない.
2394:
2395: \subsection{open phc の実装}
2396: 書いてない.
2397:
2398: \subsection{open M2 の実装}
2399: 書いてない.
2400:
2401: この節の補足は,
2402: {\tt this/open/ohp} を見よ (Open XM day, 1999, 7/12 Mon の原稿)
2403:
2404: \section{ 新しい CMO の登録 }
2405:
2406: \subsection{新しい CMO を作るときの約束}
2407:
2408: CMO では, 再帰的なデータ表現をゆるしているので,
2409: Object を増やした場合, もとからある CMO の動作も拡張される.
2410: そのシステムが正しく動作するのか確認する必要がある.
2411: 計算することはできなくても, 通信の中断なしに,
2412: データの受渡しをできないといけない.
2413:
2414: \subsection{Open XM プロジェクトに参加するには?}
2415:
2416: Open XM にパッケージを加えてくれるのは大歓迎です.
2417: takayama@math.kobe-u.ac.jpに連絡下さい.
2418: 新しい CMO を必要なら加えて下さい.
2419: 加えた場合は
2420: \begin{enumerate}
2421: \item 定義した CMObject の形式的な定義と説明.
2422: \item システム xxx が, この CMObject に関してどのように振舞うかの説明.
2423: \item この CMObject, システム xxx に関する URL.
2424: \end{enumerate}
2425: をおくって下さい.
2426: 必要ならディスカッションをおこない, 確定版の仕様を作成し, 確定した段階で
2427: CMO のタグを発行し, この CMObject に関連する URL を
2428: Open XM ホームページ \cite{openxxx} よりリンクします.
2429:
2430:
2431:
2432: \section{Appendix: English translation}
2433:
2434: \noindent
2435: (This section has not been updated.)
2436:
2437: \subsection{Common Mathematical Object format}
2438:
2439: \begin{verbatim}
2440: #define LARGEID 0x7f000000
2441: #define CMO_ERROR2 (LARGEID+2)
2442: #define CMO_NULL 1
2443: #define CMO_INT32 2
2444: #define CMO_DATUM 3
2445: #define CMO_STRING 4
2446: #define CMO_LIST 17
2447: \end{verbatim}
2448:
2449: \bigbreak
2450: \noindent
2451: Group CMObject/Basic0 requires nothing. \\
2452: Error2, Null, Integer32, Datum, Cstring, List $\in$ CMObject/Basic0. \\
2453: Document of CMObject/Basic0 is at {\tt http://www.math.kobe-u.ac.jp/openxxx}
2454: (in Japanese) \\
2455: \begin{eqnarray*}
2456: \mbox{Error2}&:& ({\tt CMO\_ERROR2}, {\sl CMObject}\, \mbox{ob}) \\
2457: \mbox{Null} &:& ({\tt CMO\_NULL}) \\
2458: \mbox{Integer32}
2459: &:& ({\tt CMO\_INT32}, {\sl int32}\ \mbox{n}) \\
2460: \mbox{Datum} &:& ({\tt CMO\_DATUM}, {\sl int32}\, \mbox{n}, {\sl byte}\,
2461: \mbox{data[0]},
2462: \ldots , {\sl byte}\, \mbox{data[n-1]}) \\
2463: \mbox{Cstring}&:& ({\tt CMO\_STRING},{\sl int32}\, \mbox{n},
2464: {\sl string}\, \mbox{s}) \\
2465: \mbox{List} &:&
2466: \mbox{({\tt CMO\_LIST}, {\sl int32}\, m, {\sl CMObject}\, ob[1], $\ldots$,
2467: {\sl CMObject}\, ob[m])} \\
2468: & & \mbox{--- m is the length of the list.} \\
2469: \end{eqnarray*}
2470:
2471: In the definition of ``Cstring'', if we decompose ``{\sl string} s'' into
2472: bytes, then ``Cstring'' should be defined as
2473: \begin{eqnarray*}
2474: \mbox{Cstring}&:& ({\tt CMO\_STRING},{\sl int32}\, n,
2475: {\sl byte}\, \mbox{s[0]},
2476: \ldots, {\sl byte}\ \mbox{s[n-1]})
2477: \end{eqnarray*}
2478:
2479: \noindent
2480: Example:
2481: \begin{center}
2482: ({\tt CMO\_INT32}, 1234)
2483: \end{center}
2484: Example:
2485: \begin{center}
2486: ({\tt CMO\_STRING}, 5, "Hello")
2487: \end{center}
2488:
2489: \begin{verbatim}
2490: #define CMO_MONOMIAL32 19
2491: #define CMO_ZZ 20
2492: #define CMO_QQ 21
2493: #define CMO_ZERO 22
2494: #define CMO_DMS 23 /* Distributed monomial system */
2495: #define CMO_DMS_GENERIC 24
2496: #define CMO_DMS_OF_N_VARIABLES 25
2497: #define CMO_RING_BY_NAME 26
2498: \end{verbatim}
2499: \bigbreak
2500: \noindent
2501: Group CMObject/Basic1 requires CMObject/Basic0. \\
2502: ZZ, QQ, Zero $\in$ CMObject/Basic1. \\
2503: \begin{eqnarray*}
2504: \mbox{Zero} &:& ({\tt CMO\_ZERO}) \\
2505: & & \mbox{ --- universal zero } \\
2506: \mbox{ZZ} &:& ({\tt CMO\_ZZ},{\sl int32}\, f, {\sl byte}\, \mbox{a[1]}, \ldots
2507: {\sl byte}\, \mbox{a[m]} ) \\
2508: &:& \mbox{ --- bignum }\\
2509: \mbox{QQ} &:& ({\tt CMO\_QQ}, {\sl ZZ}\, a, {\sl ZZ}\, b) \\
2510: & & \mbox{ --- rational number $a/b$. } \\
2511: \end{eqnarray*}
2512:
2513: \bigbreak
2514: Let us define a group for distributed polynomials.
2515:
2516: \medbreak
2517: \noindent
2518: Group CMObject/DistributedPolynomials requires CMObject/Basic0,
2519: CMObject/Basic1. \\
2520: Monomial, Monomial32, Coefficient, Dpolynomial, DringDefinition,
2521: Generic DMS ring, RingByName, DMS of N variables $\in$
2522: CMObject/DistributedPolynomials. \\
2523: \begin{eqnarray*}
2524: \mbox{Monomial} &:& \mbox{Monomial32}\, |\, \mbox{Zero} \\
2525: \mbox{Monomial32}&:& ({\tt CMO\_MONOMIAL32}, {\sl int32}\, n,
2526: {\sl int32}\, \mbox{e[1]}, \ldots,
2527: {\sl int32}\, \mbox{e[n]}, \\
2528: & & \ \mbox{Coefficient}) \\
2529: & & \mbox{ --- e[i] is the exponent $e_i$ of the monomial
2530: $x^e = x_1^{e_1} \cdots x_n^{e_n}$. } \\
2531: \mbox{Coefficient}&:& \mbox{ZZ} | \mbox{Integer32} \\
2532: \mbox{Dpolynomial}&:& \mbox{Zero} \\
2533: & & |\ ({\tt CMO\_LIST},{\sl int32} m, \\
2534: & & \ \ {\tt CMO\_DMS}, \mbox{DringDefinition},
2535: [\mbox{Monomial32}|\mbox{Zero}], \\
2536: & &\ \
2537: \{\mbox{Monomial32}\}) \\
2538: & &\mbox{--- Distributed polynomial is a sum of monomials}\\
2539: & &\mbox{--- m is equal to the number of monomials $+2$.}\\
2540: \mbox{DringDefinition}
2541: &:& \mbox{DMS of N variables} \\
2542: & & |\ \mbox{RingByName} \\
2543: & & |\ \mbox{Generic DMS ring} \\
2544: & & \mbox{ --- definition of the ring of distributed polynomials. } \\
2545: \mbox{Generic DMS ring}
2546: &:& ({\tt CMO\_INT32, CMO\_DMS\_GENERIC}) \\
2547: \mbox{RingByName}&:& ({\tt CMO\_RING\_BY\_NAME}, {\sl Cstring} s) \\
2548: & & \mbox{ --- The ring definition refered by the name ``s''.} \\
2549: \mbox{DMS of N variables}
2550: &:& ({\tt CMO\_DMS\_OF\_N\_VARIABLES}, \\
2551: & & \ ({\tt CMO\_LIST}, {\sl int32}\, \mbox{m},
2552: {\sl Integer32}\, \mbox{n}, {\sl Integer32}\,\mbox{p} \\
2553: & & \ \ [,{\sl Cstring}\,\mbox{s}, {\sl List}\, \mbox{vlist},
2554: {\sl List}\, \mbox{wvec}, {\sl List}\, \mbox{outord}]) \\
2555: & & \mbox{ --- m is the number of elements.} \\
2556: & & \mbox{ --- n is the number of variables, p is the characteristic} \\
2557: & & \mbox{ --- s is the name of the ring, vlist is the list of variables.} \\
2558: & & \mbox{ --- wvec is the weight vector.} \\
2559: & & \mbox{ --- outord is the order of variables to output.} \\
2560: \end{eqnarray*}
2561:
2562:
2563: \subsection{ Stackmachine commands}
2564:
2565: \begin{verbatim}
2566: #define SM_popSerializedLocalObject 258
2567: #define SM_popCMO 262
2568: #define SM_popString 263
2569:
2570: #define SM_mathcap 264
2571: #define SM_pops 265
2572: #define SM_setName 266
2573: #define SM_evalName 267
2574: #define SM_executeStringByLocalParser 268
2575: #define SM_executeFunction 269
2576: #define SM_beginBlock 270
2577: #define SM_endBlock 271
2578: #define SM_shutdown 272
2579:
2580:
2581: #define SM_control_kill 1024
2582: #define SM_control_reset_connection 1030
2583: \end{verbatim}
2584:
2585:
2586: \subsection{OX messages}
2587:
2588: Top level messages are OX messages.
2589: These messages start with one of the following tags.
2590:
2591: \begin{verbatim}
2592: #define OX_COMMAND 513 // for stackmachine commands
2593: #define OX_DATA 514 // for CMO
2594: #define OX_SECURED_DATA 521
2595:
2596: #define OX_SYNC_BALL 515
2597: \end{verbatim}
2598:
2599: \noindent
2600: Example:
2601: \begin{center}
2602: (OX\_COMMAND, SM\_popCMO)
2603: \end{center}
2604:
2605: \noindent
2606: Example:
2607: \begin{center}
2608: (OX\_DATA, ({\tt CMO\_STRING}, 5, "Hello"))
2609: \end{center}
2610:
2611:
2612:
2613: \begin{thebibliography}{99}
2614: \bibitem{openmath} {\tt http://www.openmath.org}
2615: \bibitem{openxxx} {\tt http://www.math.kobe-u.ac.jp/openxxx/ まだです.}
2616: \bibitem{openasir-intro} 小原, 高山, 野呂: Open Asir 入門, 1999,
2617: 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo). \\
2618: {\tt http://www.math.kobe-u.ac.jp/openxxx/}
2619: \end{thebibliography}
2620:
2621: \bigbreak
2622: \bigbreak
2623: \bigbreak
2624:
2625: \small{
2626: \noindent
2627: \rightline{ Masayuki Noro,}
2628: \rightline{ Fujitsu Laboratory, Kawasaki, Japan;}
2629: \rightline{{\tt noro@para.flab.fujitsu.co.jp}}
2630:
2631: \vskip .5cm
2632:
2633: \noindent
2634: \rightline{ Nobuki Takayama,}
2635: \rightline{Department of Mathematics, Kobe University,
2636: Rokko, Kobe, 657-8501, Japan;}
2637: \rightline{{\tt takayama@math.kobe-u.ac.jp}}
2638: }
2639:
2640: \end{document}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>