[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.7

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

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