何时一个编程语言被认为是脚本语言?

107

其他问题的重复? - Sietse
2
有很多相似之处。不一定完全相同,但有很多共享的上下文/观点。 - Kent Fredric
这是重复的问题http://stackoverflow.com/questions/100905/programming-vs-scripting-whats-your-definition - Peter Hilton
7
如果一种语言在每个小版本发布时都会破坏API并更改其语法,如果它是100多个脏乱不堪且未维护的C库的包装器,那么它就是一种脚本语言。 ;) - ivan_ivanovich_ivanoff
1
在“相关”侧边栏中,您会发现https://dev59.com/C3I_5IYBdhLWcg3wHvY5,我链接了一堆当时存在的重复问题,这些问题可以追溯到https://dev59.com/yHVD5IYBdhLWcg3wE3No。 - dmckee --- ex-moderator kitten
显示剩余5条评论
40个回答

92

简单来说,当我使用它时,它是一种现代的动态语言,但当你使用它时,它仅仅是一种脚本语言!


19
好的,"它不是一个'玩具语言',而是一种'高级语言'" :P - Roberto Bonvallet
6
那种态度傲慢且离题,-1。 - adf88
1
即使使用 -(1+1),它的速度也比打勾的快大约2倍+1。 :D - anatoly techtonik
最好的。回答。永远! - iconoclast

52

脚本语言是一种“编写脚本”来完成任务的语言。主要的焦点并不是创建自己的应用程序,而是让现有的应用程序按照您想要的方式运行,例如使用JavaScript来控制浏览器,或者使用VBA来控制Microsoft Office。


那么像Python这样的语言呢?很难说它的重点在哪里,但可以说它更注重自己的应用程序,尽管它经常被称为“脚本语言”。也许是因为参考CPython实现的隐藏编译成字节码不会引发关于“类型安全”的编译错误?也许Oded的答案有这些... - n611x007
字节码和类型系统实际上与此无关。按照上述定义,如果一个应用程序向Python公开API,则称其使用Python作为其脚本语言。如果您完全使用Python构建应用程序,则该应用程序将其作为编程语言使用。 - bug
“Scripting”不是语言类型的定义,而是一种语言可以具有的特征。所以,Python是一种“好的脚本语言”,因为它使编写脚本代码变得容易。汇编语言不是一种好的脚本语言,因为它很难进行脚本编写。C语言处于中间位置,因为虽然它有一个(system)关键字来调用,但在到达那里之前还需要大量琐碎的操作。 - nomen

41
传统上,当谈到脚本语言和编程语言的区别时,脚本语言是解释执行的,而编程语言是编译执行的。一种语言可以以不同的方式执行 - 解释执行或编译执行(到字节码或机器码)。这并不使得一种语言成为脚本语言或编程语言。在某些人看来,你如何使用一种语言将其称为脚本语言(例如,主要使用C++开发游戏的游戏开发人员将用Lua“编写”对象)。再次强调,界限不清晰 - 一种语言可以被一个人用于编程,同样的语言也可以被另一个人用作脚本语言。
这是来自wikipedia有关脚本语言的文章:
脚本语言、扩展语言或附加语言是一种编程语言,它允许控制一个或多个软件应用程序。 "脚本"与应用程序的核心代码不同,因为它们通常用不同的语言编写,并且通常由最终用户创建或至少修改。脚本通常从源代码或字节码中解释执行,而它们控制的应用程序则传统上被编译为本机机器码。脚本语言几乎总是嵌入在它们控制的应用程序中。
你会注意到使用了“通常”,“经常”,“传统上”和“几乎总是”这些词 - 这些都告诉你,没有一组明显的属性使得特定语言成为“脚本语言”。

1
@Ram Bhat - 这很令人困惑,因为这种区分是人为的。 - Oded
11
所有现代的JavaScript实现都是编译的。而且还有C语言的解释器。 - Jörg W Mittag
1
@Andrey 那不是取决于软件吗?我的意思是我遇到过C语言解释器!按照那个定义,这意味着C既是一种脚本语言,也是一种“正常”的编程语言!! - Laz
27
这完全是错的。实际上,它甚至不算是错误,只是根本没有意义。编译语言或解释语言这样的说法并不存在。语言本身没有被编译,语言只是“存在”的。它是一系列抽象的数学规则。解释和编译是执行引擎的特性,而不是语言本身的特性。事实上,每一种语言都可以使用编译器或解释器来实现。事实上,在此页面中被称为“解释”的所有语言,几乎都有编译器实现,例如JavaScript、PHP、Python和Ruby。 - Jörg W Mittag
5
@Andrey:Chakra (IE9),TraceMonkey/JägerMonkey (Firefox),Nitro (Safari),Carakan (Opera) 都会将 JavaScript 编译成字节码,然后有些字节码会被解释,有些则编译成本地代码。V8(Chrome)跳过了字节码,直接将 JavaScript 编译成本地代码。IronJS 将 JavaScript 编译成 CIL 字节码。Rhino 将 JavaScript 编译成 JVML 字节码。BESEN (目前唯一的 ECMAScript 5 引擎)将 JavaScript 编译成 BESEN 字节码,并正在添加本地编译器。以上引擎还会将正则表达式编译为本地机器码。 - Jörg W Mittag
显示剩余10条评论

31

"一个脚本是你给演员的东西。程序是你给观众的东西。" -- Larry Wall

我真的不认为现在有太大的区别了。所谓的“脚本”语言通常是编译的,只是非常快速,在运行时编译。一些“编程”语言也在运行时进一步编译(考虑JIT),而第一阶段的“编译”是语法检查和资源解析。

不要钻牛角尖,这真的不重要。


嗯...我并不困扰,但大多数面试官和老师都会。而且我从来没有听到过这些人给我一个令人满意的答案! - Laz
1
如果你在面试中给出了其他答案,作为面试官,我会认为你对问题没有把握。这个区别确实很模糊,没有明确的答案。如果你说“嗯,传统上……”,我会接受,但我也希望你能讨论一下运行时编译和JIT编译等方面的内容。 - Clinton Pierce

25

我的定义是:一种通常作为源代码而非二进制文件分发的语言。


5
你认为PHP、Python等是脚本语言吗? - Sietse
“Scripting” 是 Python 和 PHP 的常见描述。 - S.Lott
22
PHP和Python - 当然它们是脚本语言! - Antony Carthy
这就是我的定义,从一开始就是这样的。 - user34537
@Antony Carthy 这是错误的。Python通常不是一种脚本语言,但它可以像任何其他语言一样在程序中使用(例如Word(VB),浏览器(JS))。 - Joschua

16

这就像色情片一样,你看到它就知道它是什么。脚本语言的唯一可能定义是:

A language which is described as a scripting language.
有点循环,不是吗?(顺便说一下,我不是在开玩笑)。
基本上,除了被创建者这么称呼,没有什么具体的东西能让一门语言成为脚本语言。现代脚本语言的主要集合包括PHP、Perl、JavaScript、Python、Ruby和Lua。Tcl是第一个重要的现代脚本语言(虽然它不是第一种脚本语言,但我忘记了它之前的是什么,我很惊讶地发现它比Tcl还要早)。
我在我的论文中描述了主要脚本语言的特征:
 A Practical Solution for Scripting Language Compilers
 Paul Biggar, Edsko de Vries and David Gregg
 SAC '09: ACM Symposium on Applied Computing (2009), (March 2009)

大多数脚本语言都是动态类型和解释型的,在其参考实现之外没有定义的语义。然而,即使它们的主要实现变为编译或JIT编译,这也不会改变语言的“本质”。

唯一剩下的问题是如何确定一个新语言是否是脚本语言。如果它被称为脚本语言,那么它就是脚本语言。因此,Factor是一种脚本语言(至少在撰写本文时是),但是Java不是。


1
这是一个非常好的解释,但我相信有些人会点赞它,因为他们看到了“色情”这个词。 - HoKy22
论文链接已经失效。 - Quazi Irfan

16
  • supports the programming style associated with that language type (e.g., object-oriented or functional), and

  • provides a set of built-in functions and libraries that make it easier to perform tasks typically associated with that language type.

  • Using this definition, a language like Python is commonly considered a scripting language because it supports quick and easy scripting tasks through its built-in libraries and functions, while also allowing for the use of object-oriented or functional programming styles if desired. On the other hand, a language like C++ is not typically considered a scripting language, as although it supports object-oriented programming, it may not have the same level of built-in libraries and functions that make scripting tasks quicker and easier to accomplish.

  • 简化脚本编写(面向对象编程/函数式编程),即不仅允许而且使其变得容易易懂并包含有助于它的功能,AND
  • 鼓励指导您进行脚本编写(面向对象编程/函数式编程)。
  • 因此,在经过五个段落后,我得出了结论:“脚本语言是用于脚本编写的语言”。这是一个很好的定义。开玩笑,不是。

    很明显,我们现在需要看一下“脚本编写”的定义。

    这就是第三个问题:虽然术语“函数式编程”是明确定义的,只是术语“函数式编程语言”存在问题,但不幸的是,对于脚本编写来说,两者术语“脚本编写”和“脚本语言”都没有明确定义。

    首先,脚本编写就是编程。它只是一种特殊的编程方式。换句话说:每个脚本都是程序,但不是每个程序都是脚本;所有脚本的集合是所有程序集合的真子集。

    在我个人看来,使脚本编写成为脚本编写并将其与其他编程方式区分开来的因素是 …

    脚本主要操作

    • 不是由脚本创建的对象,
    • 具有与脚本无关的生命周期,且
    • 存在于脚本范围之外。

    此外,使用的数据类型和算法通常不是由脚本定义的,而是由外部环境定义的。

    考虑一下shell脚本:shell脚本通常操作文件、目录和进程。你系统中的大多数文件、目录和进程可能都不是由当前运行的脚本创建的。并且当脚本退出时,它们并不会消失:它们的生命周期完全独立于脚本。而且它们也不是脚本的一部分,它们是系统的一部分。你没有通过编写FileDirectory类来启动你的脚本,这些数据类型不是你关心的问题:你只是假设它们在那里,而且你甚至不知道(也不需要知道)它们是如何工作的。你也不实现自己的算法,例如,对于目录遍历,你只需使用find而不是实现自己的广度优先搜索。

    简而言之:脚本会附加到一个独立于脚本存在的较大系统上,操作系统的某个小部分,然后退出。

    这个更大的系统可以是操作系统(在shell脚本的情况下),浏览器DOM(在浏览器脚本的情况下),游戏(例如使用Lua的《魔兽世界》或使用Linden Scripting Language的Second Life),应用程序(例如AutoCAD或Excel/Word/Office宏的AutoLisp语言),Web服务器,一组机器人或其他任何东西。

    请注意,脚本编程方面与编程语言的所有其他方面是完全正交的:脚本语言可以是强类型或弱类型、严格类型或松散类型、静态类型或动态类型、名义上的、结构上的或鸭式的,甚至可以没有类型。它可以是命令式的或函数式的,面向对象的、过程化的或函数式的,严格的或惰性的。它的实现可以是解释的、编译的或混合的。

    例如,Mondrian是一种具有编译实现的严格强类型惰性功能脚本语言。

    然而,所有这些都无关紧要,因为在现实世界中,“脚本语言”这个术语的使用方式与上述内容毫不相干。它最常被用作一种侮辱,并且定义非常简单,甚至过于简单:

    • 真正的编程语言:我的编程语言
    • 脚本语言:你的编程语言

    看起来这似乎是该术语最常用的方式。


    这个答案有些愚蠢。当一种语言面向对象编程时,它是“面向对象”的。如果一种语言具有一级函数,则它是“函数式”的。这并不意味着一种语言不能同时具备两者。这些是语言的特征,而不是类型的定义。脚本编写也类似。如果一种语言使编写脚本变得容易——即用户应用程序交互的简短、简单代码,那么它就是“良好的脚本语言”。 - nomen

    5
    所有的脚本语言都是编程语言。所以严格来说,它们之间没有区别。
    这个术语并不指代语言的任何基本属性,而是指代语言的典型用途。如果典型用途是编写主要调用预先存在的代码和对结果进行简单处理的短程序(也就是说,如果典型用途是编写脚本),那么它就是一种脚本语言。

    5
    "脚本语言"是一个模糊的概念,可以有多种含义。通常它指的是存在一步过程,可以将源代码转换为执行。例如,在Perl中,您可以这样做:perl my_source.pl根据上述标准,PHP是一种脚本语言(即使在使用Zend Encoder“保护”源代码时可以进行“编译”过程)。PS.通常(但不总是),脚本语言是解释性的。同样,通常(但再次并非总是)脚本语言是动态类型的。

    Perl 在运行之前会编译成字节码。 - Brad Gilbert
    2
    Java怎么样?你需要一个JVM来运行Java程序,但我不会称它为脚本语言。 - Eineki

    4

    其中一种分类是

    • 脚本语言 = 动态解释
    • 普通语言 = 编译

    动态解释语言在运行时解释,而编译语言在执行前进行编译。

    需要补充的是,正如Jörg所指出的那样,解释/编译的区别不是语言的特性,而是执行引擎的特性。

    您可能还会对这个与语言相关的类型系统的解释感兴趣,它更侧重于语言方面,而不是执行引擎。大多数脚本语言是动态类型的,而“普通”语言大多是静态类型的。

    总的来说,静态类型语言与动态类型语言的区分更为明确,并且对语言的可用性有更多的影响。


    Objective-C怎么样? - mouviciel
    1
    它支持动态类型,但我不会称其为脚本语言。 - Timo Westkämper
    2
    这就是纯属错误。实际上,它甚至不是错误,它根本就毫无意义。不存在编译或解释语言这种东西。一种语言不能被编译,一种语言只是存在。它是一堆抽象的数学规则。解释和编译是执行引擎的特征,而不是语言。每一种语言都可以通过编译器或解释器实现。事实上,这个页面上所有被称为“解释”的语言,几乎都有编译实现,例如JavaScript、PHP、Python、Ruby。 - Jörg W Mittag
    @jorg-w-mittag,请随意编辑我的答案,使其更加正确。你的观点是正确的。通常情况下,如果你谈论一种编程语言,也会谈论默认的执行引擎。 - Timo Westkämper

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接