web-dev-qa-db-ja.com

ワインとモノの違い

私の知る限り、WineとMonoはどちらもUbuntuでWindowsアプリケーションを実行するために使用されます。

だから私は疑問に思っていました

  1. それらの違いは何ですか?両方とも仮想マシンですか?または、それぞれが他のカテゴリに属しますか?
  2. どの種類のWindowsアプリケーションにどれを使用するのが良いですか?たとえば、.net Frameworkを必要とする場合と必要としない場合があります。
  3. 彼らはお互いに依存していますか?一緒にインストールする必要がありますか?または、それぞれが他の存在なしに独立して動作しますか?

よろしくお願いします!

30
Tim

プログラムを正常に実行するには、次の3つのことが一致する必要があります。

  • CPU命令セット(たとえば、PCのx86ARM携帯電話では、PowerPCいくつかのApple Macでは、JavaバイトコードはJavaで_アプレット、CLI ".Net"/Monoアプリケーションの場合)
  • バイナリファイル形式(例:PE/COFFMicrosoft Windows用の「.exe」、。jar Javaアプレットの場合、PE32 ".exe"、ELFon Unix/Linux)
  • Application Programming Interface; (例:POSIXLinux/Unix、CocoaMac OSX、Win32Microsoft Windowsの場合、「。Net」/ Monoアプリケーションの場合はベースクラスライブラリ)。

エミュレーター/インタープリター(他のCPU命令セット用)、追加ファイルローダー(外部ファイル形式用)、および追加のAPIを提供する追加のプログラミングライブラリにより、3つすべてに一致する可能性を高めることができます。

また、一部のプロセッサは複数の命令セットをネイティブに実行できることに注意してください。 PCには、かなり頻繁にx86およびAMD64命令セットがあります。 ARMプロセッサは4つ実行できます:ARM32/Thumb/Javaバイトコード/ ThumbEE。一部のオペレーティングシステムは、複数のAPIをネイティブに提供することもできます(Microsoft WindowsはWin32およびPOSIXを提供します)。

それ以外の場合は、追加のソフトウェアが必要です。 Javaプログラムを実行するには、上記の3つの部分が必要です:Java仮想マシンプログラムからrunバイトコード。 Javaプログラムの起動方法、およびプログラムが呼び出すためのJava Classlibrary。 「Java」は、Sunが元々開発したいくつかの別個の技術のブランド名ですが、ユーザーにとっては1つとしてダウンロードされることがよくあります。

同じことは、「。Net」にも適用されます。これは、Microsoftが最初に開発したいくつかの異なる技術のマーケティングブランド名です。Common Language Run-time/Base Class Library(CLR)はAPI; VESはローダーであり、Common Language Interface(CLI)は命令セットです。

もともと何かを発明したからといって、Microsoft、Sun、またはIntelからこれらのテクノロジーをダウンロードする必要はありません。 AMDは、プロセッサーをIntelの標準に適合させます。 Apache( "Harmony")とGoogle( "Android Dalvik")は両方ともJavaのようなスイートを作成します。 MonoはCLR/CLI/VESスイートを提供します。重要なことは、誰もが同じ標準を使用し、互換性を持たせることです。 DVDディスクは、標準を満たすDVDプレーヤーで再生され、HTML Webページは、HTML標準を満たすWebブラウザーでレンダリングされます。

  • Monoは、Mac OSX、MS Windows、Linuxで実行できるCLR/CLI/VESスイートです。
  • Wineは、Mac OSX、MS Windows、Linuxで実行できるWin32 API実装です。
  • MonoWineの上で、任意のオペレーティングシステムの上で実行できます。
  • WineQemuの上で、任意のCPUアーキテクチャの上で実行できます。

したがって、MonoはCLR .exeアプリケーションを実行し、WineはWin32 .exeアプリケーションを実行します。唯一の共通点は、ファイル名の末尾が「.exe」であることです。内容は完全に異なり、互換性がないため、rightが必要です。

PythonインタープリターがPerl(およびその逆)で表示されるときにエラーになるように、CLRインタープリターはx86 + Win32、またはJVM + Javaバイトコードで表示されるときにエラーになります。実行したい特定のプログラムへのリンクを投稿できる場合は、自分自身または他の誰かが正確な命令セット、ファイル形式とAPIの設計、およびLinuxにインストールする必要があるものを教えてくれるはずです。それを実行します。お役に立てば幸いです!

(場合によっては両方が必要になることもあります。たとえば、Openbve列車シミュレータはC#であり、PE/COFF + CLI + CLRにコンパイルされますが、オプションでPE/COFF + Win32 + x86用にコンパイルされたCバイナリプラグインを使用できます。この場合、Win32版のMonoのWin32バージョンが必要です。 。

34
sladen

短い答え:

.NETはMicrosoftのJavaに対する答えであり、MonoはJavaのオープンソース実装です。 Wineはネイティブexe用であり、Monoとは何の関係もありません。ただし、他のネイティブWindowsソフトウェアのように、それを使用して.NETランタイムを実行できる場合があります。


長い答え:

WineとMono(および.NET)の違いを理解するには、ネイティブマシンコードの実行可能ファイルと「共通言語ランタイム」または「仮想マシン」実行可能ファイルの違いを理解する必要があります。

ネイティブマシンコード実行可能ファイルは、プロセッサに固有の命令コードを使用し、プロセッサによって直接実行されます。つまり、異なるプロセッサ用に再コンパイルする必要があります。 Wineは、この実行可能コードを直接実行し、それが行うライブラリ呼び出しをキャッチして、Win32 APIの独自の実装にリダイレクトすることにより、Windowsのネイティブマシンコード実行可能ファイルを実行できます。

「CLR」または「VM」実行可能ファイルは、1つのプロセッサに固有のものではありません。プロセッサで実行できるようにするには、追加のソフトウェアが必要です。 Mono/.NETは、この種のシステムの一例です。 .NETプログラムをWindowsで実行する場合でも、.NETランタイムをインストールする必要があります。 Javaは同じように機能します。

そう:

1)WineとMonoの違い:WineはWindows用に作成されたネイティブマシンコード実行可能ファイルを実行するためのものであり、Monoは特定のプラットフォーム用に必ずしも作成されないMono/.NET実行可能ファイルを実行するためのものです。 LinuxにMonoをインストールすることは、Windowsに.NETランタイムをインストールすることと同等です。

2)実行するプログラムが.NETをまったく使用しない場合、Wineを使用する必要があります。ここでは、Monoはまったく役に立ちません。

ただし、プログラムが.NETを使用する場合、次の2つのオプションがあり、どちらかが機能する場合と機能しない場合があります。

  • Monoを使用して実行してみてください。 .NETプログラムがwin32 APIのネイティブ関数も使用している場合、これは失敗します。これは、Windows用に作成された多くの(すべてではない).NETアプリケーションが実行します。

  • または、Microsoft .NETランタイムWindows用をWine内にインストールし、それを通して.NETアプリケーションを実行することもできます。この場合、Monoはまったく使用しません。

3)WineとMonoは互いに依存していませんが、上記のように、WineのMicrosoft .NETランタイムを使用してMono/.NETアプリケーションを実行できます。

21
Alistair Buxton