スクリプト言語と通常のプログラミング言語の違いは何ですか?


20

プログラミング言語とスクリプト言語の違いは何ですか?たとえば、CとPerlを検討してください。

スクリプト言語がインタープリターのみを必要とし、コンパイルとリンクを必要としないという唯一の違いはありますか?


4
これはここではオフトピックだと思います。知りたいことは、純粋に言語の実装の問題です。また、浅い/意見の答え(あなた自身のせいではない)を引き付けるようです。これは常に赤旗です。
ラファエル

ハードウェアは、コンパイルされた言語の「インタープリター」です。唯一の違いは、通過するインタープリターの数です。マシンがチューリングと同等であり、チューリングと同等の言語を使用している場合、コンパイル済みのインタープリターAをその言語で作成し、インターBプリターAが実行可能な言語でインタープリターを作成し、次にCインタープリターBが実行可能な言語でインタープリターを作成できます本質的に、それはすべて間接的な問題であり、これは計算の理論的根拠に起因するものではなく、実際の工学的懸念に関係するものです。
Patrick87

給与(DevOps以前)
Phil Lello

回答:


21

その違いは、その言語の意図された使用ともっと関係があると思います。

たとえば、Pythonは解釈され、Prologのようにコンパイルとリンクを必要としません。これらの両方をプログラミング言語として分類します。

プログラミング言語は、ソフトウェアを作成するためのものです。大規模プロジェクトを管理するように設計されています。彼らはおそらくプログラムを呼び出したり、ファイルを読んだりできますが、スクリプト言語ほど優れていないかもしれません。

スクリプト言語は、大規模なソフトウェア開発用ではありません。構文、機能、ライブラリなどは、小さなタスクを迅速に実行することに焦点を当てています。これは、プログラミング言語よりも「ハック的」である場合があり、すべての優れた機能を備えているとは限らないことを意味します。これらは、一連のファイルの反復処理やsysadminタスクの実行など、一般的に実行されるタスクを自動化するように設計されています。

たとえば、Bashは算術演算をうまく行いません。そのため、大規模なソフトウェアを書くのは恐ろしいことでしょう。

一種のベンチマークとして、おそらくできるとしても、perlで音楽プレーヤーを書くことは決してないでしょう。同様に、C ++を使用して特定のフォルダー内のすべてのファイルの名前を変更することは決してありません。

この線はぼやけたものになりつつあります。定義上、「スクリプト」言語であるJavaScriptは、ソフトウェアの領域にある「Webアプリ」の開発にますます使用されています。同様に、Pythonは当初、スクリプト言語の特徴の多くに適合していましたが、Pythonを主なプラットフォームとして使用して開発されたソフトウェアがますます増えています。


1
実際の例の+1:C ++を使用してバッチ名変更タスクを実行することを強制されることは想像できません!
ケーシークーボール

3
概念的な違いは述べず、それぞれのユースケースに関する一般的な意見のみを述べます。
ラファエル

3
また、スクリプト言語で世界最大のソーシャルネットワーク(PHPのFB)、トレンド全体(PerlのLJ)を促進する最初のブログサービスの1つ、数千人の開発者が簡単に共同作業できるバージョン管理システム(「Mercurial Pythonで)?申し訳ありませんが、この「スクリプティングは小さなタスク用です」というのは、流行りのごみです。
オレグV.ボルコフ

1
@Raphael概念的な違いはせいぜい曖昧だと思います。主な違いは、一般的な使用法であるIMOです。これらの言語のほとんどはチューリング完全であり、同様の計算モデルに従います。正式な区別や定義に出くわしたことは一度もありませんが、答えがあれば、自由に編集してください。
jmite

3
@Raphaelそれはポイントの一部です:概念的な違いはありません。コンパイルvsランタイムでできることは、主にインタープリターvsコンパイルの問題であり、それは言語ではなく実装の特性です(ただし、言語設計は特定の実装モデルを難しくする可能性があります)。
ジル「SO-悪であるのをやめる」

6

スクリプト言語に関する古典的な記事は、John K. OusterhoutのScripting: Computer 31(3)、1998に掲載された21世紀の高レベルプログラミングです。もう一方。

Ousterhoutは、システムプログラミング言語が、プログラミング用の機械言語を置き換えるために進化したと特徴づけました。これらは、レジスタの割り当てやサブルーチン呼び出しシーケンスなどの退屈な詳細を隠し、ループやその他の一般的な制御フローのイディオムを記述するための単純な構造を提供し、型付け規則を実施します。それらは通常(前の)コンパイラによって実装されます。これらの言語は、ソフトウェアをゼロから作成するためのものです。例は、C、C ++、およびJavaです。

対照的に、Ousterhout氏によると、スクリプト言語は、システムプログラミング言語で書かれた有用なプログラムが既に存在するという前提から始まります。Perl、Python、Tcl、Visual Basic、Unixシェルなどのスクリプト言語は、これらの既存のプログラムを新しいプログラムに結合するためのツールを提供します。Ousterhoutは、スクリプト言語を「型なし」(多くの場合、動的型付けと呼ぶものを含む)、および急速な開発を強調すると特徴付けました。それらは通常、インタープリターによって実装されます。

ここで、1人の著者の概念モデルが信頼できると仮定しないように注意する必要があります。私たちコンピューター科学者はすべての用語に正確な定義を与える数学者であるふりをしたが、実際にはほとんどのコンピューティング用語はファジーで不均一な意味で社会的に構築されています。ほとんどの用語について非常に高いレベルで大まかなコンセンサスがありますが、詳細は多くの場合誰が書いているかに依存します。したがって、彼の記事、私の答え、および他のすべての答えをここに大量の塩で取ります。

私は個人的に「通常の」プログラミング言語の存在に異議を唱えます。あなたがそれを質問の中で言います。ただし、伝えようとしている概念は、Ousterhoutのシステムプログラミング言語にほぼ対応していると思います。


2

すべてのスクリプト言語もプログラミング言語です。その逆は真実ではありません。「インタプリタのみを必要とする」言語は、インタプリタ言語ですコンパイルされた言語とは対照的に、Javaなどの一部の言語は両方のカテゴリに分類されることに注意してください)。

スクリプト言語として分類されている言語は、「接着剤」言語として有用であることを意味します。スクリプトはフル機能のプログラムではない傾向がありますが、代わりに他のソフトウェア間のギャップを埋めます。

スクリプトは通常、複数のプログラムを接続したり、非常に迅速/簡単に簡単なタスクを実行したり、パフォーマンスと安全性の懸念が低レベルの言語に抽象化された組み込み環境でも使用されます。スクリプト言語は、開発時間の短縮に重点を置いている傾向があるため、ほとんどの理由が解釈され、非常に高いレベルにあります。


概念的な違いは述べず、それぞれのユースケースに関する一般的な意見のみを述べます。
ラファエル

1

「スクリプト言語」のセットは、「プログラミング言語」のセットのサブセットです。CとPerlの違いは、システムプログラミング言語とアプリケーション言語、およびインタープリター言語とコンパイル済み言語の違いです。

システムプログラミング言語は低レベルであり、メモリ管理、予測可能なIOなどを指向しています。アプリケーション言語は、「ファイルから設定を読み取る」、「設定に従ってソケットを開いて要求を処理する」などの高レベルの問題を迅速に解決することを目指しています。

したがって、アプリケーション言語はシステム言語よりもはるかに高レベルになる傾向があります。つまり、大量の組み込み抽象化とヘルパー機能を提供し、多くの場合、何らかの自動メモリ管理を追加します。

コンパイルされた言語のプログラムは、プログラムの実行前に完全にいくつかのコードに処理されます。スクリプト言語は、実行プロセスで動的に翻訳され、多くの場合、動的コード生成とソースコード付きファイルを含む機能を備えています。

したがって、すべてのスクリプト言語はアプリケーション言語ですが、逆は当てはまりません。スクリプト言語には通常、言語自体の観点から実装するのが実用的ではない機能が含まれているため、システム言語は常にコンパイルされた言語です。ただし、スクリプト(解釈)とコンパイルの違いは実装に関するものです。haskellのように、一部の言語では両方のタイプの実装が存在する場合があります。


この解釈/コンパイルされた二分法を描くのは間違いだと思います。確かにセットには空でない交差点がいくつかありますが、それはサブセット関係だとは思いません。同様に、高レベルと低レベルは区別を正確に説明していません。Prologは非常に高レベルですが、bashまたはjavaスクリプトのようなスクリプト言語ではありません。
-jmite

1

その他は、スクリプト言語と非スクリプト言語に関連する傾向がある属性をカバーしています。彼らは用語「スクリプト言語」を使う場合には、人々が何を意味するかについての感覚を得るために役立つのですが、私はそれがあることを理解することが重要だと感じ単に何もきちんと境界定義されていないがあります:二つの知識がある人は、特定の言語Xがあるかどうかについて同意できスクリプト言語。それにも関わらず、「スクリプト言語」という用語は、境界の内側または外側にある言語について幅広い合意があるため、実用性があります。

「ファミリーカー」と「スポーツカー」、または「雑誌」と「新聞」を比較してください。すべての家族の車を一般化可能なすべてのスポーツカーと区別するための100%信頼できるルール(基本的には、各カテゴリのすべての既存の車を列挙することではないことを意味する)と少なくとも潜在的に客観的な(すべての人に受け入れられるという意味です)。しかし、決定するのが難しいケースもありますが、多くの車は明らかに1つのカテゴリに属し、他のカテゴリにはないため、これらの用語は実際には依然として有用です。


0

まだ言及していない違いは、意図したとおりに使用した場合、ほとんどのスクリプトの実行時間は「巨視的」操作に支配され、微視的操作のパフォーマンスは全体の実行時間に大きな影響を与えないことです。たとえば、レイトレーシングアニメーションプログラムに「レンダリングイメージ」ステートメントを含むスクリプト言語が含まれている場合、240フレームのアニメーションを生成するスクリプトは「レンダリングイメージ」ステートメントで4時間かかり、合計4秒でほかのすべて。レンダリングエンジン以外のすべてを100万倍高速化しても、レンダリングエンジンを0.1%高速化するよりも全体的なパフォーマンスへの影響は小さくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.