next up previous
Next: グループ SMobject/Basic に属するオペレータ Up: サーバスタックマシン Previous: サーバスタックマシン

サーバスタックマシンのグループ SMobject/Primitive に属するオペレータ

サーバスタックマシンは最低で1本のスタック

Object xxx_OperandStack[SIZE];
をもつ. ここで, Object はそのシステム固有の Object 型で構わない. CMObject は各サーバ固有のローカルオブジェクトに変換してスタックへプッ シュしてよい. ただし変換, 逆変換を合成したものは恒等写像であることが のぞましい. CMObject をどのように (local) Object に変換するか, Object が受け付けるメッセージの定義は,各システムが独自にきめて文書化しておく ものとする. つまりすべてのメッセージは, private である. たとえば, add のような基本的な メッセージにたいしても, OX スタックマシン はなにもきめていない. 将来的には open math [4] のように CMObject に対する最大公約数的なメッセージの仕様をcontent dictionary (CD) の形で定義したい.

以下, xxx_ は誤解の恐れがないときは省略する. xxx_ は local サーバシステムに固有の識別子である. Asir の場合は Asir_ を用いる. kan/sm1 の場合は Sm1_ を用いる. 関数名, タグ名は長いので省略形を用いてもよい.

以下では次のようにパケットを記述する. 各フィールドは, \fbox{データ型 \quad データ} なる形式 で書く. たとえば, int32 OX_DATA は 32 bit network byte order の数字 OX_DATAという意味である. ``イタリックで書かれているフィー ルドは,定義が別のところでなされているか解釈に誤解のないような自然言語 で説明されている object を表す.'' たとえば, String commandName は, String データ型の local object commandName を意味する. (サー バスタックマシン上の object は, CMO 形式の objectとは限らないことに注 意. CMO 形式で書いてあっても, それはサーバスタックマシンのlocal 形式 でスタック上にあると解釈して下さい.)

すべてのサーバスタックマシンは以下の操作を実装していないといけない. 各操作に対し, その前後におけるスタックの状態を示す. 図において, 右端のオブジェクトがスタックのトップに対応する.

1.
CMObject/Primitive の CMO データのうち必須のもの, CMO_ERROR2, CMO_NULL, CMO_INT32, CMO_STRING, CMO_LISTがおく られて来た場合それをスタックに push する. たとえば, CMO_NULL あるいは CMO_String の場合次のようになる.

Request:
int32 OX_DATA int32 CMO_NULL

Stack after the request:
NULL

Output: none.

Request:
int32 OX_DATA int32 CMO_String int32 size byte s1 $\cdots$ byte ssize

Stack after the request:
String s

Output: none.

CMO データの受け取りに失敗した時のみ
int32 OX_DATA int32 CMO_ERROR2 CMObject ob

をスタックへ push する. 現在のところ, ob には,

[ Integer32 OX パケット番号, Integer32 エラー番号, CMObject optional 情報]
なるリストを入れる (CMO 形式でかいてあるが, これはサーバ独自の形式でよい. CMO として送出されるときこのような形式でないといけないという意味である.)

2.
SM_mathcap
このサーバの mathcap をもどす (termcap のまね). サーバのタイプ, サー バスタックマシンの能力を知ることができる. C 言語で実装する場合は, mathcap の構造体をシステム毎にきめるものとし,この関数はその構造体への ポインタを戻す. (open sm1 では struct mathcap を用いている.

@plugin/mathcap.h)

Request:
int32 OX_COMMAND int32 SM_mathcap

Stack after the request:
int32 OX_DATA Mathcap mathCapOb

Output: none.

3.
SM_setMathcap
受け取った Mathcap m を自分のシステムに設定して, 相手側が理解不 能な CMO をおくらないようにする. C 言語で実装する場合は, mathcap の構 造体をシステム毎にきめるものとし,この関数はその構造体へのポインタを引 数とする. (open sm1 では struct mathcap を用いている.

@plugin/mathcap.h)

Stack before the request:
Mathcap m

Request:
int32 OX_DATA Mathcap m
int32 OX_COMMAND int32 SM_setMathcap

Output: none. 注意: mathcap は一般にクライアント主体で設定する. クライアントがサーバに SM_mathcap をおくり, サーバ側の mathcap を得る. それを, クライアントはそのサーバに付随した mathcap として 設定する. 次に, クライアントはサーバに自分の mathcap を SM_setMathcap でおくり, 自分の mathcap を設定させる.

4.
SM_executeStringByLocalParser
文字列 s を stack から pop し, その文字列をシステム固有の文法(サーバスタックマシンの組み込みローカ ル言語)にしたがったコマンドとして実行する. コマンドの実行の結 果の最後に戻り値があるときは, OperandStack に戻り値を push する. OpenXM では, 現在のところ関数名の標準化はおこなっていない. この関数および popString の機能を実現すれば, 最低限の open XM の サーバになれる. 実装では, まずこの二つの関数の機能を実現すべきである.

Stack before the request:
String commandString

Request:
int32 OX_COMMAND int32 SM_executeStringByLocalParser

Output: none. 参考: 実行前のスタックのデータは, String commandString なる local stack machine の object としてス タック上にあるが, TCP/IP の通信路では, 次のようなデータがまずながれて commandName がスタックに push される:

int32 OX_DATA int32 CMO_string size and the string commandString

5.
SM_executeStringByLocalParserInBatchMode
スタックに副作用がない(スタックにたいしてなんの操作もしない)ことを除き 上とまったく同じ関数である. エラーの時のみ, Error2 Object をスタック へプッシュする.

6.
SM_popString
OperandStack より Object を pop し, それを xxx の出力規則にしたがい文 字列型に変換して送信する. スタックが空のときは, (char *)NULL を戻す. 文字列は TCP/IP stream へ CMO のデー タとして送信する. エラーの場合は CMO_ERROR2 を戻すべきである.

Stack before the request:
Object

Request:
int32 OX_COMMAND int32 SM_popString

Output:
int32 OX_DATA int32 CMO_STRING size and the string s

7.
SM_getsp
現在のスタックポインタの位置をもどす. スタート時点での位置は 0 であり, object が push されたばあい, 1 づつ増えるものとする.

Stack before the request:
Object

Request:
int32 OX_COMMAND int32 SM_getsp

Stack after the request:
int32 OX_DATA int32 CMO_INT32 stack pointer value

Output: none.

8.
SM_dupErrors
スタック上のエラーオブジェクトをリストにして戻す. スタック自体は変化 させない.

Request:
int32 OX_COMMAND int32 SM_dupErrors

Stack after the request:
int32 OX_DATA CMObject a list of errors  

Output: none.

: mathcap の問い合わせに対して, ox_sm1 は次のように答える.

Class.mathcap 
 [ [199909080 , $Ox_system=ox_sm1.plain$ , $Version=2.990911$ , 
    $HOSTTYPE=i386$ ]  , 
   [262 , 263 , 264 , 265 , 266 , 268 , 269 , 272 , 273 , 275 , 276 ]  , 
   [[514] , [2130706434 , 1 , 2 , 4 , 5 , 17 , 19 , 20 , 22 , 23 , 24 , 
             25 , 26 , 30 , 31 , 60 , 61 , 27 , 33 , 40 , 34 ]]]

mathcap は 3つの要素をもつリストである. まづ, 最初の要素を見よう. Ox_system は openXM システム名である. 読み込むライブラリがちがって いて, 関数名(または シンボル)の意味がちがうときはこの名前もかえる. た とえば, open math の basic content dictionary 対応の関数定義マクロを読 みこんだ sm1 は, ox_sm1_basicCD なる名前にする. HOSTTYPE 値は, CPU の種類をあらわしunix では環境変数$HOSTTYPE の値である. 2 番目 の要素は 利用可能な SM コマンドをあつめたリストである. 3 番目のリスト は, 処理可能な数学データの形式, およびCMOの場合なら処理可能なCMOのタグ のリストが続く. 上の例では, 514 は OX_DATA をあらわし, 数学デー タのフォマットは(サイズ情報なしの) CMO であることを示す.

: message_body の実例をあげる. シリアル番号部は除いてある.

1.
executeStringByLocalParser("12345 ;"); は次のようなパケットに変換される. 各数字は 16進1バイトをあらわす. xx(yy) のなかの (yy) は対応するアスキーコードをあわらす.

0   0   2   2   0   0   0   4   0   0   0   7  
31(1)  32(2)  33(3)  34(4)  35(5)  20  3b(;)   
0   0   2   1   0   0   1   c
それぞれのデータの意味は次のとおりである.

0   0   2   2  (OX_DATA) 0   0   0   4  (CMO_STRING)
0   0   0   7  (size)
31(1)  32(2)  33(3)  34(4)  35(5)  20  3b(;)   (data)
0   0   2   1  (OX_COMMAND) 
0   0   1   c  (SM_executeStringByLocalParser)
これを OXexpression で表記すると次のようになる.
(OX_DATA, (CMO_STRING, 7, "12345 ;"))
(OX_COMMAND, (SM_executeStringByLocalParser))

2.
popString() を要請するメッセージ:
0   0   2   1  (OX_COMMAND) 
0   0   1   7  (SM_popString)
OXexpression では (OX_COMMAND, (SM_popString)).

これにたいして次の返答メッセージがくる.

0   0   2   2   (OX_DATA) 
0   0   0   4   (CMO_STRING) 0   0   0   5  (size)
31(1)  32(2)  33(3)  34(4)  35(5)
OXexpression でかくと, (OX_DATA, (CMO_STRING, 7, "12345 ;")).


next up previous
Next: グループ SMobject/Basic に属するオペレータ Up: サーバスタックマシン Previous: サーバスタックマシン
Nobuki Takayama 平成12年1月25日