
コンピューティングにおいて、スクリプトとは、通常は手作業で行うプロセスを自動化する、比較的短く単純な一連の命令のことです。スクリプトを作成する行為はスクリプティングと呼ばれます。スクリプト言語またはスクリプト言語とは、スクリプト作成に使用されるプログラミング言語のことです。 [ 1 ]
当初、スクリプト言語はオペレーティングシステムのシェルを自動化する用途に限られており、言語も比較的単純なものでした。しかし今日では、スクリプト言語はより広く普及し、一部のスクリプト言語にはアプリケーションソフトウェアの開発にも利用できるような最新機能が搭載されています。
スクリプト言語は、汎用プログラミング言語である場合もあれば、特定の環境向けのドメイン固有言語である場合もある。アプリケーションに組み込まれる場合は、拡張言語と呼ばれることもある。
スクリプト言語は、高い抽象度で動作する場合、非常に高水準のプログラミング言語と呼ばれることがあり、また、特にメインフレームコンピュータのジョブ制御言語の場合は、制御言語と呼ばれることもあります。
スクリプト言語という用語は、より広い意味で、一般的に動的な高水準プログラミング言語を指す場合にも用いられる。中には厳密にインタプリタ型言語もあれば、コンパイル方式を用いる言語もある。この文脈において、「スクリプト」という用語は、そのような言語で書かれた小さなプログラムを指す。通常、スクリプトは単一のファイルに収められ、数千行以下のコードで構成される。
スクリプト言語の範囲は、小規模なものから大規模なものまで、また高度にドメイン固有の言語から汎用プログラミング言語まで多岐にわたります。言語は、最初は小規模で高度にドメイン固有のものとして始まり、後に移植性の高い汎用言語へと発展することもあります。逆に、汎用言語が後に特定のドメイン固有の方言を発展させることもあります。
脚本とは、一般的に以下の属性を含む主観的な特徴付けである。
スクリプトは通常コンパイルされません。少なくとも通常の意味ではコンパイルされません。一般的に、ソースコードまたはバイトコードから直接解釈されるか、ジャストインタイムコンパイル後にネイティブとして実行されます。[ 7 ]
スクリプトは一般的に比較的短く、シンプルなものです。サイズや複雑さに制限がないため、スクリプトの定義は主観的なものです。分岐のない数行のコードは、おそらくスクリプトとみなされるでしょう。複数のファイルから構成され、高度なユーザーインターフェースやハードウェアインターフェース、複雑なアルゴリズム、あるいはマルチプログラミングを実行するコードベースは、おそらくスクリプトとはみなされないでしょう。
スクリプトは通常、本来であれば人がより手作業で行うような作業を自動化するものです。
スクリプト作成を主目的とした言語は、一般的に汎用言語に比べて機能が限られています。スクリプト言語では、複雑なアプリケーションを作成するための機能が不足している場合があります。
通常、スクリプトはコードの最初の行から実行を開始しますが、アプリケーションは通常、エントリポイントと呼ばれるコード内の特別な場所から開始します。
例えば、Javaはスクリプトのような言語ではありません。アプリケーションはという名前の関数から開始しますが、mainこの関数はコードの先頭にある必要はありません。次のコードはから開始しmain、次にを呼び出しprintHelloWorld、「Hello World」と出力します。
public class HelloWorld { public static void printHelloWorld () { System . out . println ( "Hello World" ); } public static void main ( String [] args ) { printHelloWorld (); } }それとは対照的に、以下のPythonmainコードは、Java で必要とされる関数やクラス定義などの構文を使用せずに「Hello World」を出力します。
print ( "Hello World" )スクリプトは、実行者によって作成または変更されることが多いが、[ 8 ]ゲームの大部分がスクリプト言語で記述されている場合のように、配布されることも多い。特に、Google Chrome のT-rex ゲームがその例である。
初期のメインフレームコンピュータ(1950年代)は対話型ではなく、バッチ処理を使用していた。IBMのジョブ制御言語(JCL)は、バッチ処理を制御するために使用される言語の原型である。[ 9 ]
最初の対話型シェルは、最初のタイムシェアリングシステムの遠隔操作を可能にするために 1960 年代に開発され、これらはシェル スクリプトを使用して、シェルというコンピュータ プログラム内で実行中のコンピュータ プログラムを制御しました。カルビン ムーアーズは、 TRAC言語でコマンド置換を発明したと一般的に考えられており、これは、スクリプトにコマンドを埋め込む機能で、解釈されるとスクリプトに文字列を挿入します。[ 10 ] Multics では、これらをアクティブ関数と呼びます。[ 11 ]ルイ プーザンは、 1964 年頃にCTSS用のコマンド スクリプト用プロセッサ RUNCOM を作成しました。MITのスチュアート マドニックは、1966 年に IBM のCP/CMS用のスクリプト言語を作成しました。彼は当初このプロセッサを COMMAND と呼び、後にEXECと名付けました。[ 12 ] Multics には、同じく RUNCOM と呼ばれる CTSS RUNCOM の派生版が含まれていました。[ 13 ] EXEC は最終的にEXEC 2とRexxに置き換えられました。
TclやLuaといった言語は、あらゆるアプリケーションに組み込める汎用スクリプト言語として特別に設計されました。Visual Basic for Applications(VBA)などの他の言語は、基盤となるシステムの自動化機能との強力な統合を実現しました。アプリケーションごとに新しい言語を開発するのではなく、こうした汎用スクリプト言語を組み込むことには明らかな利点があり、アプリケーション開発者は言語トランスレータを一からコーディングする必要がなくなり、ユーザーは他の場所で習得したスキルを応用できるようになりました。
一部のソフトウェアは、複数の異なるスクリプト言語を組み込んでいます。最新のWebブラウザは通常、ブラウザ自体の拡張機能を作成するための言語と、JavaScript ( ECMAScriptの方言)やXULなど、ブラウザを制御するためのいくつかの標準的な組み込み言語を提供しています。
スクリプト言語はいくつかの異なる種類に分類できますが、それらの種類間にはかなりの重複があります。
スクリプトは、オースターハウトの「大規模プログラミングと小規模プログラミング」という二分法のように、システムプログラミングと対比されることが多い。この見方では、スクリプトはソフトウェアコンポーネントを接続する接着剤コードであり、この目的に特化した言語は接着剤言語と呼ばれる。パイプラインやシェルスクリプトは接着剤言語の典型的な例であり、Perlも当初はこの役割を果たすために開発された。Web開発は、データベースとWebサーバー間のインターフェースとして、接着剤言語の使用例とみなすことができる。しかし、スクリプトでかなりの量のロジックが記述されている場合、それは「接着剤」ではなく、単なる別のソフトウェアコンポーネントとして特徴づける方が適切である。
グルー言語は、特に以下の記述と保守に役立ちます。
グルー言語の例:
オペレーティングシステムやアプリケーションコンポーネントに公開されているマクロ言語は、グルー言語として機能します。これには、 Visual Basic for Applications、WordBasic、LotusScript、CorelScript、Hummingbird Basic、QuickScript、Rexx、SaxBasic、WinWrap Basicなどが含まれます。AWKなどの他のツールもグルー言語とみなすことができ、Windows Script Hostエンジンによって実装される言語(WindowsではデフォルトでVBScript、JScript、VBA、およびRexx、Perl、Tcl、Python、XSLT、Ruby、Modern Pascal、 Delphi 、Cなどのサードパーティ製エンジン)も同様です。ほとんどのアプリケーションは、オブジェクトモデルまたは独自の関数を介してオペレーティングシステムコンポーネントにアクセスして使用できます。
プログラム可能な電卓などの他のデバイスにも、連携言語が搭載されている場合があります。Windows CEなどのPDAのオペレーティングシステムには、Windows NT、DOS、一部のUnixシェル、Rexx、Modern Pascal、PHP、Perlといった一般的な連携言語の実装に加え、アプリケーションを連携させるためのネイティブまたはサードパーティ製のマクロツールが用意されている場合があります。OSのバージョンによっては、WSHとデフォルトのスクリプトエンジン(VBScriptとJScript)が利用可能です。
プログラマブル電卓は、3 つの方法でグルー言語を使用してプログラムできます。たとえば、Texas Instruments TI-92は、工場出荷時のデフォルト設定でコマンド スクリプト言語を使用してプログラムできます。TI -NSpireシリーズの電卓にスクリプト言語およびグルー言語Lua が組み込まれていることは、この後継と見なすことができます。ほとんどのグラフ電卓の主要なオンボード高レベル プログラミング言語 (多くの場合 Basic の派生、場合によっては Lisp の派生、まれに C の派生) は、多くの場合、グラフ、リスト、行列などの電卓機能を結合できます。この記事でグルー言語として挙げられている派生言語に近い、より包括的な Basic バージョンのサードパーティ実装が利用可能であり、TI および HP のグラフ電卓に Perl、Rexx、またはさまざまなオペレーティングシステム シェルを実装する試みについても言及されています。 TI社製およびHP社製の一部のマシンで使用されているPCベースのC言語クロスコンパイラは、 C言語とPerl、Rexx、AWK、シェルスクリプトとPerl、Modern Pascal、VBScriptとPerl間の変換ツールと併用することで、最終的に電卓上でコンパイル済みプログラムとして実装するためのプログラムを、連携言語で記述することを可能にする。
多くのテキストエディタは、エディタに組み込まれたマクロ言語(例:The SemWare Editor (TSE)、vi improved (VIM))または外部実装(例:XEDIT)を使用して記述されたマクロ、あるいはその両方(例:KEDIT)を使用して記述されたマクロをサポートしています。テキストエディタと編集マクロは、 CMSのFILELISTやRDRLISTのように、他のアプリケーションを提供するために内部的に使用される場合もあります。
スクリプト言語の主要なクラスは、システムプログラムの動作の開始と制御に関連するジョブ制御の自動化から発展しました[ 18 ](この意味で、シェルはまさにこの目的で使用されていたIBMのJCL(ジョブ制御言語)の子孫と考えることができます)。これらの言語のインタプリタの多くは、UnixシェルやMS-DOSなどのコマンドラインインタプリタとしても機能します。AppleScriptなどの他の言語では、英語のようなコマンドを使用してスクリプトを作成できます。COMMAND.COM
グラフィカルユーザーインターフェースの登場に伴い、コンピュータを制御するための特殊なスクリプト言語が生まれました。これらの言語は、人間が操作するのと同じグラフィックウィンドウ、メニュー、ボタンなどを操作します。これは、ユーザーの操作をシミュレートすることによって実現されます。これらの言語は通常、ユーザーの操作を自動化するために使用されます。制御がシミュレートされたキー入力やマウスクリック、タッチスクリーンでのタップや押し込みによって行われる場合、このような言語はマクロとも呼ばれます。
これらの言語は原理的にはあらゆるGUIアプリケーションの制御に使用できますが、実際にはアプリケーションとオペレーティングシステムのサポートが必要なため、その使用は制限されます。ただし、この制限にはいくつかの例外があります。一部のGUIスクリプト言語は、ディスプレイ画面のピクセルからグラフィックオブジェクトを認識することに基づいています。これらのGUIスクリプト言語は、オペレーティングシステムやアプリケーションのサポートに依存しません。
IBM Workplace ShellのようにGUIが適切なインターフェースを提供している場合、 Object REXXなどの汎用スクリプト言語を使用してGUIスクリプトを作成できます。
アプリケーション固有の言語は、スタンドアロンベースのアプリケーション言語(実行可能ファイル)や内部アプリケーション固有言語(Adobe、Microsoft、Googleがそれぞれ実装した、広く普及しているスクリプトの例であるPostScript、XML 、gscriptなど)など、さまざまなカテゴリに分類できます。アプリケーション固有言語には、アプリケーションユーザーのニーズに合わせて調整された慣用的なスクリプト言語が含まれます。同様に、多くのコンピュータゲームシステムでは、ノンプレイヤーキャラクターやゲーム環境のプログラムされた動作を表現するために、独自のスクリプト言語を使用しています。このような言語は単一のアプリケーション向けに設計されており、表面上は特定の汎用言語( C言語をモデルにしたQuakeCなど)に似ているかもしれませんが、独自の機能によって区別されます。Emacs Lispは、 Lispの完全な機能を持つ方言ですが、Emacsの編集機能を拡張するのに最も役立つ多くの特別な機能を備えています。アプリケーション固有のスクリプト言語は、1つのアプリケーションに特化したドメイン固有プログラミング言語と見なすことができます。
アプリケーション固有のスクリプト言語を置き換える目的で、アプリケーションプログラムに組み込める言語が数多く開発されてきました。アプリケーションプログラマ(C言語などのシステム言語で作業する)は、スクリプト言語がアプリケーションを制御できる「フック」を組み込みます。これらの言語は技術的にはアプリケーション固有の拡張言語と同等かもしれませんが、アプリケーションに「共通」言語を組み込むことで、ユーザーはアプリケーション間でスキルを移転できるという利点を得られます。より汎用的な代替案としては、汎用言語がアプリケーションを制御するために使用できるライブラリ(多くの場合C言語ライブラリ)を提供するという方法があり、特定のドメインに合わせて言語を変更する必要はありません。
JavaScriptは、当初からウェブブラウザ内でスクリプトを作成するための言語として始まり、現在も主にその役割を果たしています。しかし、ECMAScriptとして標準化されたことで、汎用的な組み込み言語として広く普及しました。Mozillaが実装したSpiderMonkeyは、 Yahoo!ウィジェットエンジンなどの様々な環境や、 Adobe製品のFlash(ActionScript)やAcrobat ( PDFファイルのスクリプト作成用)といったアプリケーションに組み込まれています。
Tcl は拡張言語として作成されましたが、 Python、Perl、Rubyと同様の役割で汎用言語としてより頻繁に使用されるようになりました。対照的に、Rexx はジョブ制御言語として作成されましたが、拡張言語および汎用言語として広く使用されています。Perl は汎用言語ですが、Oracle Call Interface がコンパイルされたPerl 4 バイナリで構成される Oraperl (1990) 方言がありました。しかし、これはその後ライブラリ (Perl モジュール) DBD::Oracleに置き換えられました。[ 19 ] [ 20 ]
その他の複雑でタスク指向のアプリケーションでは、組み込みプログラミング言語を組み込んで公開することで、ユーザーがより高度なユーザーインターフェースでは実現できない、より多くの制御と機能を提供できるようにする場合があります。例えば、Autodesk Maya 3DオーサリングツールはMaya Embedded Languageを組み込んでおり、BlenderはPythonを使用して同様の役割を果たしています。
機能の追加や調整と実行のサイクルを高速化する必要がある他の種類のアプリケーション(ゲームエンジンなど)も、組み込み言語を使用します。開発中、これにより、ユーザーがアプリケーションの内部動作を詳細に理解したり、調整のたびにアプリケーションを再構築したりする必要なく(これにはかなりの時間がかかる場合があります)、より迅速に機能のプロトタイプを作成し、より自由に調整することができます。この目的で使用されるスクリプト言語は、より一般的で有名なLuaやPythonから、 AngelScriptやSquirrelなどのあまり知られていないものまで多岐にわたります。