什么时候将一种语言视为脚本语言?[关闭]


107

是什么使语言成为脚本语言?我听说有人说“当它被解释而不是编译时”。这将使PHP(例如)成为脚本语言。那是唯一的标准吗?还是有其他标准?

也可以看看:


您可能想扩大您的问题。我觉得这几乎是骗子。其他人可能看不到这种区别
Kent Fredric's

还有其他问题吗?
Sietse

2
stackoverflow.com/questions/98268/…有很多相似之处。不一定完全相同,但是有很多共享的上下文/意见。
肯特·弗雷德里克

7
...当一种语言在每个次要发行版中破坏API并更改其语法时,当它是大约100个肮脏,未维护的越野车C库的包装时,则它是一种脚本语言。;)
ivan_ivanovich_ivanoff 2009年

1
在“相关”侧边栏中,您将找到stackoverflow.com/questions/1514206/…,我将一堆然后是现有的重复项链接到stackoverflow.com/questions/101055/…
dmckee ---前主持人小猫,2010年

Answers:


52

脚本语言是一种“脚本化”其他事情以完成工作的语言。主要重点不是主要构建自己的应用程序,而是使现有应用程序按您想要的方式运行,例如,用于浏览器的JavaScript,用于MS Office的VBA。


那么像Python这样的语言呢?要说出重点在哪里并不容易,但是可以说,重点更多地放在自己的应用程序上,但仍然经常被称为“脚本语言”。可能是因为隐藏的编译成参考CPython impl的字节码。不会引发有关“类型安全”的编译错误?也许
奥德

字节码和类型系统实际上与它没有任何关系。根据以上定义,如果应用程序向Python公开API,则可以说它使用Python作为其脚本语言。如果您完全使用Python构建应用程序,则该应用程序会将其用作编程语言。
错误

“脚本”不是一种语言的定义。语言可以拥有的一个特征。因此,Python是一种“好的脚本语言”,因为它使编写编写脚本的代码变得容易。汇编不是一种好的脚本语言,因为它使编写脚本变得困难。C位于中间位置,因为尽管它具有用于呼出的关键字(系统),但在到达那里之前,它还会使用户感到头疼。
nomen 2014年


41

传统上,当谈论脚本与编程的区别时,将解释脚本并编译程序。语言可以通过不同的方式执行-解释或编译(转换为字节码或机器码)。这不是一种语言一种或另成为可能。

在某些人眼中,您使用语言的方式使其成为脚本语言(例如,主要使用C ++开发的游戏开发人员将编写脚本使用Lua对象)。同样,线条也模糊了-一个人可以将一种语言用于编程,而另一人可以将同一种语言用于脚本语言。

这来自维基百科有关脚本语言的文章:

脚本语言,脚本语言或扩展语言是一种编程语言,可以控制一个或多个软件应用程序。“脚本”与应用程序的核心代码不同,因为它们通常以不同的语言编写,并且经常由最终用户创建或至少由其修改。脚本通常是从源代码或字节码解释的,而它们所控制的应用程序通常是编译为本机代码。脚本语言几乎总是嵌入在它们控制的应用程序中。

您会注意到“通常”,“经常”,“传统”和“几乎总是”的使用-所有这些都告诉您,没有一组使特定语言成为“脚本语言”的独特属性。


1
@Amr:好吧,这叫做Java 脚本
sepp2k 2010年

1
@Ram Bhat-令人困惑,因为区分是人为的。
奥德2010年

11
@Andrey:所有现代JavaScript实现都已编译。而且还有C的翻译。
JörgW Mittag 2010年

27
这是完全错误的。好吧,实际上这甚至没有,只是没有意义。没有诸如编译或解释语言之类的东西。语言不会被编译,而语言只会编译。这是一堆抽象的数学规则。解释和编译是执行引擎而不是语言的特征。每种语言都可以使用编译器或解释器实现。实际上,此页面上所有被引用为“解释”的语言几乎都具有专有编译的实现,例如JavaScript,PHP,Python,Ruby。
约尔格W¯¯米塔格

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字节码,并且当前正在添加本机编译器。上面的某些方法还将正则表达式编译为本机代码。
约尔格W¯¯米塔格

31

“剧本就是给演员的东西。节目就是给观众的东西。” -拉里·沃尔

我真的认为不再有太大的区别了。所谓的“脚本”语言通常会被编译-运行非常迅速。并且某些“编程”语言也将在运行时进行进一步编译(考虑到JIT),“编译”的第一阶段是语法检查和资源解析。

不要挂在上面,这实际上并不重要。


嗯..我没有挂断电话,但是大多数面试官和老师都挂了。这些人中我从来没有一个给我满意的答案!
拉兹

1
如果您在这里给出其他答案之一,作为一名面试官,我认为您确实无法解决这个问题。区别确实是模糊的,没有明确的答案。如果您说“好吧,传统上...”,我会接受的,但是我希望您能讨论诸如运行时编译和JIT'ing之类的内容。
克林顿·皮尔斯

25

我的定义是一种通常作为源而不是二进制分发的语言。


5
所以您认为php,python等是脚本语言?
Sietse

“脚本”是Python和PHP的常用描述。
S.Lott

22
php和python-当然,它们是脚本语言!
安东尼·卡西

这是我自开始以来的定义

@Antony Carthy,这是错误的。Python通常不是脚本语言,但可以像在程序中使用的其他语言一样(例如Word(VB),浏览器(JS))
Joschua 2010年

16

有很多可能的答案。

首先:脚本语言和编程语言之间的区别并不是真正的问题,因为脚本语言一种编程语言。更多的问题是什么特征使某种编程语言成为一种脚本语言,而另一种则不是一种脚本语言。

其次:很难说XYZ语言是什么,无论XYZ是“脚本”,“功能编程”,“面向对象编程”还是您拥有什么。“功能编程”的定义非常清楚,但是没有人知道“功能编程语言”是什么。

函数式编程或面向对象的编程是编程风格。您几乎可以使用任何一种语言来编写功能样式或面向对象样式。例如,Linux的虚拟文件系统交换机和Linux的驱动程序模型是尽管C语言编写的大量面向对象的,而大量的Java或C#代码,你在网络上看到的是非常的程序,而不是面向对象的所有。OTOH,我已经看到了一些功能强大的Java代码。

因此,如果函数式编程和面向对象的编程仅仅是可以用任何语言完成的样式,那么如何定义“面向对象的编程语言”?您可以说一种面向对象的编程语言是一种允许进行面向对象的编程的语言。但这还不算什么定义:所有语言都允许面向对象的编程,因此所有语言都是面向对象的吗?因此,您说,如果一种语言强制您以面向对象的风格进行编程对象的。但这也不是什么定义:所有语言都允许进行功能编程,因此没有一种语言是面向对象的吗?

因此,对我来说,我找到了以下定义:

语言是一种脚本语言(面向对象的语言/功能性语言) 两者同时存在

  • 便于脚本(面向对象的编程/功能编程),即它不仅允许,但使得它很容易自然的和包含一些功能,帮助它,
  • 鼓励引导您进行脚本编写(面向对象的编程/函数式编程)。

因此,在五个段落之后,我得出:“脚本语言是脚本语言。” 多么好的定义。不。

显然,我们现在需要查看“脚本”的定义。

这是第三个问题的出处:“功能编程”一词定义明确,只有“功能编程语言”一词有问题,不幸的是在脚本编写方面, 术语“脚本”和术语“脚本语言”定义不明确。

好吧,首先脚本编程。这只是一种特殊的编程。IOW:每个脚本都是一个程序,但不是每个程序都是一个脚本;所有脚本集是所有程序集的适当子集。

我个人认为,使脚本编制脚本与其他程序设计区别开来的是……

脚本在很大程度上操纵那些

  • 不是由脚本创建的,
  • 生命周期与脚本无关,并且
  • 不在脚本域内。

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

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

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

如果使用Shell脚本,则较大的系统可以是操作系统;如果使用浏览器脚本,则可以是浏览器DOM;游戏(例如,使用Lua的World of Warcraft或使用Linden Scripting Language的Second Life),应用程序(例如,AutoLisp) AutoCAD或Excel / Word / Office宏的语言),网络服务器,一堆机械手或其他所有内容。

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

例如,Mondrian是具有编译实现的严格强静态类型的惰性函数脚本语言。

然而,所有这一切都是没有实际意义,因为这个词的方式脚本语言真的在现实世界中,没有任何与上述任何一项。它最常被用作侮辱,其定义非常简单,甚至过于简单:

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

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


这个答案有些愚蠢。当一种语言面向对象编程时,它就是“ 面向对象的”。如果语言具有一流的功能,则它是“功能性的”。这并不意味着一种语言不能兼而有之。这些是语言的特征,而不是类型的定义。脚本是相似的。如果一种语言可以简化脚本的编写过程,那么它就是一种“好的脚本语言”。
2014年

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

5

“脚本语言”是可能意味着很多事情的模糊概念之一。通常,它是指存在一个将您从源代码带到执行的一步过程的事实。

例如,在Perl中,您可以执行以下操作: perl my_source.pl

根据上述标准,PHP是一种脚本语言(即使您可以使用“ Zend编码器”“保护”源代码时也可以进行“编译”过程)。

PS。通常(但不是总是)解释脚本语言。还经常(但并非总是如此)动态地键入脚本语言。


Perl在运行之前会编译为字节码。
布拉德·吉尔伯特

2
Java呢?您需要一个jvm来运行Java程序,但我不会将其称为脚本语言
Eineki,

5

所有脚本语言都是编程语言。因此严格来说,没有区别。

该术语不指该语言的任何基本属性,而是指该语言的典型用法。如果通常的用途是编写主要对已有代码进行调用的简短程序,并对结果进行一些简单的处理(即,如果典型的用途是编写脚本),那么它就是一种脚本语言。


4

我认为Roberto Ierusalimschy先生在“在Lua中编程”中有一个很好的答案或问题:

但是,解释型语言的区别在于,它们不是未编译的,而是任何编译器都是语言运行时的一部分,因此可以(且容易)执行即时生成的代码


这根本无法回答问题!
Paul Biggar,2009年

让我再说一遍,脚本语言是其中包含编译器的一种语言,可以执行动态生成的代码。那怎么不回答问题呢?
罗德里戈·洛佩兹

那是一种解释性语言。如果您试图说任何解释语言都是脚本语言,请说出来。
Paul Biggar

好吧,所有语言都可以用于脚本编写,对我来说,关键的一点是它们的适用性。对我来说,区别在于,是的,它们被解释了。
罗德里戈·洛佩兹

4
Common Lisp不是我通常认为的脚本语言,但它确实具有完整eval功能。
David Thornley 2010年

4

一个师是

  • 脚本=动态解释
  • 正常=已编译

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

我还要补充一点,正如Jörg所指出的那样,解释/编译的区别不是语言的功能,而是执行引擎的功能。

您可能也对Type系统的这种解释感兴趣,该解释是相关的,并且更多地侧重于语言方面,而不是执行引擎。大多数脚本语言是动态类型的,而“普通”语言大多数是静态类型的。

通常,可以更好地定义静态类型语言与动态类型语言的区分,并且对语言的可用性具有更大的影响。


那Objective-C呢?
mouviciel 2010年

1
它支持动态类型,但是我不会将其称为脚本语言。
TimoWestkämper

2
这是完全错误的。好吧,实际上这甚至没有,只是没有意义。没有诸如编译或解释语言之类的东西。语言不会被编译,而语言只会编译。这是一堆抽象的数学规则。解释和编译是执行引擎而不是语言的特征。每种语言都可以使用编译器或解释器实现。实际上,在此页面上被引用为“解释”的所有语言几乎都具有专有编译的实现,例如JavaScript,PHP,Python,Ruby。
约尔格W¯¯米塔格

@ jorg-w-mittag,请随时编辑我的答案以使其更正确。您的积分有效。但是,通常情况下,如果您谈论一种语言,那么您还会谈论默认执行引擎。
TimoWestkämper2010年

3

脚本语言通常是

  1. 动态类型
  2. 解释,很少强调性能,但可移植性好
  3. 所需的样板代码少得多,从而可以快速进行原型制作
  4. 用于小型任务,适合编写一个文件以运行一些有用的“脚本”。

虽然通常使用非脚本语言:1.静态类型2.编译,着重于性能3.需要更多样板代码,导致原型制作速度较慢,但​​可读性和长期可维护性较高4.用于大型项目,可适应多种情况设计模式

它更是一个历史差异的今天,在我看来。写Javascript和Perl时要考虑小的简单脚本,而写C ++时要考虑复杂的应用程序。但是两者都可以使用。无论如何,无论是现代的还是古老的,许多编程语言仍然模糊了这条线(首先是模糊的!)。

可悲的是,我认识了一些开发人员,他们讨厌他们认为的“脚本语言”,认为它们更简单而不是功能强大。我认为陈词滥调-使用正确的工具完成工作。


2
没有诸如编译或解释语言之类的东西。语言不会被编译,而语言只会编译。这是一堆抽象的数学规则。解释和编译是执行引擎而不是语言的特征。每种语言都可以使用编译器或解释器实现。实际上,此页面上所有被引用为“解释”的语言几乎都具有专有编译的实现,例如JavaScript,PHP,Python,Ruby。
约尔格W¯¯米塔格

@Jorg:好点,我同意。但是我没有说不能编译,只是说这些语言在通常的用法中通常是解释而不是编译。
橡树2010年

是吗 编译了Python,PHP,Perl和Lua的所有当前实现。除MRI以外,所有当前的Ruby实现均已编译。(还有实际上不是一个,而是2个用于MRI的JIT编译器。)使用JScript之外,目前所有的JavaScript实现的编译。注意,JScript的后继者Chakra已编译。编译了Scheme的许多实现。ELisp已编译。
约尔格W¯¯米塔格

3

脚本语言最初被认为是用硬编程语言编写的应用程序的控制机制。编译后的程序无法在运行时进行修改,因此脚本编写可以给人们带来灵活性。

最值得注意的是,shell脚本使OS内核中的进程自动化(传统上是Mac上的AppleScript)。这个角色越来越多地交到了Perl的手中,然后又逐渐移交给了Python。我已经看到Scheme(特别是在Guile实现中)用于声明光线跟踪场景;最近,Lua作为脚本游戏的编程语言非常流行,以至于在许多新游戏中,唯一的硬编码就是图形/物理引擎,而整个游戏逻辑都是用Lua编码的。同样,人们认为JavaScript可以编写Web浏览器行为的脚本。

语言解放了;现在,没有人将操作系统视为一个应用程序(或根本不考虑它),许多以前的脚本语言开始被用来编写自己的完整应用程序。该名称本身变得毫无意义,并传播到当今使用的许多解释语言,无论它们是否设计为从另一个系统内部进行解释。

但是,“脚本语言”绝对不是“解释语言”的同义词-例如,BASIC在其一生中都是被解释的(即,在失去其通用性并成为Visual Basic之前),但没有人真正认为它是脚本。

更新:像往常一样阅读Wikipedia上的资料


实际上,最初的BASIC实现是编译器。直到后来,BASIC克隆才被编写为解释器,因为据认为,解释器比编译器更容易编写。
约尔格W¯¯米塔格

1
@Jörg:并非如此。在编译Dartmouth BASIC的第一个测试实现(称为Card BASIC)时,实际的实现是解释器。实际上,BASIC的最重要的新功能可能是交互式的。无需将源代码打入卡中并将其提供给编译器。用户可以坐在电传打字机上,编写程序,然后运行它。
PauliL 2010年

有趣的是,这个答案引入了“硬”语言的思想。在这种情况下,“硬”需要定义吗?
DA文森特

@DavidVincent:我可能应该说“更难”。不需要正式的定义,直观的理解就足够了:用Assembly或C编写程序要比用Ruby或Python编写程序困难得多,因为前者比后者更底层且更冗长。
阿玛丹

3

首先,编程语言不是“脚本语言”或其他东西。它可以是“脚本语言”或其他。

第二点,该语言的实现者会告诉您它是否是脚本语言。

您的问题应该读为“在哪种实现中将编程语言视为脚本语言?”,而不是“脚本语言与编程语言之间有什么区别?”。两者之间没有。

但是,如果将一种语言用于提供某种类型的中间件,那么我会将其视为脚本语言。例如,我会将JavaScript的大多数实现视为脚本语言。如果JavaScript是在操作系统而不是浏览器中运行的,那么它将不是脚本语言。如果PHP在Apache内部运行,则它是一种脚本语言。如果从命令行运行,则不是。


3

我认为脚本语言是不需要任何明显的“编译”步骤的东西。从程序员的角度来看,主要功能是:您可以编辑代码并立即运行它。

因此,我将JavaScript和PHP视为脚本语言,而ActionScript 3 / Flex并非如此。


我不想贬低彼得的答案,但是我们可以添加更多意见吗?
DA文森特

3

我和我的朋友只有这样一个论点:编程语言和脚本语言之间有什么区别。

一个流行的论点是编程语言被编译,脚本语言被解释-但是我相信这个论点是完全错误的……为什么?

  1. Chakra&V8(Microsoft和Google的JavaScript引擎)在执行之前先编译代码
  2. QBasic被解释了-这是否使Qbasic成为一种“脚本”语言?

在此基础上,我认为编程语言和脚本语言之间存在差异:

编程语言在计算机级别运行,并且可以访问计算机本身(内存,图形,声音等)。

脚本语言是沙盒化的,只能访问暴露在沙盒中的对象。它不能直接访问基础计算机。


2

我认为,动态解释的语言(例如PHP,Ruby等)仍然是“普通”语言。我会说“脚本”语言的例子是bash(或ksh或tcsh或其他)或sqlplus之类的东西。这些语言通常用于将系统上的现有程序组合为一系列连贯且相关的命令,例如:

  1. 将A.txt复制到/ tmp / work /
  2. 在数据库服务器上运行每晚清理过程
  3. 记录结果并将其发送到sysdamin

因此,我想说的是(无论如何对我而言)区别在于您如何使用该语言。诸如PHP,Perl,Ruby之类的语言可以用作“脚本语言”,但我通常会看到它们被用作“常规语言”(Perl除外,这似乎是双向的)。


谢谢..这使事情变得更加清晰。综上所述,脚本语言被设计为按顺序一起使用现有的程序。诸如C之类的BUT语言可用于通过API进行相同的操作。因此,从技术上讲,这一切都取决于使用情况
Laz

不,您只是在进行人为区分(这就是事实)。如果您可以快速使用它,那么一种语言通常会被称为脚本语言,但这不是严格的定义或任何东西。常用的解释语言通常也称为脚本语言。
wlangstroth

@Will:任何区别都是人为的。这是我自以为是的区别。;)
FrustratedWithFormsDesigner 2010年

是的,但是在这种情况下,“脚本”是一种非常口语化且含糊不清的用法。确定“按顺序一起使用现有程序”是非常具体的,而且不太正确。这听起来像是一个shell脚本,但不是Perl。然后与API(?)形成对比,我只是不想让这个家伙走得太远。
wlangstroth

2

我将继续并从重复的问题中迁移我的答案


名称“脚本语言”适用于一个非常特定的角色:您编写命令以发送到现有软件应用程序的语言。(例如传统的电视或电影“脚本”)

例如,从前,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是脚本语言,因为它们是计算机用来与基本主板/图形卡/芯片接口的脚本?

我们可以画一些线来阐明:

  1. 当您可以编写脚本语言并在不进行“编译”的情况下运行它时,它更像是一种直接脚本式的事情。例如,您无需为剧本做任何事情即可告诉演员如何处理它。它已经存在,可以按原样使用。因此,即使某些情况下编译后的语言可用于脚本目的,我们也将其排除在脚本语言之外。

  2. 脚本语言意味着将命令发送到复杂的软件应用程序。这就是我们首先编写脚本的全部原因-因此您无需了解软件向其发送命令的工作方式的复杂性。因此,脚本语言倾向于是向相对复杂的软件应用程序发送(相对)简单命令的语言...在这种情况下,机器语言和汇编代码不会削减它。


2

我是否可以建议脚本语言已成为许多人逐渐远离的术语。我要说的是,如今主要归结为编译语言和动态语言。

我的意思是,在当今这个时代,您不能真正说出类似Python或Ruby的“脚本”语言(您甚至拥有IronPythonJIT-您喜欢的语言之类的东西,两者之间的差异更加模糊了)。

老实说,就我个人而言,PHP不再是一种脚本语言。我不希望人们喜欢在简历上对PHP进行分类,而不是对Java进行分类。


即使我在php中工作很多,我也要说,直到它从基于脚本的工作变为使用/ real / fcgi servlet模型来调度从服务器委托的任务之前,我个人将其称为“一种相当不错的脚本语言,可以给应用带来错觉”
肯特·弗雷德里克

静态/动态,有编译的动态语言。
布拉德·吉尔伯特

我重复一遍:我的意思是,在当今时代,您不能真正说出类似Python或Ruby的“脚本”语言(您甚至拥有IronPython snd JitYourFavoriteLanguage之类的东西,两者之间的差异更加模糊了)。
罗伯特·古尔德

1

脚本语言倾向于在脚本引擎内运行,脚本引擎是大型应用程序的一部分。例如,JavaScript在您的浏览器脚本引擎中运行。


有趣的是,接受的答案有两个缺点。
罗伯特S.08年

1
为此应该有某种徽章。“无法处理真相”怎么样?不,有点罗word。;-)
Joseph Ferris

3
Perl,Python,Ruby,Tcl / Tk(仅列举四种脚本语言)并不是主要内置于较大的应用程序中。
乔纳森·勒夫勒

3
如此-他们不是脚本语言。
Milen A. Radev 2009年

3
嗯,如果可以将其未标记为正确的话,那就太好了。
中午丝绸

1

脚本语言是每次运行脚本时都会进行解释的语言,它意味着具有解释器,并且大多数语言都是人类可读的,脚本语言易于学习和使用才有用。

每种可编译语言都可以转换成脚本语言,反之亦然,这一切都取决于实现解释器或编译器,例如C ++具有解释器,因此如果可以使用,可以将其称为脚本语言(通常不很实用,因为C ++是一种非常复杂的语言),目前最有用的脚本语言之一是Python ...

因此,要回答您的问题,定义是使用解释程序来运行快速且容易编写脚本的程序,以解决简单任务或原型应用程序时,脚本语言最强大的用途就是包括每次使用都可能扩展一个语言。编译的应用程序。


1

我更希望人们不要使用“脚本语言”一词,因为我认为这样可以减少工作量。像Perl这样的语言,通常称为“脚本语言”。

  • Perl是一种编程语言!
  • Perl像Java和C ++一样进行编译。它的编译速度更快!
  • Perl具有对象,名称空间和闭包。
  • Perl具有IDE以及调试器和分析器。
  • Perl有培训,支持和社区。
  • Perl不只是网络。Perl不仅是sysadmin。Perl不仅仅是Internet的胶带。

为什么我们甚至需要区分像Java一样编译的语言和不是Ruby这样的语言?标签有什么价值?

有关更多信息,请参见http://xoa.petdance.com/Stop_saying_script


没有计算机可以在本地运行perl或ruby(或它们可以编译成的任何形式)。因此,perl和ruby是脚本语言,由解析器或VM解释。
anon6439

@psoul:是的。Java也是如此。
Stefano Borini,2009年

有几种技术可以将ruby编译为机器代码,尽管我不确定是否有任何一种方法不只是将解释器与表示ruby代码的字符串捆绑在一起,但是即使是真的,也可以将ruby转换为机器代码转换器。由于所有动态分派和gc等因素,它到机器代码的速度不会接近c速度。我认为没有任何ruby处理器,但是这些机器的设计更适合Lisp模型和运行Java字节码的处理器。
罗曼·泰切

1

一个重要的区别是强类型(相对于弱类型)。脚本语言通常类型较弱,从而可以更快地编写小型程序。对于大型程序,这是一个缺点,因为它会禁止编译器/解释器自动查找某些错误,从而使代码重构非常困难。


1

脚本语言是编程语言,通常将程序以可读的文本形式交付给最终用户,并且显然存在可以直接执行该程序的程序。(该程序可以很好地在内部编译该脚本;此处不相关,因为它对用户不可见。)

脚本语言能够支持交互式会话是相对常见的,在该会话中,用户只需键入自己的程序并立即执行即可。这是因为这是对第一段基本要求的简单扩展。主要的额外要求是增加了一种机制,用于确定键入的语句何时完成,以便可以将其发送到执行引擎。


1

对于这个问题稍有不同。脚本语言是一种编程语言,但是编程语言不一定是一种脚本语言。脚本语言用于控制或编写系统脚本。该系统可以是脚本语言为bash的操作系统。该系统可以是具有PHP脚本语言的Web服务器。脚本语言旨在填充特定的细分市场;它们是特定领域的语言。交互式系统已经解释了脚本语言,从而产生了解释脚本语言的概念。但是,这是系统的结果,而不是脚本语言本身。



1

“脚本语言”的定义非常模糊。我将基于以下考虑因素:

  1. 脚本语言通常没有用户可见的编译步骤。通常,用户只需用一个简单的命令即可运行程序。

  2. 脚本语言的程序通常以源代码形式传递。

  3. 脚本语言通常具有大量系统上存在的运行时,并且这些运行时可以轻松安装在大多数系统上。

  4. 脚本语言倾向于跨平台而非特定于机器。

  5. 脚本语言使调用其他程序和与操作系统的接口变得容易。

  6. 脚本语言通常很容易嵌入到以更常规的编程语言编写的大型系统中。

  7. 脚本语言通常是为简化编程而设计的,并且很少考虑执行速度。(如果要快速执行,通常的建议是用C之类的代码编写耗时的部分,然后将语言嵌入C或从该语言调用C位。)

我上面列出的某些特征对于实现来说是正确的,在这种情况下,我指的是更常见的实现。已经有了C解释器,其中(AFAIK)没有明显的编译步骤,但是对于大多数C实现而言,情况并非如此。您当然可以将Perl程序编译为本机代码,但这不是通常使用的方式。其他一些特征是社会性质的。以上某些标准有些重叠。正如我所说,定义是模糊的。


0

我会说脚本语言是它本身并没有定义的大量操作实体。例如,JavaScript操纵浏览器提供的DOM对象,PHP操纵着巨大的基于C函数的库,依此类推。当然不是一个精确的定义,而是一种思考的方式。


嗯,PHP使用了底层的C库,但是大多数语言都是这种情况,包括Java(最低级别)。而且它不能操纵这些功能……
PhiLho

0

如果它不/ 不会在CPU上运行,那对我来说就是个脚本。如果解释器需要在程序下方的CPU上运行,则它是一种脚本和一种脚本语言。

没有理由比这更复杂吗?

当然,在大多数情况下(99%),很明显一种语言是否为脚本语言。但是请考虑,例如,VM可以模拟x86指令集。在VM上运行时,这是否会使x86字节码成为脚本语言?如果有人要编写将perl代码转换为本机可执行文件的编译器怎么办?在这种情况下,我将不再知道该语言本身的名称。重要的是输出,而不是语言。

再说一次,我不知道已经完成了什么事情,所以现在我仍然很愿意调用解释型语言的脚本语言。


1
您正在调用几乎所有语言,除了那些可以编译为脚本语言的本机二进制语言的语言之外?我肯定Java开发人员会很高兴被称为脚本
撰写者

1
他们是。脚本专家。
anon6439

0

一个脚本是一个比较小的方案。一个系统,是一个比较大的项目,或收集的比较大的项目。

设计某些编程语言时,语言设计人员和编程社区认为这些功能在编写相对较小的程序时会很有用。这些编程语言称为脚本语言,例如PHP。

同样,其他编程语言也具有某些功能,语言设计者和编程社区认为这些功能在编写相对较大的程序时会很有用。这些编程语言称为系统语言,例如Java。

现在,大小程序都可以用任何语言编写。一个小的Java程序是一个脚本。例如,Java“ Hello World”程序是脚本,而不是系统。用PHP编写的大型程序或程序集合是一个系统。例如,用PHP编写的Facebook是系统,而不是脚本。

将单一语言功能视为“石蕊测试”来确定该语言最适合脚本编写还是系统编程是值得商question的。例如,脚本可以编译为字节代码或机器代码,或者可以通过直接抽象语法树(AST)解释执行。

因此,如果一种语言通常用于编写脚本,则它是一种脚本语言。脚本语言可用于编写系统,但此类应用程序可能被认为是可疑的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.