
コンピューター科学において、スクリプトとは、通常は手作業で行われるプロセスを自動化する、比較的短く単純な命令セットを指します。スクリプトを書く行為はスクリプティングと呼ばれます。スクリプト言語またはスクリプト言語は、スクリプト作成に使用されるプログラミング言語です。 [ 1 ]
当初、スクリプトはオペレーティングシステムのシェルの自動化に限定されており、言語も比較的単純なものでした。今日では、スクリプトはより普及しており、一部のスクリプト言語には、アプリケーションソフトウェアの開発にも使用できる最新の機能が搭載されています。
スクリプト言語は、汎用プログラミング言語の場合もあれば、特定の環境に特化したドメイン固有言語の場合もあります。アプリケーションに埋め込まれる場合は、拡張言語と呼ばれることもあります。
スクリプト言語は、高度な抽象度で動作する場合は「超高水準プログラミング言語」と呼ばれることもあり、特にメインフレーム コンピュータ上のジョブ制御言語の場合は「制御言語」と呼ばれることもあります。
スクリプト言語という用語は、より広い意味で、動的な高水準プログラミング言語全般を指すために使用されることがあります。厳密にインタプリタ型の言語もあれば、コンパイル形式を用いる言語もあります。この文脈では、「スクリプト」という用語は、そのような言語で書かれた小さなプログラムを指します。通常、スクリプトは単一のファイルに収められており、コード行数は数千行以下です。
スクリプト言語の範囲は、小規模なものから大規模なものまで、また高度にドメイン特化型の言語から汎用プログラミング言語まで多岐にわたります。言語は、最初は小規模で高度にドメイン特化型であったものが、後に移植性の高い汎用言語へと発展することもあります。逆に、汎用言語が後にドメイン特化型の方言へと発展することもあります。
スクリプトは、一般的に次の属性を含む主観的な特性です。
スクリプトは通常、少なくとも通常の意味ではコンパイルされません。一般的に、スクリプトはソースコードから直接解釈されるか、バイトコードから解釈されるか、ジャストインタイムコンパイル後にネイティブとして実行されます。[ 5 ]
スクリプトは一般的に比較的短くシンプルです。サイズや複雑さに制限がないため、スクリプトの判断は主観的です。分岐のない数行のコードはスクリプトとみなされることが多いでしょう。一方、高度なユーザーインターフェースやハードウェアインターフェース、複雑なアルゴリズム、マルチプログラミングを実行する複数のファイルで構成されるコードベースは、スクリプトとはみなされない可能性が高いでしょう。
スクリプトは通常、人がより手動で実行するタスクを自動化します。
スクリプトを主目的とした言語は、汎用言語に比べて機能が制限される傾向があります。スクリプト言語には、複雑なアプリケーションを作成するための機能が不足している場合があります。
通常、スクリプトはコードの最初の行から実行を開始しますが、アプリケーションは通常、エントリ ポイントと呼ばれるコード内の特別なポイントから開始します。
例えば、Javaはスクリプトのような言語ではありません。アプリケーションは という関数から開始されますが、mainこの関数はコードの先頭にある必要はありません。次のコードは から始まりmain、printHelloWorldを呼び出して「Hello World」を出力します。
パブリッククラスHelloWorld {パブリック静的void printHelloWorld (){ System . out . println ("Hello World" ); }パブリック静的void main (String [] args ){ printHelloWorld (); } }対照的に、次のPythonmainコードは、Java で必要な関数やクラス定義などの他の構文 を使用せずに「Hello World」を出力します。
印刷( "Hello World" )スクリプトは、それを実行する人によって作成または変更されることが多いですが、[ 6 ]また、ゲームの大部分がスクリプト言語で書かれている場合(特にGoogle ChromeのT-rexゲーム)など、配布されることもよくあります。
初期のメインフレームコンピュータ(1950年代)は非対話型で、バッチ処理を採用していました。IBMのジョブ制御言語(JCL)は、バッチ処理を制御するために使用される言語の原型です。[ 7 ]
最初の対話型シェルは、1960 年代に最初のタイムシェアリングシステムをリモート操作できるように開発され、シェル スクリプトが使用されました。シェル スクリプトは、実行中のコンピュータ プログラムをコンピュータ プログラム (シェル) 内で制御します。Calvin Mooers は、 TRAC言語で、コマンド置換、つまりスクリプトにコマンドを埋め込む機能 (解釈されると、スクリプトに文字列を挿入する機能) を発明したと一般に考えられています。 [ 8 ] Multics では、これらの機能をアクティブ関数と呼んでいます。[ 9 ] Louis Pouzin は、 1964 年頃、CTSS用に RUNCOM と呼ばれるコマンド スクリプト用の初期のプロセッサを作成しました。MITのStuart Madnickは、1966 年に IBM のCP/CMS用のスクリプト言語を作成しました。彼は当初このプロセッサを COMMAND と呼び、後にEXECと改名しました。[ 10 ] Multics には、CTSS から派生した RUNCOM (これも RUNCOM と呼ばれます) が含まれていました。 [ 11 ]
TclやLuaなどの言語は、あらゆるアプリケーションに組み込むことができる汎用スクリプト言語として特別に設計されました。Visual Basic for Applications(VBA)などの言語は、基盤となるシステムの自動化機能との強力な統合性を提供しました。アプリケーションごとに新しい言語を開発するのではなく、このような汎用スクリプト言語を組み込むことには明らかな利点があり、アプリケーション開発者は言語変換ツールを一から開発する必要がなくなり、ユーザーは他の場所で習得したスキルを活用できるようになりました。
一部のソフトウェアには、複数の異なるスクリプト言語が組み込まれています。最近のウェブブラウザは通常、ブラウザ自体の拡張機能を作成するための言語と、ブラウザを制御するためのJavaScript ( ECMAScriptの一種)やXULなど、いくつかの標準的な組み込み言語を提供しています。
スクリプト言語はいくつかの異なるタイプに分類でき、タイプ間でかなりの重複があります。
スクリプティングは、オースターハウトの「大規模プログラミングと小規模プログラミング」の二分法に見られるように、システムプログラミングと対比されることが多い。この観点から見ると、スクリプティングはソフトウェアコンポーネントを繋ぐグルーコードであり、この目的に特化した言語はグルー言語と呼ばれる。パイプラインやシェルスクリプトはグルー言語の典型的な例であり、Perlも当初はこの役割を果たすために開発された。Web開発は、データベースとWebサーバーを繋ぐグルー言語の使用と考えることができる。しかし、相当量のロジックがスクリプトで記述されている場合、それは「グルー」ではなく、単なる別のソフトウェアコンポーネントとみなした方が適切である。
グルー言語は、次のようなものの作成と保守に特に役立ちます。
Glue言語の例:
オペレーティングシステムやアプリケーションコンポーネントに公開されているマクロ言語は、グルー言語として機能します。これには、 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のように、他のアプリケーションを提供するために裏で利用されることもあります。
スクリプト言語の主要なクラスは、システムプログラムの起動と動作の制御に関連するジョブ制御の自動化から生まれました[ 16 ](この意味で、シェルは、まさにこの目的で使用されていたIBMのJCL(ジョブ制御言語)の子孫であると考えることができます)。これらの言語のインタープリタの多くは、 UnixシェルやMS-DOSなどのコマンドラインインタープリタとしても機能します。AppleScriptなど、英語のようなコマンドを使用してスクリプトを作成することもできます。 COMMAND.COM
グラフィカル・ユーザー・インターフェースの登場により、コンピュータを制御するための特殊なスクリプト言語が登場しました。これらの言語は、人間のユーザーと同じように、グラフィックウィンドウ、メニュー、ボタンなどを操作します。これは、ユーザーの操作をシミュレートすることによって行われます。これらの言語は、通常、ユーザーの操作を自動化するために使用されます。このような言語は、キーの押下やマウスのクリック、タッチスクリーンのタップや押下をシミュレートすることで制御を行う場合、 マクロとも呼ばれます。
これらの言語は原理的にはあらゆるGUIアプリケーションを制御するために使用できますが、実際にはアプリケーションとオペレーティングシステムのサポートが必要となるため、その用途は限られています。ただし、この制限にはいくつかの例外があります。一部のGUIスクリプト言語は、ディスプレイ画面のピクセルからグラフィカルオブジェクトを認識することに基づいています。これらのGUIスクリプト言語は、オペレーティングシステムやアプリケーションのサポートに依存しません。
IBM Workplace Shellのように GUI が適切なインターフェースを提供する場合は、 Object REXXなどの汎用スクリプト言語を使用して GUI スクリプトを作成できます。
アプリケーション固有言語は、スタンドアロン ベースのアプリケーション言語 (実行可能ファイル) や内部アプリケーション固有言語 ( Adob e 、Microsoft、Googleがそれぞれ実装した、広く配布されているスクリプトの一部であるPostScript、XML 、 gscript ) など、さまざまなカテゴリに分けられます。その中には、アプリケーション ユーザーのニーズに合わせた慣用的なスクリプト言語も含まれます。同様に、多くのコンピューター ゲームシステムでは、カスタム スクリプト言語を使用して、ノン プレイヤー キャラクターやゲーム環境のプログラムされたアクションを表現しています。この種の言語は、単一のアプリケーション用に設計されています。表面的には特定の汎用言語 ( C をモデルにしたQuakeCなど) に似ている可能性がありますが、それらを区別するカスタム機能があります。 Emacs Lisp は、完全に形成された有能なLispの方言ですが、 Emacs の編集機能を拡張するために最も役立つ多くの特別な機能を備えています。アプリケーション固有スクリプト言語は、1 つのアプリケーションに特化したドメイン固有のプログラミング言語と見なすことができます。
アプリケーション固有のスクリプト言語を置き換え、アプリケーションプログラムに埋め込むことを目的として、多くの言語が設計されています。C言語などのシステム言語を使用するアプリケーションプログラマーは、スクリプト言語からアプリケーションを制御できる「フック」を組み込むことができます。これらの言語は技術的にはアプリケーション固有の拡張言語と同等かもしれませんが、アプリケーションに「共通」言語を埋め込むことで、ユーザーはアプリケーション間でスキルを流用できるという利点が得られます。より汎用的な代替案としては、特定のドメイン向けに言語を変更することなく、汎用言語でアプリケーションを制御できるライブラリ(多くの場合Cライブラリ)を提供するという方法があります。
JavaScriptは当初、そして現在も主にウェブブラウザ内でのスクリプト記述のための言語として使われてきました。しかし、ECMAScriptとして標準化されたことで、汎用的な埋め込み言語として普及しました。Mozillaの実装であるSpiderMonkeyは、 Yahoo Widgets Engineなどの様々な環境や、 Adobe製品のFlash(ActionScript)やAcrobat(PDFファイルのスクリプト記述用)などのアプリケーションに組み込まれています。
Tclは拡張言語として開発されましたが、 Python、Perl、Rubyと同様の役割を持つ汎用言語として使われることが多くなりました。一方、Rexxはジョブ制御言語として開発されましたが、拡張言語としても汎用言語としても広く使われています。Perlは汎用言語ですが、Oracle Call Interfaceが組み込まれたPerl 4バイナリであるOraperl(1990)方言を持っていました。しかし、これはその後、ライブラリ(Perlモジュール)DBD::Oracleに置き換えられました。[ 17 ] [ 18 ]
複雑でタスク指向のアプリケーションの中には、組み込みプログラミング言語を組み込んで公開することで、どんなに洗練されたユーザーインターフェースでも、ユーザーにより多くの制御と機能を提供することがあります。例えば、Autodesk Maya 3DオーサリングツールにはMaya Embedded Languageが組み込まれており、BlenderではPythonを使用してこの役割を果たしています。
より迅速な機能追加や調整と実行のサイクルを必要とする他の種類のアプリケーション(例:ゲームエンジン)でも、組み込み言語が使用されています。これにより、開発段階では、ユーザーがアプリケーションの内部動作を詳細に理解する必要なく、また調整のたびに再構築する必要もなく(かなりの時間がかかる場合があります)、より迅速に機能のプロトタイプを作成し、より自由に調整することができます。この目的で使用されるスクリプト言語は、より一般的で有名なLuaやPythonから、 AngelScriptやSquirrelなどのあまり知られていないものまで多岐にわたります。