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>