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