- ベストアンサー
仮想機械とは?バーチャルマシンの基礎を理解しよう
- 仮想機械(バーチャルマシン)は、ソフトウェア技術によって作られたプログラムが動作するためのハードウェアひとそろいを実現するものです。
- 特に、プログラミングにおいてのバーチャルマシンは、プログラミング言語の実行コードをプラットフォームに適したコードに変換し、実行するソフトウェアです。
- バーチャルマシンによってプラットフォームごとの違いを吸収するため、ソフトウェアの開発者はプラットフォームの違いを意識せずに開発することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VM(バーチャルマシン)は、私は幾つかの世界があると思っています。 1つは、昔からのVMで今ではPCではVirtual PCやVirualBoxやVMWareなどのもの。 もう一つは、まあ元のVMから来ているとは思うのですが、JAVAにおけるVMです。 これはVMと言っても特殊化していると私は考えています。 ご質問の内容の前半は昔からのVM。 後半はJAVAのVMですね。 VMの発祥は、マシンを開発してからそのマシンでOSの開発を行うのは工数が長くなるので、マシンの開発中にVMでそのマシンを実現し、VM上でOSを開発することにより、並行開発が出来、開発期間が短くなるのを狙ったものです。 また、マシン開発中にマシンの問題がOSの開発で発見されるのが大きいですね。 昔はその名もそのものVMという名前のコンピュータがIBMにありました。 それを使って未来のマシンのOSの開発をしたことがあります。 JAVAのVMは、後半に書いてある通り、プラットフォームを意識しないで、全てのプラットフォームで、同じ仕様のVMを実現しているのが目的です。 PCにおけるVMは、標準的なPCをVMで実現し、PCの様々なOSを実行できるところが眼目です。 今のレンタルサーバはこの特質を活かし、1台の巨大サーバに、多くのVMを立ち上げて、ユーザ毎に1つのVM上のOSを丸々貸出しています。 ユーザがどんなことを行ってもVMが1つ落ちるだけで他のユーザに迷惑がかからない。 新しい仮想マシンの定義は、OSがインストールされたバーチャルHDDのファイルをコピーするだけ、という簡易さなどが眼目でしょう。 基本的にソフトウェアでマシンを表現しますが、全てをソフトウェアで実現するのはCPU資源上好ましくなく、処理速度に著しく影響を与えますので、なるべく実マシンで動かせる部分は実マシンを使うように作られています。 ということで、私はVMは1つではない、という意見です。
その他の回答 (2)
- corokorocoro
- ベストアンサー率29% (63/211)
>Java以外に、Cなどの高級言語のプログラムも、 >仮想マシンを使っているからこそ、様々なOS上で、 >動かす事ができるのでしょうか? C言語はバイナリ互換無いだろ。ビルドし直さないでWindowsやLinuxではそのまま動かないだろ。 それに対してJavaは再ビルドなしでWindowsやLinuxで動くだろ。 Cが互換があるのはソースレベルの話。ただしそれはANSIやISO内の規格上で作られた物だけ。 OSに依存するAPI/システムコールやライブラリを利用されている物はソースをビルドし直した所で 動かないだろ。 後、.NET FrameworkもJavaと同じようにVM上で動くシステム。 >特に、プログラミングにおいてのバーチャルマシンとは、特定のプログラミング言語の実行コードを、そのプラットフォームに適したコードに変換して実行するソフトウェアのことをいう。 これはどちらかというとWINEの様なAPIをエミュレートしている物の仕組みでVMの仕組みとはまた違う。
お礼
御回答ありがとうございます。 なるほど、Windows上でもLinux上で動くCプログラムは、 OSに依存するAPIやシステムコールを使っていないものだけなのですね。 ソースレベルでの互換性を、バイナリ互換とごちゃ混ぜにしていました。
- Tasuke22
- ベストアンサー率33% (1799/5383)
C/C++はVMとの関連性はないですし、プラットフォーム間の互換もありません。 プラットフォーム間では、C/C++コンパイラがどれだけの互換性を持っているか、です。 同じOSでもコンパイラが変わると互換がなかったりします。 また、ライブラリを使用することが一般的で、ライブラリの互換はそれこそありません。 プラットフォームに影響のない機能しか使っていないプログラムだけが互換があるでしょうが、プログラムとしては希でしょう。 コンパイル言語よりインタプリタ言語がプラットフォーム間の互換が大きいでしょう。 Actionscript、Javascript、PHP、Lispなどです。 まあ、このような話題はVMから大きく外れた話題です。 VMの説明が少し難しかったようで失礼致しました。
お礼
再度の御回答、ありがとうございます。 なるほど、C/C++プログラムは、バーチャルマシンとの関連性はないのですね。 となると、C/C++プログラムを、異なるプラットフォーム上で動かすのは、 難しそうですね。 そういったことも含めて、最近では、 バーチャルマシンが利用できるJavaが、 流行ってきているのかもしれないですね。
お礼
御丁寧な御回答、ありがとうございます。 内容は難しかったですが、大体のイメージはつかめました。 >JAVAのVMは、後半に書いてある通り、プラットフォームを意識しないで、全てのプラットフォームで、同じ仕様のVMを実現しているのが目的です。 Java以外に、Cなどの高級言語のプログラムも、 仮想マシンを使っているからこそ、様々なOS上で、 動かす事ができるのでしょうか?