脚本语言和普通编程语言有什么区别?


20

编程语言和脚本语言有什么区别?例如,考虑C与Perl。

脚本语言仅需要解释器而不需要编译和链接是唯一的区别吗?


4
恐怕这不在这里了。您想知道的完全是语言实现问题。它似乎也吸引了浅浅的意见(不是您自己的错),这始终是一个危险信号。
拉斐尔

硬件是编译语言的“解释器”。这样,唯一的区别就是您要经过多少位口译员。如果机器图灵当量,你使用的是图灵相当于一种语言,你可以写一个编译解释A的语言,然后写一个解释器B在解释该语言A可以执行,那么翻译C的语言解释器B可以执行本质上,这全都是间接问题,它与计算的理论基础无关,而与实际工程问题有关。
Patrick87

薪水(DevOps之前)
Phil Lello,2016年

Answers:


21

我认为差异与语言的预期用途有很大关系。

例如,像Prolog一样,Python是经过解释的,不需要编译和链接。我将这两类都归为编程语言。

编程语言用于编写软件。它们旨在管理大型项目。他们可能可以调用程序,读取文件等,但是可能不如脚本语言那么出色。

脚本语言并不适用于大规模软件开发。它们的语法,功能,库等更多地集中在快速完成小型任务上。这意味着它们有时比编程语言更“骇俗”,并且可能不具有所有相同的出色功能。它们旨在使通常执行的任务(例如遍历一堆文件或执行sysadmin任务)自动化。

例如,Bash不能很好地执行算法,这可能会使在其中编写大型软件成为一场噩梦。

作为一种基准:即使可能,我也不会用perl编写音乐播放器。同样,我绝不会尝试使用C ++重命名给定文件夹中的所有文件。

这条线变得越来越模糊。从定义上讲,JavaScript是一种“脚本”语言,越来越多地用于开发在软件领域中更多的“ Web应用程序”。同样,Python最初适合脚本语言的许多特性,但现在看到越来越多的软件使用Python作为主要平台开发。


1
实际示例为+1:我无法想象被迫使用C ++执行批处理重命名任务!
Casey Kuball 2012年

3
您没有陈述任何概念上的差异,只是陈述了有关各个用例的流行观点。
拉斐尔

3
您还会以脚本语言(PHP中的FB)“不编写”世界上最大的社交网络吗?这是最早推动整个趋势的博客服务之一(在Perl中是LJ),该版本控制系统可以轻松地使成千上万的开发人员一起工作(Mercurial在Python中)?抱歉,但是此“脚本仅用于小任务”只是流行的时髦词汇。
Oleg V. Volkov

1
@Raphael我认为概念上的差异充其量是模糊的。主要区别在于IMO的流行用法。这些语言大多数都将是图灵完整的,并遵循类似的计算模型。我从未遇到过正式的区分或定义,但是如果您有答案,请随时编辑我的答案。
jmite 2012年

3
@Raphael这就是重点:没有概念上的差异。您在编译时和运行时所能做的主要是解释还是编译,这是实现的属性,而不是语言的属性(尽管语言设计会给特定的实现模型带来困难)。
吉尔斯(Gilles)'“ SO-别再作恶了”

6

关于脚本语言的经典文章是John K. Ousterhout的《脚本:21世纪的高级编程》,发表于1998年计算机31(3)。他一方面区分了脚本语言,另一方面对系统编程语言进行了区分。另一个。

Ousterhout将系统编程语言描述为已进化为取代用于编程的机器语言。它们隐藏了诸如寄存器分配和子例程调用序列之类的繁琐细节,提供了用于编写循环和其他常见控制流习惯用法的简单构造,并强制执行键入规则。它们通常由(提前)编译器实现。这些语言旨在从头开始编写软件。示例是C,C ++和Java。

相反,根据Ousterhout的说法,脚本语言的前提是已经存在有用的程序,通常使用系统编程语言编写。诸如Perl,Python,Tcl,Visual Basic和Unix Shell之类的脚本语言提供了将这些现有程序组合成新程序的工具。Ousterhout将脚本语言描述为“无类型”(包括许多人称为动态类型),并强调了快速发展。它们通常由口译员实施。

现在,必须注意不要假设单个作者的概念模型具有权威性。尽管我们计算机科学家喜欢假装我们是对所有术语都给出精确定义的数学家,但实际上,大多数计算术语是在社会上构建的,具有模糊和异构的含义;对于大多数术语,高层都有一个粗略的共识,但是细节通常取决于谁在写。因此,把他的文章,我的答案以及所有其他答案都放在这里。

当您在问题中用语表达时,我个人会质疑“正常”编程语言的存在。但是,我认为您要传达的概念大致对应于Ousterhout的系统编程语言。


2

所有脚本语言也是编程语言。反之则不正确。“仅需要解释器”的语言解释语言(与编译语言相反,请注意,某些语言,例如Java,都属于这两种类别)。

被归类为脚本语言的语言意味着它可用作“胶水”语言。脚本往往不是功能齐全的程序,而是填补了其他软件之间的空白。

脚本通常用于将多个程序连接在一起,以非常快速/轻松地执行特殊任务,甚至在性能和安全性问题已被抽象为较低级语言的嵌入式环境中也是如此。脚本语言的重点往往是减少开发时间,因此,大多数原因都是解释性很高的。


您没有陈述任何概念上的差异,只是陈述了有关各个用例的流行观点。
拉斐尔

1

设置“脚本语言”是设置“编程语言”的子集。C和Perl之间的区别是系统编程语言和应用程序语言之间以及解释语言和编译语言之间的区别。

系统编程语言是低级的,面向内存管理,可预测的IO等。应用程序语言旨在快速解决更高级别的问题,例如“从文件读取设置,打开套接字并根据设置处理请求”。

因此,应用程序语言往往比系统语言更高级,即提供大量的内置抽象和帮助程序功能,并经常添加某种形式的自动内存管理。

在执行程序之前,已编译语言的程序已完全处理为某些代码。脚本语言是在执行过程中动态翻译的,通常包括用于动态代码生成的工具,并包括带有源代码的文件。

因此,所有脚本语言都是应用程序语言,但事实并非相反。系统语言始终是编译语言,因为脚本语言通常包含一些功能,这些功能就语言本身而言并不实用。但是请注意,脚本(解释)/编译的区别更多地是关于实现的:对于某些语言,两种类型的实现可能都存在,就像haskell一样。


我认为绘制这种解释/编译的二分法是一个谬论。我也认为这不是子集关系,尽管这些集合肯定有一些非空的交集。同样,高级和低级也无法准确地描述区别。Prolog的水平很高,但不是bash或Java脚本的脚本语言。
jmite 2012年

1

其他人则涵盖了往往与脚本语言和非脚本语言相关联的属性。这有助于了解人们使用“脚本语言”一词的含义,但我觉得更重要的是要了解没有明确定义的界限:两个有知识的人可能会不同意某一种特定的语言X是否是一种语言。脚本语言。但是,“脚本语言”一词具有实用性,因为人们对边界之外或之外的语言达成了广泛共识。

比较“家用车”与“跑车”,或“杂志”与“报纸”。我敢说,要想出一个100%可靠的规则来区分每辆家用汽车和每辆可概括的跑车(这意味着它基本上不等于列举每个类别中的所有现有汽车)并且至少具有潜在的目标(表示所有人都可以接受)。但是这些术语在实践中仍然有用,因为尽管有些情况很难决定,但许多汽车显然属于一种类别,而没有另一种类别。


0

我尚未看到的差异是,按预期使用时,大多数脚本的执行时间将由“宏观”操作控制,微观操作的性能不会对整体执行时间产生重大影响。例如,如果光线跟踪动画程序可能包含带有“渲染图像”语句的脚本语言,则生成240帧动画的脚本可能会在“渲染图像”语句中花费4个小时,而总共需要花费四秒钟其他一切。即使将渲染引擎之外的所有内容加速一百万倍,与将渲染引擎加速0.1%相比,对整体性能的影响也较小。

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.