next up previous
Next: OpenXM の通信モデル Up: Open XM の設計と実装 Previous: CMO Primitive の object

CMO の形式的表現方法

前の節で CMO の表現方法を形式的に定義せず, CMO のPrimitive の表現法を説明したが, ここでは, CMO の Lisp 風表現 (Lisp-like expression) である CMOexpression および前節で説明した CMO の標準 encoding 法をもう一度説明する.

まず, CMOexpression を形式的に 拡張 BNF 記法を用いて定義しよう. タイプライタフォントでかかれた記号は終端記号を意味する. ``:'' は定義を意味する. ``|'' は''または''を意味する. { X } は X の 0 回以上の繰り返しを表す. [ x ] は X が 0 回または 1 回出現することを表す. この記法を用いると CMOexpression は次のように定義できる.


\begin{eqnarray*}\mbox{CMOexpression}
&:& \quad
\mbox{\tt (} \mbox{\tt cmo\_tag...
...\
& &\vert\ \mbox{\tt string} \\
& &\vert\ \mbox{\tt byte} \\
\end{eqnarray*}


終端記号 int32 は, 32 bit integer を表す, 10 進または 16 進の数字の 列である. 終端記号 string は''文字''の列である. 終端記号 byte は 8 bit データを表す, 10 進または 16 進の数字の列である.

CMOexpression にあらわれる各要素を区切るために , (コンマ) を用いてもよい. cmo_tagCMO_ で始まる定数である. CMOexpression で表現される object を CMObject と呼ぶ.

この表記法 CMOexpression を利用して, CMO Primitive の object を記述 してみよう. Object 自体の構造を説明するため, BNF をもうすこし拡張して, 非終端記号, 終端記号名のみならず, 変数の 名前も書くことにする. こうすることにより, object の意味の説明も容易になる からである. また ``--'' でコメントのはじまりを表すものとする.

たとえば, (CMObject の) 32 bit integer である integer32 を BNFで定義すれば,

Integer32 : (CMO_INT32, int32)
と書くのが本来の書き方による記法であるが, ここでは,

\begin{eqnarray*}\mbox{Integer32} \ &:& \ ({\tt CMO\_INT32}, {\sl int32}\ n) \\
& & \ \mbox{--- 32 bit integer $n$\space を表す. } \\
\end{eqnarray*}


と書くことを許すことにする. このように書くことにより, 非終端記号 Integer32 は,
Integer32 : (CMO_INT32, int32)
のように, 終端記号 CMO_INT32int32 を成分にもち, CMObject の (CMO_INT32, int32 n) は, 32 bit integer n を表現しているんだということが, 1 行でわかる.

この記法を用いて, 前節で導入した, Primitive の CMObject を 形式的に定義しよう.

Group CMObject/Primitive requires nothing.
Error2, Null, Integer32, Datum, Cstring, Mathcap, List $\in$ CMObject/Primitive.
Document of CMObject/Primitive is at http://www.math.kobe-u.ac.jp/OpenXM (in English and Japanese)

\begin{eqnarray*}\mbox{Error2}&:& ({\tt CMO\_ERROR2}, {\sl CMObject}\, \mbox{ob}...
...ct}\, ob[m-1])} \\
& & \mbox{--- m is the length of the list.}
\end{eqnarray*}


Cstring で, string s の部分を byte に分解すれば,

\begin{eqnarray*}\mbox{Cstring}&:& ({\tt CMO\_STRING},{\sl int32}\, \mbox{ n},
{\sl byte}\, \mbox{s[0]},
\ldots, {\sl byte}\ \mbox{s[n-1]})
\end{eqnarray*}


となる. また, ``Group CMObject/Primitive requires nothing'' は, 以下は, グループ CMObject/Primitive の定義であり, このグループの CMObject を定義するのに, 要請される CMObject のグループは ないことを示す. ``Error2, Null, Integer32, Datum, Cstring, Mathcap, List $\in$ CMObject/Primitive'' は, グループ CMObject/Primitive には, Error2, Null, Integer32, Datum, Cstring なるクラスの object が属することを示す.

では, 実際のデータの表現の例をみてみよう. たとえば, 32 bit integer の 1234 は,

(CMO_INT32, 1234)

とかく. 文字列 ``Hello'' は

(CMO_STRING, 5, "Hello")

と書く.

CMOexpression と, CMObject の区別を理解しておくのは重要である. たとえば

(CMO_INT32, 234, "abc",(CMO_STRING))
は CMOexpression ではあるが, CMObject ではない. これは, 文法的には正しいプログラムだが, なにをやるのかは全く不明な プログラムと似ている.

さて, Open math 風 ([4]) の SGML 表現法も可能であり, その場合は, 上の二つの例は次のように 書く.

<CMO_INT32>
1234
</CMO_INT32>

<CMO_STRING>
5
"Hello"
</CMO_STRING>

次に, 標準 encoding 法を説明しよう. 標準 encoding 法では, cmo_tag を ネットワークバイトオーダーの 32 bit integer int32 に, その他のフィールドは, 定義に記述されているデータ型に従い, byte データ byte かまたは ネットワークバイトオーダーの 32 bit integer int32 に, 変換する.

高速の通信方法を用いて 効率を重視する接続の場合には, int32 を network byte order に変換する操作がおおきなオーバヘッドとなることが 報告されている. 100Mbps の通信路で 12Mbytes の CMO_ZZ の転送では 約 90% の時間が network byte order への変換についやされているという 実験データもある. 効率を重視した encoding 法については後述する.

標準 encoding と CMOexpression の間の変換は容易である. 前節で用いたデータの表記法, たとえば,

int32 CMO_INT32 int32 1234

は, CMOexpression

(CMO_INT32, 1234)

の 標準 encoding 法による表現である.


next up previous
Next: OpenXM の通信モデル Up: Open XM の設計と実装 Previous: CMO Primitive の object
Nobuki Takayama 平成12年1月25日