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>