質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

コンパイル言語とスクリプト言語の違い

解決済

回答 6

投稿

  • 評価
  • クリップ 8
  • VIEW 37K+
退会済みユーザー

退会済みユーザー

参考:
1:プログラミング言語がたくさんある理由
2:【みんな知ってる?】スクリプト言語とコンパイル言語の違いとは?

二つ言葉の認識

機械語への翻訳(コンパイル)の仕方には大きく分けて2種類があり、
1つは「コンパイラ言語」。
もう1つは「スクリプト言語」。

【コンパイル言語】
高速で動作する代わりに記述が面倒。
ソースコードを事前にコンパイルして、先に機械語に変換しておく。
例:C、C++、Java、C#などはコンパイラ言語です

【スクリプト言語】
低速で動作する代わりに短い記述で処理を実現。
ソースコードを逐次機械語に翻訳しながら実行する。
例:Python、Perl、PHP、Ruby、JavaScript

質問1

コンパイル言語は「事前(一気)にコンパイル」し、
スクリプト言語は「逐次(1行ずつ)コンパイル」しながら実行する、ということですが
この二つの言語は「どのタイミングで」コンパイルを開始するのですか?

コンパイル言語の「事前に」とはいつ、どのタイミングのことですか?
コンパイル言語・スクリプト言語ともに「書き換えたソースコードを保存したタイミング」でしょうか?

質問2

この二つの言語の違いは
コンパイルのタイミング(方法?)とそれによる実行速度の違いですが、
コンパイルによる速度の違いというのは

ソースコードを書き換えて保存
→ソースコードすべてをコンパイルしてから実行(コンパイル言語)
→ソースコードを一行ずつコンパイル、実行(スクリプト言語)

こういうことでしょうか?
もしそうだとしたらスクリプト言語の方が速そうだと思うのですが、
記事には「コンパイル言語の方が速い」ということなので、混乱しています。

質問3

上の参考2の記事の中で

コンパイル言語は先ほども説明した通り、コンパイラが必要になってきますが、
スクリプト言語だと、FlashPlayerなどの翻訳機能を兼ね備えているプレーヤーをインストールすれば
翻訳から実行まで可能になります。

コンパイル言語は翻訳がすでにされているので、
プレーヤーをインストールする必要はありませんが、
単体で動かすことになるので、PCにインストールする必要があります。

と書いてあるのですが、
スクリプト言語のコンパイラがFlashPlayerなどのプレーヤーということですか?

スクリプト言語はプレーヤーとセットになって初めて翻訳・実行が可能になるのだとしたら
コンパイル言語もコンパイラをインストールしないといけないのでは、と思ったのですが、どうでしょうか。

「すでに翻訳がされているからコンパイラをインストールする必要はなく、
(すでに翻訳された状態の)コンパイル言語だけPCにインストールすれば良い」

↑これは例えば、PCゲームをコンパイラ言語で作って、
機械語の状態(コンパイラ済み)でサイトなどに公開しているから
コンパイラは必要ない、とかそういうことでしょうか?

3つ質問しましたが、1つだけでもいいので教えていただきたいです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+7

まず、「コンパイラ言語」「スクリプト言語」というのは俗称であって、正式な分類ではありません。確かに、「コンパイル型として実装されることが多い言語」「インタプリタで実装されることが多い言語」というのがありますが、それはあくまで相対的なものでしかありません。

 質問1

一口に「プログラムを実行する」といっても、いろんなスタイルがあります。

  • (純粋な)コンパイル型…プログラムを書く→コンパイルする(「機械語」といって、マシンで直接実行できるかたちになる)→実行する(C/C++、Goなど)
  • 中間言語型…プログラムを書く→コンパイルする(「中間言語」といって、そのままでは実行できない形になる)→中間言語をインタープリタ or JIT(後述)で実行する(Java、C#、VB.netなど)
  • JIT型…プログラムを書く→ソースコードや中間言語を機械語にその場で変換する→機械語を実行(JavaScriptエンジンの多く)
  • インタープリタ型…プログラムを書く→ソースコードからそのまま実行

コンパイル型や中間言語型の場合、「コンパイル」と「実行」が別ステージに分かれていて、プログラムを書くのでない一般のユーザーは、コンパイル済のものから実行を開始できます(意外と、「自分で書く→動かす」という発想だと、ここが抜け落ちてしまいます)。

 質問2

質問1で書いたように、プログラムを使うだけのユーザーからしてみれば、すでにコンパイル済みの状態から実行できるので、そのほうが速くなります。逆に、プログラムを頻繁に書き換える開発者の視点からすれば、インタープリタ型のほうが「すぐに実行できる」ということもまた事実です。

 質問3

上で4区分した中で「(純粋)コンパイラ型」については、コンパイル済みのものを配布すれば、使う側にコンパイラは不要です。Unix向けのアプリなどでソースコードで配布されている場合には、自分でコンパイルする必要があります。

Flashの場合、区分としては「中間言語型」に近いもので、Flashの作成と実行のそれぞれにツールが必要となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 23:22

    回答有難うございます。

    何故コンパイラ型の方が実行速度が速いのかがよく分かりました。
    プログラムを実行するにも色んなスタイルがあるのですね。
    中間言語型・JIT型など知らないことが次々出てくるので、
    こうやって教えていただけるのは本当に有難いです。

    また機会があればよろしくお願いします。
    有難うございました!

    キャンセル

checkベストアンサー

+5

二つ言葉の認識

【スクリプト言語】 
ソースコードを逐次機械語に翻訳しながら実行する

以下、「スクリプト = インタプリタ」
を意味している、という前提で回答します。

それでまず、本当はインタプリタは機械語に翻訳しないです。
インタプリタはコードを解釈したら自身が実行します。

実際に簡単なインタプリタのコードを自分で読み書きしてみれば、
実態では機械語への逐次翻訳なんかしてない
(少なくともインタプリタのコードに書かない)ことが分かります。

でもまあ、その解釈と実行すること自体を、
「翻訳」と表現できなくもないかもしれません。
「嘘も方便」で、分かりやすいからよくある説明ではあります。


質問1

この二つの言語は「どのタイミングで」コンパイルを開始するのですか?
「書き換えたソースコードを保存したタイミング」でしょうか?

「保存したタイミング」ではないです。

まず、コンパイラ型言語は、コンパイルするタイミングでコンパイルします。
つまり、実行前の自由なタイミングでコンパイルできます。

次に、インタプリタ型言語は、コンパイルしないです。
コードの解釈はしますが、それは実行時に逐次行います。


質問2

スクリプト言語の方が速そうだと思うのですが、 
記事には「コンパイル言語の方が速い」ということなので、混乱しています

一般的に、コンパイラ型言語の方が「早い」と言われます。
その「早い」というのは、実行速度のことです。

コンパイラ型言語はコンパイルが必要なので、コンパイル時間がかかります。
一方、インタプリタ型言語はコンパイルしないので、この時間はかかりません。

しかし、実行時間はコンパイラ型言語の方が早いです。

インタプリタはコードを解釈し、インタプリタを実行する、という二度手間です。
コンパイラ型言語なら、コンパイルしたコードを実行する、という一度で済みます。

だから、よけいな中継地点が中抜きされてるから、コンパイラ型は実行速度が早いわけです。
ただし、インタプリタ型言語にも、開発速度が早い、といったメリットがあります。


質問3

これは例えば、PCゲームをコンパイラ言語で作って、 
機械語の状態(コンパイラ済み)でサイトなどに公開しているから 
コンパイラは必要ない、とかそういうことでしょうか?

これはおおむねその通りです。

コンパイルして実行ファイルにすれば、OSが直接実行できます。
インタプリタ型言語のコードを実行するには、
その言語のインタプリタ(の実行ファイル)が必要です。


補足

最近では中間コードを作る中間型言語が増えているので、
コンパイラ型とインタプリタ型の区別は曖昧化しています。

ただ、たとえばJavaVMが中間言語を機械語に変換するときにも、
「JITコンパイル」と言うので、最低限の区別は今でもあります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 23:15

    回答有難うございます。

    一つ追加で質問なのですが、回答文の中の
    「インタプリタは機械語に翻訳しないです。
    インタプリタはコードを解釈したら自身が実行します。」
    この部分なのですが、
    コンパイラ型のソースコードをコンパイルするのは「コンパイラ」ですが
    インタプリタのソースコードを「解釈」するのは何なのでしょうか。
    ソースコード自体ですか?

    基本的な質問で申し訳ないです。
    もしよろしければ、教えてください。
    よろしくお願いします。

    キャンセル

  • 2016/10/17 23:20

    >インタプリタのソースコードを「解釈」するのは何なのでしょうか
    解釈するのはインタプリタです。ソースコードは解釈される方です。

    キャンセル

  • 2016/10/17 23:34

    回答有難うございます。

    キャンセル

+1

たとえ話しにしたのが反って裏目になったかもしませんが

プログラムをコンピュータに対する指示書として仮に2種類の本が有るとします。
一つは機械言語で書かれています。これは、バイナリ、オブジェクト、実行形式とか呼ばれるものです。
もう一冊は、プログラム言語(c、C++、C#、Java、Python、Perl、PHP、Ruby、JavaScript)
で書かれていてプログラムソースと呼んでいます。

◆「機械言語とプログラム言語」
機械言語で書かれている本は、コンピュータ(OS)が読み、実行する事ができます。
この機械語の本を人間が読み理解するのは無理?です。(昔はダンプして読んでましたが)

プログラム言語の本は、人間が読み易く書かれています。私たちでも文法を習えば書く事ができますし、
読んで理解もきます、しかしこれを現在のコンピュータが読むことはできません。なので翻訳が必要です。

◆「コンパイラ言語とインタプリタ(スクリプト言語)」
この翻訳の役目をしているのがコンパイラ、インタプリタ(スクリプト言語)です。
まず、コンパイラは、プログラム言語で書かれているものを翻訳して機械言語本を作成します。
インタプリタは、プログラムソース本を見ながら機械語でコンピュータと話ます。
(余談ですが、StarWARsのC3POもバイナリが話せると言ってました)

◆C言語、PHP言語
c言語で言うとコンパイラは、c言語ソースから機械言語の実行形式を作成します。後はコンピュータ自身が読込み実行します。
ですので高速での実行が可能です。

スクリプト言語はこの機械語本は作成しませんが、機械語への通訳ができますのでコンピュータと話ことができます。
これは私たちが書いたメモを通訳者に渡して機械と話をしてもらのに似ています。
PHPで書かれたプログラムソースであればPHPエンジンがソースを読込み翻訳をしてコンピュータへ指示をします。
この翻訳工程は実行する度に行うのでコンパイラの一回に比べると遅くなる要因です。

例え話ばかりで失礼しました。

「コンパイラは、プログラム言語で書かれているものを翻訳して機械言語本を作成します。」
この「機械言語本」は「実行ファイル」ということで良いですか?

そう考えて良いと思います。WindowsOSの場合の.exeです。

コンパイラ型はコンパイルによってソースコードとは別の「実行ファイル」を作成するのに対して
インタプリタ型はコンパイルしないので、ソースコードを解釈することによってそのソースコード自体が「実行ファイル」となる、という解釈で合っていますか?

インタプリタは、「実行ファイル」を作成しない代わりに、ソースコードを翻訳してOSに対して実行指示と結果をやり取りしますので、ソースコード自体が実行ファイルとは言えます。「実行ファイル」ではありますが、スクリプトと呼ばれた方が良いと思われます。(誤解されない)

スクリプト言語は「逐次(1行ずつ)コンパイル」しながら実行する、ということですが

「1行づつ」と有ります。見方としてスクリプト言語の多くは、「実行文づつ」する見方もお薦めです。
内側の実行文(コマンド、関数、ルーチン)から実行される結果が外側へと伝わるイメージです。

イメージです
実行文A(実行文B(実行文C)));

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 23:04

    回答有難うございます。
    例え話で書いていただいたおかげで、イメージがしやすくて分かりやすかったです!

    追加で質問なのですが、回答文の中の
    「コンパイラは、プログラム言語で書かれているものを翻訳して機械言語本を作成します。」
    この「機械言語本」は「実行ファイル」ということで良いですか?
    コンパイラ型はコンパイルによってソースコードとは別の「実行ファイル」を作成するのに対して
    インタプリタ型はコンパイルしないので、ソースコードを解釈することによってそのソースコード自体が「実行ファイル」となる、
    という解釈で合っていますか?

    もしよろしければ、教えてください。
    よろしくお願いします。

    キャンセル

0

意外と回答がつかないので書いてみます。
前提として、
コンパイラ言語は、ソースファイルをコンパイル(+リンク)して、コンピューターが実行できるモジュールを作成します。
対してスクリプト言語は、ソースファイルをそのまま実行できる言語です。
スクリプト言語には更に、インタプリタ型とコンパイラ型が存在します。
インタプリタ型は、ソースファイルを読み込みつつコードを解釈し実行します。
故にステップごとにこの解釈する処理が入るため実行速度は遅くなります。
対してインタプリタ型は、事前に全体を解釈しておくので、動作が速くなります。
※スクリプトにたいしてコンパイルという用語を用いるのは個人的にピンとこないので、敢えて使ってません。

質問1
コンパイラ型のコンパイルのタイミングは、プログラマー次第です。
実行モジュールを作りたいなと思ったときにコンパイルします。
スクリプト型は正に実行するタイミングです。
冒頭で書いたように、インタプリタ型では逐次解釈しますし、コンパイラ型では実行する最初に行います。

質問2
ここまでの話でわかると思いますが、コンパイラ型の方が圧倒的に速いです。
コンパイラ型:実行モジュール→実行
スクリプト型:コード→解析→実行

質問3
これまたここまでの話でわかると思いますが、コンパイラ型はそのまま実行できるモジュールを作成しますので、実行時にコンパイラは必要ありません。
また実行モジュールのもとになるソースコードも必要ありません。

実際のところ細かいところは私もそれほど把握していませんので、もっと詳しい人からたぶんツッコミが入ると思いますが、大枠はこんな感じと思います。
何はともあれ、コンパイル言語とスクリプト言語をそれぞれ少しでもいいから触ってみると良くわかると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/17 23:30

    回答有難うございます。

    まだスクリプト言語(js)しか触っていないので、色んな言語を触って違いを実感したいと思います。
    また機会があればよろしくお願いします。
    回答有難うございました!

    キャンセル

0

質問者さんが述べているのは、普通「コンパイラ方式」と「インタプリタ方式」として対比されるものだと思います。

スクリプト言語について、参考の1.では

ソースコードを逐次機械語に翻訳しながら実行する

また2.では (引用ママ)

1行ずつ機械語にし変換しながら処理を実行します

と、どちらも同じ間違いを書いています。実際にそんな動作はないでしょう (JITコンパイラなんかと混同しているんでしょうか)。そして、同じ間違いがあるということは、一方がもう一方をまねしているんでしょうね。

文章の質の高さから見て、1.の渡辺 将人「プログラミング言語がたくさんある理由」(連載『初めてのプログラミング言語選び』, ThinkIT, 2011年) がオリジナルでしょう。

また、「スクリプト言語」と「コンパイラ言語」を明確に対立させて解説している例をウェブ上で探してみましたが、上の記事のほかには見つけられませんでした。よそでの解説を読むと、たとえば

  • 『IT用語辞典バイナリ』の解説ではスクリプト言語は「非常に多くの場合、スクリプト言語はインタープリタ型言語であり」としており、コンパイラ方式と対立するものとはしていません。
  • 『ウィキペディア日本語版』の解説では、「インタプリタ方式を採用しているものが多いが、性能向上のため実行時コンパイルなどの利用も盛んである。」としています。

「スクリプト言語」という用語を「インタプリタ方式」と同義のものとして使うのは、上述の記事の筆者、渡辺 将人さんの独創だと考えたほうがよさそうです。

そういうわけで、ご質問には回答できません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-5

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/14 15:31

    質問文の冒頭にあるURLをそのまま載せて回答とするというのは、さすがにひどすぎませんか。

    キャンセル

  • 2016/10/14 17:55

    明確な回答をしていないから。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る