[BACK]Return to openxxx.tex CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

Annotation of OpenXM/src/kxx/openxxx.tex, Revision 1.6

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

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