Answers:
让我尝试找到这三种语言之间的界线。当然,会有很多例外和反例,因为这只是我的观点。
一种标记语言,用于控制演示文稿的数据,像“表示这些用户名作为一个符号列表或表格”。
脚本语言用于在程序之间进行中介以生成数据。对于bash之类的shell脚本语言来说尤其如此,但是如果您对此进行反思,那么Python或Perl就是需要在UNIX中完成任务而无需编写用C编写的程序。是语言本身的解释器,可以为您完成常规任务。与您交互的其他典型程序是数据库服务器或Web服务器。
回到用户列表隐喻,以脚本语言查询数据库“给我所有用户名”,然后询问Web服务器“将该用户列表发送给此请求者”。
一种编程语言用于转换数据。通过创建将输入数据重写为输出的CPU指令来实现。希望是期望的输出。转换数据的示例是从多个加数中计算总和,或者从一组条件中解微分方程组,或者在给定一系列可能同时进行查询的情况下,以一致的方式写入和读取树状结构。
回到用户列表隐喻,用一种编程语言编写如何遍历记录表,从每个记录中提取“名称”字段,然后将它们全部返回给请求者。
请注意,脚本语言是编程语言的子集,即语言既可以是“脚本”也可以是“编程”:Python通常用于“程序之间的中介”以及“转换数据”。诸如Java之类的其他语言很少被用来“在程序之间进行调解”,这不是因为这是不可能的,而是因为它们并非旨在使这一点变得容易。脚本语言的主要特征是它可以编排其他程序,就像脚本可以为演员提供线索以开始他的角色一样。
标记语言是用于表示结构化数据的语言。例如,与纯文本文档相比,HTML可以指定文档的某些部分为标题,而其他部分为列表。
标记语言不被视为编程语言¹。
编程语言的区别并不总是显而易见的。例如,XSLT是一种图灵完备的语言²,但是基于XML(一种标记语言)。
Wikipedia本身做出了重要的努力,以避免将XSLT限定为编程语言或标记语言。它只是说这是一种声明性语言,并且使用了“在函数式编程语言和数据库查询语言中发现的优化技术”。
脚本语言是一种解释而不是编译的编程语言,这意味着脚本语言代表所有编程语言的子集。
编程语言是否是脚本语言并不总是很明显,就像是编译语言还是解释语言并不总是很明显。例如,可以将PHP 编译为中间字节码3,然后由JIT编译器将其翻译为机器代码,同时仍被视为脚本语言。
另请参阅:史蒂文·洛特(Steven Lott)的《分裂元头发》。
¹“ XML不是编程语言”。请参见XML的10分。
²“ XSLT是图灵完备的语言”,请参阅Wikipedia上的XSLT
“ HHVM将Hack和PHP编译为中间字节码。然后,该字节码在运行时由即时(JIT)编译器动态转换为x64机器代码。”请参阅HHVM。
⁴ 脚本语言在名单上维基百科通过编程语言类的。
TypeError
!每种语言都可以由解释器实现,每种语言都可以由编译器实现。
要产生任何种类的分类法,您首先需要问自己一些问题:
通常,当您听到一个与您提出的问题类似的问题时,预期的答案会做出几种假设。例如,自然可以假定,由于所有这些都是语言,因此它们必须在更通用的语言概念下形成层次结构,或者它们划分所有语言的空间,或者它们是彼此的子集。
不幸的是,以上似乎都不是正确的。也许只有编程语言具有最一致的定义。编程语言是对程序进行编码的语言。编码意味着该语言中的单词可以解释为程序(一系列动作)。计算机编程语言是这些语言的子集。非计算机编程语言的示例:杂货店清单,被解释为超市中买家的指示,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
...
底线:到今天为止,这种划分似乎并不十分有意义,它只能使您对所面对的语言有一定的直觉,但不能为您提供严格的定义。
这三个概念在某种程度上是重叠的,因此无论XSLT是一种编程语言还是Python是否是一种脚本语言,您都可以无休止地争论。
一个标记语言,是一种代表语言的文本格式的结构化数据,HTML是最知名的,但也有多种格式用于各种目的,如SVG图形,WSDL描述为种源文件中的Web服务接口,RESX。网等。一条经验法则是,标记语言不会描述过程或算法(就像编程语言一样),而是纯数据。但是,这也是一个基本的CS见解,有是代码和数据之间没有根本区别。某些标记语言(如XSLT)具有循环和条件(如“真实”编程语言),而某些编程语言(如Prolog)几乎是纯数据,而代码中未指定过程。Lisp使得行模糊不清,以至于将其自身的代码视为结构化数据格式。
至于编程语言和脚本语言之间的区别,这是历史上的区别,今天几乎已经过时了。在过去,我们编译了用C语言编写的独立程序,然后使用了诸如Shell脚本或Word Basic之类的脚本语言,这些脚本语言经过解释和设计为可以操纵其他程序和工具。如今,由于我们具有各种级别的编译和解释(字节码编译,JIT编译等)以及各种独立于语言的API,因此该行已变得很模糊,具有许多中间立场。因此,区别不是那么有用。
标记语言用于描述数据而不是逻辑。它们的典型用法是描述文档格式,例如为此目的设计了HTML。但是它们有时也用作通用数据格式,XML是一种标记语言,通常用于仅描述数据。
编程语言和脚本语言之间的区别非常模糊,两者都趋于完整,因为您可以使用它们解决任何可计算的问题。您可以寻找一些通用的“提示”,以查看某种语言是否为编程语言。
但是最后,如果语言是脚本语言或编程语言,则更多的是约定俗成的问题,而不是任何严格的标准。即使上面的提示只是趋势,您也会找到满足脚本语言所有条件的编程语言,但仍然被认为是编程语言。
TypeError
!每种语言都可以由解释器实现,每种语言都可以由编译器实现。甚至可以从解释器自动生成编译器,反之亦然。