Perbedaan antara Wine dan Mono

31

Sejauh yang saya tahu, baik Wine maupun Mono digunakan untuk menjalankan aplikasi Windows di bawah Ubuntu.

Jadi saya bertanya-tanya

  1. apa perbedaan mereka? Apakah mereka berdua mesin virtual? Atau apakah masing-masing termasuk dalam kategori lain?
  2. Lebih baik Kapan menggunakan mana untuk aplikasi Windows jenis apa? Misalnya, aplikasi yang mungkin atau mungkin tidak memerlukan .net Framework.
  3. Apakah mereka saling bergantung? Apakah mereka diharuskan menginstal bersama? Atau apakah masing-masing bekerja secara mandiri tanpa ada yang lain?

Terima kasih dan salam!

Tim
sumber

Jawaban:

34

Berhasil menjalankan suatu program mensyaratkan bahwa tiga hal cocok:

  • Set instruksi CPU (Misalnya. X86 di PC Anda, ARM di ponsel Anda, PowerPC di beberapa Apple Mac, Java bytecode untuk Java Applet, CLI untuk aplikasi ".Net" / Mono)
  • Format File Biner (Misalnya. PE / COFF ".exe" untuk Microsoft Windows, .jar untuk Java Applet, PE32 ".exe", ELF di Unix / Linux)
  • Antarmuka Pemrograman Aplikasi ; (Mis. POSIX di Linux / Unix, Cocoa untuk Mac OSX, Win32 di Microsoft Windows, Perpustakaan Kelas Dasar untuk aplikasi ".Net" / Mono).

Anda dapat meningkatkan peluang untuk mencocokkan ketiganya dengan memiliki emulator / juru bahasa (untuk set instruksi CPU lainnya), dengan memiliki pemuat file tambahan (untuk format file asing), dan memiliki pustaka pemrograman tambahan yang menyediakan lebih banyak API.

Perhatikan juga, bahwa beberapa prosesor secara native dapat menjalankan lebih dari satu set instruksi; PC cukup sering memiliki set instruksi x86 dan amd64 ; sebuah ARM prosesor dapat mengeksekusi empat: ARM32 / Thumb / bytecode Java / ThumbEE . Beberapa sistem operasi dapat menyediakan lebih dari satu API secara asli juga (Microsoft Windows menyediakan Win32 dan POSIX ).

Untuk yang lainnya, Anda memerlukan perangkat lunak tambahan. Untuk menjalankan program Java, Anda memerlukan tiga bagian yang tercantum di atas untuk membuatnya berfungsi: program Java Virtual Machine untuk menjalankan bytecode; cara meluncurkan program Java, dan Java Classlibrary untuk memanggil program. "Java" adalah nama merek di sini untuk beberapa teknologi terpisah yang semula dikembangkan oleh Sun, tetapi bagi pengguna mereka sering diunduh sebagai satu.

Hal yang sama berlaku untuk ".Net", yang merupakan merek dagang pemasaran untuk beberapa teknologi berbeda yang pada awalnya dikembangkan oleh Microsoft: The Common Language Run-time / Base Class Library (CLR) adalah API; VES adalah loader dan Common Language Interface (CLI) adalah set instruksi.

Anda tidak harus mengunduh teknologi itu dari Microsoft, dari Sun, atau dari Intel hanya karena mereka awalnya menemukan sesuatu. AMD membuat prosesor kompatibel dengan standar Intel; baik Apache ("Harmony") dan Google ("Android Dalvik") keduanya membuat suite mirip Java; dan Mono menyediakan suite CLR / CLI / VES. Yang penting adalah bahwa setiap orang menggunakan standar yang sama, menjadikannya kompatibel. Cakram DVD akan diputar di sembarang pemutar DVD yang memenuhi standar, dan laman web HTML akan merender di Peramban Web apa pun yang memenuhi standar HTML.

  • Mono adalah suite CLR / CLI / VES yang dapat berjalan di Mac OSX, MS Windows dan Linux.
  • Wine adalah implementasi Win32 API yang dapat berjalan di Mac OSX, MS Windows dan Linux.
  • Anda dapat menjalankan Mono di atas Wine , di atas sistem operasi apa pun.
  • Anda dapat menjalankan Wine di atas Qemu , di atas arsitektur CPU apa pun.

Jadi Mono membuat aplikasi .exe CLR berjalan, dan Wine membuat aplikasi Win32 .exe berjalan. Satu-satunya kesamaan adalah bahwa nama file berakhir dengan ".exe"; isinya sangat berbeda dan tidak kompatibel, jadi Anda perlu yang benar .

Sama seperti interpreter Python akan kesalahan ketika disajikan dengan Perl (dan visa versa), seorang interpreter CLR akan kesalahan ketika disajikan dengan x86 + Win32, atau bytecode JVM + Java. Jika Anda dapat memposting tautan ke program tertentu yang ingin Anda jalankan, saya atau orang lain harus dapat memberi tahu Anda set instruksi yang tepat, format file dan API yang dirancang untuknya, dan untuk apa Anda perlu menginstal di Linux untuk menjalankannya. Semoga itu bisa membantu!

(Kadang-kadang Anda bahkan mungkin membutuhkan keduanya. Misalnya, simulator kereta Openbve adalah C # dan dikompilasi ke PE / COFF + CLI + CLR, tetapi secara opsional dapat menggunakan plugin biner C yang dikompilasi untuk PE / COFF + Win32 + x86. Dalam kasus ini, Anda perlu versi Win32 dari Mono di bawah Wine. Jika arsitektur CPU juga, berbeda yang perlu ditiru; jadi Mono di bawah Wine di bawah Qemu).

dibebani
sumber
22

Jawaban singkatnya:

.NET adalah jawaban Microsoft untuk Java, dan Mono adalah implementasi open source untuknya. Anggur adalah untuk ongkos asli dan tidak ada hubungannya dengan Mono kecuali bahwa Anda mungkin dapat menjalankan .NET runtime dengannya, seperti perangkat lunak Windows asli lainnya.


Jawaban panjangnya:

Untuk memahami perbedaan antara Wine dan Mono (dan .NET), Anda harus memahami perbedaan antara executable kode mesin asli dan "runtime bahasa umum" alias executable "mesin virtual":

Eksekusi kode mesin asli menggunakan kode instruksi khusus untuk prosesor Anda dan langsung dieksekusi olehnya. Itu berarti mereka harus dikompilasi ulang untuk prosesor yang berbeda. Wine dapat menjalankan executable kode mesin asli untuk Windows dengan langsung menjalankan kode yang dapat dieksekusi ini dan menangkap semua panggilan pustaka yang dibuatnya, mengarahkan mereka ke implementasi Win32 API miliknya sendiri.

Dapat dieksekusi "CLR" atau "VM" tidak spesifik untuk satu prosesor: Mereka membutuhkan perangkat lunak tambahan untuk memungkinkan prosesor untuk menjalankannya. Mono / .NET adalah salah satu contoh dari sistem semacam ini. Program .NET memerlukan .NET runtime diinstal bahkan ketika Anda menjalankannya di Windows. Java bekerja dengan cara yang sama.

Begitu:

1) perbedaan antara Wine dan Mono: Wine untuk menjalankan executable kode mesin asli yang dibuat untuk Windows, dan Mono untuk menjalankan executable Mono / .NET yang tidak harus dibuat untuk platform tertentu. Menginstal Mono di Linux sama dengan menginstal .NET runtime di Windows.

2) Jika program yang ingin Anda jalankan tidak menggunakan .NET sama sekali, Anda harus menggunakan Wine. Mono tidak akan membantu Anda sama sekali di sini.

Namun, jika program tersebut menggunakan .NET Anda memiliki dua opsi, yang mana bisa atau tidak bisa:

  • Anda dapat mencoba menjalankannya menggunakan Mono. Ini akan gagal jika program .NET juga menggunakan fungsi asli dari win32 API, yang banyak (tetapi tidak semua) aplikasi .NET dibuat untuk Windows lakukan.

  • Atau, Anda dapat menginstal Microsoft .NET runtime untuk windows di dalam Wine, dan kemudian menjalankan aplikasi .NET melaluinya. Anda tidak akan menggunakan Mono sama sekali dalam hal ini.

3) Anggur dan Mono tidak saling bergantung sama sekali, tetapi seperti yang dinyatakan di atas, Anda dapat menggunakan runtime Microsoft .NET dalam Wine untuk menjalankan aplikasi Mono / .NET.

Alistair Buxton
sumber
Terima kasih! (1) Jadi jika suatu aplikasi bergantung pada .NET dan win32, satu-satunya cara adalah menginstal .NET pada Wine dan kemudian menginstal aplikasi pada Wine? (2) Bagaimana cara mengetahui apakah suatu aplikasi bergantung pada .NET dan / atau win32?
Tim
1
Pengetikan file *.exeakan menampilkan informasi tentang set instruksi CPU dan jenis file. Jika ini adalah aplikasi CLI / CLR (".Net" / Mono) yang juga menggunakan panggilan API Win32 asli, Anda harus menjalankannya, atau mencari file *.dllfile yang menunjukkan sebagai x86 asli + Win32.
sarat
Anda juga dapat menginstal Mono untuk Windows dalam Wine, tetapi menurut FAQ Anggur, kemungkinannya lebih kecil daripada runtime .NET. Tidak ada cara sederhana untuk mengetahui apakah program .NET menggunakan panggilan win32 asli karena ada banyak cara yang berbeda untuk melakukannya. Hal terbaik untuk dilakukan adalah coba Mono terlebih dahulu, jika tidak berhasil, coba Wine + .NET.
Alistair Buxton