言語をスクリプト言語にする理由は何ですか?「コンパイルされるのではなく、解釈されるとき」と言う人もいます。これにより、PHP(たとえば)はスクリプト言語になります。それが唯一の基準ですか?または他の基準はありますか?
40 に答える
単純。私が使うときは現代の動的言語ですが、あなたが使うときは単なるスクリプト言語です!
スクリプト言語は、他のことを「スクリプト化」する言語です。主な焦点は、主に独自のアプリを構築することではなく、既存のアプリを希望どおりに動作させることです。たとえば、ブラウザー用のJavaScript、MSOffice用のVBAなどです。
伝統的に、スクリプトとプログラミングの違いについて話すとき、スクリプトは解釈され、プログラムはコンパイルされます。言語は、解釈またはコンパイル (バイトコードまたはマシン コード) など、さまざまな方法で実行できます。これで言語が決まるわけではありません。
言語の使用方法がスクリプト言語であると考える人もいます (たとえば、主に C++ で開発するゲーム開発者は、Lua でオブジェクトのスクリプトを作成します)。繰り返しになりますが、境界線があいまいです。ある言語をある人がプログラミングに使用でき、同じ言語を別の人がスクリプト言語に使用できます。
これは、スクリプト言語に関するウィキペディアの記事からのものです。
スクリプト言語、スクリプト言語、または拡張言語は、1 つまたは複数のソフトウェア アプリケーションの制御を可能にするプログラミング言語です。「スクリプト」は、アプリケーションのコア コードとは異なります。通常は別の言語で記述され、多くの場合、エンド ユーザーによって作成されるか、少なくとも変更されるためです。スクリプトは多くの場合、ソース コードまたはバイトコードから解釈されますが、スクリプトが制御するアプリケーションは従来、ネイティブ マシン コードにコンパイルされます。スクリプト言語は、ほとんどの場合、制御するアプリケーションに組み込まれています。
「通常」、「頻繁に」、「伝統的に」、「ほぼ常に」の使用に気付くでしょう。これらはすべて、特定の言語を「スクリプト言語」にする明確な属性のセットがないことを示しています。
「台本は俳優に与えるものです。プログラムは観客に与えるものです。」-- ラリー・ウォール
これ以上の差はあまりないと思います。いわゆる「スクリプト」言語は、多くの場合、実行時に非常に迅速にコンパイルされます。また、一部の「プログラミング」言語は実行時にさらにコンパイルされ (JIT を考えてください)、「コンパイル」の最初の段階は構文チェックとリソース解決です。
こだわらないでください、それは本当に重要ではありません。
私の定義は、通常、バイナリではなくソースとして配布される言語です。
これには多くの可能な答えがあります。
まず、スクリプト言語はプログラミング言語であるため、スクリプト言語とプログラミング言語の違いの問題ではありません。別のプログラミング言語がスクリプト言語ではないのに、どの特性が一部のプログラミング言語をスクリプト言語にするのかという問題です。
第二に、XYZが「スクリプト」、「関数型プログラミング」、「オブジェクト指向プログラミング」、またはあなたが持っているものであるかどうかにかかわらず、XYZ言語が何であるかを言うのは本当に難しいです。「関数型プログラミング」とは何かの定義はかなり明確ですが、「関数型プログラミング言語」が何であるかは誰にもわかりません。
関数型プログラミングまたはオブジェクト指向プログラミングはプログラミングスタイルです。ほぼすべての言語で、機能スタイルまたはオブジェクト指向スタイルで記述できます。たとえば、Linux仮想ファイルシステムスイッチとLinuxドライバーモデルは、Cで記述されているにもかかわらず、オブジェクト指向ですが、Webで見られる多くのJavaまたはC#コードは非常に手続き型であり、オブジェクト指向ではありません。OTOH、私はいくつかの非常に機能的なJavaコードを見てきました。
では、関数型プログラミングとオブジェクト指向プログラミングが、どの言語でも実行できるスタイルにすぎない場合、「オブジェクト指向プログラミング言語」をどのように定義しますか?オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを可能にする言語であると言えます。しかし、それはあまり定義ではありません。すべての言語でオブジェクト指向プログラミングが可能です。したがって、すべての言語はオブジェクト指向ですか?つまり、オブジェクト指向スタイルでプログラミングする必要がある場合、言語はオブジェクト指向です。しかし、それもあまり定義ではありません。すべての言語で関数型プログラミングが可能であるため、オブジェクト指向の言語はありませんか?
だから、私にとって、私は次の定義を見つけました:
言語は、両方の場合、スクリプト言語(オブジェクト指向言語/関数型言語)です。
- スクリプティング(オブジェクト指向プログラミング/関数型プログラミング)を容易にします。つまり、スクリプティングを可能にするだけでなく、簡単で自然なものにし、それを支援する機能を含みます。
- スクリプティング(オブジェクト指向プログラミング/関数型プログラミング)に向けてあなたを励まし、導きます。
それで、5つの段落の後、私は「スクリプト言語はスクリプト用の言語です」に到達しました。なんて素晴らしい定義でしょう。いいえ。
明らかに、「スクリプト」の定義を確認する必要があります。
ここで3番目の問題が発生します。「関数型プログラミング」という用語は明確に定義されており、「関数型プログラミング言語」という用語だけが問題になりますが、残念ながら「スクリプト」という用語と「スクリプト言語」という用語の両方が問題になります。 "は明確に定義されていません。
まず、スクリプトはプログラミングです。それはただの特別な種類のプログラミングです。IOW:すべてのスクリプトはプログラムですが、すべてのプログラムがスクリプトであるとは限りません。すべてのスクリプトのセットは、すべてのプログラムのセットの適切なサブセットです。
私の個人的な意見では、スクリプトスクリプトを作成し、他の種類のプログラミングと区別するのは…
スクリプトは主にオブジェクトを操作します
- スクリプトによって作成されたのではなく、
- スクリプトに依存しないライフタイムを持ち、
- スクリプトのドメイン外に住んでいます。
また、使用されるデータ型とアルゴリズムは、通常、スクリプトではなく、外部環境によって定義されます。
シェルスクリプトについて考えてみましょう。シェルスクリプトは通常、ファイル、ディレクトリ、およびプロセスを操作します。システム上のファイル、ディレクトリ、およびプロセスの大部分は、現在実行中のスクリプトによって作成されたものではない可能性があります。そして、スクリプトが終了しても消えることはありません。それらの存続期間は、スクリプトから完全に独立しています。また、これらは実際にはスクリプトの一部ではなく、システムの一部でもあります。File
スクリプトを記述してクラスを開始したわけではありませんDirectory
。これらのデータ型は問題ではありません。それらが存在すると想定しているだけで、それらがどのように機能するかさえわかりません(知る必要もありません)。また、独自のアルゴリズムを実装することもありません。たとえば、find
独自の幅優先探索を実装する代わりに、ディレクトリトラバーサルを使用する場合などです。
つまり、スクリプトは、スクリプトとは独立して存在するより大きなシステムに接続し、システムの一部を操作してから終了します。
その大規模なシステムは、シェルスクリプトの場合はオペレーティングシステム、ブラウザスクリプトの場合はブラウザDOM、ゲーム(Luaを使用したWorldofWarcraftまたはLindenScriptingLanguageを使用したSecondLifeなど)、アプリケーション(AutoLispなど)になります。 AutoCADまたはExcel/Word / Officeマクロ用の言語)、Webサーバー、ロボットのパック、またはその他すべて。
スクリプトの側面は、プログラミング言語の他のすべての側面と完全に直交していることに注意してください。スクリプト言語は、強くまたは弱く型付けされるか、厳密または緩く型付けされるか、静的または動的に型付けされるか、名目上、構造的に型付けされるか、ダック型付けされる可能性があります。 。それは、命令型または機能的、オブジェクト指向、手続き型または機能的、厳密または怠惰である可能性があります。その実装は、解釈、コンパイル、または混合することができます。
たとえば、モンドリアンは、コンパイルされた実装を備えた、厳密に静的に型付けされた怠惰な機能スクリプト言語です。
ただし、スクリプト言語という用語が現実の世界で実際に使用されている方法は、上記のいずれとも関係がないため、これはすべて議論の余地があります。ほとんどの場合、それは単に侮辱として使用され、定義はかなり単純で、単純ですらあります。
- 実際のプログラミング言語:私のプログラミング言語
- スクリプト言語:プログラミング言語
これは、この用語が最も頻繁に使用される方法のようです。
それはポルノのようなものです。見ればわかります。スクリプト言語の唯一可能な定義は次のとおりです。
A language which is described as a scripting language.
少し円形ですね。(ちなみに、冗談ではありません)。
基本的に、言語をスクリプト言語にするものは、特にその作成者によってそのように呼ばれていること以外にはありません。最新のスクリプト言語の主なセットは、PHP、Perl、JavaScript、Python、Ruby、および Lua です。Tcl は、最初の主要な最新のスクリプト言語です (最初のスクリプト言語ではありませんでした。それが何であったかは忘れましたが、Tcl よりも前の言語であることを知って驚きました)。
私は論文で主要なスクリプト言語の機能について説明しています。
A Practical Solution for Scripting Language Compilers
Paul Biggar, Edsko de Vries and David Gregg
SAC '09: ACM Symposium on Applied Computing (2009), (March 2009)
ほとんどは動的に型付けされ、解釈され、リファレンス実装以外ではセマンティクスが定義されていません。ただし、主要な実装がコンパイルまたは JIT 化されたとしても、言語の「性質」は変わりません。
残っている問題は、新しい言語がスクリプト言語であるかどうかをどのように判断できるかということだけです。そうですね、スクリプト言語といえば、それは 1 つです。つまり、 Factorはスクリプト言語です (または、少なくともそれが作成された時点ではそうでした) が、Java はそうではありません。
「スクリプト言語」は、多くのことを意味する可能性のあるファジー概念の1つです。通常、これは、ソースコードから実行までの1つのステップのプロセスが存在するという事実を指します。
たとえば、Perlでは次のようにします。perl my_source.pl
上記の基準を考えると、PHPはスクリプト言語です(たとえば、Zend Encoderを使用してソースコードを「保護」する場合は、「コンパイル」プロセスを実行できます)。
PS。多くの場合(常にではありませんが)、スクリプト言語が解釈されます。また、多くの場合(ただし、常にではありません)、スクリプト言語は動的に型指定されます。
すべてのスクリプト言語はプログラミング言語です。厳密に言えば、違いはありません。
この用語は、言語の基本的な特性を指すのではなく、言語の典型的な使用法を指します。典型的な用途が、主に既存のコードへの呼び出しと、結果に対するいくつかの単純な処理を行う短いプログラムを作成することである場合 (つまり、典型的な用途がスクリプトを作成することである場合)、それはスクリプト言語です。
1区画は
- スクリプト = 動的に解釈
- 通常 = コンパイル済み
動的に解釈される言語は実行時に解釈されますが、コンパイルされた言語は実行前にコンパイルされます。
Jörgが指摘したように、解釈された/コンパイルされた区別は言語の機能ではなく、実行エンジンの機能であることを付け加えておきます。
このType systemの説明にも興味があるかもしれません。これは関連しており、実行エンジンではなく言語の側面に重点を置いています。ほとんどのスクリプト言語は動的に型付けされますが、「通常の」言語はほとんどが静的に型付けされます。
一般に、静的に型付けされた言語と動的に型付けされた言語の区分はより明確に定義されており、言語の使いやすさにより多くの影響を与えます。
Roberto Ierusalimschy 氏は、'Programming in Lua' で非常に良い回答または質問をしていると思います。
ただし、インタープリター言語の際立った特徴は、コンパイルされていないことではなく、コンパイラーが言語ランタイムの一部であるため、オンザフライで生成されたコードを実行することが可能 (かつ簡単) であることです。
スクリプト言語は元々、ハードプログラミング言語で記述されたアプリケーションの制御メカニズムとして考えられていました。コンパイルされたプログラムは実行時に変更できなかったため、スクリプトを使用することで柔軟性が得られました。
最も注目すべきは、シェルスクリプトがOSカーネル(従来はMacのAppleScript)のプロセスを自動化していたことです。ますますPerlの手に渡り、最近Pythonに渡された役割。レイトレーシングシーンを宣言するためにScheme(特にGuileの実装)が使用されているのを見てきました。そして最近、Luaはスクリプトゲームのプログラミング言語として非常に人気があります。多くの新しいゲームでハードコーディングされているのはグラフィック/物理エンジンだけですが、ゲームロジック全体はLuaでエンコードされています。同様に、JavaScriptはWebブラウザの動作をスクリプト化すると考えられていました。
解放された言語; 現在、OSをアプリケーションとして考える人は誰もいません(またはまったく考えていません)。以前はスクリプト言語であった多くの言語を使用して、独自の完全なアプリケーションを作成するようになりました。名前自体は無意味になり、別のシステム内から解釈されるように設計されているかどうかに関係なく、今日使用されている多くのインタプリタ言語に広まりました。
ただし、「スクリプト言語」は「解釈された言語」と同義ではありません。たとえば、BASICはその生涯のほとんどの間(つまり、略語を失ってVisual Basicになる前に)解釈されましたが、実際には誰もそれを次のように考えていません。スクリプト。
更新:ウィキペディアでいつものように資料を読んでください。
まず、プログラミング言語は「スクリプト言語」などではありません。それは「スクリプト言語」であったり、その他のものであったりします。
2 番目のポイントは、言語の実装者が、それがスクリプト言語かどうかを教えてくれることです。
あなたの質問は、「スクリプト言語とプログラミング言語の違いは何ですか?」ではなく、「プログラミング言語はどのような実装でスクリプト言語と見なされますか?」と読む必要があります。間はありません。
それでも、ある種のミドルウェアを提供するために使用される言語は、スクリプト言語と見なします。たとえば、私は JavaScript のほとんどの実装をスクリプト言語と考えています。JavaScript がブラウザーではなく OS で実行された場合、それはスクリプト言語ではありません。PHP が Apache 内で実行される場合、それはスクリプト言語です。コマンドラインから実行する場合は、そうではありません。
私は、スクリプト言語を、あからさまな重量感のある「コンパイル」ステップを必要としないものと見なしています。プログラマーの観点から見た主な機能は、コードを編集してすぐに実行できることです。
したがって、私は JavaScript と PHP をスクリプト言語と見なしますが、ActionScript 3 / Flexはそうではありません。
通常、スクリプト言語は次のとおりです。
- 動的型付け
- 解釈され、パフォーマンスはほとんど重視されていませんが、移植性は良好です
- 必要な定型コードが大幅に減り、非常に迅速なプロトタイピングにつながります
- 小さなタスクに使用され、1 つのファイルを作成して便利な「スクリプト」を実行するのに適しています。
1. 静的に型付けされる 2. パフォーマンスを重視してコンパイルされる 3. より多くのボイラープレート コードが必要になるため、プロトタイピングが遅くなりますが、可読性と長期的な保守性が向上します 4. 大規模なプロジェクトに使用され、多くのプロジェクトに適応しますデザインパターン
しかし、私の意見では、今日では歴史的な違いです。Javascript と Perl は小さくて単純なスクリプトを念頭に置いて作成されましたが、C++ は複雑なアプリケーションを念頭に置いて作成されました。しかし、両方ともどちらの方法でも使用できます。そして、多くのプログラミング言語は、現代のものも古いものも同様に、境界線をあいまいにしています (そして、そもそもあいまいでした!)。
悲しいことに、「スクリプト言語」と認識されているものを嫌う開発者を何人か知っています。私の意見では、古い決まり文句です。仕事には適切なツールを使用してください。
スクリプト言語は、多くの人が離れていく用語であると私は提案できますか。今日では、ほとんどがコンパイル型言語と動的言語に要約されていると思います。
つまり、Pythonのようなものを実際に言うことはできません。または、Rubyはこの時代の「スクリプト」言語です(IronPythonやJIT-your-favourite-languageのようなものもありますが、違いはさらに曖昧になっています)。
正直なところ、個人的にはPHPがスクリプト言語であるとは感じていません。私は人々が彼らの履歴書で言うJavaとは異なってPHPを分類することを好むとは思わないでしょう。
先に進み、重複した質問から回答を移行します
「スクリプト言語」という名前は、非常に特定の役割に適用されます。つまり、既存のソフトウェア アプリケーションに送信するコマンドを記述する言語です。(従来のテレビや映画の「台本」のように)
たとえば、むかしむかし、HTML Web ページは退屈なものでした。それらは常に静的でした。ある日、Netscape は、「ねえ、ブラウザにページ内の小さなコマンドを読み取らせて動作させたらどうだろう?」と考えました。そして、Javascriptが形成されました。
シンプルな JavaScript コマンドはalert()
、Web ページを読み込んでいるブラウザ (ソフトウェア アプリ) に警告を表示するように指示/命令するコマンドです。
さて、ブラウザがアラートを表示するために実際に使用alert()
するC++またはその他のコード言語に何らかの形で関連していますか? もちろん違います。.html ページに "alert()" と書いている人は、ブラウザーが実際にどのようにアラートを表示するかを理解していません。彼はブラウザが解釈するコマンドを書いているだけです。
簡単な JavaScript コードを見てみましょう
<script>
var x = 4
alert(x)
</script>
これらは、ブラウザがそれ自体で解釈するために、ブラウザに送信される命令です。実際に変数を 4 に設定し、それをアラートに設定するためにブラウザが通過するプログラミング言語は、javascript とはまったく関係ありません。
最後の一連のコマンドを「スクリプト」と呼びます (<script>
タグで囲まれているのはそのためです)。伝統的な意味での「スクリプト」の定義によると、アクターに送信される一連の指示とコマンド。たとえば、脚本 (映画の台本) が台本であることは誰もが知っています。
脚本(スクリプト)は、俳優でもカメラでも特殊効果でもありません。脚本は彼らに何をすべきかを伝えるだけです。
では、スクリプト言語とは正確には何ですか?
ツールボックスのさまざまなツールのようなプログラミング言語がたくさんあります。一部の言語は、スクリプトとして使用するために特別に設計されました。
Javasript は明らかな例です。スクリプトの領域に入らない Javascript のアプリケーションはほとんどありません。
ActionScript (Flash アニメーション用の言語) とその派生物は、Flash プレーヤー/インタープリターにコマンドを発行するだけのスクリプト言語です。確かに、オブジェクト指向プログラミングなどの抽象化はありますが、これらはすべて、フラッシュ プレーヤーにコマンドを送信するという目的を達成するための単なる手段にすぎません。
Python と Ruby は、スクリプト言語としても一般的に使用されています。たとえば、Ruby を使用して、「このサイトにアクセスし、このリンクをクリックしてください...」という行に沿ったコマンドをブラウザーに送信して、基本的な自動テストを行う会社で働いていました。その仕事では、私は決して「ソフトウェア開発者」ではありませんでした。コマンドをコンピューターに送信してブラウザーにコマンドを送信するスクリプトを作成しました。
その性質上、スクリプト言語が「コンパイル」されることはめったにありません。つまり、マシン コードに変換され、コンピュータによって直接読み取られます。
Python や Ruby から作成された GUI アプリケーションでさえ、C++ または C で記述された API に送信されるスクリプトです。C アプリに何をすべきかを指示します。
もちろん、あいまいな線があります。Machine Language/C がスクリプト言語であると言えないのはなぜですか? それらはコンピューターが基本的なマザーボード/グラフィック カード/チップとのインターフェイスに使用するスクリプトだからです。
明確にするために描くことができるいくつかの線があります:
スクリプト言語を作成して「コンパイル」せずに実行できる場合、それは直接スクリプトのようなものです。たとえば、俳優に何をすべきかを伝えるために、脚本で何もする必要はありません。すでにある、使用されている、そのままの状態です。このため、コンパイルされた言語は、場合によってはスクリプトの目的で使用できる場合でも、スクリプト言語と呼ばれることから除外します。
スクリプト言語は、複雑なソフトウェア アプリケーションに送信されるコマンドを意味します。それが、スクリプトを作成するそもそもの理由です。そのため、ソフトウェアがコマンドを送信する仕組みの複雑さを知る必要はありません。そのため、スクリプト言語は、(比較的) 単純なコマンドを複雑なソフトウェア アプリケーションに送信する言語である傾向があります。この場合、機械語とアセンブリ コードは役に立ちません。
私の意見では、PHP、Ruby などの動的に解釈される言語は、依然として「通常の」言語であると言えます。「スクリプト」言語の例としては、bash (または ksh や tcsh など) や sqlplus などがあります。これらの言語は、多くの場合、システム上の既存のプログラムを一連の一貫した関連コマンドにまとめるために使用されます。
- A.txt を /tmp/work/ にコピーします
- データベース サーバーで夜間のクリーンアップ プロセスを実行する
- 結果をログに記録し、sysdamin に送信します
ですから、違いは(とにかく、私にとっては)言語の使用方法にあると言えます。PHP、Perl、Ruby などの言語は「スクリプト言語」として使用できますが、通常は「通常の言語」として使用されます (Perl は両方の方法で使用されるようです)。
「スクリプト言語」という用語は、労力を軽減すると思うので、使用しない方がいいと思います。「スクリプト言語」と呼ばれることが多いPerlのような言語を考えてみましょう。
- Perlはプログラミング言語です!
- PerlはJavaやC++のようにコンパイルされます。コンパイルがはるかに高速になりました。
- Perlには、オブジェクトと名前空間およびクロージャがあります。
- Perlには、IDEとデバッガーおよびプロファイラーがあります。
- Perlにはトレーニングとサポートとコミュニティがあります。
- Perlは単なるWebではありません。Perlは単なるシステム管理者ではありません。Perlはインターネットの単なるダクトテープではありません。
コンパイルされたJavaのような言語とコンパイルされていないRubyを区別する必要があるのはなぜですか?ラベリングの価値は何ですか?
詳細については、 http: //xoa.petdance.com/Stop_saying_scriptを参照してください。
スクリプト言語は、既存のプログラムを構成または拡張する言語です。
スクリプト言語はプログラミング言語です。
スクリプト言語は、通常、プログラムが読みやすいテキスト形式でエンド ユーザーに配布され、そのプログラムを直接実行できると思われるプログラムが存在するプログラミング言語です。(プログラムはスクリプトを内部的にコンパイルする場合があります。ユーザーには表示されないため、ここでは関係ありません。)
スクリプト言語が、ユーザーがプログラムを入力するだけですぐに実行できるインタラクティブなセッションをサポートできることは比較的一般的です。これは、これが最初の段落の必須要件の自明な拡張であるためです。主な追加要件は、実行エンジンに送信できるように、入力されたステートメントがいつ完了するかを判断するメカニズムの追加です。
スクリプト言語は、スクリプトが実行されるたびに解釈される言語です。これは、インタープリターを持つことを意味し、ほとんどは非常に人間が読める形式であり、スクリプト言語を習得して使用するのは簡単です。
すべてのコンパイル可能な言語はスクリプト言語にすることができ、その逆も同様です。たとえば、C++ にはインタープリターがあるため、スクリプト言語と呼ぶことができるため、インタープリターまたはコンパイラーの実装に依存します (C++ として一般的にはあまり実用的ではありません)。は非常に複雑な言語です)、現在最も有用なスクリプト言語の 1 つは Python...
したがって、あなたの質問に答えるために、定義は、インタープリターを使用して迅速かつ簡単にスクリプト化されたプログラムを実行し、単純なタスクまたはプロトタイプ アプリケーションに対処することです。スクリプト言語の最も強力な使用方法は、すべての使用にコンパイルされたアプリケーション。
質問に対する少し異なる見方について。スクリプト言語はプログラミング言語ですが、プログラミング言語は必ずしもスクリプト言語ではありません。スクリプト言語は、システムを制御またはスクリプト化するために使用されます。そのシステムは、スクリプト言語が bash であるオペレーティング システムである可能性があります。システムは、スクリプト言語である PHP を使用した Web サーバーである可能性があります。スクリプト言語は、特定のニッチを埋めるように設計されています。それらはドメイン固有の言語です。対話型システムはスクリプト言語を解釈して、スクリプト言語が解釈されるという概念を生み出しました。ただし、これはシステムの結果であり、スクリプト言語自体ではありません。
「スクリプト言語」の定義はかなりあいまいです。私は次の考慮事項に基づいています。
通常、スクリプト言語には、ユーザーに表示されるコンパイル手順はありません。通常、ユーザーは 1 つの簡単なコマンドでプログラムを実行できます。
スクリプト言語のプログラムは、通常、ソース形式で渡されます。
通常、スクリプト言語には多数のシステムに存在するランタイムがあり、ランタイムはほとんどのシステムに簡単にインストールできます。
スクリプト言語は、マシン固有ではなく、クロスプラットフォームである傾向があります。
スクリプト言語を使用すると、他のプログラムの呼び出しやオペレーティング システムとのインターフェイスが簡単になります。
通常、スクリプト言語は、従来型のプログラミング言語で記述された大規模システムに簡単に組み込むことができます。
スクリプト言語は通常、プログラミングを容易にするために設計されており、実行速度はあまり考慮されていません。(高速な実行が必要な場合の通常のアドバイスは、時間のかかる部分を C などでコーディングし、言語を C に埋め込むか、言語から C ビットを呼び出すことです。)
上記の特徴のいくつかは実装に当てはまります。その場合、より一般的な実装について言及しています。(AFAIK)明らかなコンパイル手順がないCインタープリターがありましたが、ほとんどのC実装には当てはまりません。確かに、Perl プログラムをネイティブ コードにコンパイルすることはできますが、それは通常の使用方法ではありません。他のいくつかの特徴は本質的に社交的です。上記の基準の一部は、多少重複しています。おっしゃる通り、定義があいまいです。
スクリプト言語は、より大きなアプリケーションの一部であるスクリプトエンジン内で実行される傾向があります。たとえば、JavaScriptはブラウザのスクリプトエンジン内で実行されます。
スクリプト言語は、それ自体が定義していないエンティティを頻繁に操作する言語だと思います。たとえば、JavaScriptはブラウザによって提供されるDOMオブジェクトを操作し、PHPはCベースの関数の膨大なライブラリを操作します。もちろん、正確な定義ではなく、それを考える方法です。
スクリプトは比較的小さなプログラムです。システムは、比較的大きなプログラム、または比較的大きなプログラムの集合です。
一部のプログラミング言語は、言語設計者とプログラミングコミュニティが、比較的小さなプログラムを作成するときに役立つと考える機能を使用して設計されています。これらのプログラミング言語は、PHPなどのスクリプト言語として知られています。
同様に、他のプログラミング言語は、言語設計者とプログラミングコミュニティが、比較的大規模なプログラムを作成するときに役立つと考える機能を使用して設計されています。これらのプログラミング言語は、Javaなどのシステム言語として知られています。
現在、大小のプログラムはどの言語でも書くことができます。小さなJavaプログラムはスクリプトです。たとえば、Javaの「HelloWorld」プログラムはスクリプトであり、システムではありません。PHPで書かれた大きなプログラム、またはプログラムのコレクションはシステムです。たとえば、PHPで記述されたFacebookはシステムであり、スクリプトではありません。
単一言語の機能を、その言語がスクリプトまたはシステムプログラミングに最適かどうかを判断するための「リトマス試験」と見なすことには疑問があります。たとえば、スクリプトをバイトコードまたはマシンコードにコンパイルしたり、直接抽象構文木(AST)解釈によって実行したりできます。
したがって、言語は、通常、スクリプトの記述に使用される場合、スクリプト言語です。スクリプト言語を使用してシステムを作成することもできますが、そのようなアプリケーションは疑わしいと見なされる可能性があります。
プログラミング言語の概念におけるロバート・セベスタの言い換え:
スクリプト言語は、スクリプトと呼ばれるコマンドのリストを実行するファイルに入れることによって使用されます。sh (シェル用)という名前のこれらの言語の最初のものは、ファイル管理や単純なファイルフィルタリングなどのユーティリティ機能を実行するシステムサブプログラムへの呼び出しとして解釈されるコマンドの小さなコレクションとして始まりました。これに基づいて、変数、制御フローのステートメント、関数、およびその他のさまざまな機能が追加され、その結果、完全なプログラミング言語が作成されました。
そして、AWK、Tcl / Tk、Perlのような例があります(これは、最初はshとAWKの組み合わせでしたが、非常に強力になったため、彼はそれを「奇妙ですが本格的なプログラミング言語」と見なしています)。他の例には、CGIやJavaScriptが含まれます。
あなたの基準はほぼ正しいように聞こえますが、常に少し曖昧です。たとえば、Javaは(バイトコードに)コンパイルされてから(JVMによって)解釈されます。ただし、通常はスクリプト言語として分類されていません。
これは、Javaが静的に型付けされていることが原因である可能性があります。JavaScript、Ruby、Python、Perlなどはそうではありません(これらはすべてスクリプト言語と呼ばれることがよくあります)。
私は常に、スクリプト言語をある種のアプリケーションまたはプログラムと通信するための手段と見なしていました。対照的に、コンパイルされた言語は実際にプログラム自体を作成します。
ここで、スクリプト言語は通常、コンパイルされた言語で最初に作成されたプログラムに追加または変更することに注意してください。したがって、それは確かに全体像の一部になる可能性がありますが、最初のバイナリはコンパイルされた言語で最初に作成されます。
そのため、ユーザーがさまざまなアクションを実行したり、プログラムをカスタマイズしたりできるスクリプト言語を作成できました。私のプログラムは、スクリプト化されたコードを解釈し、何らかの関数を呼び出します。これは単なる基本的な例です。プログラム内でルーチンを動的に呼び出す方法を提供するだけです。
私のプログラムは、スクリプト化されたコード (これらをコマンドと呼ぶことができます) を解析し、意図したアクションをリアルタイムで実行する必要があります。
この質問はすでに何度か回答されていますが、物事の見方をミックスに追加すると思いました。確かに、この答えに同意しない人もいるかもしれませんが、この考え方は常に私を助けてくれました.
簡単に言うと
スクリプト言語は、別のプログラム内で実行されます。スクリプト言語はコンパイルされません。スクリプト言語は使いやすく、簡単に記述できます。しかし…</p>
非常に一般的なプログラミング言語 (Java、C#) は、スクリプト言語のように「親」プログラム内で実行されます。今日のスクリプト言語は、複雑なソフトウェアの構築に使用されています。最近のコンピューターは非常に高速であり、スクリプト言語は非常に効率的であるため、ほとんどのビジネス オペレーションでは、コンパイルされたプログラミング言語では (かつてはあった) 実質的な速度の利点はありません。
他の誰かが指摘したように、どの言語もコンパイルまたは解釈できるため、コンパイルまたは解釈された言語などはありません。しかし、伝統的にコンパイルではなく解釈されてきた言語 (Python、Perl、Ruby、PHP、JavaScript、Lua) も、スクリプト言語と呼ばれる傾向にあります。したがって、スクリプト言語は、コンパイルされるのではなく、一般的に解釈される言語であると言うのは比較的合理的です。スクリプト言語に共通するその他の特徴は、それらが解釈されるという事実に関連しています。
スクリプト言語は、実際にはプログラミング言語のサブセットです。先に述べた言語のいずれかがプログラミング言語でもないと主張する人はほとんどいないと思います。
CPUで実行しない/実行しない場合、それは私にとってスクリプトです。プログラムの下の CPU でインタープリターを実行する必要がある場合、それはスクリプトおよびスクリプト言語です。
これ以上複雑にする理由はありませんか?
もちろん、ほとんど (99%) の場合、言語がスクリプト言語かどうかは明らかです。ただし、たとえば、VM が x86 命令セットをエミュレートできることを考慮してください。VM で実行すると、x86 バイトコードがスクリプト言語になるのではないでしょうか? perl コードをネイティブ実行可能ファイルに変換するコンパイラを誰かが書いたらどうなるでしょうか? この場合、言語自体を何と呼べばよいかわかりません。重要なのは言語ではなく、アウトプットです。
繰り返しになりますが、私はこのようなことが行われたことを認識していないので、今のところ、インタープリター言語をスクリプト言語と呼ぶことに抵抗はありません。
私が知っている注目に値する情報源によってこのトピックについて書かれた最も一般的に知られているエッセイは、Ousterhout の二分法と呼ばれています。それはかなり恣意的であるとして非常に批判されており、しばしば冗談めかして Ousterhout の誤った二分法と呼ばれます。それは引用に値するトピックについての議論で言われています.
個人的には、これは誤った二分法であり、スクリプト言語を定義するものに関して確固たる特性を持つことを提案するこの質問に答える人を信用できないことに同意します。「スクリプト言語は動的に型付けされなければならない」などのコメントは誤りであり、「スクリプト言語は解釈されなければならない」などのコメントは意味をなしません。なぜなら、一般的な信念に反して、コンパイルと解釈は言語の特性ではないからです。
スクリプト言語に大まかに一致するものとして上で述べた多くのプロパティがありますが、ありがたいことに、それらのほとんどは、この用語に厳密な定義がないことを適切に説明しています。したがって、ここにあるものについての私の考えを複製するつもりはありません。私の経験では、ボイラープレートをあまり書かずに簡単な使い捨てプログラムを簡単に書くことができる言語をスクリプト言語と考える人がいます。私は主に、ここには表示されていない Ousterhout への引用を提供するために答えています.
Java でさえ、C で実装されているため、「スクリプト言語」です」
mgb のほぼ完璧な回答を改善しようとするのは躊躇しますが、実装に関しては C に勝るものはありませんが、言語はかなり低レベルでハードウェアに近いものです。確かに純粋な天才ですが、現代の SW を開発するには、いわば C の肩の上に立つ高レベルの言語が必要です。
つまり、Python、Ruby、Perl、そしてもちろん Java もすべて C で実装されています。Java をスクリプト言語と呼んで侮辱する人はいませんが、実際はそうです。強力で、現代的で、動的で、反射的で、何とか何とか何とか言語が必要な場合は、おそらくRubyのようなものを実行しており、Cで直接解釈されるか、Cプログラムによって解釈/ JITコンパイルされるものにコンパイルされます。
人々が行う他の区別は、動的型付け言語を「スクリプト言語」と呼ぶことです。