脚本语言

脚本语言（scripting language）是为了缩短传统的“编写、编译、链接、运行”（edit-compile-link-run）过程而创建的计算机编程语言。早期的脚本语言经常被称为批处理语言或作业控制语言。一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性，目的就是希望能让程序员快速完成程式的编写工作。而宏语言则可视为脚本语言的分支，两者也有实质上的相同之处。

虽然许多脚本语言都超越了计算机简单任务自动化的领域，比如JavaScript、Perl、PHP、Python、Ruby和Tcl，成熟到可以编写精巧的程序，但仍然还是被称为脚本。几乎所有计算机系统的各个层次都有一种脚本语言。包括操作系统层，如计算机游戏，网络应用程序，字处理文档，网络软件等。在许多方面，高级编程语言和脚本语言之间互相交叉，二者之间没有明确的界限。

## 起源

脚本语言是一种计算机程序语言，因此也能让开发者藉以编写出让电脑听命行事的程式。以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则，基于这项原则，使得脚本语言通常比C语言、C++语言或 Java之类的系统程式语言要简单容易，也让脚本语言另有一些属于脚本语言的特性：

- 语法和结构通常比较简单
- 学习和使用通常比较简单
- 通常以容易修改程式的“直译”作为执行方式，而不需要“编译”
- 程式的开发产能优于执行效能

一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个Shell脚本主要由原本需要在命令行输入的命令组成，或在一个文本编辑器中，用户可以使用脚本来把一些常用的操作组合成一组序列。主要用来书写这种脚本的语言叫做脚本语言。很多脚本语言实际上已经超过简单的用户命令序列的指令，还可以编写更复杂的程序。

## 定义

计算机语言是为了各种目的和任务而开发的，一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。大多脚本语言共性是：良好的快速开发，有效率的执行，解释而非编译执行，和其它语言编写的程序组件之间通信功能很强大。

许多脚本语言用来执行一次性任务，尤其是系统管理方面。它可以把服务组件粘合起来，因此被广泛用于GUI创建或者命令行，操作系统通常提供一些默认的脚本语言，即通常所谓shell脚本语言。

脚本通常以文本（如ASCII）保存，只在被调用时进行解释或编译。

测试大型项目中经常把脚本和其它低级编程语言一起使用，各自发挥优势解决特定问题。脚本经常用于设计互动通信，它有许多可以单独执行的命令，可以做很高级的操作，（如在传统的Unix shell（sh）中，大多操作就是程序本身。）

这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等性能问题可以不用考虑。在更低级或非脚本语言中，内存及变量管理和数据结构等耗费人工，为解决一个给定问题需要大量代码，当然这样能够获得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩性。

综上所述，脚本编程速度更快，且脚本文件明显小于如同类C程序文件。这种灵活性是以执行效率为代价的。脚本通常是解释执行的，速度可能很慢，且运行时更耗内存。在很多案例中，如编写一些数十行的小脚本，它所带来的编写优势就远远超过了运行时的劣势，尤其是在当前程序员工资趋高和硬件成本趋低时。

然而，在脚本和传统编程语言之间的界限越来越模糊，尤其是在一系列新语言及其集成常出现时。在一些脚本语言中，有经验的程序员可以进行大量优化工作。在大多现代系统中通常有多种合适的脚本语言可以选择，所以推荐使用多种语言（包括C或者汇编语言）编写一种脚本。

## 脚本语言分类

### 作业控制和外壳语言

此类脚本用于自动化工作控制，即启动和控制系统程序的行为。大多的脚本语言解释器也同时是命令行界面，如Unix shell和MS-DOS COMMAND.COM。其他如AppleScript，可以为系统增加脚本环境，但没有命令行界面。

具体包括：

- 4DOS
- 4NT / Take Command
- AppleScript
- ARexx（Amiga Rexx）
- bash
- csh
- DCL
- JCL
- ksh
- Cmd.exe批处理（Windows, OS/2）
- Command.com批处理（DOS）
- REXX
- tcsh
- sh
- Winbatch
- Windows PowerShell
- Windows Script Host
- zsh

### 文本处理语言

处理基于文本的记录是脚本语言最早的用处之一。如Unix's awk最早是设计来帮助系统管理员处理调用UNIX基于文本的配置和LOG文件。Perl最早是用来产生报告的，现在它已经成了全面成熟的语言。

具体包括：

- Awk
- Perl
- sed
- XSLT

### 动态语言

一些通用动态语言，比如Perl，从一门脚本语言发展成了更通用的编程语言，由于“解释执行，内存管理，动态”等特性，它们仍被归类为脚本语言。脚本编程常与系统编程相对比，如John Ousterhout在Ousterhout二分法或大型编程和小型编程中做出的那样。在这种视角下，脚本是胶水代码，被来连接软件组件，专门用于这个目的的语言叫做胶水语言。

- APL
- Dylan
- Groovy
- JavaScript/JScript
- Lua
- MUMPS（M）
- newLISP
- Nuva
- Perl
- PHP
- Python
- Ruby
- Scheme
- Shell脚本（如 Unix shell、Windows PowerShell等）
- GNU Smalltalk
- SuperCard
- Tcl（工具命令语言）
- VBScript

### 可扩展/可嵌入语言

少数的语言被设计通过嵌入应用程序来取代应用程序定制的脚本语言。开发者（如使用C等其它系统语言）包入使脚本语言可以控制应用程序的hook。这些语言和应用程序定制的脚本语言是同种用途，但优点在于可以在应用程序之间传递一些技能。

具体包括：

- Ch (程序)（C/C++解释器）
- ECMAScript（实现为DMDScript、JavaScript等）
- GameMonkeyScript
- Guile
- Lua
- RBScript（REALbasic脚本）
- Squirrel
- Tcl

JavaScript直到现在仍然是网页浏览器内的主要编程语言，它的ECMAScript标准化保证了它成为流行的通用嵌入性语言。

Tcl作为一种可扩展语言而创建，但更多地被用作通用性语言，就如同Python, Perl, Ruby一样。

### 应用程序定制的脚本语言

许多大型的应用程序都包括根据用户需求而定制的惯用脚本语言。同样地，许多电脑游戏系统使用一种自定义脚本语言来表现NPC（non-player character,non-playable character,non-player class）和游戏环境的预编程动作。

此类语言通常是为一个单独的应用程序所设计，虽然它们貌似一些通用语言（如QuakeC, modeled after C），但它们有自定义的功能。

具体包括：

- Action Code Script
- ActionScript
- AutoLISP
- Emacs Lisp
- Game Maker Language
- HyperTalk
- IPTSCRAE
- IRC script
- Lingo
- Matlab Embedded Language
- Maya Embedded Language
- mIRC script
- NWscript
- QuakeC
- UnrealScript
- Visual Basic for Applications
- VBScript
- ZZT-oop

### WEB编程脚本

应用程序定制的脚本语言中有一种重要的类别，用于提供WEB页面的自定义功能。它专业处理互联网通信，使用网页浏览器作为用户界面。当然，大多现代WEB编程语言都比较强大可以做一些通用编程。

具体包括：

- ColdFusion（应用服务器）
- Lasso
- Miva
- SMX
- IPTSCRAE，一些网络开发团队用于创建论坛的工具

### GUI脚本

GUI出现带来一种专业的控制计算机的脚本语言。它在用户和图形界面，菜单，按钮等之间互动。它经常用来自动化重复性动作，或设置一个标准状态。理论上它可以用来控制运行于基于GUI的计算机上的所有应用程序，但实际上这些语言是否被支持还要看应用程序和操作系统本身。当通过键盘进行互动时，这些语言也被称为宏语言。

具体包括：

- AutoHotkey
- AutoIt
- Expect

### 其它

- BeanShell（Java的脚本）
- CobolScript
- Euphoria
- F-Script
- Groovy
- Io
- KiXtart
- Object REXX
- Pike
- REBOL
- ScriptBasic
- StepTalk
- Visual DialogScript

## 外部链接

- A study of the Script-Oriented Programming (SOP) suitability of selected languages – from The Scriptometer.
- Hotscripts.com -A collection of many scripts written in an assortment of languages
- OpenSourceScripts.com -A collection of open source scripts
- A Slightly Skeptical View on Scripting Languages by Dr. Nikolai Bezroukov
- Scripting: Higher Level Programming for the 21st Century by John K. Ousterhout
- Are Scripting Languages Any Good? A Validation of Perl, Python, Rexx, and Tcl against C, C++, and Java (PDF) —2003 study
- Free Classified ASP Script Site Software
- 学习Shell Scripts 鸟哥的Linux私房菜