前の節で 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]) の XML 表現法も可能であり, その場合は, 上の二つの例は次のように 書く.
<cmo> <cmo_int32> <int32> 1234 </int32> </cmo_int32> <cmo_string> <int32 for="length"> 5 </int32> <string> "Hello" </string> </cmo_string> </cmo>
cmo_string は次のようにあらわしてもよい.
<cmo> <cmo_string> <int32 for="length"> 5 </int32> <byte> 'H' </byte> <byte> 'e' </byte> <byte> 'l' </byte> <byte> 'l' </byte> <byte> 'o' </byte> </cmo_string> </cmo>
この場合の cmo_string の DTD による定義は次のようになる.
<!ELEMENT cmo_string (int32, byte*)>
次に, 標準 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 法については後述する 8.3.
標準 encoding と CMOexpression の間の変換は容易である. 前節で用いたデータの表記法, たとえば,
int32 CMO_INT32 | int32 1234 |
は, CMOexpression
の 標準 encoding 法による表現である.
(実験的)
CMO および OX packets は XML 規格 [10] に準拠している.
XML 規格の Attribute を binary encode するために
特別なタグ
#define CMO_ATTRIBUTE_LIST (LARGEID+3)
を用意してある.
たとえば Attribute font="Times-Roman" は
(CMO_ATTRIBUTE (CMO_LIST (CMO_LIST (CMO_STRING,"font") (CMO_STRING, "Times-Roman"))))
と encoding される.
この特別な CMO tag CMO_ATTRIBUTE_LIST 以外は, XML 表現では XML のタグとして理解される.
CMO/XML で comment, for と名前がついた attributes は CMO binary expression にはエンコードされない.