前の節で CMO の表現方法を形式的に定義せず, CMO のPrimitive の表現法を説明したが, ここでは, CMO の Lisp 風表現 (Lisp-like expression) である CMOexpression および前節で説明した CMO の標準 encoding 法をもう一度説明する.
まず, CMOexpression を形式的に 拡張 BNF 記法を用いて定義しよう. タイプライタフォントでかかれた記号は終端記号を意味する. ``:'' は定義を意味する. ``|'' は''または''を意味する. { X } は X の 0 回以上の繰り返しを表す. [ x ] は X が 0 回または 1 回出現することを表す. この記法を用いると CMOexpression は次のように定義できる.
終端記号 int32 は, 32 bit integer を表す, 10 進または 16 進の数字の 列である. 終端記号 string は''文字''の列である. 終端記号 byte は 8 bit データを表す, 10 進または 16 進の数字の列である.
CMOexpression にあらわれる各要素を区切るために , (コンマ) を用いてもよい. cmo_tag は CMO_ で始まる定数である. CMOexpression で表現される object を CMObject と呼ぶ.
この表記法 CMOexpression を利用して, CMO Primitive の object を記述 してみよう. Object 自体の構造を説明するため, BNF をもうすこし拡張して, 非終端記号, 終端記号名のみならず, 変数の 名前も書くことにする. こうすることにより, object の意味の説明も容易になる からである. また ``--'' でコメントのはじまりを表すものとする.
たとえば, (CMObject の) 32 bit integer である integer32 を BNFで定義すれば,
この記法を用いて, 前節で導入した, Primitive の CMObject を 形式的に定義しよう.
Group CMObject/Primitive requires nothing.
Error2, Null, Integer32, Datum, Cstring, Mathcap, List
CMObject/Primitive.
Document of CMObject/Primitive is at http://www.math.kobe-u.ac.jp/OpenXM
(in English and Japanese)
Cstring で, string s の部分を byte に分解すれば,
となる. また, ``Group CMObject/Primitive requires nothing'' は, 以下は, グループ CMObject/Primitive の定義であり, このグループの CMObject を定義するのに, 要請される CMObject のグループは ないことを示す. ``Error2, Null, Integer32, Datum, Cstring, Mathcap, List CMObject/Primitive'' は, グループ CMObject/Primitive には, Error2, Null, Integer32, Datum, Cstring なるクラスの object が属することを示す.
では, 実際のデータの表現の例をみてみよう. たとえば, 32 bit integer の 1234 は,
とかく. 文字列 ``Hello'' は
と書く.
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
の 標準 encoding 法による表現である.