スクリプト言語

**スクリプト言語**（スクリプトげんご、）とは、主として既存のソフトウェアや実行環境の機能を制御・自動化するために用いられる高水準のプログラミング言語の総称である。多くはコンパイルを経ずにコードを逐次実行するインタプリタを採用する。オペレーティングシステム、Webブラウザ、アプリケーションソフトウェアなどの内部または上位で動作し、それらの機能の拡張や統合を担う。

## 概要
上記の意味より、さらに転じて、比較的単純なプログラムを記述するための、簡易的なプログラミング言語全般をいう。変数に型をつけないなど、動的プログラミング言語・動的型付き言語をスクリプト言語と呼ぶ定義もある。ただし、厳密な定義ないし区別は存在しない。インタプリタ方式を採用しているものが多いが、性能向上のため実行時コンパイルなどの利用も盛んである。またGo言語の様にコンパイラ方式だが `go run ソースファイル` とソースファイルを1コマンドで実行できるという言語もあるが、一般に「Goはスクリプト言語的な使い方もできる」と言えても「Goはスクリプト言語である」とは言わない。

前者（アプリケーションソフトウェアの動作内容を、台本のように記述し制御するためのプログラミング言語）の例としては、UNIXのシェルに対するシェルスクリプト、Emacsに対するEmacs Lisp、Webブラウザなどに対するJavaScriptが挙げられる。また、機能を付け加える形で制御する場合もあり、HTTPサーバに機能を付け加えるために考えられたのがSSIやPHPである。特にスクリプトを名前に冠している言語は下記の表のように制御対象となるプログラムをもつ傾向にある。

後者（転じて意味付けされた、比較的単純なプログラムを記述するためのプログラミング言語全般）の例としては、PerlやPHPが挙げられる。Perlは、その初期においては、テキスト処理ツールの動作を記述するという前者の意味が強かったが、近年では主にCGIを利用して動的なウェブサイト（掲示板など）を構築するためのプログラミング言語として、後者の意味の点で発展したといえる。

なお、大変まれながら、特定のソフトウェアを実装するために使用したプログラミング言語のことを、**スクリプト言語**と呼ぶことがあるので注意したい。この意味では、「記述言語」と呼ぶ方が望ましい。たとえば、UNIXの記述言語はC言語であるといえる。

## 歴史
世界初の対話型シェルは、タイムシェアリングシステムの遠隔操作のため、1960年代に開発された。そして、オペレータが同じコマンド列を端末のキーボードから何度も打ち込む手間を省くためスクリプティングの需要が生まれ、単純なマクロコマンドやコマンド列を格納したファイルを使う方式が開発された。これが最終的にシェルスクリプトの開発へと繋がった。また、大規模で複雑なアプリケーションの開発において、人間が介在しないバッチモードの操作を容易にするため、非常に基本的な埋め込み型スクリプト機能が開発された。すなわち、プログラムの一部としてユーザーが書いた命令列を解釈実行する機能を備えるようにした。この場合の命令列は非常に特殊な言語で書かれ、プログラムの中にプログラムを埋め込むようなものであった。

歴史的には、C言語などの高速なプログラミング言語とBourne ShellやAWKで書かれた低速なスクリプトは、明らかに性能に差があった。しかし技術の進歩による実行環境の速度向上に伴って性能差は縮まり、Perl、Ruby、Pythonといったインタプリタ型言語が汎用プログラミング言語として広く使われるようになっていった。

TclやLuaといった言語は、汎用スクリプト言語として設計されており、アプリケーションに埋め込む形で使うこともできるし、単独で使うこともできる。Visual Basic for Applications (VBA) などのシステムは、基盤となるシステムの自動化機構と強く結びついている。アプリケーション毎に新たな言語を開発せずに汎用スクリプト言語を埋め込むことには、明らかな長所がある。開発者が言語を解釈する機能を一から開発する手間を省き、ユーザーは既知の言語を使えるので学習の手間が省ける。

Common Gateway Interface (CGI) は、Webサーバをスクリプト言語で制御することを可能とする。早くからCGI用として使われたスクリプト言語としては、Perl、ASP、PHPなどがある。

ソフトウェアによっては、複数の異なるスクリプト言語に対応している。最近のウェブブラウザにはブラウザ自身を拡張できる言語があり、ブラウザ制御用の埋め込み言語として、ECMAScript (JavaScript) がある。

## スクリプト言語の種類
### ジョブ制御言語とシェル

スクリプト言語の一種は、ジョブ制御の自動化から生み出されたもので、システムプログラムの起動と制御を行う。そういう意味ではシェルの祖先としてIBMの （JCL、ジョブ制御言語）があるとも言える。この種の言語の処理系（インタプリタ）の多くは、UNIXのシェルやMS-DOSの`[[COMMAND.COM]]`といったコマンドラインインタプリタと呼ばれるものである。他にも英語のようなコマンドでスクリプトを書ける AppleScript などもある。macOS では、CocoaとAppleScript或いはJavaScriptを使ってアプリケーション全体を構築することもできる。

### GUIスクリプト
GUIの出現により、コンピュータの制御のための特殊なスクリプト言語も生み出された。それは、ウィンドウ、メニュー、ボタンなどのシステムが生成したものとやり取りする言語であり、人間の手が行うことをシミュレーションする。これらの言語はユーザーが行うことを自動化し標準化するもので、一般にマクロ言語などと呼ばれる。

原理的にはGUIベースのコンピュータ上で動作する任意のアプリケーションを制御できるが、一般に特定のアプリケーションやオペレーティングシステムに対応してマクロ言語が存在する。しかし、中には画面上のピクセル配置からグラフィカルなオブジェクトを認識して操作する言語もあり、その場合はOSやアプリケーションに依存することなく操作可能である。

### アプリケーション専用言語
大規模なアプリケーションプログラムの多くは、固有のスクリプト言語を備えており、そのアプリケーションのユーザーが必要に応じてそれを使う。同様に、コンピュータゲームシステムの多くに固有のスクリプト言語があり、NPCの振る舞いや環境のプログラミングに使われている。このような言語は1つのアプリケーションのためだけに設計されている。表面上は特定の汎用言語に似ているものもあるが（例えばQuakeにはC言語に良く似たQuakeCがある）、汎用言語にはない特有の機能を有していることが多い。Emacs Lisp は機能を完備したLISP言語の方言だが、Emacsの機能の拡張や変更に便利な特殊機能を数多く備えている。アプリケーション専用のスクリプト言語は、特定アプリケーションに特化したドメイン固有言語と見ることもできる。

### Webブラウザ
Webブラウザは、ウェブページを表示するためのアプリケーションである。その操作を制御するための専用言語が開発されてきた。例えば、JavaScript、マイクロソフトのVBScript（Internet Explorer でのみ動作）、MozillaプロジェクトのXUL（Firefoxでのみ動作）、XMLコンテンツを新たな形式に変換して表示するためのXSLTなどがある。ユーザーの印象を良くして反応を引き出すためにXMLとJavaScriptの組合せを利用した技法が広く採用されるようになり、Ajaxという名前まで付けられるようになっている。

### Webサーバ
HTTPリンクにおけるサーバ側では、アプリケーションサーバやCMSなどの動的コンテンツサーバでも、様々なスクリプティング技法を活用している。この領域でよく使われるのは、PHP、JSP、ASP などだが、他にも Ruby on Rails などが一部で人気を得ている。

### テキスト処理言語
テキスト処理は古くからあるスクリプト言語の用途の1つである。UNIXのツールであるAWK、sed、grep 向けに書かれたスクリプトは、テキスト形式の設定ファイルやログファイルに関する処理を自動化するのに使われてきた。この分野では正規表現が重要である。テキスト処理用スクリプト言語では、正規表現を使って処理対象の構造を形式的に表現する。

Perlはもともと、テキスト処理ツールの限界を超えることを目的として開発されたが、現在ではより汎用的な言語に成長している。

### 汎用動的言語

Perlなどの言語はスクリプト言語として生まれたが、より広い用途に使えるプログラミング言語に成長していった。Perlとよく似た言語で、実行中に解釈され、メモリ管理機能があり、動的な言語は、それぞれ相互に似ていることから「スクリプト言語」と呼ばれることもある。しかし、実際にはアプリケーション本体の記述に使われることが多い言語もある。一般に、それらの言語の作者が自ら「スクリプト言語」と呼ぶことはない。

### 拡張/埋め込み型言語
アプリケーション専用のスクリプト言語の代替として、アプリケーションプログラムに埋め込める言語は、これまでいくつも設計されてきた。（C言語などを主に使う）アプリケーションプログラマが、そのアプリケーションを制御させるためにスクリプト言語用「フック」をプログラムに作りこむ。そのような言語はアプリケーション専用の拡張言語と同じ用途に使用されるが、別のアプリケーションとスクリプトについてのスキルを共有できるという利点がある。JavaScriptはウェブブラウザ内のスクリプト言語として生まれ、今もその用途が大半だが、ECMAScriptとして標準化されたことで、汎用の埋め込み用言語としても広まった。特にMozillaが実装したSpiderMonkeyは Yahoo! Widget Engine などいくつかの環境に埋め込まれている。ECMAScriptの実装（処理系）を埋め込んでいる他の例としては、アドビの製品であるAdobe Flash（ActionScript）やAdobe Acrobat（PDFファイルのスクリプティング用）がある。

Tclは拡張言語として生まれたが、Python、Perl、Ruby などと同じように汎用言語として使われることが多い。

複雑で用途が限定されたアプリケーションでは、通常のユーザインタフェースで提供可能な機能とは別に埋め込み型プログラミング言語を備え、ユーザーにさらなる制御手段を提供している。例えば、3DオーサリングツールMayaはMELというスクリプト言語を内蔵している。また、Blenderはその用途にPythonを採用している。

機能を頻繁に追加する場合や、色々試しては実行してみるような場合（例えば、ゲームエンジン）も、埋め込み型言語を利用している。開発中のプロトタイピングに威力を発揮し、プログラムの中核部を知らなくてもアプリケーションの機能をいじることができる。この用途のスクリプト言語としては、LuaやPythonが有名だが、他にもAngelScriptやSquirrelなどがある。

### その他のスクリプト言語
* CFML
* Enterprise Generation Language
* Euphoria
* Falcon
* Ferite
* Fiona
* Groovy
* HSP
* HyperTalk
* LotusScript
* REXX
* Lingo
* Scheme
* SuperTalk
*Ichigojam script

## 脚注

### 出典

## 関連項目
* 軽量プログラミング言語
* 動的プログラミング言語
* アーキテクチャ記述言語
* ビルド (ソフトウェア)
* ドメイン固有言語
* グルー言語 と グルーコード
* プログラミング言語一覧
* マクロ/マクロ言語 と プリプロセッサ
* シバン (Unix)
* シェルスクリプト

## 外部リンク
* Patterns for Scripted Applications
*  — from The Scriptometer
* A Slightly Skeptical View on Scripting Languages by Dr. Nikolai Bezroukov
* Rob van der Woude's Scripting Pages — 管理用スクリプトに関する情報
* Are Scripting Languages Any Good? A Validation of Perl, Python, Rexx, and Tcl against C, C++, and Java (PDF) — 2003 study
* Scripting: Higher Level Programming for the 21st Century by John K. Ousterhout
* Use of VBScript in QTP automation
* Scripting on the Java platform — JavaWorld
* "Programming is Hard - Let's Go Scripting" by Larry Wall - Perl.com transcript of his State of the Onion speech.
* スクリプティングのすべて MSDN