- 締切済み
コンパイラ、インタプリタ、クロスコンパイラについて
インタプリタについて質問があります。 色々と調べたところ、perl、php、rubyなど、ソースをインタプリタで実行する言語の利点は以下なのだと思います。 ソフトを作っている環境と実行環境の間でcpuやos等が異なる場合は、 ソースは互いに異なる機械語に翻訳されるので、翻訳は実行環境で行わなければならない。 その際、コンパイラの場合はわざわざ手動で翻訳を実行しなければならないが、 インタプリタの場合は勝手に実行時に翻訳してくれるので楽。 1.それで質問なのですが、 コンパイラは環境に対応した機械語を出すらしいですが、 何故そんな事ができるのでしょうか。 コンパイラが、自身が置かれた環境を分析して、それに対応した機械語を出すのでしょうか? それとも、そもそも環境毎に対応したコンパイラを使うという事でしょうか? 2.また、世の中にはクロスコンパイラというものがあると聞きました。 クロスコンパイラがあれば、ソフトを作っている環境でそのままコンパイルできるので、 インタプリタはいらないのではないでしょうか? クロスコンパイラの短所や長所などを教えてほしいです。 3.翻訳後の話として、機械語はcpuやosによって違うという話ですよね。 つまり、機械語にコンパイル済みのソフトを配布する際は環境毎に対応したソフトを それぞれ配布しなければならないのですよね。 しかし、ネット上でダウンロードできるフリーのソフトなんかは、 特定のOS向け、あるいはOS別に違うファイルを配布、というのはよく見かけますが、 cpuやその他の環境毎に配布物を分けているのは見たことがありません。 機械語は、本当にos以外にも依存するものなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- GOOD-Fr
- ベストアンサー率32% (83/256)
かなり混乱されているようですね。 > ソフトを作っている環境と実行環境の間でcpuやos等が異なる場合は(以下略) あっているような、あっていないような。 まず、インタプリタとコンパイラについて、どのような特徴があるのか、復習してみましょうか。 インタプリタ 1) 実行時にソースコードを読み込み、即時実行する 2) 実行時にソースコードが必要である。したがって、ソースコードは一般に可読ファイルである 3) ソースコードを改変することが可能 4) ソースコードを読み込んだ環境で、そのまま実行される。 5) 一般的に実行速度が遅い。コンパイラで生成されるオブジェクトの 1/100 程度と言われる コンパイラ 1) ソースコードをコンパイラが読み込み、オブジェクト(とりあえず、機械語、と思ってください。正確には、ちょっと違います)を作成する。できあがったオブジェクトを起動することで、初めてプログラムが実行される 2) 実行時にソースコードは必要ない。オブジェクトは二進数のかたまりなので簡単には人間には読むことができず、ソースコードを秘匿することができる 3) オブジェクトしか入手できない場合、ソースコードを改変することは当然できない 4) コンパイルを行なう環境とオブジェクトを実行する環境が必ずしも同じとは限らない 5) 一般的にインタプリタよりも実行速度が速い。 > インタプリタの場合は勝手に実行時に翻訳してくれるので楽。 ある程度、言語の処理系を理解するまでは、この理解でもいいかと思いますが、一般的にインタプリタは実行時に「ソースコードを機械語に翻訳」はしていません。 今では、インタプリタ言語は、「スクリプト」と呼ばれるものが多くなっているような気がしますが、ある言語を処理するのに、インタプリタかコンパイラのどちらかである必要はありません。昔話になりますが、C 言語のインタプリタはありましたし、Visual Basic のように今ではコンパイラが普通になっている BASIC も、パソコンの普及時にはインタプリタが普通でした。Perl や Ruby、Unix のシェルスクリプト、MS-DOSのバッチファイルなども、その気になればコンパイラを作成することは可能です(意味があるかどうか、は、実現性とはまた別の話です)。 コンパイラの 4) のところの説明が、セルフコンパイラとクロスコンパイラになります。インタプリタはセルフしかなくて、クロスインタプリタというものはありません(たぶん)。 ここまでで、とりあえず、インタプリタとコンパイラについては理解できた、ということでいいでしょうか? 続けます。 > 1.それで質問なのですが、(略) 一般的に、コンパイラは実行環境にあわせたオブジェクトを作成します。この場合のコンパイラは「セルフコンパイラ」を指していて、一般的に「コンパイラ」といえば、セルフコンパイラだと思っていいと思います。セルフですから、自分の実行されている環境のオブジェクトが作成されるわけです。 が、コンパイラの作成者がその気になれば、どういうものでも作れます。Apple が用意しているコンパイラは、PowerPC と Intel のオブジェクトを一度に作成してひとつのオブジェクトにすることも可能です。この場合、セルフと呼ぶべきかクロスと呼ぶべきか、よくわかりません。 > そもそも環境毎に対応したコンパイラを使うという事でしょうか? 一般的にはそのとおりです。普通に「コンパイラ」といえば「セルフコンパイラ」のことを指すからです。 > クロスコンパイラがあれば、(中略)、インタプリタはいらないのではないでしょうか? 完全に誤解しています。 コンパイラとインタプリタはそれぞれに長所と短所があります。どちらかがあればもうひとつはいらない、ということはありません。 クロスコンパイラについても、誤解していると思われるので、前の人の説明や、この上のほうの文章を参照してください。 一般的にクロスコンパイラでの開発はめんどくさいです。 理由は、オブジェクトの作成環境と実行環境が異なるからです。 ソースコードを作成して、コンパイラにかけてオブジェクトを生成したら、そのオブジェクトを実行環境上に移動させなければ実行することができません。移動させる手段は、いろいろ考えられます。CD に焼く必要があるかもしれませんし、USB メモリを使えるかもしれませんし、ネットワークでファイル共有しているかもしれません。場合によっては毎回 ROM に焼き付けをしなくてはいけないかもしれません。実行してみて動作がおかしいようであれば、またまた、ソースの作成環境に戻って、ソースを修正して、コンパイラにかけて・・・・、の繰り返しです。 では、なぜわざわざめんどくさいクロスコンパイラでの開発を行なうのか。 ほとんどの場合、「しかたなく」というのが答でしょう。 たとえば、DVD プレーヤーに組み込まれているプロセッサのためのプログラムを開発するために DVD プレーヤー上でセルフ開発するしかない、としたら、どうでしょう。キーボードは?ディスプレイは?マウスもウィンドウも使えそうにないですよね。ネットワークも使えるかどうかあやしそうです。そもそも、OS ってあるんでしょうか。それなら、Windows や Unix 上でクロス作成したほうがいいと思いませんか。 クロス開発が必要な場合は他にもいろいろありますが、Windows や ワークステーションのプログラムであれば、まずまちがいなくセルフ環境での開発になるはずで、プログラムを作成する人の大半はセルフ環境だけあれば、問題ないと思います。 > ネット上でダウンロードできるフリーのソフトなんかは、(中略)、機械語は、本当にos以外にも依存するものなのでしょうか? おそらく、Windows 用のプログラムのことを指していますね? Windows は、現在 Intel 互換の CPU でしか動作しません。また、Windows 98 や Windows 2000 で動作するプログラムの大半は、無修正で XP や Vista でも動作します。Intel や AMD からさまざまな名前のプロセッサが販売されてきましたが、それらは「バイナリ互換」ですので、オブジェクトから見た場合は「1種類」に過ぎません。つまり、「Windows 用」と限定した場合、OS も CPU も1種類しか存在せず、「環境毎に対応したソフトをそれぞれ配布」する必要が、もともとないわけです。(なので、たくさんの市販アプリケーションが売られている) Apple の場合、PowerPC と Intel が CPU として存在します。ですので、Intel でしか動作しないプログラムと、PowerPC と Intel の両方で動作するプログラムがあります。PowerPC 用のオブジェクトでも Intel 上で実行できるように OS 側で工夫しているので、古い PowerPC 用のプログラムでも新しい Intel Mac で動作する可能性はあります。(なぜこんなことが可能なのか、動作しないような例外はどんなものがあるのかはご自身で調べてください) ワークステーション用のプログラム、ということになりますと、さまざまな CPU が採用されているため、実行ファイルは CPU ごとに異なります。代表的なものは Sparc、PA-RISC、PowerPC、MIPS などでしょうか。また、メーカーが異なれば OS も異なるので、オブジェクトも異なってきます。このため、ソースコードを配布して、各自の環境でセルフコンパイルをしてもらうか、市販のプログラムの場合は実行環境(OS とか CPU を指定した環境)ごとにコンパイル済みの、別パッケージとして販売されます。 まずは、言葉の意味を正しく理解すること。次に、身近な環境(つまり、Windows のことですが)が、コンピュータとして一般的である、との先入観を持たないことから始めてみてください。Windows PC であれば、OpenSolaris の Live CD も動作するはずですので、OpenSolaris をダウンロードして Windows とは異なる環境を使ってみるのも理解を深めるのにはいいかもしれません。
- Tacosan
- ベストアンサー率23% (3656/15482)
簡単に: 環境ごとに対応したコンパイラを使います. で, コンパイラの中にも「自分自身の動いている環境用のコンパイラ」と「自分自身とは異なる環境用のコンパイラ」というのがあって, 前者を「セルフコンパイラ」, 後者を「クロスコンパイラ」と呼びます. クロスコンパイラは「プログラムの開発ができないような環境」, 例えば組み込み機器用に使うことが多いのですが, 理論上はそうでない場合にも使えます. で最後の質問ですが, コンパイル済みのバイナリを配布するときには「CPU ごとにわける」ことは必須です. FreeBSD や NetBSD ではコンパイル済みバイナリを CPU ごとにわけて配布していますし, Sunfreeware では x86 と SPARC の Solaris 用にコンパイル済みバイナリを配布しています. まあ, Unix なら普通コンパイラをもってるのでバイナリを配布する (従って「CPU ごとに配布物をわける」) 必要はないとも言えますし, Windows 用だとバイナリを配布しなきゃならないけど Windows が動く CPU が限定されてるのでやはり「CPU ごとに配布物をわける」意味はないですが. あとついでにいっておくけど Perl は「ソースを内部表現にコンパイルしてからインタプリタで実行」してる (ruby もそうじゃないかな) し, Java もある意味ではこれと同じ (「インタプリタ」と呼ばずに「仮想機械」と呼んでますが) 感じです.
- Tacosan
- ベストアンサー率23% (3656/15482)
簡単に: 環境ごとに対応したコンパイラを使います. で, コンパイラの中にも「自分自身の動いている環境用のコンパイラ」と「自分自身とは異なる環境用のコンパイラ」というのがあって, 前者を「セルフコンパイラ」, 後者を「クロスコンパイラ」と呼びます. クロスコンパイラは「プログラムの開発ができないような環境」, 例えば組み込み機器用に使うことが多いのですが, 理論上はそうでない場合にも使えます. で最後の質問ですが, コンパイル済みのバイナリを配布するときには「CPU ごとにわける」ことは必須です. FreeBSD や NetBSD ではコンパイル済みバイナリを CPU ごとにわけて配布していますが, ご存知ありませんか? まあ, Unix なら普通コンパイラをもってるのでバイナリを配布する (従って「CPU ごとに配布物をわける」) 必要はないとも言えますし, Windows 用だとバイナリを配布しなきゃならないけど Windows が動く CPU が限定されてるのでやはり「CPU ごとに配布物をわける」意味はないですが. あとついでにいっておくけど Perl は「ソースを内部表現にコンパイルしてからインタプリタで実行」してる (ruby もそうじゃないかな) し, Java もある意味ではこれと同じ (「インタプリタ」と呼ばずに「仮想機械」と呼んでますが) 感じです.