如果 YAML 不是标记语言,它是啥?
Posted
技术标签:
【中文标题】如果 YAML 不是标记语言,它是啥?【英文标题】:If YAML ain't markup language, what is it?如果 YAML 不是标记语言,它是什么? 【发布时间】:2011-10-21 13:17:54 【问题描述】:我看不出是什么让 YAML 不如 XML 成为一种标记语言。标记语言的目的是定义文档的结构,而 YAML 正是这样做的(YAML 代表 YAML 不是标记语言)。
YAML 应该代表的是,另一种标记语言。
【问题讨论】:
【参考方案1】:我看不出是什么让 YAML 不像 XML 那样成为一种标记语言。
使用 YAML 代替 XML 有几个优点。首先,它更具人类可读性。与 XML 数据结构不同,我们必须定义并给出每个数据元素的标记名称。开发人员会觉得 XML 代码很笨重,用户很难理解 XML 文档。实际上,XML 是用于机器对机器的通信,而不是用于用户与机器的通信。由于 YAML 是人类可读的,因此您可以将其视为用户读取/更改数据源并使用它与计算机程序进行通信。
这是一个示例,显示它们的结构有何不同。
XML Examples:
<busNo>101
<busStop>ABC
<busFee>5.4</busFee>
</busStop>
<busStop>CUHK
<busFee>5.4</busFee>
</busStop>
<busStop>HKU
<busFee>5.4</busFee>
</busStop>
<busStop>XYZ
<busFee>5.4</busFee>
</busStop>
</busNo>
YAML Examples:
--- #bus no
101 : [ABC:5.4, HKU:5.4, CUHK:5.4, XYZ:5.4]
使用 YAML 的最佳示例是用于程序的配置文件。当然,您可以将自己的配置文件格式解析为 XML 并将其传递到您的程序中。但是,您可以改用 YAML。此外,您可以进行更快的开发,尤其是在 Web 开发方面。 YAML 是用 Python、Perl、Ruby.etc 等脚本语言设计的。 YAML 旨在轻松翻译成上述各种语言通用的结构。
总而言之,YAML 是为人类阅读而设计的,它不像 XML 那样成为一种标记语言。
【讨论】:
问题是关于为什么 YAML 代表 YAML Ain't Markup Language。这并没有真正回答它。 @EdoDodo:他在问“我看不出是什么让 YAML 不像 XML 那样成为一种标记语言。”我正在解释。 您所做的是比较了 XML 和 YAML 的语法,说 XML 需要标签并且很烦人,并且 YAML 需要两个空格缩进并且更容易输入。这种语言格式的比较并不能解释差异。这就像比较 php 和 Ruby 的语法,然后说没有$
变量和 ;
结束语句使它们不是编程语言。你还没有回答这个问题。更易于阅读的标记不会使一种语言比另一种语言更少或更多markup
。
您的 YAML 示例绝对符合大多数人使用 YAML 的约定。但是,它与您在上面给出的 XML 完全没有可比性。而不是将 101 的值设置为公交车站的数组......您可以将 101 的值设置为一个对象,其中属性“busStops”是公交车站的数组。类似地,每个停靠点都可以是具有属性名称(“XYZ”)和属性 busFee(“5.4”)的对象。 YAML 可以很好地表示相同的结构,但您的示例有它表示不同的结构,程序必须做出更多假设。【参考方案2】:
这是来自a page about YAML的引述:
我想读者心中的第一个问题必须是,“为什么 YAML 这个名字?”有许多工具被可爱地采用了 “YA*”形式的首字母缩略词,意思是“又一个 XXX”。在怀里 开源智慧的竞赛,YAML 避开了其隐含的首字母缩略词,而是 解决递归的“YAML 不是标记语言”。有一个 然而,对此有一定的意义:YAML 做了标记语言所做的事情, 但不需要任何标记。
之所以选择这个名称,是因为与其他传统语言(如 XML)相比,它需要的标记要少得多。它将其区分为更面向数据而不是面向标记。
【讨论】:
为什么 YAML 需要更少的标记;如果它确实需要更少的标记,那不是让它成为一种标记语言吗?【参考方案3】:XML 从 html 和 SGML 继承了其名称中的“ML”部分,它们是“标记”语言,因为它们描述的是纯文本流以及 标记 指令,例如“this一段文字应该是粗体”或“这段文字是一个标题”。也就是说,文本的那些特定部分被标记为粗体或标题。
后来,有些人开始编写仅由标签和属性组成的 XML,没有用于标记这些标签的纯文本。 (关于这是否是对 XML 的适当使用,意见和风格有所不同)。当以这种方式使用时,XML 成为一种用于记录树状结构数据的语言。
YAML 不是“一种”标记语言,因为它的数据模型只包含树形结构,没有树形结构适用的底层线性文本的概念。那里没有什么可以标记的——或者换句话说,由 YAML 流表示的数据不是标记。相比之下,由 XML 标记 表示的数据 是 标记,或者至少根据某些观点应该是这样的。 (在这两种情况下,所述数据的表示都包含一些标记,例如 YAML 中的冒号和缩进或 XML 中的“=”和引号,但这不是重点)。
【讨论】:
“后来,有些人开始编写仅由标签和属性组成的 XML,没有用于标记的纯文本。”那么这是否意味着<books><book title="The Shining" author="Stephen King"></book></books>
不是标记语言,而<books><book><title>The Shining</title><author>Stephen King</author></book></books>
是,因为实际上是在标记文本?
语言 本身就是这样,无论您碰巧如何使用它。在您的第一个示例中,您没有使用它作为标记语言,并不是说这在道德上有什么不好的。这是我在将事物序列化为 XML 时自己使用的风格,尽管有很多人会告诉你这就是 Doing It Rong。在我的书中,不要把东西写成带标记的文本,因为这不是它们实际上的样子。毕竟,底层的纯文本“The ShiningStephen King”本身并没有多大意义。【参考方案4】:
因此,标记语言假定基本文本,通常是人类可读的,然后是指导处理的特殊指示符或“标记”。这个想法来自一位编辑,他将某人手稿的印刷版“标记”以显示新行的位置、编辑等。
这样,SGML 是一种用于声明标记语言的元语言,而 HTML 是一种标记语言。 1996-7 年,当 XML 出现时,它作为一种简化的 SGML 元语言被出售,用于创建标记语言。在 XML(和 SGML)中,您有用于“标记”部分文本的元素,然后是修改标记的属性。随着时间的推移,XML 的用途远不止文档标记,人们将它用于数据序列化——尽管它从来没有被设计用来做这样的事情。当然,这是要解决的大问题。
YAML 和 JSON 出现在现场,专注于 data 序列化,而不是文档标记。在这些语言中,根本没有核心文档文本。 因此,YAML Ain't Markup Language 与 XML 的区别非常准确。
【讨论】:
作为历史记录,YAML 起源于“SML”(“简单标记语言”)组。这个小组遇到的问题实际上并不是语法:而是 XML 使用的核心信息模型。 XML 信息模型(现在编码为 DOM)非常适合面向文本的网页。这对数据序列化来说是一个巨大的负担。在 SML-LIST 讨论中不断出现的主要问题是:“属性还是元素?”。对于数据序列化,答案是:两者都不是。这个问题本身是有缺陷的。因此,YAML 首先是用于序列化的数据模型,然后是语法。 但是……第一个字母真的可以由任何字母组成……为什么选择“Y”?【参考方案5】:这是真实的故事...... :)
Clark、Oren 和我于 2001 年 4 月开始研究 YAML。Oren 和 Clark 是 SML 邮件列表的成员,该列表试图使 XML 更简单。我刚刚为 Perl 编写了一种称为 Data::Denter 的数据序列化语言。 Clark 联系我告诉我他们称之为 YAML 的一个想法,它看起来类似于 Data::Denter 语法。 Clark 已经收购了 yaml.org。
在我们一起工作了几个月后,我指出 YAML(当时最明确地代表 Yet Another Markup Language)并不是真正的标记语言(标记一个文本文档)但是一种序列化语言(类型化/循环数据图的文本表示)。我们都喜欢 YAML 这个名字,所以我们将它回缩为 YAML Ain't Markup Language。
http://yaml.org/spec/ 开头为:
YAML™(与“骆驼”押韵)是一种人性化、跨语言、基于 Unicode 的数据序列化语言,围绕敏捷编程语言的常见原生数据结构而设计。
我自己说得再好不过了……:
【讨论】:
嗯,这是一个有趣的完整答案。 backronym 中有一个无限递归!它从不回答 Y 代表什么。它也可以称为 CAML - CAML Ain't Markup Language。以上是关于如果 YAML 不是标记语言,它是啥?的主要内容,如果未能解决你的问题,请参考以下文章