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