Şarap ve Mono Arasındaki Fark


31

Bildiğim kadarıyla, hem Wine hem de Mono, Ubuntu altındaki Windows uygulamalarını çalıştırmak için kullanılıyor.

Bu yüzden merak ediyordum

  1. aralarındaki farklar neler? İkisi de sanal makineler mi? Yoksa her biri başka bir kategoriye mi ait?
  2. Hangi tür Windows uygulamaları için ne zaman kullanılır? Örneğin .net Framework gerektirebilecek veya gerektirmeyebilecek uygulamalar.
  3. Birbirlerine mi bağlılar? Birlikte yüklemeleri gerekir mi? Yoksa her biri diğerinin varlığından bağımsız olarak mı çalışıyor?

Teşekkürler ve saygılar!

Yanıtlar:


34

Bir programı başarılı bir şekilde çalıştırmak, üç şeyin eşleşmesini gerektirir:

  • CPU komut seti ( PC'nizde x86 , cep telefonunuzda ARM , bazı Apple Mac'lerde PowerPC , Java Appletleri için Java bayt kodu , ".Net" / Mono uygulamaları için CLI )
  • İkili Dosya Biçimi ( Microsoft Windows için PE / COFF ".exe", Java Uygulamaları için .jar , PE32 ".exe", Unix / Linux'ta ELF )
  • Uygulama Programlama Arabirimi ; (Örn. Linux / Unix üzerindeki POSIX , Mac OSX için Kakao , Microsoft Windows'daki Win32 , ".Net" / Mono uygulamaları için Temel Sınıf Kütüphanesi ).

Her ikisini de eşleştirici olma şansını, emülatörlere / tercümanlara (diğer CPU komut setleri için), ekstra dosya yükleyicilere (yabancı dosya formatları için) ve daha fazla API sağlayan ek programlama kitaplıklarına sahip olarak artırabilirsiniz.

Ayrıca, bazı işlemcilerin yerel olarak birden fazla komut setini çalıştırabileceğine dikkat edin; bir PC oldukça sık x86 ve amd64 komut setine sahiptir; Bir ARM işlemcisi dört yürütebilir: ARM32 / Thumb / Java bytecode / ThumbEE . Bazı işletim sistemleri de birden fazla API sağlayabilir (Microsoft Windows, Win32 ve POSIX sağlar ).

Her şey için ekstra bir yazılıma ihtiyacınız var. Java programlarını çalıştırmak için çalışması için yukarıda listelenen üç bölüme ihtiyacınız vardır: bayt kodunu çalıştırmak için bir Java Sanal Makinesi programı ; Java programlarını başlatmanın bir yolu ve programların çağrılması için bir Java Sınıf Kütüphanesi. "Java", burada Sun tarafından geliştirilen, ancak bir kullanıcı olarak sık sık indirilen birkaç ayrı teknoloji için burada bir markadır.

Aynısı, Microsoft tarafından geliştirilen ve farklı teknolojiler için bir pazarlama markası olan ".Net" için de geçerlidir: Ortak Dil Çalışma Zamanı / Temel Sınıf Kütüphanesi (CLR) API; VES yükleyici ve Ortak Dil Arabirimi (CLI) komut setidir.

Bu teknolojileri Microsoft'tan, Sun'dan veya Intel'den, aslında bir şey icat ettikleri için indirmeniz gerekmez. AMD, işlemcileri Intel'in standartlarıyla uyumlu hale getirir; Hem Apache ("Harmony") hem de Google ("Android Dalvik") Java biçiminde bir paket oluşturuyor. ve Mono bir CLR / CLI / VES paketi sunar. Önemli olan, herkesin aynı standartları kullanması ve bunları uyumlu hale getirmesidir. Bir DVD disk, standardı karşılayan herhangi bir DVD oynatıcıda oynatılır ve bir HTML web sayfası, HTML standartlarını karşılayan herhangi bir Web Tarayıcısında oluşturulur.

  • Mono , Mac OSX, MS Windows ve Linux üzerinde çalışabilen bir CLR / CLI / VES paketidir.
  • Wine , Mac OSX, MS Windows ve Linux üzerinde çalışabilen bir Win32 API uygulamasıdır.
  • Kaçabilirsiniz Mono üstünde Şarap herhangi bir işletim sisteminin üzerinde.
  • Kaçabilirsiniz Wine üstünde QEMU herhangi işlemci mimarisi üstüne,.

Böylece Mono , CLR .exe uygulamalarını çalıştırır ve Wine , Win32 .exe uygulamalarını çalıştırır. Ortak olan tek şey, dosya adlarının ".exe" ile bitmesidir; içerikler tamamen farklı ve uyumsuz, bu yüzden doğru olana ihtiyacınız var .

Tıpkı bir Python yorumlayıcısı Perl ile sunulduğunda hata verir (ve tersi), bir CLR yorumlayıcısı x86 + Win32 veya JVM + Java bayt kodu ile sunulduğunda hata verir. Çalıştırmak istediğiniz belirli bir programa bağlantı gönderebiliyorsanız, kendim veya bir başkası size tam komut setini, dosya formatını ve onun için tasarlandığı API'yi ve Linux'ta ne yüklemeniz gerektiğini söyleyebilmelidir. çalıştırmak için. Umarım yardımcı olur!

(Bazen ikisine de ihtiyacınız olabilir. Örneğin, Openbve train simülatörü C # ve PE / COFF + CLI + CLR'ye derlenmiştir, ancak isteğe bağlı olarak PE / COFF + Win32 + x86 için derlenmiş C ikili eklentilerini de kullanabilirsiniz. Bu durumda, Wine altında Mono'nun bir Win32 sürümüne ihtiyacınız var.İşlemci mimarisi de öyleyse, öykünmesi gerekenden farklı, bu yüzden Qemu altındaki Wine altında Mono).


22

Kısa cevap:

.NET, Microsoft'un Java'ya cevabıdır ve Mono bunun açık kaynaklı bir uygulamasıdır. Wine, yerel exes içindir ve Mono ile ilgisi yoktur, ancak başka bir yerel Windows yazılımı gibi .NET çalışma zamanını da çalıştırabilirsiniz.


Uzun cevap:

Wine ve Mono (ve .NET) arasındaki farkı anlamak için yerel makine kodu çalıştırılabilir dosyaları ile "ortak dil çalışma zamanı" aka "sanal makine" çalıştırılabilir dosyaları arasındaki farkı anlamanız gerekir:

Yerel makine kodu çalıştırılabilirleri işlemcinize özgü talimat kodlarını kullanır ve doğrudan onun tarafından yürütülür. Bu, farklı işlemciler için yeniden derlenmeleri gerektiği anlamına gelir. Wine, doğrudan bu yürütülebilir kodu çalıştırarak ve yaptığı herhangi bir kütüphane çağrısını yakalayarak, bunları Win32 API'sinin kendi uygulamasına yönlendirerek, Windows için yerel makine kodu çalıştırılabilir dosyalarını çalıştırabilir.

"CLR" veya "VM" çalıştırılabilir dosyaları bir işlemciye özgü değildir: İşlemcinin çalışabilmesi için fazladan bir yazılıma ihtiyaç duyarlar. Mono / .NET bu tür bir sistem örneğidir. .NET programları, Windows üzerinde çalıştırsanız bile .NET çalışma zamanlarının yüklü olmasını gerektirir. Java aynı şekilde çalışır.

Yani:

1) Wine ve Mono arasındaki fark: Wine, Windows için yapılan yerel makine kodu çalıştırılabilir kodlarını çalıştırmak içindir ve Mono, belirli bir platform için yapılması zorunlu olmayan Mono / .NET çalıştırılabilir dosyalarını çalıştırmak içindir. Mono’yu Linux’a kurmak, .NET çalışma zamanını Windows’a kurmakla eşdeğerdir.

2) Çalıştırmak istediğiniz program hiç .NET kullanmıyorsa, Wine kullanmalısınız. Mono burada sana yardım etmeyecek.

Ancak, program .NET kullanıyorsa, ikisi de işe yarayabilecek ya da çalışmayabilecek iki seçeneğiniz vardır:

  • Mono kullanarak çalıştırmayı deneyebilirsiniz. Bu, .NET programı ayrıca Windows için yapılan pek çok (ancak tümü değil) .NET uygulamasının yaptığı win32 API'sindeki yerel işlevleri kullanıyorsa başarısız olur.

  • Alternatif olarak, Wine içindeki Windows için Microsoft .NET çalışma zamanını yükleyebilir ve ardından .NET uygulamasını çalıştırabilirsiniz. Bu durumda Mono'yu hiç kullanmayacaksınız.

3) Wine ve Mono birbirlerine hiç bağlı değillerdir, ancak yukarıda belirtildiği gibi Mono / .NET uygulamalarını çalıştırmak için Wine'daki Microsoft .NET çalışma zamanını kullanabilirsiniz.


Teşekkürler! (1) Yani, bir uygulama hem .NET'e hem de win32'ye bağlıysa, tek yol .NET'i Wine'a yüklemek ve uygulamayı Wine'a yüklemek mi? (2) Bir uygulamanın .NET ve / veya win32'ye dayanıp güvenmediğini nasıl bilebilirim?
Tim

1
Yazma file *.exe, CPU komut seti ve dosya tipi hakkında bilgi gösterecektir. Bir CLI / CLR ise ( ".Net" / Mono) bu uygulama da herhangi biri için doğrudan Win32 API çalıştırmak gerekir aramaları veya göz kullandığı file *.dlldoğal x86 + Win32 olarak göstermek dosyalar.
salı

Mono for Wine ürününü Mono da Wine'da yükleyebilirsiniz, ancak Wine SSS’ine göre .NET çalışma zamanından daha az çalışma olasılığı vardır. Bir .NET programının yerel win32 çağrılarını kullanıp kullanmadığını bilmenin basit bir yolu yoktur, çünkü yapabilecekleri birçok farklı yol vardır. Yapılacak en iyi şey, önce Mono'yu denemek, işe yaramazsa, Wine + .NET'i deneyin.
Alistair Buxton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.