Skip to content

Latest commit

 

History

History
473 lines (355 loc) · 12.3 KB

redbin.adoc

File metadata and controls

473 lines (355 loc) · 12.3 KB

Redbin格式

规范版本 1

Redbin是一种二进制格式,可以准确表示存储在内存中的Red值,同时启用快速加载(避免文本表示格式的解析和验证阶段)。 Redbin格式很大程度上受到http://www.rebol.com/article/0044.html [REBin]的启发。 Redbin可以编码单词的绑定信息,并可以处理任何块中的any-block!值。

Redbin格式访问的用户界面将由“load / binary”和“mold / binary”提供。一个可用的底层实现_could_使用编解码器子系统。

实施约束:

  • 存储Redbin数据的基地址将被加载,需要64位对齐。

1. 编码格式

_默认_编码格式针对解码速度进行了优化,而_紧凑_格式需要较小的存储空间(以牺牲较慢的解码为代价)。

值以小端格式存储。

词汇约定:

  1. 括号中的数字表示字段的字节大小。

  2. 块中的字段名称后跟随的数据类型名称是该数据类型的值的占位符。

  3. 字段名称后跟等号具有固定值。

2. 头部

magic="REDBIN" (6), version=1 (1), flags (1), length (4), size (4)

flags (option is enabled if bit is set):
    bit0: compact mode
    bit1: compressed
    bit2: symbol table
    bit3-7: <reserved>

length : number of root records to load.
size   : size of records payload in bytes.

如果应用压缩,则头后面的数据是要压缩的有效载荷。 压缩算法选择依赖于实现。

3. 符号表

符号表立即跟随标题数据。 这是可选的,只有在Redbin有效载荷的其余部分中存在单词时才应使用它。 符号表有两个部分:

  • 每个符号的字符串表示的偏移表

  • 字符串缓冲区,NULL终止并且彼此并置

表中的符号的位置是其_索引_(从零开始),并且用作上下文和单词中的符号的引用。 字符串缓冲区部分包含UTF-8编码的字符串,其末尾可选填充,以确保64位对齐。 表中的偏移量是从字符串缓冲区开始到引用的字符串缓冲区的字节偏移量。

表编码:

默认: length (4), size (4), offset1 (4), offset2 (4),...
紧凑: TBD

`length`字段包含表中的条目数。`size`字段表示字符串缓冲区的大小(以字节为单位)(包括可选的尾部填充字节)。

在解码过程中,这些符号被合并在Red自己的符号表中,并且偏移量由Red表中的符号ID值替代。 也就是说,Redbin记录中的符号引用是对仅在加载过程中使用的Red的内部符号表条目的间接引用。

符号表后,Red值按顺序存储为记录,无特殊分隔符或结束标记。 来自根级别的加载值通常存储在block!序列。

4. 记录定义

每个记录以一个32位`header`字段开头,定义为:

  • bit31 : new-line flag

  • bit30 : no-values flag (for contexts)

  • bit29 : stack? flag (for contexts)

  • bit28 : self? flag (for contexts)

  • bit27 : set? flag (for words)

  • bit26-16 : <reserved>

  • bit15-8 : unit (used for encoding elements size in a series buffer)

  • bit7-0 : type

以下是每个单独记录的说明:

4.1. 对齐

默认:header (4)
紧凑:n/a

header/type=0

这个空类型槽用于正确对齐64位值。

4.2. Datatype!

Default: header (4), value (4)
Compact: TBD

header/type=1

4.3. Unset!

Default: header (4)
Compact: TBD

header/type=2

4.4. None!

Default: header (4)
Compact: TBD

header/type=3

4.5. Logic!

Default: header (4), value=0|1 (4)
Compact: TBD

header/type=4

4.6. Block!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=5

`head`字段指示块引用的偏移,使用基于零的整数。 `length`字段包含要存储在块中的值的数量。 块值只是遵循块定义,不需要分隔符或结束分隔符。

4.7. Paren!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=6

与block!相同的编码规则。

4.8. String!

Default: header (4), head (4), length (4), data (unit*length) [, padding (1-3)]
Compact: TBD

header/type=7
header/unit=1|2|4

`head`字段与块相同。 `unit`子字段指示字符串的编码格式,只有1,2和4的值有效。 `length`字段包含要存储在字符串中的代码点数,最多支持16777215个代码点(2 ^ 24 - 1)。 字符串以UCS-1,UCS-2或UCS-4格式编码。 不存在NUL字符,也不存在于`length`字段中。 可以使用1到3个NUL字节的可选尾填充,以将string!记录的末尾与32位边界对齐。

4.9. File!

Default: header (4), head (4), length (4), data (unit*length)
Compact: TBD

header/type=8
header/unit=1|2|4

与string!相同的编码规则!

4.10. Url!

Default: header (4), head (4), length (4), data (unit*length)
Compact: TBD

header/type=9

与string!相同的编码规则!

4.11. Char!

Default: header (4), value (4)
Compact: TBD

header/type=10

4.12. Integer!

Default: header (4), value (4)
Compact: TBD

header/type=11

4.13. Float!

Default: [padding=0 (4),] header (4), value (8)
Compact: TBD

header/type=12

添加可选的填充字段将“value”字段偏移正确对齐到64位值。

4.14. Context!

Default: header (4), length (4), symbol1 (4), symbol2 (4),..., value1 [any-type!], value2 [any-type!], ...
Compact: TBD

header/type=14
header/no-values=0|1
header/stack?=0|1
header/self?=0|1

上下文是一些数据类型在内部使用的Red值,如function !, object! 和衍生类型。 上下文包含两个连续的表,第一个是上下文中表示为符号引用的单词条目列表,第二个表是第一个表中每个符号的关联值。 `length`字段表示上下文中的条目数。 上下文记录只能存在于根级别,不能嵌套。 如果设置了“no-values”标志,则表示符号之后没有值(空的上下文)。 如果设置了“stack?”标志,那么这些值将分配给堆栈而不是堆内存。 “self?”标志用于表示上下文能够处理自引用字(对象中的“self”)。

4.15. Word!

Default: header (4), symbol (4), context (4), index (4)
Compact: TBD

header/type=15
header/set?=0|1

`context`字段是与引用`context`值的Redbin文件中的记录部分的开头的偏移量。 上下文需要位于Redbin记录列表中的单词记录之前。 如果`context`等于-1,则指全局上下文。

如果定义了`set?`字段,则该记录后面是[any-value!]记录,并且该解码器将需要将该字设置为该值(在正确的上下文中)。 当形成给定上下文的值序列太贵(主要用于全球范围内的名称/值对)时,这形成了一个key/value对,可以以adhoc方式对单词的值进行编码。

4.16. Set-word!

Default: header (4), symbol (4), context (4), index (4)
Compact: TBD

header/type=16

和word!相同。

4.17. Lit-word!

Default: header (4), symbol (4), context (4), index (4)
Compact: TBD

header/type=17

和word!相同。

4.18. Get-word!

Default: header (4), symbol (4), context (4), index (4)
Compact: TBD

header/type=18

和word!相同。

4.19. Refinement!

Default: header (4), symbol (4), context (4), index (4)
Compact: TBD

header/type=19

和word!相同。

4.20. Issue!

Default: header (4), symbol (4)
Compact: TBD

header/type=20

4.21. Native!

Default: header (4), ID (4), spec [block!]
Compact: TBD

header/type=21

`ID`是内部的`natives/table`跳转表的偏移量。

4.22. Action!

Default: header (4), ID (4), spec [block!]
Compact: TBD

header/type=22

`ID`是内部的`actions/table`跳转表的偏移量。

4.23. Op!

Default: header (4), symbol (4),
Compact: TBD

header/type=23

`symbol`表示作为_ op!_值的源的action,native或函数名(仅来自全局上下文)。

4.24. Function!

Default: header (4), context [context!], spec [block!], body [block!], args [block!], obj-ctx [context!]
Compact: TBD

header/type=24

4.25. Path!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=25

和block!同样的编码。

4.26. Lit-path!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=26

和block!同样的编码。

4.27. Set-path!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=27

和block!同样的编码。

4.28. Get-path!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=28

和block!同样的编码。

4.29. Bitset!

Default: header (4), length (4), bits (length)
Compact: TBD

header/type=30

`length`字段指示存储的位数,舍入到8的高位。这些位是bitset!序列缓冲区的内存转储。 字节顺序被保留。 `bits`字段需要用足够的NUL字节进行填充,以保持下一个记录32位对齐。

4.30. Point!

Default: header (4), x (4), y (4), z (4)
Compact: TBD

header/type=31

4.31. Object!

Default: header (4), context [reference!], class-id (4), on-set-idx (4), on-set-arity (4)
Compact: TBD

header/type=32

`on-set-idx`字段表示上下文值表中`on-change*`的偏移量。`on-set-arity`存储该功能的真实性。

4.32. Typeset!

Default: header (4), array1 (4), array2 (4), array3 (4)
Compact: TBD

header/type=33

4.33. Error!

Default: header (4), context [reference!]
Compact: TBD

header/type=34

4.34. Vector!

Default: header (4), head (4), length (4), values (unit*length)
Compact: TBD

header/type=35

`unit`表示向量元素类型大小的大小:1,2,4或8个字节。 `values`字段保存值列表。 `values`需要用NUL字节填充,以将下一个记录对齐到32位边界(如果`unit`等于1或2)。

4.35. Pair!

Default: header (4), x (4), y (4)
Compact: TBD

header/type=37

4.36. Percent!

Default: [padding=0 (4),] header (4), value (8)
Compact: TBD

header/type=38

百分比值存储为64位浮点数。 添加可选的填充字段将`value`字段偏移正确对齐到64位值。

4.37. Tuple!

Default: header (4), array1 (4), array2 (4), array3 (4)
Compact: TBD

header/type=39

4.38. Map!

Default: header (4), length (4), ...
Compact: TBD

header/type=40

`length`字段包含要存储在地图中的元素数(键+值)。 map元素简单地遵循长度定义,不需要分隔符或结尾分隔符。

4.39. Binary!

Default: header (4), head (4), length (4), ...
Compact: TBD

header/type=41

和block!同样的编码。

4.40. Time!

Default: [padding=0 (4),] header (4), value (8)
Compact: TBD

header/type=43

时间值存储为64位浮点数。 添加可选的填充字段将`value`字段偏移正确对齐到64位值。

4.41. Tag!

Default: header (4), head (4), length (4), data (unit*length)
Compact: TBD

header/type=44
header/unit=1|2|4

和string!同样的编码。

4.42. Email!

Default: header (4), head (4), length (4), data (unit*length)
Compact: TBD

header/type=45
header/unit=1|2|4

和string!同样的编码。

4.43. Date!

Default: header (4), date (4), time (8)
Compact: TBD

header/type=47

日期被打包成32位整数(与`red-date!`相同)。 时间值存储为64位浮点数。

4.44. Reference!

 Default: header (4), count (4), index1 (4), index2 (4), ...
 Compact: TBD

 header/type=255

这个特殊的记录类型存储对已经加载的类型any-block!或object!的值的引用。 这样可以在Redbin中存储周期。 引用是从路径创建到加载值(假定根值存储在块中)。 每个`index`字段指向要进入的系列或对象值,直到到达最后一个值,指向要引用的值。 `count`字段表示要通过的索引数。 如果其中一个索引必须应用于一个对象,它将引用相应的对象的字段(0 ⇒ 1个字段,1 ⇒ 2个字段,…​)。 所有索引都是基于零的。