编程语言vs标记语言vs脚本语言


38

到目前为止,我还不知道这三个之间的主要区别。当有人问我这个问题时,我只告诉他们C#是一种编程语言,HTML和XML是标记语言,而JavaScript和VBScript是脚本语言。但是,它们之间的主要区别是什么?


不要忘记查询语言!
凯尔·德莱尼

Answers:


38

让我尝试找到这三种语言之间的界线。当然,会有很多例外和反例,因为这只是我的观点。

  • 一种标记语言,用于控制演示文稿的数据,像“表示这些用户名作为一个符号列表或表格”。

  • 脚本语言用于在程序之间进行中介以生成数据。对于bash之类的shell脚本语言来说尤其如此,但是如果您对此进行反思,那么Python或Perl就是需要在UNIX中完成任务而无需编写用C编写的程序。是语言本身的解释器,可以为您完成常规任务。与您交互的其他典型程序是数据库服务器或Web服务器。

    回到用户列表隐喻,以脚本语言查询数据库“给我所有用户名”,然后询问Web服务器“将该用户列表发送给此请求者”。

  • 一种编程语言用于转换数据。通过创建将输入数据重写为输出的CPU指令来实现。希望是期望的输出。转换数据的示例是从多个加数中计算总和,或者从一组条件中解微分方程组,或者在给定一系列可能同时进行查询的情况下,以一致的方式写入和读取树状结构。

    回到用户列表隐喻,用一种编程语言编写如何遍历记录表,从每个记录中提取“名称”字段,然后将它们全部返回给请求者。

请注意,脚本语言是编程语言的子集,即语言既可以是“脚本”也可以是“编程”:Python通常用于“程序之间的中介”以及“转换数据”。诸如Java之类的其他语言很少被用来“在程序之间进行调解”,这不是因为这是不可能的,而是因为它们并非旨在使这一点变得容易。脚本语言的主要特征是它可以编排其他程序,就像脚本可以为演员提供线索以开始他的角色一样。


7
脚本语言在形式上是编程语言的子类。(我还看到使用REPL可以完全解释C和Java之类的语言;这种障碍双向泄漏……)
Donal Fellows 2014年

1
@DonalFellows:你是对的。我的回答是这样,但是我没有明确使用“一个是另一个的子集”这个表达。另外,我没有暗示要解释一个类别,而不能解释另一个类别,因为我知道这是一个微弱的区分。
logc

1
@DonalFellows:我编辑了答案,以明确提及一个是另一个的子集。
logc 2014年

1
我支持这一答案,因为它是迄今为止(唯一)声称标记语言是描述数据结构的语言。
伊丹·阿里2014年

3
@JörgWMittag:我知道会有例外,这就是为什么我从“会有很多例外”开始:)否则,在我的答案中哪里暗示编译脚本语言?为了避免这种陷阱,我试图专注于语言的目的 ……
logc 2014年

11

标记语言是用于表示结构化数据的语言。例如,与纯文本文档相比,HTML可以指定文档的某些部分为标题,而其他部分为列表。

标记语言不被视为编程语言¹。

编程语言的区别并不总是显而易见的。例如,XSLT是一种图灵完备的语言²,但是基于XML(一种标记语言)。

Wikipedia本身做出了重要的努力,以避免将XSLT限定为编程语言或标记语言。它只是说这是一种声明性语言,并且使用了“在函数式编程语言和数据库查询语言中发现的优化技术”。

脚本语言是一种解释而不是编译的编程语言,这意味着脚本语言代表所有编程语言的子集。

编程语言是否是脚本语言并不总是很明显,就像是编译语言还是解释语言并不总是很明显。例如,可以将PHP 编译为中间字节码3,然后由JIT编译器将其翻译为机器代码,同时仍被视为脚本语言。

另请参阅:史蒂文·洛特(Steven Lott)的《分裂元头发》


¹“ XML不是编程语言”。请参见XML的10分

²“ XSLT是图灵完备的语言”,请参阅Wikipedia上的XSLT

“ HHVM将Hack和PHP编译为中间字节码。然后,该字节码在运行时由即时(JIT)编译器动态转换为x64机器代码。”请参阅HHVM

脚本语言在名单上维基百科通过编程语言类的。


16
语言永远不会被编译或解释。语言只是。编译和解释是用于实现该语言的编译器或解释器(duh!)的特征。术语“编译语言”或“解释语言”甚至没有意义,它们属于不同的抽象级别。如果英语是一种打字语言,则“编译语言”将是一种TypeError!每种语言都可以由解释器实现,每种语言都可以由编译器实现。
约尔格W¯¯米塔格

@JörgWMittag“每种语言都可以由解释器实现,每种语言都可以由编译器实现”-100%正确吗?
斯巴达克斯(Spartacus)2014年

@spartacus我称犹豫的“不”。我认为可以编译的任何语言都可以解释(只执行指令而不是保存指令),但是我听说同音性严重限制了编译的可能性
Izkata 2014年

@Izkata我不会说谐音本身会改变编译的可能性,但它的元编程允许将很多编译工作推迟到运行时(如果有的话)。
马克·赫德

1
正如“JörgW Mittag”已经指出的那样,“脚本语言”部分纯属错误。并且最上面没有“编程语言”的解释。
大卫·拉布

2

要产生任何种类的分类法,您首先需要问自己一些问题:

  • 我要放入正确定义的关系中的对象吗?
  • 如果是这样,它们实际上存在吗?
  • 我是将自己仅限于对象之间的一种特定类型的关系,还是对系统仅使用合法关系有一定的要求?

通常,当您听到一个与您提出的问题类似的问题时,预期的答案会做出几种假设。例如,自然可以假定,由于所有这些都是语言,因此它们必须在更通用的语言概念下形成层次结构,或者它们划分所有语言的空间,或者它们是彼此的子集。

编程语言

不幸的是,以上似乎都不是正确的。也许只有编程语言具有最一致的定义。编程语言是对程序进行编码的语言。编码意味着该语言中的单词可以解释为程序(一系列动作)。计算机编程语言是这些语言的子集。非计算机编程语言的示例:杂货店清单,被解释为超市中买家的指示,DNA通过转录肽进行解释,模拟音乐唱片充当录音机的程序。

因此,计算机编程语言就是对计算机进行编程的语言。

脚本语言

定义不明确。可以解释该术语的含义。从历史上看,似乎没有这种编译器来生成机器代码的编程语言就是这种方式。按照当今的标准,这将使每种流行的编程语言(无汇编程序)都归为此类。即使是像C这样的所谓的低级语言,也都需要具有预先存在的过程的运行时,因此通过编译C程序获得的二进制代码不完全是机器代码,而且还时不时地调用运行时。

标记语言

定义不明确。无论何时使用该术语,其意图似乎都是用非常有限的词典来描述一种编程语言,该词典主要用于生成视觉或音频图像。可能很难将XML看作是对某种程序进行编程,但是如果您查看Man或TexInfo标记,则会发现“特殊”字符实际上是解释器的指令。

也可以对XML语言进行“编程”解释,如下所示:

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

底线:到今天为止,这种划分似乎并不十分有意义,它只能使您对所面对的语言有一定的直觉,但不能为您提供严格的定义。


1

这三个概念在某种程度上是重叠的,因此无论XSLT是一种编程语言还是Python是否是一种脚本语言,您都可以无休止地争论。

一个标记语言,是一种代表语言的文本格式的结构化数据,HTML是最知名的,但也有多种格式用于各种目的,如SVG图形,WSDL描述为种源文件中的Web服务接口,RESX。网等。一条经验法则是,标记语言不会描述过程或算法(就像编程语言一样),而是纯数据。但是,这也是一个基本的CS见解,有代码和数据之间没有根本区别。某些标记语言(如XSLT)具有循环和条件(如“真实”编程语言),而某些编程语言(如Prolog)几乎是纯数据,而代码中未指定过程。Lisp使得行模糊不清,以至于将其自身的代码视为结构化数据格式。

至于编程语言脚本语言之间的区别,这是历史上的区别,今天几乎已经过时了。在过去,我们编译了用C语言编写的独立程序,然后使用了诸如Shell脚本或Word Basic之类的脚本语言,这些脚本语言经过解释和设计为可以操纵其他程序和工具。如今,由于我们具有各种级别的编译和解释(字节码编译,JIT编译等)以及各种独立于语言的API,因此该行已变得很模糊,具有许多中间立场。因此,区别不是那么有用。


0

标记语言用于描述数据而不是逻辑。它们的典型用法是描述文档格式,例如为此目的设计了HTML。但是它们有时也用作通用数据格式,XML是一种标记语言,通常用于仅描述数据。

编程语言和脚本语言之间的区别非常模糊,两者都趋于完整,因为您可以使用它们解决任何可计算的问题。您可以寻找一些通用的“提示”,以查看某种语言是否为编程语言。

  • 脚本语言通常被解释而不是被编译,或者至少提供了被解释的选项。
  • 脚本语言通常被构建为可以快速使用而不是快速运行。
  • 脚本语言往往带有非常广泛的标准库。许多编程语言也可以,但是对于他们来说是可选的。

但是最后,如果语言是脚本语言或编程语言,则更多的是约定俗成的问题,而不是任何严格的标准。即使上面的提示只是趋势,您也会找到满足脚本语言所有条件的编程语言,但仍然被认为是编程语言。


4
语言永远不会被编译或解释。语言只是。编译和解释是用于实现该语言的编译器或解释器(duh!)的特征。术语“编译语言”或“解释语言”甚至没有意义,它们属于不同的抽象级别。如果英语是一种打字语言,则“编译语言”将是一种TypeError!每种语言都可以由解释器实现,每种语言都可以由编译器实现。甚至可以从解释器自动生成编译器,反之亦然。
约尔格W¯¯米塔格

@JörgWMittag的确,没有语言是固有地编译或解释的。但是通常有关于如何执行的约定,这主要是我在这里指的是什么。
皮埃尔·安德森
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.