The Wayback Machine - https://web.archive.org/web/20221026114558/https://baike.sogou.com/kexue/d10020.htm

脚本语言

编辑

脚本或脚本语言是一种特殊运行时环境的编程语言,可以自动执行任务[1];这些任务可以由操作员一个接一个地执行。脚本语言经常被解释(而不是编译)。

原语通常是基本任务,或者API函数调用,这种语言允许它们被组合成更多的程序。可以通过脚本自动化的环境包括软件应用程序、网页浏览器中的网页、操作系统shell的使用、嵌入式系统以及许多游戏。脚本语言可以被视为特定环境的特定领域语言;在编写应用程序脚本的情况下,它也称为扩展语言。脚本语言有时也被称为非常高级的编程语言,因为它们在高抽象层次上运行,或者被称为控制语言,特别是针对大型机上的作业控制语言。

术语“脚本语言”也泛指动态高级通用语言,如Perl[2]、PowerShell、Python和Tcl[3],术语“脚本”通常用于这些语言中的小程序(最多几千行代码),或用于特定领域的语言,如文本处理语言sed和AWK。这些语言中的一些最初是为在特定环境中使用而开发的,后来发展成可移植的特定领域语言或通用语言。相反,许多通用语言都有用作脚本语言的方言。本文讨论了针对特定环境的狭义语言中的脚本语言。

脚本语言的范围分布从非常小且非常特定的领域的语言到用于脚本的通用编程语言。针对特定环境的脚本语言的标准示例包括:Bash,针对Unix或类似于Unix的操作系统;ECMAScript (JavaScript),用于网络浏览器;和 Visual Basic宏语言,针对微软办公软件。Lua是一种被设计和广泛用作扩展语言的语言。Python是一种通用语言,也通常用作扩展语言,而ECMAScript仍然主要是网络浏览器的脚本语言,但也用作通用语言。Lisp的Emacs Lisp方言(供Emacs编辑器使用)和Visual Basic的Visual Basic 宏语言方言是通用语言脚本语言方言的示例。一些游戏系统,特别是第二人生虚拟世界和铁路模拟器专营权,已经通过脚本扩展( Linden脚本语言和 TrainzScript)在功能上得到广泛扩展。在像 Wesnoth这样的其他游戏中,玩家玩的各种实际游戏都是由其他用户编写的脚本。

1 特征编辑

通常,脚本语言的学习和编写速度非常快,可以是短源代码文件,也可以是交互式的读取-求值-输出循环(REPL,语言编程环境)。[4]这通常意味着相对简单的语法和语义;通常,“脚本”(用脚本语言编写的代码)作为“脚本”从头到尾执行,没有明确的入口点。

例如,将Java描述为脚本语言是不常见的,因为它有冗长的语法和规则,说明哪些类存在于哪些文件中,并且不能直接交互执行Java,因为源文件只能包含必须由主机应用程序或应用程序启动器从外部调用的定义。

public class HelloWorld {
  public void printHelloWorld() {
    System.out.println("Hello World");
  }
}

这段旨在打印“ Hello World”的代码没有任何作用,因为main()没有在Hello World类中声明。

相比之下,Python允许在单个文件中定义一些函数,或者完全避免函数,使用命令式编程风格,甚至交互使用它。

print ("Hello World")

这一行Python代码打印“ Hello World”;这里不需要main()这样的声明性语句。

脚本语言通常是从源代码或字节码来解释的。[5]相比之下,编写脚本的软件环境通常是用汇编语言编写的,并以机器代码的形式分发。

脚本语言可以被设计为供程序的最终用户使用或开发, 或者只供开发人员内部使用,因此他们可以用脚本语言编写程序的一部分。脚本语言通常使用抽象(一种信息隐藏的形式)来为用户省去内部变量类型、数据存储和内存管理的详细信息。

脚本通常是由执行它们的人创建或修改的[6],但是它们也经常是分布式的,例如当大部分游戏是用脚本语言编写的时候。

2 历史编辑

早期的大型计算机(在20世纪50年代)是非交互式的,而是使用批处理。IBM的作业控制语言(JCL)是用于控制批处理的语言原型。[7]

第一个交互式shell 是在20世纪60年代开发出来的,用来实现第一个分时系统的远程操作,这些 shell脚本控制着计算机程序中运行的计算机程序,即shell。人们认为 Calvin Mooers在他的TRAC语言中发明了命令替换,即在脚本中嵌入命令的能力,当被解释时,在脚本中插入一个字符串。[8]Multics调用这些动态函数[9]Louis Pouzin在1964年左右为CTSS编写了一个早期的命令脚本处理器,名为RUNCOM。麻省理工学院的Stuart Madnick在1966年为IBM的 CP/CMS编写了一种脚本语言。他最初称这个处理器为COMMAND,后来称为EXEC。[10] Multics包括CTSS RUNCOM的一个分支,也叫RUNCOM。[11]EXEC最终被EXEC 2和REXX取代。

Tcl和Lua等语言是专门设计成通用脚本语言的,可以嵌入任何应用程序中。其他语言,如  Visual Basic宏语言(VBA)提供了与底层系统自动化设施的强大集成。嵌入这种通用脚本语言而不是为每个应用程序开发一种新的语言也有明显的好处,使应用程序开发人员不必从头编写语言翻译器,并允许用户应用在别处学到的技能。

一些软件包含几种不同的脚本语言。现代网络浏览器通常提供一种编写浏览器扩展的语言,以及几种控制浏览器的标准嵌入式语言,包括JavaScript(ECMAScript的方言)或XUL 。

3 类型编辑

3.1 粘合语言

脚本通常与系统编程形成对比,如 Ousterhout的二分法或“大规模编程和小规模编程”。从这个角度来看,脚本是连接软件组件的粘合代码,专门用于这个目的的语言是粘合语言。管道和 shell脚本是粘合语言的典型例子,Perl最初是为了填补这个角色而开发的。Web开发可以被认为是粘合语言的使用,在数据库和web服务器之间连接接口。但是如果大量的逻辑是用脚本编写的,那么它更适合简单地描述为另一个软件组件,而不是“胶水”。

粘合语言对于编写和维护尤其有用:

  • 命令窗口的自定义命令 ;
  • 比用编译语言更好实现的程序更小的程序;
  • 可执行文件的“包装”程序,如批处理文件,它在运行文字处理器、电子表格、数据库、汇编程序、编译器等应用程序之前或之后,移动或处理文件,并使用操作系统做其他事情;
  • 可能会改变的脚本;
  • 解决方案的快速原型最终用另一种通常是编译的语言实现。

粘合语言示例:

  • AppleScript ColdFusionDCL
  • 嵌入式 Common Lisp语言ecl
  • Erlang JCL CoffeeScript JuliaJScript和JavaScript
  • Luam4
  • Modern PascalPerl (5和6)
  • PHP
  • PowerShell
  • Pure PythonRebol
  • RedRexx
  • Ruby SchemeTcl
  • Unix Shell scripts (ksh、csh、bash、shand等)
  • VBScript
  • 工作流语言
  • XSLT

操作系统或应用程序组件的宏语言可以充当粘合语言。其中包括Visual Basic宏语言、 WordBasic、LotusScript、CorelScript、Hummingbird Basic、QuickScript、SaxBasic和 WinWrap Basic。像AWK这样的其他工具也可以被认为是粘合语言,任何由 Windows脚本主机引擎实现的语言(在 Windows中默认是VBScript、JScript和VBA,第三方引擎包括 VBScript、JScript和VBA,包括Rexx、Perl、Tcl、Python、XSLT、Ruby、Modern Pascal、Delphi和C的实现)。大多数应用程序可以通过对象模型或其自身的功能来访问和使用操作系统组件。

其他设备,如可编程计算器,也可能有粘合语言;除了通用粘合语言的实现之外,诸如  Windows CE之类的掌上电脑操作系统可能还具有将应用程序粘合在一起的本地或第三方宏工具——包括 Windows NT、MS-DOS 和一些 Unix shells、Rexx、 Modern Pascal、PHP和Perl。根据操作系统版本,WSH和默认脚本引擎(VBScript和JScript)可用。

可编程计算器可以通过三种方式用粘合语言编程。例如,默认情况下,德州仪器的TI-92可以用命令脚本语言编程。将脚本语言和粘合语言Lua包含在TI-NSpire系列计算器中可以被看作是这种方法的继承。大多数图形计算器的主要机载高级编程语言(最常见的是 Basic派生语言,有时是Lisp 派生语言,更罕见的是C 派生语言)在许多情况下可以将计算器功能粘合在一起,如图形、列表、矩阵等。更全面的基本版本的第三方实现可能更接近本文中作为粘合语言列出的变体,并且还提到了在 美国德州仪器公司和惠普公司 图形计算器上实现Perl、Rexx或各种操作系统shells的尝试。一些用于美国德州仪器公司和惠普公司 机器用于连接转换C和Perl、Rexx、AWK,以及Perl的shell scripts、Modern Pascal、往返于Perl的VBScript的基于PC机个人电脑的C交叉编译器, 使得用粘合语言编写程序以最终在计算器上实现(作为编译程序)成为可能。

3.2 作业控制语言和shells

一类主要的脚本语言已经从作业控制的自动化发展出来,它涉及到启动和控制系统程序的行为。(从这个意义上来说,人们可能会认为shells是IBM的JCL或作业控制语言的衍生物,后者正是为此目的而使用的。)这些语言中的许多解释器兼作命令行解释器,如Unix shell或MS-DOS  COMMAND.COM。其他的,比如 AppleScript,提供了使用类似英语的命令来构建脚本。

3.3 图形用户界面脚本

随着图形用户界面的出现,一种专门用于控制计算机的脚本语言出现了。这些语言与人类用户使用的相同的图形窗口、菜单、按钮等交互。他们通过模拟用户的行为来做到这一点。这些语言通常用于自动化用户操作。当控制是通过模拟按键或鼠标点击,以及在触摸激活的屏幕上点击或按压时,这种语言也被称为“宏”。

这些语言原则上可以用来控制任何图形用户界面应用程序;但是,实际上它们的使用是有限的,因为它们的使用需要应用程序和操作系统的支持。这个限制有 一些例外。一些图形用户界面脚本语言基于从显示屏幕像素识别图形对象。这些图形用户界面脚本语言不依赖于操作系统或应用程序的支持。

3.4 特定于应用程序的语言

特定于应用程序的语言可以分为许多不同的类别,即基于独立的应用程序语言(可执行的)或内部特定于应用程序的语言(postscript、xml、gscript作为一些广泛分布的脚本,分别由Adobe、微软和谷歌实现),其中包括一种适合应用程序用户需求的惯用脚本语言。同样,许多计算机游戏系统使用定制脚本语言来表达非玩家角色和游戏环境的编程操作。这种语言是为单个应用程序设计的;而且,虽然它们表面上可能类似于一种特定的通用语言(例如,以C语言为模型的 QuakeC),但它们有区别于其他语言的定制特征。Emacs Lisp虽然是Lisp的一种完整的、功能强大的方言,但它包含许多特殊的特性,这些特性使得它对于扩展Emacs的编辑功能非常有用。特定于应用程序的脚本语言可以被视为专用于单个应用程序的特定领域的编程语言。

3.5 可扩展/可嵌入语言

许多语言已经被设计成用于通过嵌入应用程序来取代特定于应用程序的脚本语言。应用程序程序员(用C或其他系统语言工作)包括了脚本语言可以控制应用程序的“钩子”。这些语言在技术上可能等同于特定于应用程序的扩展语言,但是当应用程序嵌入一种“通用”语言时,用户可以获得从一个应用程序到另一个应用程序转移的技能。一种更通用的替代方法是简单地提供一个通用语言可以用来控制应用程序的库(通常是一个C库),而不需要修改特定领域的语言。

JavaScript最初主要是一种在网络浏览器中编写脚本的语言,现在仍然是;然而,作为ECMAScript语言的标准化形式使得它作为一种通用嵌入式语言而广受欢迎。特别是,Mozilla实现 SpiderMonkey被嵌入到几个环境中,比如 Yahoo!小部件引擎。嵌入ECMAScript实现的其他应用程序包括Adobe产品 Adobe Flash ( ActionScript)和Adobe Acrobat(用于编写PDF文件脚本)。

Tcl是作为一种扩展语言创建的,但是在类似于Python、Perl和Ruby的角色中,已经越来越频繁地作为通用语言使用。另一方面,Rexx最初是作为作业控制语言创建的,但它被广泛用作扩展语言和通用语言。Perl是一种通用语言,但有Orape rl(1990)方言,由一个Perl 4二进制文件组成,并在 其中编译了 Oracle调用接口。然而,这已经被库(Perl模块)DBD:: Oracle所取代。[12][13]

其他复杂的面向任务的应用程序可能包含并公开一种嵌入式编程语言,以允许其用户拥有比通过用户界面更强的控制能力和更多的功能,无论这些功能多么复杂。例如,Autodesk Maya 3D创作工具嵌入了MEL脚本语言,或使用Python来填充该角色的blender。

一些其他类型的应用需要更快的添加特性或调整运行周期(例如游戏引擎),也使用嵌入式语言。在开发过程中,这允许他们更快地原型化特性并更自由地进行调整,而不需要用户对应用程序的内部工作有深入的了解或者在每次调整后重新构建它(这可能需要大量的时间)。用于此目的的脚本语言从更常见和更著名的Lua和 Python到不太知名的语言,如AngelScript和Squirrel。

Ch是业界嵌入到C/C++应用程序中的另一个兼容C的脚本选项。

参考文献

  • [1]

    ^"ECMAScript 2019 Language Specification". www.ecma-international.org. Retrieved 2018-04-02..

  • [2]

    ^Sheppard, Doug (2000-10-16). "Beginner's Introduction to Perl". dev.perl.org. Retrieved 2011-01-08..

  • [3]

    ^Programming is Hard, Let's Go Scripting…, Larry Wall, December 6, 2007.

  • [4]

    ^Hey, Tony; Pápay, Gyuri (2014). The Computing Universe: A Journey through a Revolution. Cambridge University Press. p. 76. ISBN 978-1-31612322-5, "A major characteristic of modern scripting languages is their interactivity, sometimes referred to as a REPL programming environment. […] The characteristics of ease of use and immediate execution with a REPL environment are sometimes taken as the definition of a scripting language.".

  • [5]

    ^Brown, Vicki. "Scripting Languages". Retrieved 2009-07-22..

  • [6]

    ^Loui, Ronald (2008). "In praise of scripting". IEEE Computer. Archived from the original on 2015-09-23. Retrieved 2013-08-27..

  • [7]

    ^IBM Corporation (1967). IBM System/360 Operating System Job Control Language (C28-6529-4) (PDF)..

  • [8]

    ^Mooers, Calvin. "TRAC, A Procedure-Describing Language for the Reactive Typewriter". Archived from the original on 2001-04-25. Retrieved March 9, 2012..

  • [9]

    ^Van Vleck, Thomas (ed.). "Multics Glossary – A — (active function)". Retrieved March 9, 2012..

  • [10]

    ^Varian, Melinda. "VM AND THE VM COMMUNITY: Past, Present, and Future" (PDF). Retrieved March 9, 2012..

  • [11]

    ^Van Vleck, Thomas (ed.). "Multics Glossary – R — (RUNCOM)". Retrieved March 9, 2012..

  • [12]

    ^Oraperl, CPAN].

  • [13]

    ^Perl, Underground Oracle FAQ.

阅读 5972
版本记录
  • 暂无