什么时候语言被认为是一种脚本语言?
什么使语言成为脚本语言? 我听到一些人说:“当它被解释,而不是编译”。 这将使PHP(例如)成为脚本语言。 这是唯一的标准吗? 还是还有其他标准?
也可以看看:
- “脚本”和“应用程序”有什么区别?
脚本语言是“脚本”的东西做其他事情的语言。 主要关注的不是主要构build自己的应用程序,而是让现有的应用程序以您想要的方式进行操作,例如用于浏览器的JavaScript,用于MS Office的VBA。
简单。 当我使用它时,它是一种现代dynamic语言,当您使用它时,它仅仅是一种脚本语言!
传统上,当谈论脚本与编程的区别时,脚本被解释并编译程序。 语言可以以不同的方式执行 – 解释或编译(字节码或机器码)。 这并不是一个或另一个语言 。
在某些人看来, 使用某种语言的方式使其成为一种脚本语言(例如,主要用C ++开发的游戏开发人员将在Lua中编写脚本 )。 同样,线条模糊 – 一个人可以使用一种语言进行编程,而另一种语言可以使用相同的语言进行脚本语言编程。
这是关于脚本语言的维基百科文章:
脚本语言,脚本语言或扩展语言是允许控制一个或多个软件应用程序的编程语言。 “脚本”不同于应用程序的核心代码,因为它们通常是用不同的语言编写的,而且通常是由最终用户创build或至less修改的。 脚本经常从源代码或字节码中解释,而它们控制的应用程序传统上被编译为本机机器码。 脚本语言几乎总是embedded到他们控制的应用程序中。
你会注意到“通常”,“经常”,“传统”和“几乎总是”的使用 – 这些都告诉你, 没有一组独特的属性使特定的语言成为“脚本语言”。
“剧本是你给演员的东西,一个节目就是你给观众的东西。” 拉里·沃尔
我真的不觉得有什么区别了。 所谓的“脚本”语言经常被编译 – 只是非常快,并且在运行时。 还有一些“编程”语言在运行时也被进一步编译(想到JIT),“编译”的第一阶段是语法检查和资源parsing。
不要挂在上面,这真的不重要。
我的定义是一种通常以源代码而不是二进制代码的语言。
这有很多可能的答案。
首先:脚本语言和编程语言之间的区别并不是真正的问题,因为脚本语言是一种编程语言。 更多的是什么特性使一些编程语言成为脚本语言而另一种编程语言不是脚本语言的问题。
第二:很难说XYZ语言是什么,XYZ是“脚本”,“函数式编程”,“面向对象编程”还是你自己。 什么是“函数式编程”的定义是相当清楚的,但是没有人知道“函数式编程语言”是什么。
函数式编程或面向对象编程是编程风格 ; 你可以使用几乎任何语言写入function风格或面向对象的风格。 例如,Linux虚拟文件系统交换机和Linux驱动程序模型尽pipe使用C语言编写,仍然是面向对象的,而在networking上看到的很多Java或C#代码却是非常程序化的,而不是面向对象的。 OTOH,我已经看到了一些function强大的Java代码。
所以,如果函数式编程和面向对象编程只是可以用任何语言完成的风格,那么如何定义一个“面向对象的编程语言”呢? 你可以说一个面向对象的编程语言是一种允许面向对象编程的语言。 但这不是一个定义: 所有的语言都允许面向对象的编程,所以所有的语言都是面向对象的? 所以,你说,一个语言是面向对象的,如果它迫使你以面向对象的风格编程的话。 但是这并不是什么定义: 所有语言都允许函数式编程,因此没有语言是面向对象的?
所以,对我而言,我发现了以下定义:
一种语言是一种脚本语言(面向对象的语言/function语言),如果两者兼有的话
- 有利于脚本编写(面向对象的编程/函数式编程),即它不仅允许它,而且使它更容易和自然,并包含帮助它的function,以及
- 鼓励并指导您使用脚本(面向对象的编程/函数式编程)。
所以,在五段之后,我已经到了:“一种脚本语言是一种脚本语言”。 多么好的定义 不。
显然,我们现在需要看“脚本”的定义。
这就是第三个问题出现的地方:而“function性程序devise”这个术语是定义明确的,而“function性程序devise语言”这个术语是有问题的,不幸的是在使用脚本的时候,术语“脚本”和“脚本语言“是不明确的。
那么,首先脚本是编程。 这只是一种特殊的编程。 IOW:每个脚本都是一个程序,但不是每个程序都是一个脚本; 所有脚本的集合都是所有程序集合的一个子集。
我个人认为,使脚本编写脚本和区别于其他编程的东西是…
脚本在很大程度上操纵对象
- 不是由脚本创build的,
- 有一个独立于脚本的生活
- 生活在剧本的领域之外。
而且,所使用的数据types和algorithm通常不由脚本定义,而是由外部环境定义。
考虑一个shell脚本:shell脚本通常操作文件,目录和进程。 系统中的大部分文件,目录和进程可能不是由当前正在运行的脚本创build的。 当脚本退出时,它们不会消失:它们的一生完全独立于脚本。 而且它们也不是脚本的一部分,它们也是系统的一部分。 你并没有通过编写File
和Directory
类来启动你的脚本,那些数据types并不是你所关心的:你只是假设他们在那里,而你甚至不知道(也不需要知道)他们是如何工作的。 而且你也没有实现你自己的algorithm,例如,你只需要使用find
来进行目录遍历,而不是实现自己的广度优先search。
总之:一个脚本附加到一个更大的独立于脚本的系统上,操纵系统的一小部分,然后退出。
这个更大的系统可以是操作系统在shell脚本的情况下,浏览器DOM在浏览器脚本的情况下,游戏(例如具有Lua的魔兽世界或具有Linden脚本语言的第二人生),应用程序(例如AutoLisp AutoCAD或Excel / Word / Officemacros的语言),Web服务器,一包机器人或其他东西完全。
请注意,脚本方面与编程语言的所有其他方面完全正交:脚本语言可以是强types或弱types,严格或宽松types,静态或dynamictypes,名义上,结构上或鸭子types,甚至可以是无types的。 它可以是命令性的或function性的,面向对象的,程序性的或function性的,严格的或者懒惰的。 其实现可以被解释,编译或混合。
例如,Mondrian是一个严格强大的静态types懒惰function脚本语言与编译实现。
但是,所有这些都是没有意义的,因为脚本语言在现实世界中的使用方式与上述任何一个都没有关系。 它通常被简单地用作侮辱,定义是相当简单的,甚至是简单的:
- 真正的编程语言:我的编程语言
- 脚本语言:你的编程语言
这似乎是该术语最常用的方式。
这就像色情,当你看到它,你就知道了。 脚本语言唯一可能的定义是:
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)
大多数都是dynamicinput和解释的,大多数在其参考实现之外没有定义的语义。 但是,即使他们的主要实现变成了编译或者JIT,也不会改变语言的“本质”。
他们唯一的问题是如何判断一个新的语言是否是一种脚本语言。 那么,如果它被称为脚本语言,它是一个。 因此, 因素是一种脚本语言(至less在写作的时候),但是,Java并不是。
“脚本语言”就是那些可能意味着很多东西的模糊概念之一。 通常它指的是存在一个从源代码到执行的一步过程。
例如在Perl中你可以这样做: perl my_source.pl
鉴于上述标准,PHP是一种脚本语言(即使在使用Zend编码器“保护”源代码时,您可以拥有“编译”过程)。
PS。 通常(但不总是)脚本语言被解释。 还经常(但不一定)脚本语言是dynamictypes的。
所有的脚本语言都是编程语言。 所以严格来说,没有什么区别。
这个术语并不是指语言的任何基本属性,而是指语言的典型用法 。 如果典型的用法是编写一些简短的程序,这些程序主要是调用预先存在的代码,并对结果进行一些简单的处理(也就是说,如果典型的用法是编写脚本 ),那么它就是一种脚本语言。
我认为Roberto Ierusalimschy先生在“Lua编程”中有一个非常好的答案或问题:
然而,解释型语言的区别特征并不是它们没有被编译,而是任何编译器都是语言运行时的一部分,因此,可以(并且容易)执行dynamic生成的代码
一个师是
- 脚本=dynamic解释
- 正常=编译
dynamic解释的语言在运行时被解释,而编译的语言在执行之前被编译。
我应该补充一点,正如约格所指出的,解释/编译的区别不是语言的一个特征,而是执行引擎的特征。
您可能也会对Type系统的这种解释感兴趣,这个解释与语言方面相关,并且更多地关注于语言方面,而不是执行引擎。 大多数脚本语言是dynamictypes的,而“正常”语言大多是静态types的。
一般来说,静态和dynamictypes语言的划分更好地定义,并且对语言的可用性有更多的影响。
脚本语言通常是 :
- dynamicinput
- 解释,很less强调性能,但良好的可移植性
- 需要更less的样板代码 ,导致非常快速的原型
- 用于小任务,适合编写一个单独的文件来运行一些有用的“脚本”。
虽然非脚本语言通常是 :1.静态types2.编译,重点在性能3.需要更多的样板代码,导致原型较慢,但更多的可读性和长期可维护性4.用于大型项目,适应多devise模式
但在我看来,现在更多的是历史的差异。 Javascript和Perl是用小而简单的脚本编写的,而C ++是用复杂的应用程序编写的; 但两者都可以使用任何一种方式。 许多现代和古老的编程语言都会模糊线条(首先它是模糊的!)。
可悲的是,我知道一些开发者厌恶他们所认为的“脚本语言”,认为他们更简单,不那么强大。 我的看法是,老陈规 – 使用正确的工具来完成这项工作。
脚本语言最初被认为是用硬编程语言编写的应用程序的控制机制。 编译的程序不能在运行时修改,所以脚本给了人们灵活性。
最值得注意的是,shell脚本是在OS内核中自动执行进程(传统上,Mac上的AppleScript)。 这个angular色越来越多地传递到Perl的手中,然后最近又被转移到Python中。 我见过用于声明光线跟踪场景的Scheme(特别是在Guile实现中) 最近,Lua作为游戏编程语言非常受欢迎 – 在许多新游戏中唯一硬编码的东西是graphics/物理引擎,而整个游戏逻辑都是用Lua编码的。 以同样的方式,JavaScript被认为是脚本的Web浏览器的行为。
语言解放了; 没有人现在认为操作系统是一个应用程序(或者根本就不用考虑),许多以前的脚本语言开始被用来编写自己的完整应用程序。 这个名字本身变得毫无意义,并且传播到今天使用的许多解释型语言,而不pipe它们是否被devise成在另一个系统内被解释。
然而,“脚本语言”绝对不是“解释型语言”的同义词,例如,BASIC被解释为它的大部分生命(即在它失去了它的缩写并成为Visual Basic之前),但是没有人真的把它看作脚本。
更新:阅读材料照常维基百科可用。
首先,编程语言不是一种“脚本语言”或其他东西。 它可以是一个“脚本语言”和其他东西。
第二点,语言的实现者会告诉你它是否是一种脚本语言。
你的问题应该是“在什么实现中将编程语言视为脚本语言?”,而不是“脚本语言和编程语言有什么区别?”。 没有之间。
然而,如果用语言来提供某种types的中间件,我会认为它是一种脚本语言。 例如,我会考虑将JavaScript的大部分实现作为脚本语言。 如果JavaScript是在操作系统中运行的,而不是浏览器,那么它就不是脚本语言。 如果PHP运行在Apache内部,它是一种脚本语言。 如果从命令行运行,则不是。
我认为脚本语言是任何不需要公开沉重的感觉“编译”步骤的东西。 程序员的主要特点是:编辑代码并立即运行。
因此,我将JavaScript和PHP视为脚本语言,而ActionScript 3 / Flex并不是真的。
我的朋友和我只是有这个说法:编程语言和脚本语言有什么区别。
一个stream行的说法是,编程语言被编译和脚本语言解释 – 但我相信这个说法是完全错误的…为什么?
- Chakra&V8(微软和Google的JavaScript引擎)在执行之前编译代码
- QBasic被解释 – 这是否使Qbasic成为“脚本”语言?
在此基础上,这是我对编程语言和脚本语言之间差异的争论:
一种编程语言在机器级运行,可以访问机器本身(内存,graphics,声音等)。
脚本语言是沙盒,只能访问暴露在沙盒中的对象。 它没有直接访问底层机器。
在我的意见中,我会说dynamic解释的语言,如PHP,Ruby等…仍然是“正常”的语言。 我会说“脚本”语言的例子是像bash(或ksh或tcsh或其他)或sqlplus的东西。 这些语言通常用于将系统上的现有程序串连成一系列连贯且相关的命令,例如:
- 将A.txt复制到/ tmp / work /
- 在数据库服务器上运行每晚清理过程
- logging结果并将它们发送到sysdamin
所以我会说,不同的(对我来说)更多的是如何使用这种语言。 像PHP,Perl,Ruby这样的语言可以用作“脚本语言”,但是我经常把它们看作是“普通语言”(Perl除外,这两种语言似乎都是这样。
我将继续,并从重复问题中移出我的答案
名称“脚本语言”适用于一个非常具体的angular色:您编写的命令发送到现有的软件应用程序的语言。 (如传统的电视或电影“脚本”)
例如,曾经,HTML网页很无聊。 他们总是静止的。 然后有一天,Netscape想:“嘿,如果我们让浏览器读取页面上的一些命令并采取行动,该怎么办? 就这样,Javascript就形成了。
一个简单的javascript命令是alert()
命令,它指示/命令正在读取网页的浏览器(一个软件应用程序)显示警报。
现在, alert()
以任何方式与C ++或浏览器实际用来显示警报的任何代码语言有关? 当然不是。 有人在.html页面上写入“alert()”并不理解浏览器如何显示警报。 他只是写一个浏览器将解释的命令。
让我们看看简单的JavaScript代码
<script> var x = 4 alert(x) </script>
这些是发送给浏览器的指令,供浏览器自行解释。 浏览器经历的编程语言实际上将variables设置为4,并将其置于警报中……与javascript完全无关。
我们把最后一系列的命令称为“脚本”(这就是为什么它包含在<script>
标记中)的原因。 正如传统意义上的“脚本”的定义: 一系列指令和命令发送给演员 。 大家都知道,剧本(电影剧本)就是一个剧本。
剧本(脚本) 不是演员,或相机,或特殊效果。 剧本只是告诉他们该做什么。
那么,什么是脚本语言呢?
在工具箱中有很多编程语言就像不同的工具; 有些语言是专门用作脚本的。
Javasript就是一个明显的例子。 有很less的应用程序的JavaScript不属于脚本领域。
ActionScript(Flashanimation语言)及其派生词是脚本语言,因为它们只是向Flash播放器/解释器发出命令。 当然,还有抽象如面向对象的编程,但所有这些只是最后的一种手段:向Flash播放器发送命令。
Python和Ruby通常也被用作脚本语言。 例如,我曾经为一家使用Ruby脚本命令发送到浏览器的公司工作,“去这个站点,点击这个链接…”做一些基本的自动化testing。 在那份工作上,我不是一个“软件开发者”。 我刚刚写了脚本,发送命令到计算机发送命令给浏览器。
由于其本质,脚本语言很less被“编译” – 即被翻译成机器代码,并由计算机直接读取。
甚至从Python和Ruby创build的GUI应用程序都是脚本发送到用C ++或C编写的API。它告诉C应用程序要做什么。
当然有一个模糊的界限。 为什么不能说机器语言/ C是脚本语言,因为它们是计算机用来连接基本主板/graphics卡/芯片的脚本?
我们可以画一些线来澄清:
-
当你编写一个脚本语言并运行它而不用“编译”时,它更像是一种直接脚本的东西。 例如,你不需要对剧本做任何事情就可以告诉演员如何处理。 它已经在那里,按原样使用。 出于这个原因,我们将排除编译语言被称为脚本语言,即使它们可以在某些场合用于脚本目的。
-
脚本语言意味着命令发送到一个复杂的软件应用程序; 这就是我们首先编写脚本的全部原因 – 所以您不需要知道软件如何向其发送命令的复杂性。 所以,脚本语言倾向于将相对简单的命令发送给复杂的软件应用程序 ……在这种情况下,机器语言和汇编代码不会削减它。
我可以build议脚本语言已经成为很多人正在离开的术语。 我想说的大部分归结为现在的编译语言和dynamic语言。
我的意思是说你不能说像Python这样的东西,或者Ruby在这个时代是“脚本化”的语言(你甚至有IronPython和JIT,你最喜欢的语言 ,差异甚至更加模糊)。
说实话,我个人不觉得PHP是一种脚本语言了。 我不希望人们喜欢把PHP分类为在简历上说Java。
脚本语言倾向于在脚本引擎中运行,脚本引擎是大型应用程序的一部分。 例如,JavaScript在你的浏览器脚本引擎中运行。
脚本语言是一种在每次脚本运行时都被解释的语言,它意味着有一个解释器,并且大部分是人类可读的,对于一个脚本语言很容易学习和使用是有用的。
每一种可编译的语言都可以被编译成一种脚本语言,反之亦然,这完全取决于实现一个解释器或一个编译器,例如C ++有一个解释器,所以如果使用的话,它可以被称为脚本语言(一般不如C ++是一个非常复杂的语言),目前最有用的脚本语言之一是Python …
所以要回答你的问题,定义是使用一个解释器来运行快速和简单的脚本程序,以解决简单的任务或原型应用程序的脚本语言最强大的使用是包括每个用途扩展一个可能性编译应用程序
我更喜欢人们不使用术语“脚本语言”,因为我认为这会减less努力。 采取像Perl这样的语言,通常称为“脚本语言”。
- Perl是一种编程语言!
- Perl是像Java和C ++一样编译的。 它只是编译了很多!
- Perl有对象和命名空间和闭包。
- Perl有IDE和debugging器和分析器。
- Perl有培训和支持以及社区。
- Perl不只是networking。 Perl不只是系统pipe理员。 Perl不仅仅是互联网的胶带。
为什么我们甚至需要区分Java编译的语言和不是的Ruby呢? 标签有什么价值?
有关更多信息,请参阅http://xoa.petdance.com/Stop_saying_script 。
一个重要的区别是强types (与弱打字相比)。 脚本语言通常input较弱 ,因此可以更快地编写小程序。 对于大型程序来说,这是一个缺点,因为它禁止编译器/解释器自动地发现某些错误,使得重构代码非常困难。
脚本语言是编程语言,其中程序通常以可读的文本forms交付给最终用户,并且程序可以直接执行该程序。 (程序可能会在内部编译脚本,这在这里是不相关的,因为用户不可见)。
脚本语言能够支持交互式会话是相对常见的,用户只需键入他们的程序并立即执行即可。 这是因为这是对第一段基本要求的微小延伸; 主要的额外要求是增加一种机制来确定何时一个input语句是完整的,以便它可以被发送到执行引擎。
对于这个问题略有不同。 脚本语言是一种编程语言,但是编程语言不一定是脚本语言。 脚本语言用于控制或编写系统脚本。 这个系统可能是一个操作系统,脚本语言是bash。 该系统可以是一个PHP脚本语言的Web服务器。 脚本语言被devise来填补一个特定的利基; 他们是领域特定的语言。 交互式系统已经解释了脚本语言,这引起了脚本语言被解释的概念; 然而,这是系统的结果,而不是脚本语言本身。
脚本语言是configuration或扩展现有程序的语言。
脚本语言是一种编程语言。
“脚本语言”的定义非常模糊。 我会基于以下考虑:
-
脚本语言通常不具有用户可见的编译步骤。 通常,用户可以通过一个简单的命令来运行程序。
-
脚本语言中的程序通常以源代码forms传递。
-
脚本语言通常具有在大量系统上运行的运行时,并且可以在大多数系统上轻松地安装运行时。
-
脚本语言往往是跨平台的,而不是特定于计算机的。
-
脚本语言可以很容易地调用其他程序并与操作系统进行交互。
-
Scripting languages are usually easily embeddable into larger systems written in more conventional programming languages.
-
Scripting languages are normally designed for ease of programming, and with much less regard for execution speed. (If you want fast execution, the usual advice is to code the time-consuming parts in something like C, and either embed the language into C or call C bits from the language.)
Some of the characteristics I listed above are true of implementations, in which case I'm referring to the more common implementations. There have been C interpreters, with (AFAIK) no obvious compile step, but that's not true of most C implementations. You could certainly compile a Perl program to native code, but that's not how it's normally used. Some other characteristics are social in nature. Some of the above criteria overlap somewhat. As I said, the definition is fuzzy.
A scripting language is a programming language designed for integrating and communicating with other programming languages. You can also say it instructs others to do stuff
I would say scripting language is the one heavily manipulating entities it doesn't itself define. For instance, JavaScript manipulates DOM objects provided by the browser, PHP operates enormous library of C-based functions, and so on. Of course not a precise definition, more a way to think if it.
If it doesn't/ wouldn't run on the CPU, it's a script to me. If an interpreter needs to run on the CPU below the program, then it's a script and a scripting language.
No reason to make it any more complicated than this?
Of course, in most (99%) of cases, it's clear whether a language is a scripting language. But consider that a VM can emulate the x86 instruction set, for example. Wouldn't this make the x86 bytecode a scripting language when run on a VM? What if someone was to write a compiler that would turn perl code into a native executable? In this case, I wouldn't know what to call the language itself anymore. It'd be the output that would matter, not the language.
Then again, I'm not aware of anything like this having been done, so for now I'm still comfortable calling interpreted languages scripting languages.