简单来说,当我使用它时,它是一种现代的动态语言,但当你使用它时,它仅仅是一种脚本语言!
脚本语言是一种“编写脚本”来完成任务的语言。主要的焦点并不是创建自己的应用程序,而是让现有的应用程序按照您想要的方式运行,例如使用JavaScript来控制浏览器,或者使用VBA来控制Microsoft Office。
"一个脚本是你给演员的东西。程序是你给观众的东西。" -- Larry Wall
我真的不认为现在有太大的区别了。所谓的“脚本”语言通常是编译的,只是非常快速,在运行时编译。一些“编程”语言也在运行时进一步编译(考虑JIT),而第一阶段的“编译”是语法检查和资源解析。
不要钻牛角尖,这真的不重要。
我的定义是:一种通常作为源代码而非二进制文件分发的语言。
这就像色情片一样,你看到它就知道它是什么。脚本语言的唯一可能定义是:
A language which is described as a scripting language.
有点循环,不是吗?(顺便说一下,我不是在开玩笑)。 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不是。
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.
因此,在经过五个段落后,我得出了结论:“脚本语言是用于脚本编写的语言”。这是一个很好的定义。开玩笑,不是。
很明显,我们现在需要看一下“脚本编写”的定义。
这就是第三个问题:虽然术语“函数式编程”是明确定义的,只是术语“函数式编程语言”存在问题,但不幸的是,对于脚本编写来说,两者术语“脚本编写”和“脚本语言”都没有明确定义。
首先,脚本编写就是编程。它只是一种特殊的编程方式。换句话说:每个脚本都是程序,但不是每个程序都是脚本;所有脚本的集合是所有程序集合的真子集。
在我个人看来,使脚本编写成为脚本编写并将其与其他编程方式区分开来的因素是 …
脚本主要操作
- 不是由脚本创建的对象,
- 具有与脚本无关的生命周期,且
- 存在于脚本范围之外。
此外,使用的数据类型和算法通常不是由脚本定义的,而是由外部环境定义的。
考虑一下shell脚本:shell脚本通常操作文件、目录和进程。你系统中的大多数文件、目录和进程可能都不是由当前运行的脚本创建的。并且当脚本退出时,它们并不会消失:它们的生命周期完全独立于脚本。而且它们也不是脚本的一部分,它们是系统的一部分。你没有通过编写File
和Directory
类来启动你的脚本,这些数据类型不是你关心的问题:你只是假设它们在那里,而且你甚至不知道(也不需要知道)它们是如何工作的。你也不实现自己的算法,例如,对于目录遍历,你只需使用find
而不是实现自己的广度优先搜索。
简而言之:脚本会附加到一个独立于脚本存在的较大系统上,操作系统的某个小部分,然后退出。
这个更大的系统可以是操作系统(在shell脚本的情况下),浏览器DOM(在浏览器脚本的情况下),游戏(例如使用Lua的《魔兽世界》或使用Linden Scripting Language的Second Life),应用程序(例如AutoCAD或Excel/Word/Office宏的AutoLisp语言),Web服务器,一组机器人或其他任何东西。
请注意,脚本编程方面与编程语言的所有其他方面是完全正交的:脚本语言可以是强类型或弱类型、严格类型或松散类型、静态类型或动态类型、名义上的、结构上的或鸭式的,甚至可以没有类型。它可以是命令式的或函数式的,面向对象的、过程化的或函数式的,严格的或惰性的。它的实现可以是解释的、编译的或混合的。
例如,Mondrian是一种具有编译实现的严格强类型惰性功能脚本语言。
然而,所有这些都无关紧要,因为在现实世界中,“脚本语言”这个术语的使用方式与上述内容毫不相干。它最常被用作一种侮辱,并且定义非常简单,甚至过于简单:
- 真正的编程语言:我的编程语言
- 脚本语言:你的编程语言
看起来这似乎是该术语最常用的方式。
perl my_source.pl
根据上述标准,PHP是一种脚本语言(即使在使用Zend Encoder“保护”源代码时可以进行“编译”过程)。PS.通常(但不总是),脚本语言是解释性的。同样,通常(但再次并非总是)脚本语言是动态类型的。其中一种分类是
动态解释语言在运行时解释,而编译语言在执行前进行编译。
需要补充的是,正如Jörg所指出的那样,解释/编译的区别不是语言的特性,而是执行引擎的特性。
您可能还会对这个与语言相关的类型系统的解释感兴趣,它更侧重于语言方面,而不是执行引擎。大多数脚本语言是动态类型的,而“普通”语言大多是静态类型的。
总的来说,静态类型语言与动态类型语言的区分更为明确,并且对语言的可用性有更多的影响。