什么使语言成为脚本语言?我听说有人说"当它被解释而不是编译".这将使PHP(例如)成为脚本语言.这是唯一的标准吗?还是有其他标准吗?
"脚本"和"应用程序"之间有什么区别?
Martin Becke.. 93
简单.当我使用它时,它是一种现代动态语言,当你使用它时,它只是一种脚本语言!
简单.当我使用它时,它是一种现代动态语言,当你使用它时,它只是一种脚本语言!
脚本语言是一种"脚本"其他东西来做事情的语言.主要关注点不是主要构建自己的应用程序,而是让现有的应用程序以您想要的方式运行,例如用于浏览器的JavaScript,用于MS Office的VBA.
传统上,在谈论脚本与编程的区别时,脚本会被解释并编译程序.语言可以以不同的方式执行 - 解释或编译(到字节码或机器代码).这不会使语言成为一种或另一种语言.
在某些人看来,使用某种语言的方式使其成为一种脚本语言(例如,主要使用C++开发的游戏开发人员将编写 Lua中的对象脚本).同样,线条模糊 - 一种语言可以用于一个人的编程,同一种语言可以用于另一个人的脚本语言.
这是关于脚本语言的维基百科文章:
脚本语言,脚本语言或扩展语言是一种允许控制一个或多个软件应用程序的编程语言."脚本"与应用程序的核心代码不同,因为它们通常以不同的语言编写,并且通常由最终用户创建或至少修改.脚本通常从源代码或字节码解释,而它们控制的应用程序传统上编译为本机机器代码.脚本语言几乎总是嵌入在他们控制的应用程序中.
您会注意到"通常","经常","传统"和"几乎总是"的使用 - 这些都告诉您没有一组独特的属性使特定语言成为"脚本语言".
"剧本就是你给演员们的.剧本是你给观众的." - 拉里沃尔
我真的认为不再存在太大的差别了.所谓的"脚本"语言经常被编译 - 只是非常快,并且在运行时.一些"编程"语言也在运行时进一步编译(想想JIT),"编译"的第一阶段是语法检查和资源解析.
不要挂断它,这真的不重要.
我的定义是一种通常作为源而不是二进制分发的语言.
这就像色情片,当你看到它时就知道了.脚本语言唯一可能的定义是:
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)
大多数是动态类型和解释的,并且大多数在其引用实现之外没有定义的语义.但是,即使它们的主要实现被编译或JITed,也不会改变语言的"本质".
他们唯一的问题是如何判断一种新语言是否是一种脚本语言.好吧,如果它被称为脚本语言,它就是一个.因此,Factor是一种脚本语言(或者至少是在编写时),但是,Java不是.
这有很多可能的答案.
第一:它不是一个脚本语言和编程语言之间差异的问题,因为脚本语言是一种编程语言.这更像是一个问题,即什么特性使一些编程语言成为脚本语言,而另一种编程语言不是脚本语言.
第二:很难说XYZ语言是什么,XYZ是"脚本","函数式编程","面向对象编程"还是你有什么."函数式编程"的定义非常清楚,但没有人知道"函数式编程语言"是什么.
函数式编程或面向对象编程是编程风格 ; 您可以用几乎任何语言编写功能样式或面向对象的样式.例如,Linux的虚拟文件系统交换机和Linux的驱动程序模型被大量面向对象的,尽管用C写的,而大量的Java或C#代码,你在网络上看到的是非常的程序,而不是面向对象的,在所有.OTOH,我已经看到了一些功能很强的Java代码.
因此,如果函数式编程和面向对象编程只是可以用任何语言完成的样式,那么如何定义"面向对象的编程语言"?您可以说面向对象的编程语言是一种允许面向对象编程的语言.但这并不是一个定义:所有语言都允许面向对象的编程,因此所有语言都是面向对象的?所以,你说,语言是面向对象的,如果它迫使你以面向对象的方式编程.但这也不是一个定义:所有语言都允许函数式编程,因此没有语言是面向对象的?
所以,对我来说,我发现了以下定义:
语言是一种脚本语言(面向对象的语言/函数语言),如果它们都是
促进脚本编写(面向对象编程/函数编程),即它不仅允许它,而且使它变得简单和自然,并包含有助于它的功能,AND
鼓励并指导您编写脚本(面向对象编程/函数编程).
因此,经过五段后,我得出的结论是:"脚本语言是一种脚本语言".多么棒的定义.不.
显然,我们现在需要看一下"脚本"的定义.
这是第三个问题来自于:而术语"函数式编程"是明确的,它是唯一的术语"函数式编程语言",也就是有问题的,不幸的脚本,这两个术语"脚本"和术语"脚本语言"定义不明确.
嗯,首先脚本是编程.这只是一种特殊的编程.IOW:每个脚本都是一个程序,但不是每个程序都是脚本; 所有脚本的集合是所有程序集的适当子集.
在我个人看来,使脚本编写脚本并将其与其他类型的编程区分开来的是......
脚本很大程度上操纵了那些对象
不是由脚本创建的,
有一个独立于脚本和
住在脚本域之外.
此外,使用的数据类型和算法通常不是由脚本定义,而是由外部环境定义.
想想一个shell脚本:shell脚本通常操纵文件,目录和进程.系统上的大多数文件,目录和进程可能不是由当前运行的脚本创建的.当脚本退出时,它们不会消失:它们的生命完全独立于脚本.而且它们也不是脚本的一部分,它们也是系统的一部分.你没有通过编写File
和Directory
类来启动你的脚本,这些数据类型都不是你关心的:你只是假设它们在那里,你甚至不知道(也不需要知道)它们是如何工作的.并且您也没有实现自己的算法,例如,对于目录遍历,您只需使用find
而不是实现自己的广度优先搜索.
简而言之:脚本将自身附加到一个独立于脚本的较大系统上,操作系统的一小部分然后退出.
在shell脚本的情况下,较大的系统可以是操作系统,在浏览器脚本的情况下可以是浏览器DOM,游戏(例如,带有Lua或带有Linden脚本语言的Second Life的魔兽世界),应用程序(例如AutoLisp) AutoCAD或Excel/Word/Office宏的语言),Web服务器,一组机器人或其他完全不同的东西.
请注意,脚本方面与编程语言的所有其他方面完全正交:脚本语言可以是强类型或弱类型,严格或松散类型,静态或动态类型,名义上,结构上或鸭子类型,甚至可以是无类型.它可以是命令式的或功能性的,面向对象的,程序性的或功能性的,严格的或惰性的.它的实现可以被解释,编译或混合.
例如,Mondrian是一种严格强烈静态类型的惰性函数脚本语言,具有编译实现.
然而,所有这一切都是没有实际意义,因为这个词的方式脚本语言是真的在现实世界中,没有任何与上述任何一项.它最常用作侮辱,定义相当简单,甚至简单:
真正的编程语言:我的编程语言
脚本语言:您的编程语言
这似乎是该术语最常用的方式.
"脚本语言"是那些可能意味着许多事情的模糊概念之一.通常它指的是存在一个从源代码到执行的一步过程.
例如在Perl中你做: perl my_source.pl
鉴于上述标准,PHP是一种脚本语言(即使您可以使用Zend Encoder来"保护"源代码时也可以进行"编译"过程).
PS.通常(但不总是)脚本语言被解释.通常(但同样,并非总是)脚本语言是动态类型的.
所有脚本语言都是编程语言.所以严格来说,没有区别.
该术语不涉及该语言的任何基本属性,它指的是该语言的典型用法.如果典型的用法是编写主要调用预先存在的代码的简短程序,并对结果进行一些简单的处理(即,如果典型的用途是编写脚本)那么它就是一种脚本语言.