プログラミング言語とマークアップ言語とスクリプト言語


38

これまで、私はこれら3つの主要な違いを知りません。誰かにこれについて尋ねられたとき、私はC#がプログラミング言語であり、HTMLとXMLがマークアップ言語であり、JavaScriptとVBScriptがスクリプト言語であると言うだけです。しかし、それらを互いに区別する主な違いは何ですか?


言語のクエリを忘れないでください!
カイルデラニー

回答:


38

これら3種類の言語の境界線を見つけてみましょう。もちろん、これは単なる私の意見であるため、多数の例外と反例があります。

  • マークアップ言語は、「これらのユーザー名を箇条書きリストまたは表として表す」など、データの表示を制御するために使用されます。

  • スクリプト言語は、データを生成するためにプログラム間仲介するために使用されます。これは、bashのようなシェルスクリプト言語に特に当てはまりますが、それについて考えると、PythonまたはPerlも、Cでプログラムを作成せずにUNIXでタスクを実行する必要性から生じました。は、言語自体のインタープリターであり、一般的なタスクを実行します。対話する他の典型的なプログラムは、データベースサーバーまたはWebサーバーです。

    ユーザーリストのメタファーに戻って、スクリプト言語で、データベースに「すべてのユーザー名を指定してください」と尋ね、次にWebサーバーに「このユーザーリストをこの要求者に送信する」と尋ねます。

  • データの変換にはプログラミング言語が使用されます。これは、入力データを出力に書き換えるCPU命令を作成することにより行われます。うまくいけば、目的の出力。データの変換の例は、多数の加数から合計を計算するか、一連の条件から微分方程式系を解くか、一連の同時クエリの可能性がある場合に一貫した方法でツリー状の構造を読み書きすることです。 。

    ユーザーリストのメタファーに戻り、プログラミング言語では、レコードのテーブルを走査し、各レコードから「名前」フィールドを抽出し、それらすべてをリクエスターに返す方法を記述します。

スクリプト言語はプログラミング言語のサブセットであることに注意してください。つまり、言語は「スクリプト」と「プログラミング」の両方である可能性があります。Pythonは通常「プログラム間の仲介」と「データの変換」に使用されます。Javaのような「プログラム間の仲介」に使用されることはほとんどない他の言語があります。これは不可能ではなく、これらを容易にするように設計されていないためです。スクリプトが俳優に自分のパートを開始する手がかりを与えるように、スクリプト言語の重要な特徴は、他のプログラムを調整できることです。


7
スクリプト言語は、正式にはプログラミング言語のサブクラスです。(CやJavaのような言語がREPLで完全に解釈されるのを見たこともあります;両方の方法で障壁が漏れています…)
ドナルフェロー

1
@DonalFellows:そのとおりです。私はそれを念頭に置いて答えましたが、「一方は他方のサブセットです」という表現を明示的に使用していません。また、一方のカテゴリが解釈され、もう一方のカテゴリが解釈されないことを暗示していません。これは弱い区別であることを知っていたからです。
logc

1
@DonalFellows:回答を編集して、一方が他方のサブセットであることを明示的に述べました。
logc

1
これまでのところ、マークアップ言語はデータの構造を記述する言語であると主張している唯一の存在であるため、この答えを支持しています。
イダンアリー

3
JörgWMittag@:私は:)そうでなければ、私の答えに、私はスクリプト言語がされていることを意味するものではない「多数の例外があるだろう」と始めた理由である、例外があることを知っていたではない?コンパイル 私はその落とし穴を避けるために正確に言語の目的に集中しようとしました...
logc

11

マークアップ言語は、構造化データを表すために使用される言語です。たとえば、HTMLでは、フラットテキストドキュメントと比較して、ドキュメントの一部がタイトルであるか、その他の一部がリストであることを指定できます。

マークアップ言語はプログラミング言語とは見なされません¹。

プログラミング言語との違いは必ずしも明らかではありません。たとえば、XSLTはチューリング完全言語²ですが、マークアップ言語であるXMLに基づいています。

ウィキペディア自体は、プログラミング言語またはマークアップ言語としてXSLTを修飾することを避けるために重要な努力をしています。それは宣言型言語であり、「関数型プログラミング言語およびデータベースクエリ言語に見られる最適化手法」を使用しているとのみ述べています。

スクリプト言語は、コンパイルされるのではなく解釈されるプログラミング言語です。つまり、スクリプト言語はすべてのプログラミング言語のサブセットを表します。

言語がコンパイルされているか解釈されているかが常に明らかではないように、プログラミング言語がスクリプト言語であるかどうかは常に明らかではありません。たとえば、PHP 中間バイトコード³にコンパイルされ、JITコンパイラによってマシンコードに変換されますが、それでもスクリプト言語と見なされます⁴。

スティーブン・ロットによるメタヘアの分割も参照してください。


¹「XMLはプログラミング言語ではありません」。10ポイントのXMLを参照してください。

²「XSLTはチューリング完全言語です」ウィキペディアでXSLTを参照してください

³「HHVMはHackとPHPを中間バイトコードにコンパイルします。このバイトコードは、実行時にジャストインタイム(JIT)コンパイラーによってx64マシンコードに動的に変換されます。HHVMを参照してください。

スクリプト言語ウィキペディア上のタイプによって、プログラミング言語のリストでは。


16
言語がコンパイルまたは解釈されることはありません。言語はただです。コンパイルと解釈は、言語の実装に使用されるコンパイラーまたはインタープリター(duh!)の特徴です。「コンパイルされた言語」または「解釈された言語」という用語は意味をなさず、異なるレベルの抽象化に属します。Englischが型付き言語である場合、「コンパイル済み言語」はTypeError!すべての言語はインタプリタで実装でき、すべての言語はコンパイラで実装できます。
ヨルグWミットタグ

@JörgWMittag「すべての言語はインタプリタで実装でき、すべての言語はコンパイラで実装できます」-100%本当ですか?
スパルタカス

@spartacus私はそれをためらいがちな「ノー」と呼んでいます。私はコンパイルすることができる任意の言語でも(だけではなく、それを保存する命令を実行する)と解釈することができますが、私がいることを聞いたと思うhomoiconicityがひどく、コンパイルの可能性を制限
Izkata

@Izkataホモイコニック性自体がコンパイルの可能性を変えるとは言いませんが、それを可能にするメタプログラミングは、多くのコンパイルを実行時まで延期する必要があることを意味します。
マークハード

1
「JörgW Mittag」がすでに指摘したように、「スクリプト言語」の部分はまったく間違っています。さらに、「プログラミング言語」の説明はありません。
デビッド

2

あらゆる種類の分類法を作成するには、最初にいくつかの質問をする必要があります。

  • 適切に定義された関係にオブジェクトを配置しますか?
  • もしそうなら、それらは実際に存在しますか?
  • オブジェクト間の特定の種類の関係のみに制限しているのですか、それともシステムが正当な関係のみを使用するための一連の要件がありますか?

通常、あなたが尋ねたような質問を聞くとき、予想される答えはいくつかの仮定をします。たとえば、これらはすべて言語であるため、より一般的な言語の概念の下で階層を形成する必要がある、またはすべての言語の空間を分割する、または互いのサブセットであると仮定するのは自然です。

プログラミング言語

残念ながら、上記のどれも真実ではないようです。おそらく、プログラミング言語だけが最も同意する定義を持っています。プログラミング言語は、プログラムをエンコードする言語です。エンコードとは、言語の単語をプログラム(一連のアクション)として解釈できることを意味します。コンピュータープログラミング言語は、これらのサブセットです。非コンピュータープログラミング言語の例:スーパーマーケットのバイヤーへの指示として解釈される食料品リスト、ペプチドの転写によって解釈されるDNA、テープレコーダーのプログラムとして機能するアナログ音楽レコード。

したがって、コンピュータープログラミング言語はコンピューターをプログラムする言語です。

スクリプト言語

明確に定義されていません。この用語の意味を解釈することは可能です。歴史的には、マシンコードを生成するコンパイラを持たないプログラミング言語はこのように呼ばれていたように思われます。今日の標準では、これにより、アセンブラーを除くすべての一般的なプログラミング言語がこのカテゴリに分類されます。Cのようないわゆる低レベル言語でも、既存のプロシージャを備えたランタイムが必要です。したがって、Cプログラムをコンパイルして得られるバイナリは完全にマシンコードではなく、時々ランタイムを呼び出します。

マークアップ言語

明確に定義されていません。この用語が使用されるときはいつでも、主に視覚的または音声イメージを生成するために使用される、非常に限られた語彙を持つプログラミング言語を記述することを意図しているようです。XMLが何かをプログラミングしていると見るのは難しいかもしれませんが、ManまたはTexInfoマークアップを見ると、「特別な」文字が実際にはインタープリターの指示であることがわかります。

また、次のようなXML言語の「プログラミング」解釈を行うこともできます。

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

ボトムライン:今日のこの区分は、あまり意味がないように見えます。どの言語に直面しているかについての直観を与えるだけですが、厳密な定義は提供しません。


1

3つの概念はすべてある程度重複しているため、XSLTがプログラミング言語であるか、Pythonがスクリプト言語であるかどうかにかかわらず、無限の引数を取得できます。

マークアップ言語が表現する言語である、テキスト形式で構造化データを、HTMLは、最もよく知られているが、様々な目的のための多数の形式は、グラフィックスのためのSVG、Webサービスのインタフェースを記述するためのWSDL、中resouceファイル用RESXように、あります。ネットなど。経験則では、マークアップ言語はプロセスやアルゴリズムを記述しませんが(プログラミング言語のように)、純粋なデータです。しかし、それはCSの基本的な洞察でもありますコードとデータの間に根本的な違いはありません。XSLTのような一部のマークアップ言語には、「実際の」プログラミング言語のようなループと条件があり、Prologのような一部のプログラミング言語は、コードでプロセスが指定されていないほぼ純粋なデータです。そして、Lispは独自のコードを構造化データ形式として扱うので、行を曖昧にします。

プログラミング言語スクリプト言語の区別に関しては、これは今日ほとんど時代遅れの歴史的な区別です。昔は、C言語で記述されたスタンドアロンプ​​ログラムをコンパイルし、シェルスクリプトやWord Basicなどのスクリプト言語がありました。これらは、他のプログラムやツールを操作するために解釈および設計されていました。今日、さまざまなレベルのコンパイルと解釈(バイトコードのコンパイル、JITコンパイルなど)、および言語に依存しないさまざまなAPIがあるため、この行は多くの妥協点でかなりぼやけています。したがって、区別はそれほど有用ではありません。


0

マークアップ言語は、ロジックではなくデータを記述するために使用されます。それらの典型的な使用法は、ドキュメントのフォーマットを記述することです。たとえば、HTMLはこのために設計されています。しかし、これらは一般的なデータ形式としても使用される場合があり、XMLはデータを記述するためだけに使用されることが多いマークアップ言語です。

プログラミング言語とスクリプト言語の違いは非常に曖昧です。どちらも計算可能な問題を解決できるという点で、両方とも完全に理解しがちです。言語がプログラミング言語であるかどうかを確認するには、いくつかの一般的な「ヒント」があります。

  • スクリプト言語は多くの場合、コンパイルされるのではなく解釈されるか、少なくとも解釈されるオプションを提供します。
  • スクリプト言語は多くの場合、実行が高速というよりは、作業が高速になるように構築されています。
  • スクリプト言語には、非常に広範な標準ライブラリが付属する傾向があります。多くのプログラミング言語も同様ですが、よりオプションです。

しかし、最終的に、言語がスクリプト言語またはプログラミング言語である場合は、厳密な基準というよりも慣習の問題です。上記のヒントは単なるトレンドであり、スクリプト言語のすべての基準を満たしているが、依然としてプログラミング言語と見なされているプログラミング言語があります。


4
言語がコンパイルまたは解釈されることはありません。言語はただです。コンパイルと解釈は、言語の実装に使用されるコンパイラーまたはインタープリター(duh!)の特徴です。「コンパイルされた言語」または「解釈された言語」という用語は意味をなさず、異なるレベルの抽象化に属します。Englischが型付き言語である場合、「コンパイル済み言語」はTypeError!すべての言語はインタプリタで実装でき、すべての言語はコンパイラで実装できます。インタープリターからコンパイラーを自動的に生成することも、その逆も可能です。
ヨルグWミットタグ

@JörgWMittag本質的にコンパイルまたは解釈される言語はないことは事実です。しかし、それが通常どのように実行されるかについての慣習がしばしばあります。これは主にここで言及していることです。
ピエールアンダーソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.