2. 数据定义子语言
2.1 字段
与网络机器的所有通信都使用位串完成:这些位串也称为消息,由接收方 HOST 进行解析,以便在 其内存 中以其自身的内存形式和代码重建数据结构。
位被组合成有意义的字段:字段是具有确定内容的一组位。它可以包含:
- 一个数据元素(数据字段)
- 某种指定环境参数的位模式
- 一个指针
- 其他某些字段的标识。
描述珠格式的方法源自 RFC #31 中建议的二进制消息描述方法:
- 每个字段都用其名称和以位数计的长度来声明。
- 字段中常用的、对应某种特殊含义的固定值,可以赋予名称。
- 字段的合法拼接方式由规则确立;当某字段只允许取某些固定值时,这些值既可以用其数值指定,也可以用相应的名称指定。
2.2 数据珠
数据字段(类型 (a))拼接起来构成数据珠:珠是一种不可分割的原子数据单元,用作 在 HOST 与网络机器之间传输的任何数据结构的构建元素。珠是可被引用的最小数据单元。
用若干字段拼接构成珠的合法方式在构造规则中说明。珠具有固定长度和无歧义的结构。在实际机器中,珠通常定义为整数个相邻的寄存器。这一约束在此并不适用,不过也许偏向于例如采用 32 位字、每字 4 字节的 HOST 会更高效,这是 ARPA 网络上最常见的字结构。
数据珠可以看作该语言的操作数,而类型 (b) 和 (c) 的字段则是运算符。
2.3 控制字段
数据珠彼此链接的方式以及它们运行所处的环境,由附加的控制字段指定;控制字段不能被引用,它们是作用于其后珠串的运算符或其标识符,或者是各个珠之间的链接。
如果控制字段是在结构头部这一层指定的,那么它的作用范围也可以是结构中的所有珠或子结构。更确切地说,必须定义两类珠结构:同构结构和异构结构。
如果在结构头部为整个结构同时指定了唯一的珠类型和固定的参数环境,则该结构被定义为同构结构。
如果以下条件中至少有一个成立,则该结构被定义为异构结构。
-
构建该结构时使用了不同类型的珠
-
结构中的珠所处的环境在结构内部发生变化。
需要定义五个主要的控制字段。
- MODIFY
- FLAG
- POINTER
- IDENTIFICATION
- PARAMETER
2.3.1 MODIFY 字段
MODIFY 字段是位于异构结构中每个珠之前的一位字段:当其后跟随一个或多个类型为 b、d 或 e 的控制字段(旨在修改数据珠的环境或其类型)时,它是一个被置位的标志。该字段的取值为:
- 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 字段
每个珠所附指针的数量和性质取决于结构定义。给定的链表结构可能需要一个前向指针。环形结构可能再用一个指向第一个元素的指针。珠之间必要的链接在结构定义中定义,此后必要的指针字段会自动添加到每个数据珠上。在结构内部,珠通过相对于结构头部的地址来引用。因此,16 位的指针字段应完全足以容纳该地址。
2.3.4 IDENTIFICATION 字段
IDENTIFICATION 字段是一个 8 位字段,用于在已定义的珠类型列表中标识一种珠类型。标准珠类型从零开始向上编号,非标准珠类型从 255 开始向下编号。非标准类型的编号专属于每个服务器程序或一组服务器程序。只要珠类型未在结构根部对整个结构作出定义,IDENTIFICATION 字段就跟在取值为 1 的 MODIFY 字段之后。标识字段也用在结构头部这一层,用于指定该结构中所使用的相同元素(珠或结构)的类型。
2.3.5 PARAMETER 字段
PARAMETER 字段给出其后数据珠串所处的环境参数列表。PARAMETER 字段特定于某种珠类型;在不存在歧义时(或后续数据珠的类型无歧义时),它直接跟在 MODIFY 字段之后。
示例:标准珠 BEAMVT 的参数字段将包含以下字段。
- 一个 2 位字段,指示所产生的移动类型
00 do not display move the beam
01 display final point point
10 display vector vector
11 unused
-
一个 4 位字段,用 0 到 15 的数字表示光束强度,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
一个字符由一个八位字段(与之同名)构成。定义了许多与当前使用的特殊字符相对应的特殊模式;它们与 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 的数表示与标准表示不同,则视所传输的数据而定,有两种选择:
-
数值数据以标准代码中的十进制数形式交换
-
向网络机器定义定点和浮点格式,由用户 HOST 执行
-
要么从服务器二进制表示到十进制表示的直接转码,反之亦然。
要么从服务器二进制表示到其自身二进制表示的转码,反之亦然。
由于所交换的数大多要以十进制打印,或以十进制形式输入,因此我们认为,当相应 HOST 的二进制表示互不兼容时,以十进制表示进行交换是最简单的。
因此定义了:
-
十进制表示的数,它不是珠,而是字符串(见 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) 决定。
因此,只需定义两个数据字段:
-
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 标准代码最左两列这一点:它们对应于 EBCDIC 中前三位为零、ASCII 中前两位为零的代码。
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
开关参数一旦为 ON,只要未被复位为 OFF,就一直保持 ON。
光束强度用 0 到 1 之间的数表示。0 为黑色,1 为显示器所能达到的最亮程度。介于两者之间的数指定强度差的相对对数。BEAM 允许在不改变当前 INT 参数的情况下打开或关闭光束。
2.7 结构
2.7.1 结构定义
结构定义主要在于规定数据珠之间的拓扑关系:
-
顺序关系;不需要指针字段
-
通过若干指针建立的链接。
2.7.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
- 所用的结构类型是 VECTOR,维数为 1,含 4 个元素
- 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
压缩十进制数 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
十进制数(非压缩或区位)
1<n<31
DNUM <-- {NUM} + D SIGN+ PNUM