[BACK]Return to stackmachine.tex CVS log [TXT][DIR] Up to [local] / OpenXM / doc / OpenXM-specs

Annotation of OpenXM/doc/OpenXM-specs/stackmachine.tex, Revision 1.2

1.1       noro        1: //&jp \section{ OX スタックマシン }
                      2: //&eg \section{ OX stackmachine }  (This section has not yet been translated.)
                      3:
                      4: /*&jp
                      5: この節では, OX スタックマシン operator の説明
                      6: (TCP/IP ソケット上での標準 encoding 法 を用いる),
                      7: および, サンプルサーバとリンクする場合または
                      8: open XM ライブラリとしてリンクして使用する場合の
                      9: ための C の関数の仕様を説明する.
                     10:
                     11: 説明の前に, OX サーバスタックマシンの動作の原則を
                     12: 説明しておく.
                     13: サーバスタックマシンは,
                     14: {\tt SM\_pop*} 系のスタックマシンコマンドがこないかぎり,
                     15: 自発的にメッセージを送信することはない.
                     16: この原則に基づいて分散計算のプログラミングをおこなう.
                     17: イベントドリブンなプログラム法とはちがうことに
                     18: 注意しよう.
1.2     ! noro       19: */
1.1       noro       20:
1.2     ! noro       21: /*&eg
        !            22: In this section we describe the OX stack machine operators.  In
        !            23: the descriptions OX messages are represented by th standard encoding
        !            24: scheme on TCP/IP sockets.  In principle, an OX stack machine never
        !            25: sends data to the output stream unless it receives {\tt SM\_pop*}
        !            26: commands.  Note that the programming style should be different from
        !            27: that for event-driven programming.
        !            28: */
1.1       noro       29:
1.2     ! noro       30: //&jp \subsection{サーバスタックマシン }
        !            31: //&eg \subsection{Server stack machine}
1.1       noro       32:
1.2     ! noro       33: /*&jp
1.1       noro       34: サンプルサーバである {\tt oxserver00.c}
                     35: は以下の仕様の C の関数を用意して,
                     36: {\tt nullstackmachine.c } を置き換えれば一応動作するはずである.
1.2     ! noro       37: */
        !            38: /*&eg
        !            39: {\tt oxserver00.c} is implemented as a sample server.
        !            40: If you want to implement you own server,
        !            41: write the following functions and use them instead of
        !            42: those in {\tt nullstackmachine.c }.
        !            43: */
1.1       noro       44:
1.2     ! noro       45: //&jp \subsubsection{サーバスタックマシンのグループ SMobject/Basic0 に属するオペレータ}
        !            46: //&eg \subsubsection{Operators in the group SMobject/Basic0}
1.1       noro       47:
1.2     ! noro       48: /*&jp
1.1       noro       49: \noindent
1.2     ! noro       50: サーバスタックマシンは最低で1本のスタック
        !            51: \begin{verbatim}
        !            52: Object xxx_OperandStack[SIZE];
        !            53: \end{verbatim}
        !            54: をもつ.  ここで, {\tt Object} はそのシステム固有の Object 型で構わない.
        !            55: CMObject は各サーバ固有のローカルオブジェクトに変換してスタックへプッ
        !            56: シュしてよい.  ただし変換, 逆変換を合成したものは恒等写像であることが
        !            57: のぞましい.  CMObject をどのように (local) Object に変換するか, Object
        !            58: が受け付けるメッセージの定義は,各システムが独自にきめて文書化しておく
        !            59: ものとする.  つまりすべてのメッセージは, private である.  たとえば,
        !            60: {\tt add } のような基本的な メッセージにたいしても, OX スタックマシン
        !            61: はなにもきめていない.  将来的には open math \cite{openmath} のように
        !            62: CMObject に対する最大公約数的なメッセージの仕様をcontent dictionary
        !            63: (CD) の形で定義したい.
        !            64:
        !            65: 以下, \verb+ xxx_ + は誤解の恐れがないときは省略する.
        !            66: \verb+ xxx_ + は local サーバシステムに固有の識別子である.
        !            67: {\tt Asir} の場合は \verb+ Asir_ + を用いる.  {\tt kan/sm1} の場合は
        !            68: \verb+ Sm1_ + を用いる.  関数名, タグ名は長いので省略形を用いてもよい.
        !            69:
        !            70: 以下では次のようにパケットを記述する.  各フィールドは,
        !            71: \fbox{データ型 \quad  データ} なる形式
        !            72: で書く.  たとえば, {\tt int32 OX\_DATA} は 32 bit network byte order
        !            73: の数字 {\tt OX\_DATA}という意味である.  ``イタリックで書かれているフィー
        !            74: ルドは,定義が別のところでなされているか解釈に誤解のないような自然言語
        !            75: で説明されている object を表す.''  たとえば, {\it String commandName}
        !            76: は, String データ型の local object {\it commandName} を意味する.  (サー
        !            77: バスタックマシン上の object は, CMO 形式の objectとは限らないことに注
        !            78: 意.  CMO 形式で書いてあっても, それはサーバスタックマシンのlocal 形式
        !            79: でスタック上にあると解釈して下さい.)
1.1       noro       80:
1.2     ! noro       81: すべてのサーバスタックマシンは以下の関数を実装していないといけない.
        !            82: */
1.1       noro       83:
1.2     ! noro       84: /*&eg
1.1       noro       85: \noindent
1.2     ! noro       86: Any OX stack machine has at least one stack.
1.1       noro       87: \begin{verbatim}
                     88: Object xxx_OperandStack[SIZE];
                     89: \end{verbatim}
1.2     ! noro       90: Here {\tt Object} may be local to the system {\tt xxx} wrapped by the stack
        !            91: machine.
        !            92: That is, the server may translate CMObjects into local its
        !            93: objects and push them onto the stack.  However, it is preferable that
        !            94: the composition of such a translation and its inverse is equal to the
        !            95: identity map. The translation scheme is called the phrase book of the
        !            96: server and it should be documented for each stack machine.  In OpenXM,
        !            97: any message is private.  In future we will provide a content
        !            98: dictionary (CD; see OpenMath \cite{openmath}) for basic specifications
        !            99: of CMObjects.
        !           100:
        !           101: In the following, \verb+ xxx_ + may be omitted if no confusion occurs.
        !           102: As the names of functions and tags are long, one may use abbreviated
        !           103: names.  Message packets are represented as follows.  Each field is
        !           104: shown as \fbox{data type \quad data}.  For example {\tt int32
        !           105: OX\_DATA} denotes a number {\tt OX\_DATA} which is represented by a 32
        !           106: bit network byte order.  If a field is displayed by italic characters,
        !           107: it should be defined elsewhere or its meaning should be clear.  For
        !           108: example {\it String commandName} denotes a local object {\it
        !           109: commandName} whose data type is String.  Note that an object on the
        !           110: stack may have a local data type even if it is represented as CMO.
1.1       noro      111:
1.2     ! noro      112: Any server stack machine has to implement the following operations.
        !           113: */
1.1       noro      114:
                    115: \begin{enumerate}
1.2     ! noro      116: \item
        !           117: /*&jp
        !           118: CMObject/Basic0 の CMO データのうち必須のもの, {\tt CMO\_ERROR2}, {\tt
        !           119: CMO\_NULL}, {\tt CMO\_INT32}, {\tt CMO\_STRING}, {\tt CMO\_LIST}がおく
        !           120: られて来た場合それをスタックに push する.  たとえば, {\tt CMO\_NULL}
        !           121: あるいは {\tt CMO\_String} の場合次のようになる.
        !           122: */
        !           123: /*&eg
        !           124: Any server should accept CMObjects in the group CMObject/Basic0.
        !           125: The server pushes such data onto the stack.
        !           126: The following examples show the states of the stack after receiving
        !           127: {\tt CMO\_NULL} or {\tt CMO\_String} respectively.
        !           128: */
1.1       noro      129:
1.2     ! noro      130: Request:
1.1       noro      131: \begin{tabular}{|c|c|}  \hline
                    132: {\tt int32 OX\_DATA} & {\tt int32 CMO\_NULL} \\
                    133: \hline
                    134: \end{tabular}
1.2     ! noro      135:
        !           136: Stack after the request:
1.1       noro      137: \begin{tabular}{|c|}  \hline
                    138: {\it NULL} \\
                    139: \hline
                    140: \end{tabular}
                    141:
1.2     ! noro      142: //&jp Result:  なし.
        !           143: //&eg Result:  none.
        !           144:
        !           145: Request:
1.1       noro      146: \begin{tabular}{|c|c|c|c|c|c|}  \hline
                    147: {\tt int32 OX\_DATA} & {\tt int32 CMO\_String} &{\tt int32} {\rm size}
                    148: &{\tt byte} {\rm s1} & $\cdots$ &{\tt byte} {\rm ssize}\\
                    149: \hline
                    150: \end{tabular}
1.2     ! noro      151:
        !           152: Stack after the request:
1.1       noro      153: \begin{tabular}{|c|}  \hline
                    154: {\it String s} \\
                    155: \hline
                    156: \end{tabular}
                    157:
1.2     ! noro      158: //&jp Result:  なし.
        !           159: //&eg Result:  none.
        !           160:
        !           161: //&jp CMO データの受け取りに失敗した時のみ  \\
        !           162: //&eg If the server fails to receive a CMO data,
1.1       noro      163: \begin{tabular}{|c|c|c|}  \hline
                    164: {\tt int32 OX\_DATA} & {\tt int32 CMO\_ERROR2} & {\it CMObject} ob\\
                    165: \hline
                    166: \end{tabular}
                    167: \\
1.2     ! noro      168: /*&jp
1.1       noro      169: をスタックへ push する.
                    170: 現在のところ, ob には, \\
                    171: \centerline{
                    172: [{\sl Integer32} OX パケット番号, {\sl Integer32} エラー番号,
                    173: {\sl CMObject} optional 情報]
                    174: }
                    175: なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい.
                    176: CMO として送出されるときこのような形式でないといけないという意味である.)
1.2     ! noro      177: */
        !           178: /*&eg
        !           179: is pushed onto the stack.
        !           180: Currently ob is a list\\
        !           181: \centerline{
        !           182: [{\sl Integer32} OX serial number, {\sl Integer32} error code,
        !           183: {\sl CMObject} optional information]
        !           184: }
        !           185: */
1.1       noro      186:
                    187: \item
                    188: \begin{verbatim}
1.2     ! noro      189: SM_mathcap
1.1       noro      190: \end{verbatim}
1.2     ! noro      191: /*&jp
        !           192: このサーバの mathcap をもどす (termcap のまね).  サーバのタイプ, サー
        !           193: バスタックマシンの能力を知ることができる.  C 言語で実装する場合は,
        !           194: mathCap の構造体をシステム毎にきめるものとし,この関数はその構造体への
        !           195: ポインタを戻す.  (open sm1 では {\tt struct mathCap} を用いている.
        !           196: */
        !           197: /*&eg
        !           198: It request to push the mathcap of the server.
        !           199: The mathcap is similar to the termcap. One can know the server type
        !           200: and the capability of the server from the mathcap.
        !           201: */
1.1       noro      202: @plugin/mathcap.h)
1.2     ! noro      203:
        !           204: Request:
1.1       noro      205: \begin{tabular}{|c|c|}  \hline
                    206: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_mathcap}  \\
                    207: \hline
                    208: \end{tabular}
1.2     ! noro      209:
        !           210: Result:
1.1       noro      211: \begin{tabular}{|c|c|}  \hline
                    212: {\tt int32 OX\_DATA} & {\sl Mathcap}  mathCapOb \\
                    213: \hline
                    214: \end{tabular}
                    215:
                    216: \item
                    217: \begin{verbatim}
1.2     ! noro      218: SM_setMathCap
1.1       noro      219: \end{verbatim}
1.2     ! noro      220: /*&jp
        !           221: 受け取った Mathcap {\tt m} を自分のシステムに設定して, 相手側が理解不
        !           222: 能な CMO をおくらないようにする.  C 言語で実装する場合は, mathCap の構
        !           223: 造体をシステム毎にきめるものとし,この関数はその構造体へのポインタを引
        !           224: 数とする.  (open sm1 では {\tt struct mathCap} を用いている.
        !           225: */
        !           226: /*&eg
        !           227: It requests to register the peer's mathcap {\tt m} in the server.
        !           228: The server can avoid to send OX messages unknown to its peer.
        !           229: */
1.1       noro      230: @plugin/mathcap.h)
1.2     ! noro      231:
        !           232: Request:
1.1       noro      233: \begin{tabular}{|c|c|}  \hline
                    234: {\tt int32 OX\_DATA} & {\sl Mathcap} m  \\ \hline
                    235: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setMathCap}  \\
                    236: \hline
                    237: \end{tabular}
1.2     ! noro      238:
        !           239: //&jp Result:  なし. \\
        !           240: //&eg Result:  none. \\
        !           241: /*&jp
        !           242: \noindent
1.1       noro      243: 注意: mathcap は一般にクライアント主体で設定する.
                    244: クライアントがサーバに {\tt SM\_mathcap} をおくり,
                    245: サーバ側の mathcap を得る.
                    246: それを, クライアントはそのサーバに付随した mathcap として
                    247: 設定する.
                    248: 次に, クライアントはサーバに自分の mathcap を
                    249: {\tt SM\_setMathCap} でおくり, 自分の mathcap を設定させる.
1.2     ! noro      250: */
        !           251: /*&eg
        !           252: \noindent
        !           253: Remark: In general the exchange of mathcaps is triggered by a client.
        !           254: A client sends {\tt SM\_mathcap} to a server and obtains the server's
        !           255: mathcap. Then the client registers the mathcap. Finally the client
        !           256: sends its own mathcap by {\tt SM\_setMathCap} and the server
        !           257: registers it.
        !           258: */
1.1       noro      259:
                    260: \item
                    261: \begin{verbatim}
1.2     ! noro      262: SM_executeStringByLocalParser
1.1       noro      263: \end{verbatim}
1.2     ! noro      264: /*&jp
        !           265: 文字列 $s$ をシステム xxx の文法(サーバスタックマシンの組み込みローカ
        !           266: ル言語)にしたがったコマンドとして実行する.  ただし, コマンドの実行の結
        !           267: 果の最後に戻り値があるときは, {\tt OperandStack} に戻り値を push する.
        !           268: 正常終了なら 0 を, 異常終了なら -1 をもどす.  debug モードにはいった場
        !           269: 合, -2 を戻す. エラーの時 Error2 Objectを stack へ push する.\\ {\tt
        !           270: kan/sm1} の場合, サーバスタックマシンの組み込みローカル言語は{\tt sm1}
        !           271: ポストスクリプト言語である.  サーバスタックマシンと, {\tt sm1} ポスト
        !           272: スクリプト言語はスタックを共有するように実装されている.  実際の計算は
        !           273: {\tt executeStringByLocalParser} により実行される.  open XM では, 現在
        !           274: のところ関数名の標準化はおこなっていない.  したがって, 実際の計算コマ
        !           275: ンドの送出は mathcap をみてクライアントが正しいコマンドを選択する必要
        !           276: がある. (しかしながら, 共通関数名がないために, 共通仕様のサーバスタッ
        !           277: クマシンの実装はきわめて簡単である. 関数名の共通化は将来の課題.) \\割
        !           278: 込みに関しては, -1 を戻すように ハンドラを書く.
        !           279: executeStringByLocalParser() を再帰的に呼んだときも 割り込みのハンドラ
        !           280: が正しく動作するようにこの関数は書かれるべきである.  この関数を呼び出
        !           281: したのち, signal, setjmp の再設定を呼び出し側でやらないといけない. \\
        !           282: この関数および {\tt popString} の機能を実現すれば, 最低限の open XM の
        !           283: サーバになれる.  実装では, まずこの二つの関数の機能を実現すべきである.
        !           284: */
        !           285: /*&eg
        !           286: A character string $s$ is parsed by the local parser of the stack
        !           287: machine and interpreted by the local interpreter.
        !           288: If the exececution produces a result, it is pushed onto
        !           289: {\tt OperandStack}.
        !           290: If an error has occured,  Error2 Object is pushed onto the stack.
        !           291: OpenXM does not provide standard function names.
        !           292: If this operation and {\tt SM\_popString} is implemented, the stack machine
        !           293: can be used as an OX server.
        !           294: */
        !           295:
        !           296: Stack before the request:
1.1       noro      297: \\
                    298: \begin{tabular}{|c|}  \hline
                    299: {\it String commandString} \\
                    300: \hline
                    301: \end{tabular}
1.2     ! noro      302:
        !           303: Request:
1.1       noro      304: \begin{tabular}{|c|c|}  \hline
                    305: {\tt int32 OX\_COMMAND}& {\tt int32 SM\_executeStringByLocalParser} \\
                    306: \hline
                    307: \end{tabular}
1.2     ! noro      308:
        !           309: //&jp Result:  なし.
        !           310: //&eg Result:  none.
        !           311: /*&jp
        !           312: \noindent
        !           313: 参考: \  実行前のスタックのデータは,
        !           314: {\it String commandString} なる local stackmachine の object としてス
        !           315: タック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて
1.1       noro      316: {\it commandName} がスタックに push される:
1.2     ! noro      317: */
        !           318: /*&eg
        !           319: \noindent
        !           320: Remark: Before this request, one has to push {\it String commandString}
        !           321: onto the stack. It is done by sending the following OX data message.
        !           322: */
1.1       noro      323: \begin{tabular}{|c|c|c|}  \hline
                    324: {\tt int32 OX\_DATA} & {\tt int32 CMO\_string} & {\it size and the string commandString} \\
                    325: \hline
                    326: \end{tabular}
                    327:
                    328: \item
                    329: \begin{verbatim}
1.2     ! noro      330: SM_executeStringByLocalParserInBatchMode
1.1       noro      331: \end{verbatim}
1.2     ! noro      332: /*&jp
        !           333: スタックに副作用がない(スタックにたいしてなんの操作もしない)ことを除き
        !           334: 上とまったく同じ関数である.  エラーの時のみ, Error2 Object をスタック
        !           335: へプッシュする.
        !           336: */
        !           337: /*&eg
        !           338: This is the same request as {\tt SM\_executeStringByLocalParser}
        !           339: except that it does not modify the stack. It pushes an Error2 Object
        !           340: if an error has occured.
        !           341: */
1.1       noro      342: \item
                    343: \begin{verbatim}
1.2     ! noro      344: SM_popString
        !           345: \end{verbatim}
        !           346: /*&jp
        !           347: {\tt OperandStack} より Object を pop し, それを xxx の出力規則にしたがい文
        !           348: 字列型に変換して送信する.  スタックが空のときは, {\tt (char *)NULL} を戻す.
        !           349: 文字列は {\tt ox\_stream out}へ CMO のデー
        !           350: タとして送信する.  エラーの場合は {\tt CMO\_ERROR2} を戻すべきである.
        !           351: */
        !           352: /*&eg
        !           353: It requests for a server to pop an object from {\tt OperandStack},
        !           354: to convert it into a character string according to the output format
        !           355: of the local system, and to send the character string via TCP/IP stream.
        !           356: {\tt (char *)NULL} is returned when the stack is empty.
        !           357: The returned strings is sent as a CMO string data.
        !           358: {\tt CMO\_ERROR2} should be returned if an error has occured.
        !           359: */
        !           360:
        !           361: Stack before the request:
1.1       noro      362: \begin{tabular}{|c|}  \hline
                    363: {\it Object} \\
                    364: \hline
                    365: \end{tabular}
1.2     ! noro      366:
        !           367: Request:
1.1       noro      368: \begin{tabular}{|c|c|}  \hline
                    369: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_popString} \\
                    370: \hline
                    371: \end{tabular}
1.2     ! noro      372:
        !           373: Result:
1.1       noro      374: \begin{tabular}{|c|c|c|}  \hline
                    375: {\tt int32 OX\_DATA} & {\tt int32 CMO\_STRING} & {\it size and the string s} \\
                    376: \hline
                    377: \end{tabular}
                    378:
                    379: \item
                    380: \begin{verbatim}
1.2     ! noro      381: SM_getsp
1.1       noro      382: \end{verbatim}
1.2     ! noro      383: /*&jp
        !           384: 現在のスタックポインタの位置をもどす.  スタート時点での位置は 0 であり,
        !           385: object が push されたばあい, 1 づつ増えるものとする.
        !           386: */
        !           387: /*&eg
        !           388: It request to push the current stack pointer onto the stack.
        !           389: The stack pointer is represented by a non-negative integer.
        !           390: Its initial value is 0 and a push operation increments the
        !           391: stack pointer by 1.
        !           392: */
        !           393:
        !           394: Stack before the request:
1.1       noro      395: \begin{tabular}{|c|}  \hline
                    396: {\it Object} \\
                    397: \hline
                    398: \end{tabular}
1.2     ! noro      399:
        !           400: Request:
1.1       noro      401: \begin{tabular}{|c|c|}  \hline
                    402: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_getsp} \\
                    403: \hline
                    404: \end{tabular}
1.2     ! noro      405:
        !           406: Result:
1.1       noro      407: \begin{tabular}{|c|c|c|}  \hline
                    408: {\tt int32 OX\_DATA} & {\tt int32 CMO\_INT32} & {\it stack pointer value} \\
                    409: \hline
                    410: \end{tabular}
                    411:
                    412: \item
                    413: \begin{verbatim}
1.2     ! noro      414: SM_dupErrors
1.1       noro      415: \end{verbatim}
1.2     ! noro      416: /*&jp
        !           417: スタック上のエラーオブジェクトをリストにして戻す.  スタック自体は変化
        !           418: させない.
        !           419: */
        !           420: /*&eg
        !           421: It requests to push a list object containing all error objects on the stack.
        !           422: */
        !           423:
        !           424: Stack before the request:
1.1       noro      425: \begin{tabular}{|c|}  \hline
                    426: {\it Object} \\
                    427: \hline
                    428: \end{tabular}
1.2     ! noro      429:
        !           430: Request:
1.1       noro      431: \begin{tabular}{|c|c|}  \hline
                    432: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_dupErrors} \\
                    433: \hline
                    434: \end{tabular}
1.2     ! noro      435:
        !           436: Result:
1.1       noro      437: \begin{tabular}{|c|c|c|}  \hline
                    438: {\tt int32 OX\_DATA} & {\sl CMObject} \ a list of errors\\
                    439: \hline
                    440: \end{tabular}
                    441: \end{enumerate}
                    442:
                    443: \medbreak
                    444: \noindent
1.2     ! noro      445: /*&jp
1.1       noro      446: {\bf 例}: \
                    447: mathcap の問い合わせに対して, {\tt ox\_sm1} は次のように答える.
1.2     ! noro      448: */
        !           449: /*&eg
        !           450: {\bf Example}: \
        !           451: {\tt ox\_sm1} returns the following data as its mathcap.
        !           452: */
1.1       noro      453: %%Prog: [(cmoMathCap)] extension ::
                    454: \begin{verbatim}
                    455: Class.mathcap
                    456:  [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ ,
                    457:     $HOSTTYPE=i386$ ]  ,
                    458:    [262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , 276 ]  ,
                    459:    [[514] , [2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 ,
                    460:              25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 34 ]]]
                    461: \end{verbatim}
                    462:
1.2     ! noro      463: /*&jp
        !           464: mathcap は 3つの要素をもつリストである.  まづ, 最初の要素を見よう.
        !           465: Ox\_system は open xxx システム名である.  読み込むライブラリがちがって
        !           466: いて, 関数名(または シンボル)の意味がちがうときはこの名前もかえる. た
        !           467: とえば, open math の basic content dictionary 対応の関数定義マクロを読
        !           468: みこんだ sm1 は, ox\_sm1\_basicCD なる名前にする.  HOSTTYPE値は, CPU
        !           469: の種類をあらわしunix では環境変数\verb+$HOSTTYPE+ の値である.  2 番目
        !           470: の要素は 利用可能な SM コマンドをあつめたリストである.  3 番目のリスト
        !           471: は, 処理可能な数学データの形式, およびCMOの場合なら処理可能なCMOのタグ
        !           472: のリストが続く.  上の例では, 514 は {\tt OX\_DATA} をあらわし, 数学デー
        !           473: タのフォマットは(サイズ情報なしの) CMO であることを示す.
        !           474: */
        !           475: /*&eg
        !           476: A mathcap has three components. The first one contains informations
        !           477: to identify the system and hosts on which the application runs.
        !           478: In the above example, Ox\_system denotes the system name.
        !           479: HOSTTYPE represents the OS type and taken from \verb+$HOSTTYPE+
        !           480: enviroment variable.
        !           481: The second component consists of avaiable SM commands.
        !           482: The third component is a list of pairs. Each pair consists
        !           483: of an OX message tag and the available message tags.
        !           484: Again in the above example, 514 is the value of {\tt OX\_DATA}
        !           485: and it indicates that the server accepts CMO (without size information)
        !           486: as mathematical data messages. In this case the subsequent
        !           487: list represents available CMO tags.
        !           488: */
1.1       noro      489:
                    490: \medbreak
                    491: \noindent
1.2     ! noro      492: //&jp {\bf 例}: \
        !           493: //&eg {\bf Example}: \
1.1       noro      494: %%Prog: (ox.sm1) run  sm1connectr  [(oxWatch) ox.ccc] extension
                    495: %%Prog: ox.ccc (122345; ) oxsubmit ;
1.2     ! noro      496: //&jp {\tt message\_body} の実例をあげる.   シリアル番号部は除いてある.
        !           497: //&eg {\tt message\_body} の実例をあげる.   シリアル番号部は除いてある.
1.1       noro      498: \begin{enumerate}
                    499: \item  {\tt executeStringByLocalParser("12345 ;");}
1.2     ! noro      500: /*&jp
        !           501: は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.
        !           502: {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.
        !           503: */
        !           504: /*&eg
1.1       noro      505: は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす.
                    506: {\tt xx(yy)} のなかの {\tt (yy)} は対応するアスキーコードをあわらす.
1.2     ! noro      507: */
1.1       noro      508: \begin{verbatim}
                    509: 0   0   2   2   0   0   0   4   0   0   0   7
                    510: 31(1)  32(2)  33(3)  34(4)  35(5)  20  3b(;)
                    511: 0   0   2   1   0   0   1   c
                    512: \end{verbatim}
1.2     ! noro      513: /*&jp
1.1       noro      514: ここで,
                    515: \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,
                    516: 順番に {\tt OX\_DATA} それから,
                    517: CMO のタグの, {\tt CMO\_STRING} を表す.
                    518: \verb+ 0  0  0  7 + は文字数,
                    519: 最後に 文字列 {\tt 12345 ;} が来る.
                    520: ここで, \verb+ 0 0 1 c + は, network byte order で,
                    521: {\tt OX\_executeString} を表す.
1.2     ! noro      522: */
        !           523: /*&eg
        !           524: ここで,
        !           525: \verb+ 0 0 2 2 0 0 0 4 + は, network byte order で,
        !           526: 順番に {\tt OX\_DATA} それから,
        !           527: CMO のタグの, {\tt CMO\_STRING} を表す.
        !           528: \verb+ 0  0  0  7 + は文字数,
        !           529: 最後に 文字列 {\tt 12345 ;} が来る.
        !           530: ここで, \verb+ 0 0 1 c + は, network byte order で,
        !           531: {\tt OX\_executeString} を表す.
        !           532: */
1.1       noro      533:
1.2     ! noro      534: //&jp まとめると次のようになる.
        !           535: //&eg まとめると次のようになる.
1.1       noro      536: \begin{verbatim}
                    537: 0   0   2   2  (OX_DATA) 0   0   0   4  (CMO_STRING)
                    538: 0   0   0   7  (size)
                    539: 31(1)  32(2)  33(3)  34(4)  35(5)  20  3b(;)   (data)
                    540: 0   0   2   1  (OX_COMMAND)
                    541: 0   0   1   c  (SM_executeStringByLocalParser)
                    542: \end{verbatim}
1.2     ! noro      543: //&jp これを OXexpression で表記すると次のようになる.
        !           544: //&eg これを OXexpression で表記すると次のようになる.
1.1       noro      545: \begin{center}
                    546: (OX\_DATA, (CMO\_STRING, 7, "12345 ;"))
                    547: \end{center}
                    548: \begin{center}
                    549: (OX\_COMMAND, (SM\_executeStringByLocalParser))
                    550: \end{center}
                    551:
1.2     ! noro      552: //&jp \item  {\tt popString()}  を要請するメッセージ:
        !           553: //&eg \item  {\tt popString()}  を要請するメッセージ:
1.1       noro      554: \begin{verbatim}
                    555: 0   0   2   1  (OX_COMMAND)
                    556: 0   0   1   7  (SM_popString)
                    557: \end{verbatim}
                    558: OXexpression では
                    559: (OX\_COMMAND, (SM\_popString)).
                    560:
                    561: \noindent
1.2     ! noro      562: //&jp これにたいして次の返答メッセージがくる.
        !           563: //&eg これにたいして次の返答メッセージがくる.
1.1       noro      564: \begin{verbatim}
                    565: 0   0   2   2   (OX_DATA)
                    566: 0   0   0   4   (CMO_STRING) 0   0   0   5  (size)
                    567: 31(1)  32(2)  33(3)  34(4)  35(5)
                    568: \end{verbatim}
1.2     ! noro      569: //&jp OXexpression でかくと,
        !           570: //&eg OXexpression でかくと,
1.1       noro      571: (OX\_DATA, (CMO\_STRING, 7, "12345 ;")).
                    572: \end{enumerate}
                    573:
1.2     ! noro      574: //&jp \subsubsection{グループ SMobject/Basic1 に属するオペレータ}
        !           575: //&eg \subsubsection{グループ SMobject/Basic1 に属するオペレータ}
1.1       noro      576:
                    577: \begin{enumerate}
                    578: \item
                    579: \begin{verbatim}
                    580: void xxx_pops(int n)
                    581: \end{verbatim}
1.2     ! noro      582: /*&jp
        !           583: operand stack より, {\it n} 個の元 ({\it obj1, obj2, $\ldots$, objn})
        !           584: を pop して捨てる.
        !           585: */
        !           586: /*&eg
        !           587: operand stack より, {\it n} 個の元 ({\it obj1, obj2, $\ldots$, objn})
        !           588: を pop して捨てる.
        !           589: */
        !           590:
        !           591: //&jp Stack before the request: (右が stack のトップである.) \\
        !           592: //&eg Stack before the request: (右が stack のトップである.) \\
1.1       noro      593: \begin{tabular}{|c|c|c|c|c|}  \hline
                    594: {\it obj1} & {\it  obj2}  & $\cdots$ & {\it objn}  &{\it INT32 n} \\
                    595: \hline
                    596: \end{tabular}
1.2     ! noro      597:
        !           598: Request:
1.1       noro      599: \begin{tabular}{|c|c|}  \hline
                    600: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_pops } \\
                    601: \hline
                    602: \end{tabular}
1.2     ! noro      603:
        !           604: //&jp Result:  なし.
        !           605: //&eg Result:  none.
1.1       noro      606:
                    607:
                    608: \item
                    609: \begin{verbatim}
                    610: int xxx_setName(char *name)
                    611: \end{verbatim}
1.2     ! noro      612: /*&jp
        !           613: {\tt OperandStack} より {\it name} を pop し, つぎに{\tt OperandStack}
        !           614: より {\it obj} を pop し, それを現在の名前空間で変数 {\it name} に
        !           615: bind する.  正常終了なら 0 を, 異常終了なら -1 をもどす.  TCP/IP によ
        !           616: る通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} をstack へ push する.
        !           617: */
        !           618: /*&eg
        !           619: {\tt OperandStack} より {\it name} を pop し, つぎに{\tt OperandStack}
        !           620: より {\it obj} を pop し, それを現在の名前空間で変数 {\it name} に
        !           621: bind する.  正常終了なら 0 を, 異常終了なら -1 をもどす.  TCP/IP によ
        !           622: る通信では, 異常終了の時のみ, {\tt CMO\_ERROR2} をstack へ push する.
        !           623: */
        !           624: //&jp Stack before the request: (右が stack の top.)
        !           625: //&eg Stack before the request: (右が stack の top.)
1.1       noro      626: \begin{tabular}{|c|c|}  \hline
                    627: {\it obj} & {\it String name}  \\
                    628: \hline
                    629: \end{tabular}
1.2     ! noro      630:
        !           631: Request:
1.1       noro      632: \begin{tabular}{|c|c|}  \hline
                    633: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_setName} \\
                    634: \hline
                    635: \end{tabular}
1.2     ! noro      636:
        !           637: //&jp Result: なし.
        !           638: //&eg Result: none.
1.1       noro      639:
                    640: \item
                    641: \begin{verbatim}
                    642: int xxx_evalName(char *name)
                    643: \end{verbatim}
1.2     ! noro      644: /*&jp
        !           645: 現在の名前空間で変数 {\it name} を評価する.  評価の結果 {\it
        !           646: resultObj} をスタックへ戻す.  関数自体は正常終了なら 0 を, 異常終了な
        !           647: ら -1 をもどす.  TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2}
        !           648: を stack へ push する.
        !           649: */
        !           650: /*&eg
        !           651: 現在の名前空間で変数 {\it name} を評価する.  評価の結果 {\it
        !           652: resultObj} をスタックへ戻す.  関数自体は正常終了なら 0 を, 異常終了な
        !           653: ら -1 をもどす.  TCP/IP の場合, 異常終了の場合のみ {\tt CMO\_ERROR2}
        !           654: を stack へ push する.
        !           655: */
        !           656:
        !           657: //&jp Stack before the request: (右が stack の top.)
        !           658: //&eg Stack before the request: (右が stack の top.)
1.1       noro      659: \begin{tabular}{|c|}  \hline
                    660: {\it String name}  \\
                    661: \hline
                    662: \end{tabular}
1.2     ! noro      663:
        !           664: Request:
1.1       noro      665: \begin{tabular}{|c|c|}  \hline
                    666: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_evalName} \\
                    667: \hline
                    668: \end{tabular}
1.2     ! noro      669:
        !           670: //&jp Stack after the request: (右が stack の top.)
        !           671: //&eg Stack after the request: (右が stack の top.)
1.1       noro      672: \begin{tabular}{|c|}  \hline
                    673: {\it resultObj} \\
                    674: \hline
                    675: \end{tabular}
1.2     ! noro      676:
        !           677: //&jp Result:  なし.
        !           678: //&eg Result:  none.
1.1       noro      679:
                    680: \item
                    681: \begin{verbatim}
                    682: int xxx_executeFunction(char *s, int n)
                    683: \end{verbatim}
1.2     ! noro      684: /*&jp
        !           685: スタックより {\it n} 個のデータを pop して, サーバのローカル関数{\it
        !           686: s} を実行する.  エラーのときのみ {\tt CMO\_ERROR2} を stack へ push す
        !           687: る.
        !           688: */
        !           689: /*&eg
        !           690: スタックより {\it n} 個のデータを pop して, サーバのローカル関数{\it
        !           691: s} を実行する.  エラーのときのみ {\tt CMO\_ERROR2} を stack へ push す
        !           692: る.
        !           693: */
        !           694:
        !           695: //&jp Stack before the request: (右が stack の top.) \\
        !           696: //&eg Stack before the request: (右が stack の top.) \\
1.1       noro      697: \begin{tabular}{|c|c|c|c|c|}  \hline
                    698: {\it objn} & $\cdots$ & {\it obj1} & {\it INT32 n} & {\it String s} \\
                    699: \hline
                    700: \end{tabular}
1.2     ! noro      701:
        !           702: Request:
1.1       noro      703: \begin{tabular}{|c|c|}  \hline
                    704: {\tt int32 OX\_COMMAND} & {\tt int32 SM\_executeFunction}  \\
                    705: \hline
                    706: \end{tabular}
                    707:
1.2     ! noro      708: //&jp Stack after the request: 関数実行の結果.
        !           709: //&eg Stack after the request: 関数実行の結果.
1.1       noro      710:
1.2     ! noro      711: //&jp Result: なし.
        !           712: //&eg Result: none.
1.1       noro      713:
                    714: \item
                    715: \begin{verbatim}
                    716: bytes *xxx_popSerializedLocalObject(void)
                    717: void popSerializedLocalObject(ox_stream out)
                    718: \end{verbatim}
1.2     ! noro      719: /*&jp
        !           720: 最初の関数はライブラリとしてリンクして使用するための関数である.  スタッ
        !           721: クより pop した object を local 形式の serialization してbyte 列で戻す.
1.1       noro      722: 2 番目の関数は Socket で通信するための同機能の関数であり,
1.2     ! noro      723: serialization された byte 列を{\tt ox\_stream out} へ出力する.  この場
        !           724: 合, header {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT} をつけ
        !           725: てから, byte 列を送る. この関数はおもに, homogeneous な分散システムで
        !           726: 用いる.  次に, サーバスタックマシンの関数が実行されるまでは,戻り
        !           727: object の内容は保証されないといけない.
        !           728: */
        !           729: /*&eg
        !           730: 最初の関数はライブラリとしてリンクして使用するための関数である.  スタッ
        !           731: クより pop した object を local 形式の serialization してbyte 列で戻す.
        !           732: 2 番目の関数は Socket で通信するための同機能の関数であり,
        !           733: serialization された byte 列を{\tt ox\_stream out} へ出力する.  この場
        !           734: 合, header {\tt int32 OX\_DATA}, {\tt int32 CMO\_LOCAL\_OBJECT} をつけ
        !           735: てから, byte 列を送る. この関数はおもに, homogeneous な分散システムで
        !           736: 用いる.  次に, サーバスタックマシンの関数が実行されるまでは,戻り
        !           737: object の内容は保証されないといけない.
        !           738: */
1.1       noro      739: \item
1.2     ! noro      740: /*&jp
        !           741: local serialized object, および サポートする CMO object を{\tt
        !           742: OX\_DATA} として受信した場合, {\tt OperandStack} へpush する.  受信エ
        !           743: ラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.
        !           744: */
        !           745: /*&eg
        !           746: local serialized object, および サポートする CMO object を{\tt
        !           747: OX\_DATA} として受信した場合, {\tt OperandStack} へpush する.  受信エ
        !           748: ラーを起こしたときのみ, {\tt CMO\_ERROR2} を stack へ push する.
        !           749: */
1.1       noro      750:
                    751: \item
                    752: \begin{verbatim}
                    753: bytes *xxx_popCMO(void)
                    754: void xxx_popCMO(ox_stream out)
                    755: \end{verbatim}
                    756:
1.2     ! noro      757: /*&jp
        !           758: 最初の関数はライブラリとしてリンクして使用するための関数である.  {\tt
        !           759: OperandStack} より object を pop し CMO 形式の serialized object を
        !           760: byte 列として戻す.  2 番目の関数は Socket で通信するための同機能の関数
        !           761: であり, {\tt ox\_stream out } へ, そのデータを header {\tt OX\_DATA}
        !           762: をつけてながす.  この関数はおもに, heterotic な分散システムで用いる.
        !           763: 次に, サーバスタックマシンの関数が実行されるまでは,戻り object の内容
        !           764: は保証されないといけない.
        !           765: */
        !           766: /*&eg
        !           767: 最初の関数はライブラリとしてリンクして使用するための関数である.  {\tt
        !           768: OperandStack} より object を pop し CMO 形式の serialized object を
        !           769: byte 列として戻す.  2 番目の関数は Socket で通信するための同機能の関数
        !           770: であり, {\tt ox\_stream out } へ, そのデータを header {\tt OX\_DATA}
        !           771: をつけてながす.  この関数はおもに, heterotic な分散システムで用いる.
        !           772: 次に, サーバスタックマシンの関数が実行されるまでは,戻り object の内容
        !           773: は保証されないといけない.
        !           774: */
        !           775:
        !           776: Request:
1.1       noro      777: \begin{tabular}{|c|c|}  \hline
                    778: {\tt int32 OX\_COMMAND} & {\tt int32 OX\_popCMO}  \\
                    779: \hline
                    780: \end{tabular}
1.2     ! noro      781:
        !           782: Result:
1.1       noro      783: \begin{tabular}{|c|c|}  \hline
                    784: {\tt int32 OX\_DATA} &   {\it Serialized CMO} \\
                    785: \hline
                    786: \end{tabular}
                    787:
1.2     ! noro      788: //&jp 以下で, {\tt ox\_stream} はサンプルサーバの場合,
        !           789: //&eg 以下で, {\tt ox\_stream} はサンプルサーバの場合,
1.1       noro      790: \begin{verbatim}
                    791: typedef FILE2 * ox_stream;
                    792: \end{verbatim}
1.2     ! noro      793: //&jp である (cf. {\tt file2.h}). これは処理系によりちがってよい.
        !           794: //&jp {\tt ox\_asir} では, {\tt FILE *} を用いている.
        !           795: //&eg である (cf. {\tt file2.h}). これは処理系によりちがってよい.
        !           796: //&eg {\tt ox\_asir} では, {\tt FILE *} を用いている.
1.1       noro      797:
                    798: \end{enumerate}
                    799:

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