• ベストアンサー

コンパイル言語とインタープリター言語の違いについて

コンパイルするプログラミング言語とインタープリターする プログラミング言語の違いについて教えてください。 特に、開発上および運営上の利点・欠点についてお願いします。 また、CGIでは、PHPやPERLなどのインタープリター言語が 主流ですが、その理由とC言語などで組むのと比較して、 どのような利点があるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

現在ではもはや古典的な「コンパイル言語」「インタープリタ言語」の区別は意味を持たないでしょう。 Cは確かにターゲットのCPU/OSの環境専用のマシン語にコンパイルされ、実行されますが、Javaや.NET用言語では、ソースプログラムをそれぞれの仮想マシンの仮想マシンコードにコンパイルしてオブジェクトファイルを作り、仮想マシンがそのコードをインタープリトします。 また、PerlやRuby等に置いてもソースを中間コードにコンパイルしてからその中間コードをインタープリトします。 従って、 ・純粋なコンパイル言語・・・CPU/OS等環境依存のマシン語ファイルをつくり実行する ・その他のいわゆるコンパイル言語・・・あらかじめ中間コードファイルにコンパイルしておき、その中間コードをインタープリトして実行する ・いわゆるインタープリター言語・・・実行の最初に中間コードにコンパイルしそれをインタープリトして実行する 運営上の問題 ・いわゆるコンパイル言語・・・ソースファイルとオブジェクトファイルの関連づけをきちんと管理する必要がある。管理しないとエラー発生時にどのソースファイルを調べればいいかわからない ・純粋なコンパイル言語・・・上記に加えて、異なる環境で動かすためには再コンパイルとテストが必要 ・いわゆるインタープリタ言語・・・何度も何度も実行される場合、コンパイルの時間が実行速度に影響する(ウェブアプリでの利用では一度できた中間コードをHTTPサーバープログラム中に保持することでコンパイルの繰り返しを防ぐ工夫がされることが多い) 特定のOS環境でのみ使える機能をつかったプログラムは、どの形式であろうが、その特定の環境でしか使えません。

その他の回答 (5)

回答No.6

No.5の方の回答と同様になりますが…… 現代の本格的な言語は速度を稼ぎやすいコンパイラ方式が多いですが、インタープリタ方式はその実装の開発に低レベル(コンピュータ寄り)の知識の必要性が小さい利点があると思います。コンパイル作業が不要で即座に実行を開始できるインタープリタ方式の利点は、コンピュータの処理能力の向上によってあまり目立たなくなってしまいました。注意しなければならないのは、インタプリタ方式ではソースコードを実行する環境へそのまま配置するので、第三者にソースコードの解析が間単に行われてしまうことでしょうか。ただしいったん中間コードにコンパイルする場合はこの限りではありません。 とはいえ、各言語での開発における利点を考えたとき、コンパイラ言語かインタプリタ言語かということそのものに起因する利点はそれほど多くなく、むしろ言語仕様やライブラリの豊富さ、普及率、動作する環境なんかの影響のほうがはるかに大きいと思います。PHPやPerlがCGI向けとして普及したのは、それらがインタープリタ方式だから、というわけではありません。 たしかに、なぜかインタプリタ言語の多くが環境依存が少なく開発できるように作られている傾向がありますが、それは別にインタプリタ方式にしたから環境依存が減ったわけではありません。どちらかの実装しか用意されていない言語が多いですが、そもそも本質的にどんなプログラミング言語の処理系もどちらの方式でも実装することが出来ます。コンパイラ言語の代表格であるC言語にすらインタプリタ実装は存在します。 まともなIDEがあればコンパイラ言語かインタプリタ言語かに関わらず自動で構文チェックしたりボタン一発で実行出来るのが普通ですし、簡単に配置も出来るでしょう。試験対策などでないのであれば、コンパイラ言語対インタプリタ言語という二元論的な捉えかたはオススメしません。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

すいません。わかりやすくするために言い過ぎました。 確かに環境に依存する書き方は、コンパイル言語およびインタプリタ言語のどの言語でも可能ですね。 こう言っておきましょう。 コンパイラ言語は、環境依存するプログラムを書く場合に使われることが多い。インタプリタ言語は、環境依存しないプログラムを書く場合に使われることが多い。 なぜなら、最近の多くのインタプリタ言語がせっかく環境依存性が低い(または低いことを目指している)のに環境依存性が高いプログラムを書いてしまったら存在意義が薄れてしまうから。 だからと言って環境依存で書いてはいけない訳ではなく、書けない訳でもないのですが。 覚えてる言語で楽に書けたら書いてしまうのが人というもので、ちょっとしたツールならperlで書くと楽だったりします。でも環境依存しまっくっているので、互換性はまったくないプログラムが出来てしまいます。 それでも言える事は、インタプリタの方が環境依存しないプログラムを書きやすいのは間違いないと思います。 >しかもBASICにいたっては方言が強すぎた。 BASICが環境依存がひどいのは時代の産物だと思います。 あのころのハードでは、コンパイラはメモリ規模や外部記憶装置(カセットテープ?)には荷が重すぎたからインタプリタしか選択肢がありませんでした。互換性を保つOSも入れる余地がなかったのでハードの差をまったく吸収できていませんでした。 それにメーカーごとに特色を出そうとして、オリジナルな文法を拡張しすぎたのがBASICだった訳ですから。 >コンパイルがらみのことを抜きにすれば言語によっては互換性は高い。 C言語の言語性は確かにそうですが、コンパイルが必要という点でだけは依存性が高いと言えます。オープンソースのコードは良いですが、ソースコード提供されていないプログラムは、やはり提供されている実行ファイルに環境依存してしまいます。それに、C言語で8ビットのマイコンから64ビットのCPUまで互換性があるプログラムを書こうと思ったら、かなり互換性に気をつけないとまず動きませんし。

  • maguro999
  • ベストアンサー率21% (59/273)
回答No.3

>[メリット]稼動するハードウェアやOSに依存しない(互換性が高い)。 依存がないと言い切るのはやめておいたほうがいいですよ。 実際にPHPではWindows側だとWin32APIを呼び出す機能とか印刷機能など OS依存の付け加えられていますし PerlだとWindows側だとファイルロック関数が使えませんし 環境依存があくまで小さいだけですね。 しかもBASICにいたっては方言が強すぎた。 >[デメリット]稼動するハードウェアやOSに依存する(互換性が低い)。 コンパイルがらみのことを抜きにすれば言語によっては互換性は高い。 C言語なんかはANSIの規格上の機能は互換は保たれている。 それ以上のことはってことになるとだめだけどそれは先のインタプリタ言語にもいえることになる。 後、Javaや.NET(名目上は/NET環境があればOSを選ばないという。実際に他のOSへの/NET環境の移植プロジェクトがある。)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

昔はコンパイラは時間がかかるので即時性がないとか言われましたが、最近のコンパイル時間は短いので、インタープリタに比べて即時性に大差はないと思います。 コンパイル言語 [メリット]実行速度が速い。 [デメリット]稼動するハードウェアやOSに依存する(互換性が低い)。 インタプリタ言語 [メリット]稼動するハードウェアやOSに依存しない(互換性が高い)。 [デメリット]実行速度が遅い。 >CGIでは、PHPやPERLなどのインタープリター言語が主流ですが、その理由とC言語などで組むのと比較して、どのような利点があるのか教えてください。 ハードとOSに依存しないのが最大のメリットだと思います。サーバがWindowsなのかLinuxなのか気にしなくて良いですし、CPUがx86系(インテル)なのかPowerPC系なのか、或いはSPARCなんてのもありますね。 コンパイル言語は、CPUとOSに依存した実行ファイルを作りますので、動くサーバに毎にコンパイルや移植(ソースコードの書き換え)が必要です。

  • maguro999
  • ベストアンサー率21% (59/273)
回答No.1

コンパイル言語 メリット ・ネイティブアプリかが作れるので速度的に有利 デメリット ・別のOSやアーキテクチャーが違うシステムで動かす場合 コンパイルのためにその環境を用意するかクロスコンパイラを用意する 必要がある インタプリタ言語 メリット ・各言語のインタプリタさえ入っていればどこでも動く デメリット ・翻訳しながら実行するのでコンパイラ言語で作ったプログラムに比べて速度面で不利 後コンパイラ言語では一応はあるけど Javaや.NET環境はネイティブコードをはくわけでない ということを >CGIでは、PHPやPERLなどのインタープリター言語が・・・・ ですが、いちいちサーバと同じOSのシステムをローカルに構築して そこでコンパイルしてサーバにアップなんてめんどくさい。 だったらサーバ上でコンパイルすればいいという人もいるけど 「本サーバでそんな無駄な負荷かけたりできるかよ。」って事です。 そういう意味ではJavaでJSPはかなり理想的かな。 後、CGIとPerlやPHPとの関係ですけど CGIモードで動かせばそれらの言語はCGIだけど Webサーバのモジュールとして動かせばCGIではない。 でPHPってCGIモードで動かすよりモジュールとして動かすことのほうが 多い気がする。

関連するQ&A