インタプリタについて質問があります。
色々と調べたところ、perl、php、rubyなど、ソースをインタプリタで実行する言語の利点は以下なのだと思います。
ソフトを作っている環境と実行環境の間でcpuやos等が異なる場合は、
ソースは互いに異なる機械語に翻訳されるので、翻訳は実行環境で行わなければならない。
その際、コンパイラの場合はわざわざ手動で翻訳を実行しなければならないが、
インタプリタの場合は勝手に実行時に翻訳してくれるので楽。
1.それで質問なのですが、
コンパイラは環境に対応した機械語を出すらしいですが、
何故そんな事ができるのでしょうか。
コンパイラが、自身が置かれた環境を分析して、それに対応した機械語を出すのでしょうか?
それとも、そもそも環境毎に対応したコンパイラを使うという事でしょうか?
2.また、世の中にはクロスコンパイラというものがあると聞きました。
クロスコンパイラがあれば、ソフトを作っている環境でそのままコンパイルできるので、
インタプリタはいらないのではないでしょうか?
クロスコンパイラの短所や長所などを教えてほしいです。
3.翻訳後の話として、機械語はcpuやosによって違うという話ですよね。
つまり、機械語にコンパイル済みのソフトを配布する際は環境毎に対応したソフトを
それぞれ配布しなければならないのですよね。
しかし、ネット上でダウンロードできるフリーのソフトなんかは、
特定のOS向け、あるいはOS別に違うファイルを配布、というのはよく見かけますが、
cpuやその他の環境毎に配布物を分けているのは見たことがありません。
機械語は、本当にos以外にも依存するものなのでしょうか?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
かなり混乱されているようですね。
> ソフトを作っている環境と実行環境の間で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 とは異なる環境を使ってみるのも理解を深めるのにはいいかもしれません。
No.2
- 回答日時:
簡単に:
環境ごとに対応したコンパイラを使います. で, コンパイラの中にも「自分自身の動いている環境用のコンパイラ」と「自分自身とは異なる環境用のコンパイラ」というのがあって, 前者を「セルフコンパイラ」, 後者を「クロスコンパイラ」と呼びます. クロスコンパイラは「プログラムの開発ができないような環境」, 例えば組み込み機器用に使うことが多いのですが, 理論上はそうでない場合にも使えます.
で最後の質問ですが, コンパイル済みのバイナリを配布するときには「CPU ごとにわける」ことは必須です. FreeBSD や NetBSD ではコンパイル済みバイナリを CPU ごとにわけて配布していますし, Sunfreeware では x86 と SPARC の Solaris 用にコンパイル済みバイナリを配布しています.
まあ, Unix なら普通コンパイラをもってるのでバイナリを配布する (従って「CPU ごとに配布物をわける」) 必要はないとも言えますし, Windows 用だとバイナリを配布しなきゃならないけど Windows が動く CPU が限定されてるのでやはり「CPU ごとに配布物をわける」意味はないですが.
あとついでにいっておくけど Perl は「ソースを内部表現にコンパイルしてからインタプリタで実行」してる (ruby もそうじゃないかな) し, Java もある意味ではこれと同じ (「インタプリタ」と呼ばずに「仮想機械」と呼んでますが) 感じです.
No.1
- 回答日時:
簡単に:
環境ごとに対応したコンパイラを使います. で, コンパイラの中にも「自分自身の動いている環境用のコンパイラ」と「自分自身とは異なる環境用のコンパイラ」というのがあって, 前者を「セルフコンパイラ」, 後者を「クロスコンパイラ」と呼びます. クロスコンパイラは「プログラムの開発ができないような環境」, 例えば組み込み機器用に使うことが多いのですが, 理論上はそうでない場合にも使えます.
で最後の質問ですが, コンパイル済みのバイナリを配布するときには「CPU ごとにわける」ことは必須です. FreeBSD や NetBSD ではコンパイル済みバイナリを CPU ごとにわけて配布していますが, ご存知ありませんか?
まあ, Unix なら普通コンパイラをもってるのでバイナリを配布する (従って「CPU ごとに配布物をわける」) 必要はないとも言えますし, Windows 用だとバイナリを配布しなきゃならないけど Windows が動く CPU が限定されてるのでやはり「CPU ごとに配布物をわける」意味はないですが.
あとついでにいっておくけど Perl は「ソースを内部表現にコンパイルしてからインタプリタで実行」してる (ruby もそうじゃないかな) し, Java もある意味ではこれと同じ (「インタプリタ」と呼ばずに「仮想機械」と呼んでますが) 感じです.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 会社で英語を使うことになっての英語の勉強方法 5 2022/07/03 11:49
- 英語 accommodate の日本語訳について教えてください。 Social attitudes wil 3 2022/12/17 16:09
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- YouTube Youtubeとかの外国語の動画に、日本語の字幕をつけたのを自分のアカウントから公開扱いでアップした 1 2023/04/11 00:25
- 工学 機械工学科を志望する理由です 添削をお願いします 私が機械工学科を志望する理由はものを製作することに 1 2022/11/19 09:43
- その他(悩み相談・人生相談) これを明日の面接で言おうと思ってるんですけど大丈夫ですかね 私が機械工学科を志望する理由はものを製作 1 2022/11/19 19:44
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- その他(OS) Ubuntuに仮想環境いれて古いwindows動かしたいんですが、OSイメージ無料で手に入りますか? 2 2023/03/09 23:49
- 経済学 因子分析における因子得点の解釈について 1 2022/12/10 02:05
- 英語 「install and/or execute an application」の訳し方 2 2022/04/05 11:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
昔のgraph.hというファイル
-
C++Builder → Visual C++ 移植...
-
<conio.h>?
-
C++でデスクトップGUIアプリ開...
-
C言語の規格
-
『Bin』ディレクトリは何の略語?
-
未使用引数の注意文出力を回避...
-
Visual Studio でmakefileを使...
-
POWERCOBOLのSQL...
-
VC++の/Zm オプションについて
-
COBOLの論理演算子について質問...
-
C言語での式の評価順序について
-
PICでのI2C通信でのマスタ、ス...
-
C言語はC言語でできている?
-
cc と gcc の違い
-
C言語でのコンパイラの作成方法
-
void型のポインタで構造体の参照
-
C言語でチェスを作ってみたいと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
printfなど、標準関数のソース...
-
組み込みソフト。ROM領域にデータ
-
リリースモードとデバッグモー...
-
変数の内容がコロコロ変わる、...
-
cc と gcc の違い
-
COBOLの論理演算子について質問...
-
Visual Studio でmakefileを使...
-
PICでのI2C通信でのマスタ、ス...
-
COBOLのALPHABET...
-
<conio.h>?
-
VB6のコンパイラ
-
COBOL計算式の中間ワーク桁数に...
-
パーサとコンパイラの違いって?
-
関数形式マクロ dtaは戻り値が...
-
プログラミングって右脳よりの...
-
C++Builder → Visual C++ 移植...
-
24bit サイズの変数
おすすめ情報