指令碼語言

指令碼語言（scripting language）是為了縮短傳統的「編寫、編譯、連結、執行」（edit-compile-link-run）過程而建立的計算機程式語言。早期的指令碼語言經常被稱為批處理語言或。一個指令碼通常是解釋執行而非編譯。指令碼語言通常都有簡單、易學、易用的特性，目的就是希望能讓程式設計師快速完成程式的編寫工作。而巨集語言則可視為指令碼語言的分支，兩者也有實質上的相同之處。

雖然許多指令碼語言都超越了計算機簡單任務自動化的領域，比如 JavaScript、Perl Programming is Hard, Let's Go Scripting… , Larry Wall, December 6, 2007、PHP、Python、Ruby 和 Tcl，成熟到可以編寫精巧的程式，但仍然還是被稱為指令碼。幾乎所有計算機系統的各個層次都有一種指令碼語言。包括作業系統層，如計算機遊戲，網路應用程式，字處理文件，網路軟體等。在許多方面，高階程式語言和指令碼語言之間互相交叉，二者之間沒有明確的界限。

起源

指令碼語言是一種電腦程式語言，因此也能讓開發者藉以編寫出讓電腦聽命行事的程式。以簡單的方式快速完成某些複雜的事情通常是創造指令碼語言的重要原則，基於這項原則，使得指令碼語言通常比 C 語言、C++ 語言或 Java 之類的要簡單容易，也讓指令碼語言另有一些屬於指令碼語言的特性：

語法和結構通常比較簡單
學習和使用通常比較簡單
通常以容易修改程式的「直譯」作為執行方式，而不需要「編譯」
程式的開發產能優於執行效能

一個指令碼可以使得本來要用鍵盤進行的相互式操作自動化。一個 Shell 指令碼主要由原本需要在命令列輸入的命令組成，或在一個文字編輯器中，使用者可以使用指令碼來把一些常用的操作組合成一組序列。主要用來書寫這種指令碼的語言叫做指令碼語言。很多指令碼語言實際上已經超過簡單的使用者命令序列的指令，還可以編寫更復雜的程式。

定義

計算機語言是為了各種目的和任務而開發的，一個常見任務就是把各種不同的已有元件連線起來以完成相關任務。大多指令碼語言共性是：良好的快速開發，有效率的執行，解釋而非編譯執行，和其它語言編寫的程式元件之間通訊功能很強大。

許多指令碼語言用來執行一次性任務，尤其是系統管理方面。它可以把服務元件粘合起來，因此被廣泛用於 GUI 建立或者命令列，作業系統通常提供一些預設的指令碼語言，即通常所謂 shell 指令碼語言。

指令碼通常以文字（如 ASCII）儲存，只在被呼叫時進行解釋或編譯。

測試大型專案中經常把指令碼和其它低階程式語言一起使用，各自發揮優勢解決特定問題。指令碼經常用於設計互動通訊，它有許多可以單獨執行的命令，可以做很高階的操作，（如在傳統的 Unix shell（sh）中，大多操作就是程式本身。）

這些高階命令簡化了程式碼編寫過程。諸如記憶體自動管理和溢位檢查等效能問題可以不用考慮。在更低階或非指令碼語言中，記憶體及變數管理和資料結構等耗費人工，為解決一個給定問題需要大量程式碼，當然這樣能夠獲得更為細緻的控制和最佳化。指令碼缺少最佳化程式以提速或者降低記憶體的伸縮性。

綜上所述，指令碼程式設計速度更快，且指令碼檔案明顯小於如同類 C 程式檔案。這種靈活性是以執行效率為代價的。指令碼通常是解釋執行的，速度可能很慢，且執行時更耗記憶體。在很多案例中，如編寫一些數十行的小指令碼，它所帶來的編寫優勢就遠遠超過了執行時的劣勢，尤其是在當前程式設計師工資趨高和硬體成本趨低時。

然而，在指令碼和傳統程式語言之間的界限越來越模糊，尤其是在一系列新語言及其整合常出現時。在一些指令碼語言中，有經驗的程式設計師可以進行大量最佳化工作。在大多現代系統中通常有多種合適的指令碼語言可以選擇，所以推薦使用多種語言（包括 C 或者組合語言）編寫一種指令碼。

指令碼語言分類

3.1 作業控制和 shell 語言

此類指令碼用於自動化工作控制，即啟動和控制系統程式的行為。大多的指令碼語言直譯器也同時是命令列介面，如 Unix shell 和 MS-DOS COMMAND.COM。其他如 AppleScript，可以為系統增加指令碼環境，但沒有命令列介面。

具體包括：

AppleScript
（Amiga Rexx）
bash
csh
ksh
Cmd.exe 批處理（Windows, OS/2）
Command.com 批處理（DOS）
REXX
tcsh
sh
Windows PowerShell
Windows Script Host
zsh

3.2 文字處理語言

處理基於文字的記錄是指令碼語言最早的用處之一。如 Unix's awk 最早是設計來幫助系統管理員處理呼叫 UNIX 基於文字的配置和 LOG 檔案。Perl 最早是用來產生報告的，現在它已經成了全面成熟的語言。

具體包括：

Awk
Perl
sed
XSLT

3.3 動態語言

一些通用動態語言，比如 Perl，從一門指令碼語言發展成了更通用的程式語言，由於 “解釋執行，記憶體管理，動態” 等特性，它們仍被歸類為指令碼語言。指令碼程式設計常與系統程式設計相對比，如在或中做出的那樣。在這種視角下，指令碼是，被來連線軟體元件，專門用於這個目的的語言叫做膠水語言。

APL
Dylan
Groovy
JavaScript/JScript
Lua
（M）
newLISP
Nuva
Perl
PHP
Python
Ruby
Scheme
Shell 指令碼（如 Unix shell、Windows PowerShell 等）
GNU Smalltalk
Tcl（工具命令語言）
VBScript

3.4 可擴充套件 / 可嵌入語言

少數的語言被設計透過嵌入應用程式來取代應用程式定製的指令碼語言。開發者（如使用 C 等其它系統語言）包入使指令碼語言可以控制應用程式的 hook。這些語言和應用程式定製的指令碼語言是同種用途，但優點在於可以在應用程式之間傳遞一些技能。

具體包括：

（C/C++ 直譯器）
ECMAScript（實現為 DMDScript、JavaScript 等）
Guile
Lua
RBScript（REALbasic 指令碼）
Tcl

JavaScript 直到現在仍然是網頁瀏覽器內的主要程式語言，它的 ECMAScript 標準化保證了它成為流行的通用嵌入性語言。

Tcl 作為一種可擴充套件語言而建立，但更多地被用作通用性語言，就如同 Python, Perl, Ruby 一樣。

3.5 應用程式定製的指令碼語言

許多大型的應用程式都包括根據使用者需求而定製的慣用指令碼語言。同樣地，許多電腦遊戲系統使用一種自定義指令碼語言來表現 NPC（non-player character,non-playable character,non-player class）和遊戲環境的預程式設計動作。

此類語言通常是為一個單獨的應用程式所設計，雖然它們貌似一些通用語言（如 QuakeC, modeled after C），但它們有自定義的功能。

具體包括：

ActionScript
AutoLISP
Emacs Lisp
Matlab Embedded Language
QuakeC
Visual Basic for Applications
VBScript

3.6 WEB 程式設計指令碼

應用程式定製的指令碼語言中有一種重要的類別，用於提供 WEB 頁面的自定義功能。它專業處理網際網路通訊，使用網頁瀏覽器作為使用者介面。當然，大多現代 WEB 程式語言都比較強大可以做一些通用程式設計。

具體包括：

ColdFusion（應用伺服器）
，一些網路開發團隊用於建立論壇的工具

3.7 GUI 指令碼

GUI 出現帶來一種專業的控制計算機的指令碼語言。它在使用者和圖形介面，選單，按鈕等之間互動。它經常用來自動化重複性動作，或設定一個標準狀態。理論上它可以用來控制運行於基於 GUI 的計算機上的所有應用程式，但實際上這些語言是否被支援還要看應用程式和作業系統本身。當透過鍵盤進行互動時，這些語言也被稱為巨集語言。

具體包括：

AutoHotkey
AutoIt
Expect

3.8 其它

（Java 的指令碼）
Euphoria
Groovy
Io
KiXtart
Pike
REBOL