2. データ定義サブ言語
2.1 フィールド
ネットワークマシンとのすべての通信はビット列を用いて行われる。これらのビット列はメッセージとも呼ばれ、受信側のHOSTによって解析され、受信側HOSTは そのメモリ の内部に、自身のメモリとコードでデータ構造を再構築する。
ビットは意味のあるフィールドにまとめられる。フィールドとは、明確な内容を持つビットのグループである。フィールドが 含みうるもの は次のとおりである。
- データの要素(データフィールド)
- 環境パラメータを指定するビットパターン
- ポインタ
- 他のいくつかのフィールドの識別
ビードの形式を記述する方法は、RFC #31で提案されたバイナリメッセージの記述方法から派生したものである。
- 各フィールドは、その名前とビット数で表した長さとともに宣言される。
- 特別な意味に対応する、フィールドのよく使われる固定値には、名前を付けてよい。
- フィールドを連結する正しい方法は規則によって開始される。フィールドの特定の固定値のみが許される場合、それらはその値によって、あるいは対応する名前によって指定できる。
2.2 データビード。
データフィールド(型(a))は連結されてデータビードを形成する。ビードとは、HOSTとネットワークマシンとの間で伝送されるあらゆるデータ構造の構成要素 として使われる 、分割不可能な原子的データ単位である。ビードは参照可能なデータの最小単位である。
複数のフィールドを連結してビードを形成する正しい方法は、構成規則で示される。ビードは固定長であり、曖昧さのない構造を持つ。実際のマシンでは、ビードは通常、連続するレジスタの整数個として定義される。ここではこの制約は適用されない。ただし、たとえば32ビットの語、1語あたり4バイトを持つHOSTを優遇するほうが効率的であると判明するかもしれない。これはARPAネットワーク上で最も一般的な語構造である。
データビードは言語のオペランドとみなしてよく、その言語において型(b)と型(c)のフィールドは演算子となる。
2.3 制御フィールド
データビード同士の結び付け方と、それらが動作する環境は、追加の制御フィールドによって指定される。制御フィールドは参照することができず、後続のビード列に対する演算子もしくはその識別子、または個々のビード間の結合である。
制御フィールドが構造の先頭の水準で指定されている場合、その作用範囲は構造のすべてのビードまたは下位構造にも及びうる。より正確に言えば、ビードの構造として、均質な構造と異質な構造の2種類を定義しなければならない。
構造の先頭で、構造全体について単一のビード型と固定のパラメータ環境の両方が指定されている場合、その構造は均質であると定義する。
次の条件の少なくとも一つが真である場合、その構造は異質であると定義する。
-
構造を組み立てるために異なる型のビードが使われている
-
構造のビードが置かれている環境が、構造の内部で変化する。
定義が必要な主な制御フィールドは5つある。
- MODIFY
- FLAG
- POINTER
- IDENTIFICATION
- PARAMETER
2.3.1 MODIFYフィールド
MODIFYフィールドは、異質な構造の各ビードの前に置かれる1ビットのフィールドである。これは、データビードの環境または型のいずれかを変更することを目的とする、型b、d、またはeの1つ以上の制御フィールドが後に続く場合にセットされるフラグである。このフィールドは次の値をとる。
- 1: 付随するデータビードの型とその環境が変化しない場合
- 0: 付随する要素が、後続のデータビードの型および/または環境の変更を指定する、型b、d、またはeの制御フィールドまたは制御フィールドの並びである場合
2.3.2 FLAGフィールド
MODIFYフィールドがセットされている場合、その直後には8ビットのFLAGフィールドが続き、IDENTIFICATIONフィールドと、複数ありうるPARAMETERフィールドのうちどれが存在するかを示す。各ビットは、1にセットされているとき次の意味を持つ。
bit number
0 IDENTIFICATION field present
1 first parameter field present
2 second parameter field present
---
6 sixth parameter field present
7 next field is another FLAG field
for some more parameters (in case
more than 6 parameters may be
attached to a bead environment).
2.3.3 POINTERフィールド
各ビードに付けるポインタの数と性質は、構造の定義に依存する。あるリスト構造は、1つの前方ポインタを必要とするかもしれない。リング構造は、先頭要素への追加のポインタを使うかもしれない。ビード間に必要な結合は構造の定義の中で定義され、それ以降、必要なポインタフィールドが各データビードに自動的に追加される。構造内のビードは、構造の先頭からの相対アドレスによって参照される。したがって、このアドレスを格納するには16ビットのポインタフィールドで十分なはずである。
2.3.4 IDENTIFICATIONフィールド
IDENTIFICATIONフィールドは8ビットのフィールドであり、定義済みのビード型のリストの中からビード型を識別する。標準のビード型は0から昇順に番号付けされ、非標準のビード型は255から降順に番号付けされる。非標準の型の番号付けは、各サーバプログラムまたはサーバプログラムの集合に固有である。構造のルートにおいて構造全体についてビード型が定義されていない場合には常に、IDENTIFICATIONフィールドは値1のMODIFYフィールドの後に続く。識別フィールドは、構造の先頭の水準でも、その構造内で使われる同一要素(ビードまたは構造)の型を指定するために使われる。
2.3.5 PARAMETERフィールド
PARAMETERフィールドは、後続のデータビード列が置かれる環境パラメータのリストを与える。PARAMETERフィールドはビード型に固有である。曖昧さがない場合、あるいは次のデータビードの型について曖昧さがない場合、PARAMETERフィールドはMODIFYフィールドの直後に続く。
例:標準ビードBEAMVTのパラメータフィールドは次のフィールドを含む。
- 生成される移動の種類を示す2ビットのフィールド
00 do not display move the beam
01 display final point point
10 display vector vector
11 unused
-
ビーム強度を0から15の数で示す4ビットのフィールド。0は強度ゼロ、15は可能な最大強度を意味する。
-
点滅のための1ビットのフィールド
-
0: オフ
-
1: オン
-
ライトペン感度のための1ビットのフィールド
-
0: オフ
-
1: オン
2.4 メタ言語の定義
例では、ビードの定義でも構造の定義でも、読みやすさのためにCOBOLのレポート風のメタ言語を使う。
Symbol Meaning
+ concatenation
{ } choice
[ ] optional choice
{ } l<=u { } l<=u repetition
1 lower bound on the
number of identical
items; if omitted l
is assumed to be 0.
u upper bound on the
number of identical
items; if omitted u
is assumed to be ∞.
a number alone means: exact
number of repetition.
: label for further use _within the same rule_
= assignment
= > conditional alternative
( ) grouping
' ' indicates a special value given to the following field name
(+) plus
(-) minus
2.5 提案する標準ビード
2.5.1 英数字ビード
文字:CHAR
文字は、1つの8ビットのフィールド(同じ名前を持つ)から成る。現在使われている特殊文字に対応する多くの特殊パターンが定義されている。それらはCHARのいくつかの部分集合とともに表2.5.1に示す。基本の文字コードは標準ASCIIとして宣言される。
standard EBCDIC
CODE
or by the name
followed by the 128 characters in this code corresponding to
the 128 ASCII characters. If no code declaration is specified,
the ASCII code is assumed by default.
数値表現
通常、プログラムの核はサーバのHOSTにとどまり、ユーザのHOSTはデータに対して算術演算を行う必要はないはずである。この場合、HOSTの算術演算装置の設計に関わる原理を記述する必要はない。しかし、固定小数点数と浮動小数点数の形式は記述しなければならない。
-
ユーザHOSTとサーバHOSTが同じ数値表現、たとえば標準表現を持つ場合、それぞれの数値表現でデータを伝送することで、両者間のデータ流量が減る。
-
サーバHOSTが標準表現とは異なる数値表現を持つ場合、伝送されるデータに応じて2つの選択肢がある。
-
数値データを標準コードの10進数として交換する
-
固定小数点形式と浮動小数点形式をネットワークマシンに対して定義し、ユーザHOSTが次のいずれかを行う
-
サーバのバイナリ表現から10進表現への直接のコード変換、およびその逆。
または、サーバのバイナリ表現から自身のバイナリ表現へのコード変換、およびその逆。
交換される数の大部分は10進で印字されるか、10進の入力として与えられるため、対応するHOST間でバイナリ表現に非互換性がある場合には、10進表現での交換が最も容易であると考えられる。
したがって、次のものを定義する。
-
10進表現の数。これはビードではなく文字列である(2.3.1参照)
-
固定小数点数:単精度FXPNUM1、倍精度FXPNUM2
Field definition BYTE 8 SIGN 1
SBYTE 7
FXP NUM1 <-- SIGN + SBYTE + {BYTE}3
FXP NUM2 <-- FXP NUM1 + {BYTE}4
- 浮動小数点数:単精度FLPNUM1、倍精度FLPNUM2
FLP NUM1 <-- SIGN + SBYTE + {BYTE}3
FLP NUM2 <-- FLPNUM1 + {BYTE}4
これは浮動小数点数の構文を表現しているにすぎない。意味論としては、FLPNUM1において次のように述べるべきである。
-
SIGNは、仮数である形式{BYTE}3の数の符号である
-
SBYTEは指数であり、指数を正にするため、その値には40₁₆のバイアスがかけられる。実際、FXPNUM1とFLPNUM1は意味論によって異なる。
これらの性質は、特別なフィールド定義によって表現される。
EXP <-- SBYTE (+) '40H'SBYTE
MANT <-- SIGN (+) {BYTE}3
そして浮動小数点数は次のように定義される。
FLP = MANT 2EXP
1. 特殊文字
Transmission Control Characters
SOH
STX
ETX
EOT
ENQ
ACK
DLE
NAK
SYN
ETB
ESC
Printer Control Characters
horizontal tabulation HT + '0X1' CHAR
vertical tabulation VT + '0BX' CHAR
new line NL + '0AX' CHAR
end of message EOM + '08X' CHAR
Teletype Control Characters
Carriage return CR + ''0DX' CHAR
shift out SO + '0EX' CHAR
shift in SI + '0FX' CHAR
BS +
Device Control Characters
DC1
DC2
DC3
DC4
Table 2.3.1
2. 文字の部分集合
Numeric characters ' 1 '
{ 2 }
NUM + { . } CHAR
{ . }
{ 9 }
' '
Printable characters { NUM
{ ALPH
PRCHAR + { ≡
{
Intermediate characters ' characters '
{ in column } CHAR
ITCHAR + { 2 }
' '
Final Characters
FIN CHAR + CHAR ⊖ ITCHAR
Transmission Control
Characters* ' NUL '
{ . }
TRACHAR + { . } CHAR
{ DEL }
Derra Control Characters Teletype control character
DCCHAR + ' DC1 ' CHAR TYCCHAR { CR
{ DC2 } { SO
{ DC3 } { SI
{ DC4 } { BS
' ' {
Alphabetic characters ' A '
{ . } CHAR
ALPH + { . }
{ Z }
' '
Printer Control
Characters { HT
{ VT
PCCHAR + { NL } CHAR
{ EOM }
{
Table 2.3.1: Special ASCII characters and groups of ASCII
characters.
*see USACII standards
2.5.2 図形ビード
J. RulifsonがRFC #5で提案したとおり、あらゆるグラフィカルディスプレイの画面は正方形とみなし、点の座標は両軸とも-1/2から+1/2に正規化される。構造の最初の点の位置は、ビームの静止点である原点からの偏向によって決まる。後続の点は、直前のビーム位置からの偏向(AX,AY)によって決まる。
したがって、定義が必要なデータフィールドは2つだけである。
-
DEFLECTION: 12ビットのフィールド。偏向は、- 1から+1までの数でサーバにとって通常の精度で定義される。
-
ANGLE: 15ビットのフィールド。水平軸と原点を通る軸との間の角度を、0から2Πまでのラジアンで定義する。その最初のビットは、角度を時計回りにとるか反時計回りにとるかを示す。
データビードは次のとおりである。
MOVE
このビードが現れるときにセットされているパラメータに応じて、MOVEは次のいずれかを指定しうる。
-
ビームの不可視の移動。この場合、ビーム強度はゼロである
-
新しい点。この場合、ビームが新しい点に到達したときにのみビーム強度がオンになる。
-
ベクトル。この場合、ビーム強度はゼロでないある値にセットされる
MOVE + {DEFLECTION}2
円弧:ARC
円弧は、その中心、続いてその開始点、およびその終了軸の角度によって定義される。
ARC + {DEFLECTION}4 +ANGLE
2.6 提案するパラメータフィールド。
2.6.1 文字列。
文字列において、制御文字の一部は実際にはパラメータフィールドである。すなわち、後続の文字列に対する演算子として働く。例:
lower shift
upper shift
new line
escape
. . . .
しかし、これらの文字のコードと用法は標準コードの中で決められているため、パラメータの定義には含めない。これらの文字がASCIIまたはEBCDIC標準コードの左側の2列にあることを利用できる。これらは、EBCDICでは最初の3ビットがゼロのコード、ASCIIでは最初の2ビットがゼロのコードに相当する。
2.6.2 グラフィックスパラメータ
次のパラメータフィールドを定義する。
scale SCALE 4
beam intensity INT 4
light pen sensitivity SENS + SWITCH
blinking BLINK + SWITCH
beam BEAM + SWITCH
SWITCHは1ビットのフィールドであり、次の値をとりうる。
ON <-- '1' SWITCH
OFF <-- '0' SWITCH
スイッチパラメータは、OFFにリセットされない限りONのままである。
ビーム強度は0から1までの数で表される。0は黒、1はディスプレイが出せる限りの明るさである。その間の数は、強度差の相対的な対数を指定する。BEAMにより、現在のINTパラメータを変更することなくBEAMをオンまたはオフに切り替えられる。
2.7 構造
2.7.1 構造の定義。
構造の定義は、主としてデータビード間の位相的な関係を指定することから成る。
-
順序関係。ポインタフィールドは不要
-
いくつかのポインタによる結合。
2.7.2 標準構造型。
基本となる標準構造型を2つ選ぶ
- VECTOR: データビードの並び(文字列、配列、表…)を表す
- PLEX: あらゆる種類の有向グラフ、木、リング…)を表す
VECTOR (C;N1,...NC) <-- VECTORHDR + VECTORBODY
VECTORBODY <-- (=C+1:{defined bead})Ni + [VECTORBODY]
VECTORHDR <-- 'VECTOR' IDENTIFICATION + C + N1 + N2 + .... + NC
Cはベクトル内の部分(列)の数であり、各部分はNC個の要素を持つ。
また、圧縮ベクトルCOMPVECTORを定義することもおそらく有益である。圧縮ベクトルでは、同一要素の並びが、1つの要素+特別なビード+並びの中の同一要素の数として伝送される。
PLEX (M)
ポインタフィールドの最初のビットは、そのポインタが終端要素を指すかどうかを示す。終端要素を指す場合、前方 ポインタフィールドは追加されない 。
Mは構造内のデータ要素の数である。
2.8 オブジェクト
2.8.1 オブジェクトの定義。
オブジェクトは、右辺に次のものを含む意味規則によって定義される。
- オブジェクトを識別する名前
- オブジェクト定義のパラメータの集合。
- オペランド:データ要素として使われるビードの名前
左辺には次のものを含む。
- 演算子:パラメータフィールド
- データビードの構造。
例:SQUAREと呼ばれる新しいオブジェクトの定義は次のとおりである。
SQUARE <-
(A,L,AΘ) ROT(ANGLE) (VECTOR(1,4) (BEAM'OFF'+
MOVE (A) + BEAM 'ON' + MOVE (0,L) + MOVE (L,0) +
MOVE (0,2L) + MOVE (2L,0))
ここでROTはデータ操作言語で定義される変換を指し、VECTORは標準構造として定義されている。
- 新しい構造の識別子はSQUAREである
- 使われる構造型は、次元1、要素4個のVECTORである
- VECTORの要素は標準ビードMOVEである
- パラメータはA、L、A Θである
- パラメータフィールドBEAM 'OFF'とBEAM 'ON'が使われる。
2.8.2 英数字の標準オブジェクト。
圧縮文字列(COMSTRING)
COMSTRING <-- VECTOR (1) ({ [PCHAR]n + { HT+NUM
{ VT+NUM
{ ESC+CHAR
{ NL
{ EOP
} } )n EOP
圧縮文字列とは、任意個の印字可能文字から成る文字列の後に次のいずれかの文字が続いたものを、任意回繰り返したものである。
-
水平タブ。その後に、追加すべき空白の数が続く
-
垂直タブ。その後に、飛ばす行数が続く。
-
エスケープ。その後に任意の文字が続く
-
改行
-
改ページ
圧縮文字列はEOF文字で終わる。
コード表(CODE)
CODE <-- VECTOR (1;128) {CHAR}128
CODEは、あるプログラムについて想定される変換表の名前である。ユーザが定義する場合、ユーザは第1列から第8列に、対応するASCIIコードと等価な8ビットのパターンを与えなければならない。
バイナリカードイメージ
B CARD <-- VECTOR (1;120) {CHAR}120
パック10進数HNUM 4ビットのフィールド
' A X ' ' 0 H '
{ C X } { . }
DSIGN { E X } HNUM PNUM <-- { . } HNUM
{ F X } { . }
{ B X } { 9 H }
{ D X }
' '
1<n<31
PDNUM <-- {PNUM} + DSIGN
10進数(アンパックまたはゾーン)
1<n<31
DNUM <-- {NUM} + D SIGN+ PNUM