为什么XML确切地称为“语言”?


105

我一直想知道为什么XML的名称为L。

XML本身不执行任何操作。它只是一种数据存储格式,而不是一种语言!语言“做”事情。

使XML“完成”工作(将其转变为某种语言)的方法是xmlns在其根元素中添加属性。只有这样,它才能告诉环境它的含义。
一个示例是XHTML。它是活动的,具有链接,超文本,样式等,均由触发xmlns。否则,XHTML文件只是标记节点中的一堆数据。

那么为什么XML被称为语言呢?它什么也没描述,什么也没解释,只是。

编辑:也许我的问题应该更广泛。由于当前的答案是“因为XML是以SGML命名的,而XML是以GML的命名的,等等”,所以问题应该是,为什么标记语言(如XML)被称为语言?

哦,还有WRT的近票:不,我不是在问X。我是在问L!


128
您基于某种语言必须“做”某件事的要求?我在dictionary.com的任何定义中都没有看到这一点。
kdgregory 2016年

10
就像斯瓦希里语只有在双方都理解的情况下才能被理解。或者,如果读者理解该语言的这一部分,则可以理解医学期刊上的文章。没什么两样 人们组成了定义。
Sami Kuhmonen

42
标记语言是一个通用术语 en.wikipedia.org/wiki/Markup_language
狗仔队

37
@MrLister:“那些是人类语言,而不是计算机语言”语言是一种语言。在最极端的情况下,甚至英语也需要上下文信息(正在使用哪种方言)来明确理解。并不能阻止它成为一种语言。您的问题只是一个错误的前提。
Lightness Races in Orbit

68
don'rt语言的事情,他们表达沟通的东西
哈根·冯·艾特森

Answers:


238

真正的答案是XML的名称为L,因为一个叫Raymond L orie的人是1970年代IBM最早的“标记语言”的设计者之一。开发人员必须找到该语言的名称,因此他们选择GML,因为它是三个开发人员(Goldfarb,Mosher和Lorie)的缩写。然后,他们创建了反义词“ 通用标记语言”

后来它被标准化为SGML(标准化通用标记语言),并且在创建XML时,开发人员希望保留ML后缀以指示与SGML的家族关系,并且他们在前面添加了X,因为他们认为它看起来很酷。(即使实际上没有任何意义,XML是一种元语言,允许您定义可扩展的语言,但是XML本身并不是可扩展的。)

至于第二个问题,是否可以合法地将XML称为语言:

可以通过计算处理的任何结构化文本(甚至二进制)格式都可以称为语言。语言不会像这样“做”任何事情,但是某些软件可能会处理该语言的输入并根据语言来“做”某事。

您注意到XML是正确的“存储格式”,但是文本存储格式可以称为语言,这些术语不是互斥的。

编程语言是语言的子集。例如HTML和CSS是语言,但不是编程语言,而JavaScript是一种真正的编程语言。也就是说,也没有正式的编程语言定义,并且存在很大的灰色区域的语言,根据您的观点,可以将其称为数据格式或编程语言。

鉴于此,XML显然是一种语言。只是不是一种编程语言 -尽管它可以用于定义诸如XSLT之类的编程语言。

您关于名称空间的观点无关紧要。命名空间是XML的可选功能,并且不会更改XML词汇表的语义。如果格式可能包含多个词汇表,则只需消除其名称歧义即可。


编辑:reinierpost指出,您可能对这个问题的理解与我所理解的有所不同。也许您是说特定的词汇(例如XHTML,RSS,XSLT等)是语言,因为它们将元素和属性与特定的语义相关联,但是XML标准本身并未为特定的元素和属性定义任何语义,因此感觉不像是“真实语言”。

我对此的回答是,XML 确实定义了语法和语义,只是在不同的级别定义了它。例如,它定义了元素和属性的语法以及有关如何处理它们的规则。XML是一种“元语言”,它仍然是一种语言(就像元数据仍然是数据一样!)。例如,EBNF显然也是一种语言,但是其目的是定义其他语言的语法,因此它也是一种元语言。



19
@Snowman:“形式语言”不一定与计算中通常所说的语言相对应。例如,“形式语言”不需要是文本的-机器代码与大多数二进制格式和协议一样,是形式语言。因此,我不会说“形式语言”一词与计算中的“语言”具有相同的含义。
JacquesB '16

15
我不知道任何语言必须是文字还是非文字的要求。从终端构造句子的想法与这些终端中位的任意解释无关,也与哪种类型的计算机(基于硅或碳的计算机)能够读取它们无关。

4
@NicolBolas:好点,机器代码绝对是一种语言。我只是认为将二进制语言称为“格式”更为常见,例如,您说的是GIF格式而不是GIF语言。
JacquesB '16

3
@BenCottrell:那不是图吗,因为可能有循环?
JacquesB '16

181

因为它是一种语言。一个标记语言,而不是一种编程语言。

请注意,自然的人类语言(例如英语和西班牙语)也不会“做”任何事情。实际上,从技术上讲,C ++和Java之类的东西不会“做”任何事情,直到它们被馈送到编译器并执行输出。做事和成为一种语言在很大程度上彼此正交。


43
用“解释器”代替“编译器”。被提供给编译器也不会使它们“做任何事”,它只是将它们翻译成另一种语言,这又不会“做任何事”。所有执行都是解释。有时,解释器可能非常简单,并用硅实现,在这种情况下,我们称其为“执行单元”,但它仍然是解释器。</nitpick>无论如何,好的答案!
约尔格W¯¯米塔格

8
@JörgWMittag好点。由于我随机选择了通常会编译的语言,因此添加了“,然后执行输出”。
Ixrec '16

1
如果可以的话,是一种可扩展的标记语言。
doppelgreener

1
我认为人类语言会“做”事情。参见言语行为理论...

2
甜美,甜美的正交性。在不同的代数中执行该语言,就会出现一系列全新的动作。从理论上讲,无论如何。
Kenogu Labz '16

103

令Σ为非空的有限符号集,称为字母表。然后,∑ *是可数的无限个有限词集,可以通过将Σ中的零个或多个符号串联而形成。任何定义良好的子集大号 ⊆Σ*是一种语言

让我们将其应用于XML。它的字母是Unicode字符集U,它是非空且有限的。并非每个零个或多个Unicode字符的串联都是格式正确的XML文档,例如字符串

<tag> soup &; not <//good>

显然不是。构成格式正确的XML文档的XML子集U * 是可确定的(或“递归”)。存在的是作为输入的任何单词的机器(算法或计算机程序)瓦特ü *和一个有限的时间量,输出是1,如果后瓦特 ∈XML,否则为0。这样的算法是任何XML处理软件的子例程。并非所有语言都是可决定的。例如,在有限的时间内终止的有效C程序集不是(这称为暂停问题))。当设计一种新语言时,要做出的一个重要决定就是它应该尽可能强大,还是为了更好地确定性而更好地限制表达性。

一些语言可以通过来定义的语法,据说能够产生的语言。语法由

  • 一组有限的文字(也称为终端符号),
  • 一个不相交的有限的语法变量集(也称为非终结符),
  • 杰出的启动符号,来自所述组的变量取和
  • 有限的一组规则(所谓的生产),其允许某些种替换所组成。

任何仅由文字组成的单词都可以通过以起始符号开头然后应用给定的规则来派生,这些单词都属于语法产生的语言。

例如,以下语法(用非正式的表示法)使您可以精确得出十进制表示法中的整数。

  1. 语法的文字是数字123456789,和0
  2. 变量是符号小号d
  3. S是起始符号。
  4. 任何出现的变量S都可以替换
    • 与文字0
    • 0后跟变量D之外的任何文字。
  5. 任何出现的变量D都可以替换
    • 后面加上任何文字,然后是变量D的另一个实例或
    • 由空字符串组成。

这是我们的推导方法42

S-(应用规则4,第二个变体)→ 4 D-(应用规则5,第一个变体)→ 42 D-(应用规则5,第二个变体)→ 42

根据您在语法中允许的复杂规则,需要使用各种复杂的机器来证明给定的单词实际上可以由语法产生。上面给出的示例是一个常规语法,它是最简单,功能最弱的。下一类强大的语法称为上下文无关。这些语法也很容易验证。XML(除非我忽略了一些我不知道的晦涩功能)可以用上下文无关的语法来描述。语法的分类形成了语法(因此语言)的乔姆斯基层次结构。语法可以描述的每种语言至少是半确定的(或“递归枚举”)。即,存在一种机器,给定实际上属于该语言的单词,该机器得出证明它可以在有限时间内由语法产生的证明,并且永远不会输出错误的证明。这样的机器称为验证程序。请注意,如果输入的单词实际上不属于该语言,则该机器可能永远不会停止运行。显然,我们希望用功能较弱的语法来描述我们的编程语言,以便能够在有限的时间内拒绝无效程序。

Schemata是XML的补充,允许完善格式正确的文档集。遵循某种模式的格式正确的文档根据该模式称为有效。例如,字符串

<?xml version="1.0" encoding="utf-8" ?>
<root>all evil</root>

是格式正确的XML文档,但不是有效的XHTML文档。存在用于XHTMLSVGXSLT以及其他的模式。模式验证也可以通过一种算法来完成,该算法可确保在每个输入经过有限数量的步骤后停止运行。这样的程序称为验证器或验证解析器。图式由所谓的scema定义语言定义,这是一种正式定义语法的方式。XSD是XML的官方模式定义语言,它本身是基于XML的。RELAX NG是XSD的一种更优雅,更简单且功能稍逊的替代方案。

因为您可以定义自己的模式,所以XML被称为可扩展语言,它是“ XML”中“ X”的起源。

您可以定义一组规则,使XML文档可以解释为计算机程序的描述。前面提到的XSLT是使用XML构建的这种编程语言的示例。更一般而言,如果需要的话,可以将几乎所有编程语言的抽象语法树很自然地序列化为XML。


7
@乔治:在数学中,“定义明确”在很大程度上只是一个增强器:在数学上存在的所有事物都已经定义明确。
凯文

9
@乔治(Giorgio)“定义明确”是指有一个正式谓词可以告诉某项是否属于该集合。该谓词通常是不可计算的,但必须明确指定而没有矛盾。否则,可能会发生坏事。“成对的字符串(wM),其中M是输出w然后停顿的图灵机的最小描述”是一个定义明确但不可计算的谓词(请参阅Kolmogorov复杂度)。…
5gon12eder 2016年

2
@ 5gon12eder:该集合在ZFC下不存在(因为分离的公理模式不足以描述它)。如果您使用其他集合理论,则应指定它。
凯文

5
@ 5gon12eder:“包含该集合中未包含的所有字符串的集合”不存在。具有讽刺意味的是,术语“定义明确”不是定义明确的。
凯文

3
所述合式属性或验证由执行语法。如果您提到的话,这个答案是完美的。
Thibault D.

31

在计算机科学中,形式语言只是一组字符串,通常是无限的并且经常使用规则来描述(这些规则的两个常见版本是正则表达式形式语法)。

请注意,这意味着语言只需要语法,而语言不需要描述每个有效字符串的含义(称为语义)。

现在,这意味着编程语言是形式语言,也具有描述某些计算的语义。例如,XHTML是一种形式语言,其语义(大致和非正式地)描述了超文本文档的外观和行为。

尽管XML本身没有语义(但从XML派生的许多语言都有,例如XHTML和XAML),但XML仍然是一种语言。

从技术上讲,二进制格式也是语言,但是并不是那样称呼它们。术语“语言”保留给人类可读的格式。


10
@MrLister,因为它们不是人类可读的。当它们不是人类可读的时,我们倾向于将其称为格式数据格式
梅森惠勒

3
@JamesSnell当然,不要与其他ML语言家族混淆。是的,首字母缩写人满为患!
梅森惠勒

3
如果人们正在使用正式的工具为JFIF等构建解析器(或特别是验证器),那么工程师可能确实将其称为“语言”。虽然更有可能作为“语法”。
JDługosz

3
@MrLister:嗯,他们语言,但因为它们定义可重复使用的数据结构,他们有一个特殊的名字:格式。但是,是的,这些也是语言。
Lightness Races in Orbit

4
@MrLister:命名格式更多是营销问题。XML人士称XML为XML,是因为“ * ML”表示与先前格式(如GML和SGML)的家族关系,并且因为他们认为前面带有X看起来很酷。GML之所以称为GML,是因为它是一种通用的标记语言,还因为它是这三种语言设计者的缩写。因此,基本上,XML中的L是因为一个叫Raymond L orie的人是第一种标记语言的设计师。
JacquesB '16

12

语言是一种传达信息的方法。

编程语言是一种传达算法的方法。

诸如XML的标记语言是用于传达数据的语言。


...而这些数据很可能是算法的描述。
a安

@Luaan ...和一种编程语言也可能被滥用来传达数据。例如,与JSON类似。
菲利普

2
您甚至可以递归。我已经看到了包含C#代码的NAnt脚本(一种基于XML的语言),该脚本仅用于数据存储。使用包含XML的字符串文字。是的,这是使成年男子哭泣的那种东西:P
Luaan'Aug

2

XML是一种元语言。您可以使用它来定义特定的语言。语言从不做任何事情,它们只是允许我们表达事物。同样,XML不是一种“存储语言”也是不正确的。相反,实际上。您可以随意存储XML文档。最好将XML视为一种传输语言。PS。如果您不认为XML可以“做任何事情”,则必须说明许多系统(例如码头)将XML用作(不良)编程语言的情况。这是对XML的一种可悲的滥用,但是它无处不在,并且只是许多示例之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.