4/ZPL
ZeroMQ 属性语言
- 状态:稳定
- 编辑:Pieter Hintjens ph@imatix.com
ZeroMQ 属性语言 (ZPL) 定义了一种极简的框架语言,用于指定属性集,表示为名称-值属性对的层次结构。
许可
版权所有 (c) 2010 iMatix Corporation 及贡献者
本规范是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;可以是许可证的第 3 版,或(根据您的选择)任何更高版本。
分发本规范是希望它会有用,但不提供任何担保;甚至不包括适销性或特定用途适用性的默示担保。有关更多详情,请参阅 GNU 通用公共许可证。
您应该已经随此程序收到了一份 GNU 通用公共许可证的副本;如果没有,请参阅 https://gnu.ac.cn/licenses。
变更流程
本规范是一个自由和开放的标准(参见“自由和开放标准的定义”),并受数字标准组织(Digital Standards Organization)的共识导向规范系统(Consensus-Oriented Specification System, COSS)管辖(参见“共识导向规范系统”)。
语言
本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释(参见“RFC 中用于表示要求级别的关键词”)。
目标
ZPL 设计用于表示一个属性集,其中每个属性都有一个名称和一个值。属性是分层的,即属性可以包含其他属性。其目标是
- 易于阅读和编辑,利用视觉线索来表示语义。
- 语法极简。
- 在任何编程语言中都易于解析。
- 可用作名称/值更新的连续流。
- 能够表示分层数据结构。
- 对数据类型保持中立。
- 将人为错误的风险降至最低。
ZPL 的用例包括
- 人工编辑的配置文件,其中可读性是关键。
- 流式数据交换。
- 流式日志记录。
规范
ZPL 是一种 ASCII 文本格式,使用空白字符——行尾和缩进——进行框架和分层。ZPL 数据由一系列编码为名称/值对的属性组成,每行一个,其中名称可以是结构化的,值是一个无类型的字符串。
实现应将以下任何序列视为行尾:换行符 (%x0A)、回车符 (%x0D) 或回车符后跟换行符 (%x0A %x0D)。
以下是一个典型的 ZPL 文件示例
1. ZPL configuration file example
1. This format is designed to be trivial to write and parse
#
context
iothreads = 1
verbose = 1 # Ask for a trace
main
type = zmq_queue
frontend
option
hwm = 1000
swap = 25000000
subscribe = "#2"
bind = tcp://eth0:5555
backend
bind = tcp://eth0:5556
注意
- 空白字符仅在属性名称之前和值内部具有意义。
- 以“#”开头的文本被视为注释并被丢弃。
- 每个非空行定义一个属性,包含一个名称和一个可选的值。
- 值是无类型的字符串,应用程序可以按照其希望的任何方式解释它们。
- 整个值可以用单引号或双引号括起来,引号本身不构成值的一部分。
- 在带引号的字符串中,除结束引号外的任何可打印字符都是有效的。
- 以引号开头但未以匹配引号结尾的值被视为不带引号的。
- 在带引号的字符串中,没有机制用于转义引号或其他字符。
- ZPL 中唯一的特殊字符是:空白字符、“#”、“=”以及单引号和双引号。
- 层次结构通过缩进表示,子级比其父级多缩进 4 个空格。
- ZPL 文件中的第一个非空白字符始终是“#”或字母数字字符。
- 值后面的空白字符被丢弃,除非它们在有效的引号内。
名称 SHALL 符合此语法
name = *name-char
name-char = ALPHA | DIGIT | "$" | "-" | "_" | "@" | "." | "&" | "+" | "/"
理由与设计
ZPL 之所以存在,是因为替代方案不足
- XML 无法作为流读写。
- JSON 无法作为流读写,并且由于项目列表之间的分隔符而编辑起来很笨拙。
- YAML 解析起来相对复杂。
- UNIX 风格的配置语法不支持名称层次结构。
使用有意义的空白字符可能存在争议。其目的是使其比花括号等语法元素更容易手动创建和验证。它消除了对分隔符的需求。固定的 4 个字符缩进旨在避免将来自不同来源的 ZPL 文件片段混合在一起时产生混淆和错误。
缺乏类型意识和其他语义验证是故意的。ZPL 并非意在成为一种形式语法,而是一种易于解析的名称/值对框架。它在框架数据方面模仿了 0MQ,但不试图检查或验证这些数据。