谁能解释一下脚本语言和编程语言之间的区别?
你也可以为每个人陈述一些例子。我用谷歌搜索了很多,但我总是从 Stack Overflow 中找到最好的答案。
14 回答
脚本语言是不需要显式编译步骤的编程语言。
例如,在正常情况下,您必须先编译一个 C 程序,然后才能运行它。但在正常情况下,您不必在运行 JavaScript 程序之前对其进行编译。所以 JavaScript 有时被称为“脚本”语言。
这条线越来越模糊,因为现代硬件和现代编译技术的编译速度如此之快。例如,谷歌浏览器中的 JavaScript 引擎 V8 在浏览器之外也使用了很多,它实际上将 JavaScript 代码即时编译成机器代码,而不是解释它。(事实上,V8 是一个优化的两阶段编译器。)
另请注意,一种语言是否是“脚本”语言可能更多地与环境有关,而不是语言。您没有理由不能编写 C 解释器并将其用作脚本语言(人们已经这样做了)。您也没有理由不能将 JavaScript 编译为机器代码并将其存储在可执行文件中(人们已经这样做了)。Ruby 语言就是一个很好的例子:最初的实现是完全解释的(一种“脚本”语言),但现在有多个编译器。
“脚本”语言的一些示例(例如,传统上使用的没有显式编译步骤的语言):
- 卢阿
- JavaScript
- VBScript 和 VBA
- Perl
还有一小部分传统上与显式编译步骤一起使用的代码:
- C
- C++
- D
- Java (但请注意,Java 被编译为字节码,然后在运行时被解释和/或重新编译)
- 帕斯卡
...然后你在两个阵营中都有像 Python 这样的东西:Python 在没有编译步骤的情况下被广泛使用,但主要实现 (CPython) 通过即时编译为字节码然后在VM,它可以将该字节码写入文件(.pyc
, .pyo
)以供使用而无需重新编译。
这只是极少数,如果你做一些研究,你会发现更多。
要了解脚本语言和编程语言之间的区别,必须了解脚本语言诞生的原因。
最初,有一些编程语言是用来构建诸如 excel、word、浏览器、游戏等程序的。这些程序是用 c 和 java 等语言构建的。随着时间的推移,这些程序需要一种方法让用户创建新功能,因此他们必须为其字节码提供接口,因此脚本语言诞生了。
脚本语言通常不会编译,因此只要您编写有意义的内容就可以运行。因此,excel 可以使用 C++ 构建,但它公开了一种称为 VBA 的脚本语言,供用户定义功能。类似地,浏览器可以使用 C++/Java 构建,但它们公开了一种称为 javascript 的脚本语言(与 java 没有任何关系)。游戏通常使用 C++ 构建,但公开了一种称为 Lua 的语言,供用户定义自定义功能。
脚本语言通常位于某种编程语言之后。脚本语言通常较少访问计算机的本机功能,因为它们运行在原始编程语言的子集上。这里的一个例子是 Javascript 将无法访问您的文件系统。脚本语言通常比编程语言慢。
尽管脚本语言可能访问较少且速度较慢,但它们可以是非常强大的工具。脚本语言成功的一个因素是易于更新。你还记得网络上 java 小程序的日子吗,这是运行编程语言 (java) 与运行脚本语言 (javascript) 的示例。当时,计算机还没有那么强大,javascript 也没有那么成熟,所以 Java 小程序占据了主导地位。但是 Java 小程序很烦人,它们需要用户加载和编译语言。快进到今天,Java 小程序几乎绝迹,Javascript 占据主导地位。由于已经安装了大多数浏览器组件,因此 JavaScript 的加载速度非常快。
最后,脚本语言也被认为是编程语言(尽管有些人拒绝接受这一点)——我们在这里应该使用的术语是脚本语言与编译语言。
所有脚本语言都是编程语言。
语言不被归类为脚本 - 它完全取决于执行环境。
如果环境是被解释的,这通常被称为脚本环境。
差异变得越来越不重要。传统上,脚本语言扩展现有程序......我认为“脚本”的主要定义是它指的是为现有实体编写一组指令来执行。然而,在脚本语言以专有和口语语法开始的地方,如今大多数流行的语言都与 C 有一定的关系。
我认为“解释与编译”的区别实际上是扩展现有程序(带有内置解释器)的症状,而不是内在差异。程序员和外行更关心的是,“程序员在做什么?” 一个程序被解释而另一个程序被编译这一事实在确定创建者的活动差异方面意义不大。你不会判断一个剧作家的剧本是更常被大声朗读还是在舞台上表演,对吗?
编程语言:编译为机器代码并在底层操作系统的硬件上运行。
脚本语言:是编程语言的非结构化子集。一般是这样解释的。它基本上是“脚本”做其他事情。主要关注点不是主要构建您自己的应用程序,而是让现有应用程序以您想要的方式运行,例如用于浏览器的 JavaScript、TCL 等,
*** 但是在某些情况下,编程语言被转换为解释器,反之亦然,比如使用 C 解释器,您可以在其中使用“C”脚本。脚本通常用于控制应用程序行为,而编程语言用于构建应用程序。但请注意,作为 Python 的示例,分界日趋模糊,这取决于人们如何使用该语言。
脚本语言是编程语言的一个子集。
- 用户不会将脚本语言编译成机器代码(python、perl、shell 等)。相反,另一个程序(称为解释器,运行该程序并模拟其行为)
- 一些不是脚本的编程语言(C、C++、Haskell 和其他“编译”语言)被编译为机器代码,然后运行。
我认为您所说的“差异”实际上是真正差异的结果。
实际差异是编写代码的目标。谁将运行此代码。
脚本语言用于编写以软件系统为目标的代码。它将使该软件系统上的操作自动化。该脚本将成为目标软件系统的一系列指令。
编程语言以计算系统为目标,可以是真实机器或虚拟机器。指令由机器执行。
当然,真机只能理解二进制代码,所以你需要编译一种编程语言的代码。但这是针对机器而不是程序的结果。
另一方面,脚本的目标软件系统可以编译或解释代码。取决于软件系统。
如果我们说真正的区别在于是否编译,那么我们就有一个问题,因为在 V8 中运行 Javascript 时是编译的,而在 Rhino 中运行时不是。
它变得更加混乱,因为脚本语言已经发展到非常强大。因此,它们不仅限于创建小脚本来自动化另一个软件系统上的操作,您可以使用它们创建任何丰富的应用程序。
Python 代码以解释器为目标,因此我们可以说它在该解释器上“编写”操作。但是,当您编写 Python 代码时,您不会将其视为编写解释器的脚本,而是将其视为创建应用程序。解释器只是在那里进行更高级别的编码。所以对我来说,Python 更像是一种编程语言而不是脚本语言。
回到世界还年轻的时候,在你从 .exe 或 .bat 中选择的 PC 世界中,描述很简单。Unix 系统一直都有 shell 脚本(/bin/sh、/bin/csh、/bin/ksh 等)和编译语言(C/C++/Fortran)。
为了区分角色和职责,编译语言(通常称为第三代语言)被视为“编程”语言,而“脚本”语言被视为调用解释器的语言(通常称为第四代语言)。脚本语言通常被用作连接多个命令/编译程序之间的“粘合剂”,这样用户就不必担心执行任务的一组步骤——他们开发了一个文件,描述了哪些步骤他们想要完成,这成为任何人都可以遵循的“脚本”。
不同的人/团体编写了新的解释器来解决特定的问题域。awk 是比较知名的一种,它主要用于模式匹配和对输入应用一系列数据转换。它运行良好,但问题范围有限。由于源代码不可用,该域的扩展几乎是不可能的。Perl(Larry Wall,主要作者/架构师)工具脚本更上一层楼 - 并开发了一个解释器,不仅允许用户运行系统命令、操作输入和输出数据、支持无类型变量,还可以访问 Unix 系统级 API作为脚本本身的函数。它可能是最早广泛使用的高级脚本语言之一。
您的问题专门针对 Python。因为 python 解释器针对包含 python 代码的文本文件运行,并且 python 代码可以在任何有 python 解释器的地方运行,所以我会说它是一种脚本语言(与 Perl 相同)。您不需要为每个不同的 OS/CPU 体系结构重新编译用户 python 命令文件(就像使用 C/C++/Fortran 一样),使其更易于移植和使用。
这个答案归功于 Jerrold (Jerry) Heyman。原帖:https ://www.researchgate.net/post/Is_Python_a_Programming_language_or_Scripting_Language
脚本语言
脚本语言在另一个程序中解释。JavaScript 嵌入在浏览器中并由该浏览器解释。
脚本语言示例
- JavaScript
- Perl
- Python
脚本语言的优点:
简单——脚本语言比编程语言更容易编写。
更少的代码行 (LOC)
编程语言
像 Java 这样的编程语言是由另一个应用程序以相同的方式编译而不是解释的。
示例编程语言
- C
- C++ 和
- 爪哇
更多细节
除了 Scripting language 是 Interpreted 和 Programming language 是 Compiled 的区别之外,还有一个区别如下,我猜这已经被忽略了。
脚本语言是一种编程语言,用于操作、定制和自动化现有系统的设施。在这样的系统中,有用的功能已经通过用户界面可用,并且脚本语言是一种用于将该功能暴露给程序控制的机制。
而编程语言通常用于从零开始对系统进行编码。
源代码ECMA
在脚本语言(如 JavaScript 和旧的 PHP 版本)中,我们使用现有的基本函数和方法来执行我们的工作。让我们举一个例子,JavaScript
我们可以使用ajax
或web-sockets
仅当浏览器支持它们或存在方法或浏览器中的方法。但是在 C 或 C++ 、Java 等语言中,我们可以从头开始编写该功能,即使该功能的任何库都不可用,但我们不能在 JavaScript 中这样做。
你能在 JavaScript 的帮助下支持 Internet Explorer 8 或更早版本中的 web-sockets 但是你可以用 C 或 C++ 或 Java 编写一个插件,这可能会在 Internet Explorer 8 中添加 web-socket 的功能。
基本上,在脚本语言中,我们按顺序编写代码,按顺序执行现有方法以完成我们的工作。在数字计算器中输入数字和公式进行运算也是脚本语言的一个很好的例子。我们应该注意,每种脚本语言的编译器/运行时环境总是用编程语言编写的,我们可以在其中添加更多功能和方法,并且可以编写新的库。
PHP 这是一种有点黑白编程和脚本的语言。我们可以通过添加用另一种高级语言编写的编译扩展来添加新方法。我们不能直接在 PHP 中添加高级网络功能或创建图像处理库。
PS我真的很抱歉只围绕PHP JavaScript回答我的问题,但我使用这两个是因为我在这两个方面有相当多的经验。
我不同意使用解释器的语言是脚本语言而编译的语言是编程语言这一事实。我们可以为任何语言开发解释器或编译器。解释型环境更适合 Web 脚本编写并使其更容易,这就是我们拥有它的原因。
好吧,我觉得脚本语言和编程语言之间没有任何区别。这一切都是为了完成工作。当涉及到与 Web 相关的任务时,考虑到小任务,我们将它们称为 Web 脚本,这样我们也可以将与系统相关的任务称为系统或操作系统级别的脚本,并将我们用来完成这些任务的编程语言称为系统脚本语言。
也不是不能用 Python 编写系统级代码,用 C 语言编写 Web 脚本(如果我们能建立所需的平台和环境,肯定可以做到)。但是它所需要的只是太多的努力,这可能会影响快速开发的时间限制,而减少一点延迟并不会让我们在 web 脚本中受益匪浅。但如果我们在 Python 中执行系统级任务,则反之亦然。
底线:语言选择取决于要执行的任务的性质,将语言区分为脚本语言是一个神话。
脚本语言是人们认为是脚本语言的编程语言。这是一个没有明确界限的人为类别,每个提议的规则都有例外。
用于说语言是脚本语言的经典规则是表征,而不是定义。如果一种语言满足许多规则,那么它很有可能被认为是一种脚本语言。如果不是,那么很有可能不是。规则通常包括:
- 它适用于小型“脚本”,而不是大型程序。
- 它嵌入在另一个应用程序中,用于对该应用程序进行小的修改。
- 它是解释的而不是编译的。
- 它适用于新手程序员,而不是专业人士。
- 它的名字以“脚本”结尾。
我要补充:
- 脚本语言是一种编程语言,几乎所有错误都在运行时被检测到。
也就是说,它可能是一种解释性语言。
如果一种编程语言具有重要的“编译时”行为,即在不运行程序的情况下分析代码并报告错误,例如来自 C、Java 或 C# 的类型错误,那么它很可能不被视为脚本语言。
传统上,许多脚本语言都是直接从源代码解释的,但其中更流行的已经获得了性能更高的实现,可以预编译代码,比如 Python 的.pyc
文件,或者优化在运行之前编译为本机代码的 JavaScript 引擎。
如果该语言可以由解释器实现,它只在运行源代码时查看源代码,那么它很可能被认为是一种脚本语言。是否真的以这种方式实现并不重要,但如果可以,那么它也不需要对代码进行大量的编译时错误检查。
如果该语言提供了有用的静态语义来帮助检测错误(除了语法错误)而无需运行程序,那么它可能不是脚本语言。
总是有例外,通常基于围绕语言的传统而不是任何实际规则。BASIC 通常不被认为是一种“脚本语言”,尽管它几乎满足了任何人曾经使用过的所有标准。这就是为什么 Visual Basic Script 必须在名称中添加“脚本”,以区别于 Visual Basic,这是一种用于大型程序的“真正”编程语言。
BASIC 也是一种古老的编程语言,就像 COBOL 和 Fortran 一样,在人们期望从一种语言进行静态分析之前,基本上在“脚本语言”甚至还没有出现之前。
如果我们从逻辑上看到编程语言和脚本语言,那么这是 99.09% 相同的。因为我们使用相同的概念,如循环、控制条件、变量等等,所以我们可以说是的,两者都是相同的,但它们之间只有一件事不同,那就是在 C/C++ 和其他编程语言中,我们在执行之前编译代码。但是在 PHP 、 JavaScript 等脚本语言中我们不需要编译直接在浏览器中执行。
谢谢 Nitish K. Jha