next up previous contents
: MathCap : サーバスタックマシン : サーバスタックマシン   目次

サーバスタックマシンのグループ 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.

  9. SM_pushCMOtag
    
    スタックの先頭オブジェクトが CMO に変換された場合の CMO tag を CMO_INT32 としてスタックへ push する. 先頭オブジェクトはスタックに留まる. 先頭オブジェクトをCMO へ変換する方法が無い場合は, エラー object を積む.

    Request:
    int32 OX_COMMAND int32 SM_pushCMOtag

    Stack after the request:
    int32 OX_DATA CMO_INT32 tag  

    Output: none.


next up previous contents
: MathCap : サーバスタックマシン : サーバスタックマシン   目次
Nobuki Takayama 平成28年8月27日