Answers:
脚本语言是一种“脚本化”其他事情以完成工作的语言。主要重点不是主要构建自己的应用程序,而是使现有应用程序按您想要的方式运行,例如,用于浏览器的JavaScript,用于MS Office的VBA。
简单。当我使用它时,它是一种现代的动态语言,当您使用它时,它只是一种脚本语言!
传统上,当谈论脚本与编程的区别时,将解释脚本并编译程序。语言可以通过不同的方式执行-解释或编译(转换为字节码或机器码)。这不是一种语言一种或另成为可能。
在某些人眼中,您使用语言的方式使其成为脚本语言(例如,主要使用C ++开发的游戏开发人员将编写脚本使用Lua对象)。同样,线条也模糊了-一个人可以将一种语言用于编程,而另一人可以将同一种语言用于脚本语言。
这来自维基百科有关脚本语言的文章:
脚本语言,脚本语言或扩展语言是一种编程语言,可以控制一个或多个软件应用程序。“脚本”与应用程序的核心代码不同,因为它们通常以不同的语言编写,并且经常由最终用户创建或至少由其修改。脚本通常是从源代码或字节码解释的,而它们所控制的应用程序通常是编译为本机代码。脚本语言几乎总是嵌入在它们控制的应用程序中。
您会注意到“通常”,“经常”,“传统”和“几乎总是”的使用-所有这些都告诉您,没有一组使特定语言成为“脚本语言”的独特属性。
“剧本就是给演员的东西。节目就是给观众的东西。” -拉里·沃尔
我真的认为不再有太大的区别了。所谓的“脚本”语言通常会被编译-运行非常迅速。并且某些“编程”语言也将在运行时进行进一步编译(考虑到JIT),“编译”的第一阶段是语法检查和资源解析。
不要挂在上面,这实际上并不重要。
有很多可能的答案。
首先:脚本语言和编程语言之间的区别并不是真正的问题,因为脚本语言是一种编程语言。更多的问题是什么特征使某种编程语言成为一种脚本语言,而另一种则不是一种脚本语言。
其次:很难说XYZ语言是什么,无论XYZ是“脚本”,“功能编程”,“面向对象编程”还是您拥有什么。“功能编程”的定义非常清楚,但是没有人知道“功能编程语言”是什么。
函数式编程或面向对象的编程是编程风格。您几乎可以使用任何一种语言来编写功能样式或面向对象样式。例如,Linux的虚拟文件系统交换机和Linux的驱动程序模型是尽管C语言编写的大量面向对象的,而大量的Java或C#代码,你在网络上看到的是非常的程序,而不是面向对象的所有。OTOH,我已经看到了一些功能强大的Java代码。
因此,如果函数式编程和面向对象的编程仅仅是可以用任何语言完成的样式,那么如何定义“面向对象的编程语言”?您可以说一种面向对象的编程语言是一种允许进行面向对象的编程的语言。但这还不算什么定义:所有语言都允许面向对象的编程,因此所有语言都是面向对象的吗?因此,您说,如果一种语言强制您以面向对象的风格进行编程对象的。但这也不是什么定义:所有语言都允许进行功能编程,因此没有一种语言是面向对象的吗?
因此,对我来说,我找到了以下定义:
语言是一种脚本语言(面向对象的语言/功能性语言) 两者同时存在
- 便于脚本(面向对象的编程/功能编程),即它不仅允许,但使得它很容易和自然的和包含一些功能,帮助它,和
- 鼓励和引导您进行脚本编写(面向对象的编程/函数式编程)。
因此,在五个段落之后,我得出:“脚本语言是脚本语言。” 多么好的定义。不。
显然,我们现在需要查看“脚本”的定义。
这是第三个问题的出处:“功能编程”一词定义明确,只有“功能编程语言”一词有问题,不幸的是在脚本编写方面, 既术语“脚本”和术语“脚本语言”定义不明确。
好吧,首先脚本是编程。这只是一种特殊的编程。IOW:每个脚本都是一个程序,但不是每个程序都是一个脚本;所有脚本集是所有程序集的适当子集。
我个人认为,使脚本编制脚本与其他程序设计区别开来的是……
脚本在很大程度上操纵那些
- 不是由脚本创建的,
- 生命周期与脚本无关,并且
- 不在脚本域内。
同样,所使用的数据类型和算法通常不是由脚本定义的,而是由外部环境定义的。
考虑一下shell脚本:shell脚本通常操纵文件,目录和进程。系统上的大多数文件,目录和进程可能不是由当前运行的脚本创建的。它们在脚本退出时不会消失:它们的生存期完全独立于脚本。而且它们也不是脚本的真正部分,它们是系统的一部分。您不是通过编写脚本File
和Directory
类来启动脚本的,这些数据类型与您无关,您只是假设它们在那里,甚至都不知道(也不需要知道)它们如何工作。而且,您也没有实现自己的算法,例如,对于目录遍历,您只是使用它find
而不是实现自己的广度优先搜索。
简而言之:脚本将自身附加到一个独立于脚本而存在的较大系统,操纵系统的一小部分然后退出。
如果使用Shell脚本,则较大的系统可以是操作系统;如果使用浏览器脚本,则可以是浏览器DOM;游戏(例如,使用Lua的World of Warcraft或使用Linden Scripting Language的Second Life),应用程序(例如,AutoLisp) AutoCAD或Excel / Word / Office宏的语言),网络服务器,一堆机械手或其他所有内容。
请注意,脚本编写方面与编程语言的所有其他方面完全正交:脚本编写语言可以是强类型或弱类型,严格或松散类型,静态或动态类型,名义上,结构上或鸭式类型,甚至可以取消类型化。它可以是命令性的或功能性的,面向对象的,过程性的或功能性的,严格的或惰性的。它的实现可以被解释,编译或混合。
例如,Mondrian是具有编译实现的严格强静态类型的惰性函数脚本语言。
然而,所有这一切都是没有实际意义,因为这个词的方式脚本语言是真的在现实世界中,没有任何与上述任何一项。它最常被用作侮辱,其定义非常简单,甚至过于简单:
- 真正的编程语言:我的编程语言
- 脚本语言:您的编程语言
这似乎是该术语最常用的方式。
就像色情片一样,看到它就知道。脚本语言的唯一可能定义是:
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不是。
我认为Roberto Ierusalimschy先生在“在Lua中编程”中有一个很好的答案或问题:
但是,解释型语言的区别在于,它们不是未编译的,而是任何编译器都是语言运行时的一部分,因此可以(且容易)执行即时生成的代码
eval
功能。
一个师是
动态解释的语言在运行时被解释,而编译的语言在执行之前被编译。
我还要补充一点,正如Jörg所指出的那样,解释/编译的区别不是语言的功能,而是执行引擎的功能。
您可能也对Type系统的这种解释感兴趣,该解释是相关的,并且更多地侧重于语言方面,而不是执行引擎。大多数脚本语言是动态类型的,而“普通”语言大多数是静态类型的。
通常,可以更好地定义静态类型语言与动态类型语言的区分,并且对语言的可用性具有更大的影响。
脚本语言通常是:
虽然通常使用非脚本语言:1.静态类型2.编译,着重于性能3.需要更多样板代码,导致原型制作速度较慢,但可读性和长期可维护性较高4.用于大型项目,可适应多种情况设计模式
但它更是一个历史差异的今天,在我看来。写Javascript和Perl时要考虑小的简单脚本,而写C ++时要考虑复杂的应用程序。但是两者都可以使用。无论如何,无论是现代的还是古老的,许多编程语言仍然模糊了这条线(首先是模糊的!)。
可悲的是,我认识了一些开发人员,他们讨厌他们认为的“脚本语言”,认为它们更简单而不是功能强大。我认为陈词滥调-使用正确的工具完成工作。
脚本语言最初被认为是用硬编程语言编写的应用程序的控制机制。编译后的程序无法在运行时进行修改,因此脚本编写可以给人们带来灵活性。
最值得注意的是,shell脚本使OS内核中的进程自动化(传统上是Mac上的AppleScript)。这个角色越来越多地交到了Perl的手中,然后又逐渐移交给了Python。我已经看到Scheme(特别是在Guile实现中)用于声明光线跟踪场景;最近,Lua作为脚本游戏的编程语言非常流行,以至于在许多新游戏中,唯一的硬编码就是图形/物理引擎,而整个游戏逻辑都是用Lua编码的。同样,人们认为JavaScript可以编写Web浏览器行为的脚本。
语言解放了;现在,没有人将操作系统视为一个应用程序(或根本不考虑它),许多以前的脚本语言开始被用来编写自己的完整应用程序。该名称本身变得毫无意义,并传播到当今使用的许多解释语言,无论它们是否设计为从另一个系统内部进行解释。
但是,“脚本语言”绝对不是“解释语言”的同义词-例如,BASIC在其一生中都是被解释的(即,在失去其通用性并成为Visual Basic之前),但没有人真正认为它是脚本。
更新:像往常一样阅读Wikipedia上的资料。
首先,编程语言不是“脚本语言”或其他东西。它可以是“脚本语言”或其他。
第二点,该语言的实现者会告诉您它是否是脚本语言。
您的问题应该读为“在哪种实现中将编程语言视为脚本语言?”,而不是“脚本语言与编程语言之间有什么区别?”。两者之间没有。
但是,如果将一种语言用于提供某种类型的中间件,那么我会将其视为脚本语言。例如,我会将JavaScript的大多数实现视为脚本语言。如果JavaScript是在操作系统而不是浏览器中运行的,那么它将不是脚本语言。如果PHP在Apache内部运行,则它是一种脚本语言。如果从命令行运行,则不是。
我认为脚本语言是不需要任何明显的“编译”步骤的东西。从程序员的角度来看,主要功能是:您可以编辑代码并立即运行它。
因此,我将JavaScript和PHP视为脚本语言,而ActionScript 3 / Flex并非如此。
我认为,动态解释的语言(例如PHP,Ruby等)仍然是“普通”语言。我会说“脚本”语言的例子是bash(或ksh或tcsh或其他)或sqlplus之类的东西。这些语言通常用于将系统上的现有程序组合为一系列连贯且相关的命令,例如:
因此,我想说的是(无论如何对我而言)区别在于您如何使用该语言。诸如PHP,Perl,Ruby之类的语言可以用作“脚本语言”,但我通常会看到它们被用作“常规语言”(Perl除外,这似乎是双向的)。
我将继续并从重复的问题中迁移我的答案
名称“脚本语言”适用于一个非常特定的角色:您编写命令以发送到现有软件应用程序的语言。(例如传统的电视或电影“脚本”)
例如,从前,HTML网页很无聊。它们始终是静态的。然后有一天,Netscape想:“嘿,如果让浏览器读取页面中的小命令并对其执行操作,该怎么办?” 这样,就形成了Javascript。
一个简单的javascript命令就是该alert()
命令,该命令指示/命令正在读取网页以显示警报的浏览器(软件应用程序)。
现在,它是否alert()
以任何方式与浏览器实际用于显示警报的C ++或任何代码语言有关?当然不是。在.html页面上写“ alert()”的人不了解浏览器如何实际显示警报。他只是在写一个浏览器会解释的命令。
让我们看一下简单的javascript代码
<script>
var x = 4
alert(x)
</script>
这些是发送给浏览器的指令,供浏览器自己解释。浏览器实际使用的编程语言将变量设置为4,并将其置于警报中……这与javascript完全无关。
我们将最后一系列命令称为“脚本”(这就是为什么将其包含在<script>
标签中的原因)。就传统意义而言,仅按“脚本”的定义即可:发送给演员的一系列指令和命令。每个人都知道剧本(例如电影剧本)就是剧本。
剧本(脚本)不是演员,摄像机或特殊效果。剧本只是告诉他们该怎么做。
现在,到底什么是脚本语言?
有很多编程语言,就像工具箱中的不同工具一样。有些语言是专门为用作脚本而设计的。
Javasript是一个明显的例子。很少有Javascript应用程序不属于脚本编写领域。
ActionScript(Flash动画的语言)及其派生词是脚本语言,因为它们仅向Flash播放器/解释器发出命令。当然,有诸如面向对象程序设计之类的抽象方法,但这仅仅是到达终点的一种方法:向Flash Player发送命令。
Python和Ruby通常也用作脚本语言。例如,我曾经在一家公司工作,该公司使用Ruby编写脚本命令以发送到浏览器,这些命令类似于“转到该站点,单击此链接...”进行一些基本的自动化测试。我是不是一个“软件开发”通过任何手段,在那工作。我只是编写了将命令发送到计算机以将命令发送到浏览器的脚本。
由于其性质,脚本语言很少被“编译”,即被翻译成机器代码,并由计算机直接读取。
甚至从Python和Ruby创建的GUI应用程序都是发送到用C ++或C编写的API的脚本。它告诉C应用程序该怎么做。
当然有一些模糊性。您为什么不能说机器语言/ C是脚本语言,因为它们是计算机用来与基本主板/图形卡/芯片接口的脚本?
我们可以画一些线来阐明:
当您可以编写脚本语言并在不进行“编译”的情况下运行它时,它更像是一种直接脚本式的事情。例如,您无需为剧本做任何事情即可告诉演员如何处理它。它已经存在,可以按原样使用。因此,即使某些情况下编译后的语言可用于脚本目的,我们也将其排除在脚本语言之外。
脚本语言意味着将命令发送到复杂的软件应用程序。这就是我们首先编写脚本的全部原因-因此您无需了解软件向其发送命令的工作方式的复杂性。因此,脚本语言倾向于是向相对复杂的软件应用程序发送(相对)简单命令的语言...在这种情况下,机器语言和汇编代码不会削减它。
我是否可以建议脚本语言已成为许多人逐渐远离的术语。我要说的是,如今主要归结为编译语言和动态语言。
我的意思是,在当今这个时代,您不能真正说出类似Python或Ruby的“脚本”语言(您甚至拥有IronPython和JIT-您喜欢的语言之类的东西,两者之间的差异更加模糊了)。
老实说,就我个人而言,PHP不再是一种脚本语言。我不希望人们喜欢在简历上对PHP进行分类,而不是对Java进行分类。
脚本语言倾向于在脚本引擎内运行,脚本引擎是大型应用程序的一部分。例如,JavaScript在您的浏览器脚本引擎中运行。
我更希望人们不要使用“脚本语言”一词,因为我认为这样可以减少工作量。像Perl这样的语言,通常称为“脚本语言”。
为什么我们甚至需要区分像Java一样编译的语言和不是Ruby这样的语言?标签有什么价值?
有关更多信息,请参见http://xoa.petdance.com/Stop_saying_script。
脚本语言是配置或扩展现有程序的语言。
脚本语言是一种编程语言。
“脚本语言”的定义非常模糊。我将基于以下考虑因素:
脚本语言通常没有用户可见的编译步骤。通常,用户只需用一个简单的命令即可运行程序。
脚本语言的程序通常以源代码形式传递。
脚本语言通常具有大量系统上存在的运行时,并且这些运行时可以轻松安装在大多数系统上。
脚本语言倾向于跨平台而非特定于机器。
脚本语言使调用其他程序和与操作系统的接口变得容易。
脚本语言通常很容易嵌入到以更常规的编程语言编写的大型系统中。
脚本语言通常是为简化编程而设计的,并且很少考虑执行速度。(如果要快速执行,通常的建议是用C之类的代码编写耗时的部分,然后将语言嵌入C或从该语言调用C位。)
我上面列出的某些特征对于实现来说是正确的,在这种情况下,我指的是更常见的实现。已经有了C解释器,其中(AFAIK)没有明显的编译步骤,但是对于大多数C实现而言,情况并非如此。您当然可以将Perl程序编译为本机代码,但这不是通常使用的方式。其他一些特征是社会性质的。以上某些标准有些重叠。正如我所说,定义是模糊的。
如果它不/ 不会在CPU上运行,那对我来说就是个脚本。如果解释器需要在程序下方的CPU上运行,则它是一种脚本和一种脚本语言。
没有理由比这更复杂吗?
当然,在大多数情况下(99%),很明显一种语言是否为脚本语言。但是请考虑,例如,VM可以模拟x86指令集。在VM上运行时,这是否会使x86字节码成为脚本语言?如果有人要编写将perl代码转换为本机可执行文件的编译器怎么办?在这种情况下,我将不再知道该语言本身的名称。重要的是输出,而不是语言。
再说一次,我不知道已经完成了什么事情,所以现在我仍然很愿意调用解释型语言的脚本语言。
一个脚本是一个比较小的方案。一个系统,是一个比较大的项目,或收集的比较大的项目。
设计某些编程语言时,语言设计人员和编程社区认为这些功能在编写相对较小的程序时会很有用。这些编程语言称为脚本语言,例如PHP。
同样,其他编程语言也具有某些功能,语言设计者和编程社区认为这些功能在编写相对较大的程序时会很有用。这些编程语言称为系统语言,例如Java。
现在,大小程序都可以用任何语言编写。一个小的Java程序是一个脚本。例如,Java“ Hello World”程序是脚本,而不是系统。用PHP编写的大型程序或程序集合是一个系统。例如,用PHP编写的Facebook是系统,而不是脚本。
将单一语言功能视为“石蕊测试”来确定该语言最适合脚本编写还是系统编程是值得商question的。例如,脚本可以编译为字节代码或机器代码,或者可以通过直接抽象语法树(AST)解释执行。
因此,如果一种语言通常用于编写脚本,则它是一种脚本语言。脚本语言可用于编写系统,但此类应用程序可能被认为是可疑的。