Mono sering digunakan untuk mengatakan "Ya, .NET adalah cross-platform". Seberapa valid klaim itu? [Tutup]

168

Dalam Apa yang Anda pilih untuk proyek Anda antara .NET dan Java pada saat ini? Saya mengatakan bahwa saya akan mempertimbangkan "Apakah Anda akan selalu menggunakan untuk Windows?" satu-satunya keputusan teknis terpenting untuk menjadi yang terdepan dalam proyek web baru, dan jika jawabannya "tidak", saya akan merekomendasikan Java daripada .NET.

Argumen kontra yang sangat umum adalah bahwa "Jika kita ingin menjalankan Linux / OS X / Terserah, kita hanya akan menjalankan Mono" 1 , yang merupakan argumen yang sangat menarik di permukaan, tetapi saya tidak setuju untuk beberapa alasan.

  • OpenJDK dan semua vendor yang disediakan JVM telah melewati Sun TCK resmi yang memastikan semuanya berjalan dengan benar. Saya tidak mengetahui Mono mengoper Microsoft TCK.
  • Mono mengikuti rilis .NET. Apa .NET-level saat ini didukung penuh?
  • Apakah semua elemen GUI (WinForms?) Berfungsi dengan benar di Mono?
  • Bisnis mungkin tidak ingin bergantung pada kerangka kerja Sumber Terbuka sebagai rencana resmi B.

Saya sadar bahwa dengan tata kelola Java yang baru oleh Oracle, masa depan tidak aman, tetapi misalnya IBM menyediakan JDK untuk banyak platform , termasuk Linux. Mereka hanya tidak bersumber terbuka.

Jadi, dalam keadaan apa Mono strategi bisnis yang valid untuk .NET-aplikasi?


1 Mark H meringkasnya sebagai : "Jika klaimnya adalah " Saya memiliki aplikasi windows yang ditulis dalam .NET, itu harus berjalan pada mono " , maka tidak, itu bukan klaim yang valid - tetapi Mono telah melakukan upaya untuk membuat porting aplikasi seperti itu. lebih sederhana. "

Komunitas
sumber
24
Supaya jelas, .NET adalah implementasi CLI dari Microsoft. Mono adalah implementasi CLI dengan Novell yang memimpin.
ChaosPandion
Ini kedengarannya lebih seperti jawaban untuk pertanyaan sebelumnya daripada pertanyaan sendiri. Saya sarankan Anda mempertimbangkan untuk mengedit pertanyaan Anda untuk membuatnya lebih berdiri sendiri.
Walter
2
@walter, intinya adalah bahwa saya menyadari bahwa "java lebih lintas-platform daripada. NET" -judul, dan saya daftar mereka untuk membuat jawaban menggabungkan argumen-counter terbaik.
1
Ini di luar topik untuk pertanyaan. Kepala ke situs perencanaan bisnis dan telusuri beberapa contoh rencana untuk melihat apa yang benar - benar penting untuk bisnis ... Tech X vs Tech Y adalah tentang sama pentingnya dengan FedEx memperdebatkan Ford vs GM untuk pengiriman van.
red-dirt

Jawaban:

194

Jawaban Sparkie mengerti, biarkan aku sedikit melengkapi.

".NET adalah lintas platform" terlalu banyak pernyataan yang ambigu karena kerangka kerja dan dunia yang semula diciptakan untuknya telah berubah dan berevolusi.

Jawaban singkatnya adalah:

Mesin yang mendasari bahwa kekuatan NET dan turunannya, Bahasa Infrastruktur Standar Umum, adalah cross-platform dan seolah-olah Anda ingin membuat kode Anda pergi ke beberapa platform, Anda perlu berencana untuk menggunakan API kanan pada platform yang tepat untuk memberikan pengalaman terbaik di setiap platform.

Keluarga CLI belum mencoba pendekatan "Write Once, Run Anywhere", karena perbedaan dari ponsel ke mainframe terlalu besar. Alih-alih semesta API dan fitur runtime yang khusus untuk platform telah muncul untuk memberi pengembang alat yang tepat untuk menciptakan pengalaman hebat di setiap platform.

Pikirkan: pemrogram tidak lagi menargetkan PC Windows atau Server Unix. Dunia, sekarang lebih dari sebelumnya dikelilingi oleh platform yang menarik dari PC, ke konsol game, ke ponsel yang kuat, ke kotak set-top, ke server besar dan mendistribusikan cluster mesin. Satu ukuran cocok untuk semua platform hanya akan merasa kembung pada perangkat kecil, dan merasa kurang bertenaga pada sistem besar .

Produk .NET Framework Microsoft tidak lintas platform, hanya berjalan di Windows. Ada variasi .NET Framework dari Microsoft yang berjalan di sistem lain seperti Windows Phone 7, XBox360 dan browser melalui Silverlight, tetapi semuanya adalah profil yang sedikit berbeda.

Hari ini Anda dapat menargetkan setiap OS utama, telepon, perangkat seluler, sistem dan server tertanam dengan teknologi .NET. Berikut adalah daftar yang menunjukkan implementasi CLI mana yang akan Anda gunakan dalam setiap kasus (daftar ini tidak komprehensif, tetapi harus mencakup 99% dari kasus):

  • komputer PC berbasis x86 dan x86-64:
    • menjalankan Windows -> Biasanya Anda menjalankan .NET atau Silverlight tetapi Anda juga dapat menggunakan Mono lengkap di sini.
    • menjalankan Linux, BSD atau Solaris -> Anda menjalankan Mono atau Silverlight penuh
    • menjalankan MacOS X -> Anda menjalankan Mono atau Silverlight penuh
    • menjalankan Android -> Anda menjalankan subset Mono / Android
  • Komputer ARM:
    • Menjalankan Windows Phone 7: Anda menjalankan Compact Framework 2010
    • Menjalankan Windows 6.5 dan yang lebih lama: Anda menjalankan Compact Framework lama
    • Perangkat Android: Anda menjalankan Mono / Android
  • Komputer PowerPC:
    • Anda menjalankan Mono penuh untuk sistem operasi Linux, BSD atau Unix penuh
    • Anda menjalankan embedded Mono untuk PS3, Wii atau sistem embedded lainnya.
    • Di XBox360, Anda menjalankan CompactFramework
  • Komputer S390, S390x, Itanium, SPARC:
    • Anda menjalankan Mono penuh
  • Sistem operasi tertanam lainnya:
    • Anda menjalankan .NET MicroFramework atau Mono dengan profil seluler.

Tergantung pada kebutuhan Anda di atas mungkin cukup atau tidak. Anda tidak akan mendapatkan kode sumber yang sama untuk dijalankan di mana-mana. Misalnya, kode XNA tidak akan berjalan di setiap desktop, sedangkan perangkat lunak .NET Desktop tidak akan berjalan di XNA atau telepon. Anda biasanya perlu membuat perubahan pada kode Anda untuk berjalan di profil lain dari .NET Framework. Berikut adalah beberapa profil yang saya ketahui:

  • Profil .NET 4.0
  • Profil Silverlight
  • Profil Windows Phone 7
  • Profil XBox360
  • Profil inti Mono - mengikuti profil .NET dan tersedia di Linux, MacOS X, Solaris, Windows dan BSD.
  • .NET Micro Framework
  • Mono di profil iPhone
  • Mono di Profil Android
  • Mono di Profil PS3
  • Mono di Profil Wii
  • Profil Cahaya Bulan (kompatibel dengan Silverlight)
  • Moonlight extended profile (Silverlight + akses penuh .NET 4 API)

Jadi masing-masing profil itu sebenarnya sedikit berbeda, dan ini bukan hal yang buruk. Setiap profil dirancang agar sesuai dengan platform inangnya dan mengekspos API yang masuk akal, dan menghapus yang tidak masuk akal.

Misalnya, API Silverlight untuk mengontrol browser host tidak masuk akal di telepon. Dan shader di XNA tidak masuk akal pada perangkat keras PC yang tidak memiliki dukungan setara untuk itu.

Semakin cepat Anda menyadari bahwa .NET bukan solusi untuk mengisolasi pengembang dari kemampuan yang mendasari perangkat keras dan platform asli, semakin baik Anda.

Itu mulai berkata, beberapa API dan tumpukan tersedia dalam beberapa platform, misalnya ASP.NET dapat digunakan pada Windows, Linux, pada Solaris, pada MacOS X karena API tersebut ada di .NET dan Mono. ASP.NET tidak tersedia pada beberapa platform yang didukung Microsoft seperti XBox atau Windows Phone 7 dan tidak didukung pada platform lain yang Mono dukung seperti Wii atau iPhone.

Informasi berikut ini hanya benar pada 21 November, dan banyak hal di dunia Mono kemungkinan akan berubah.

Prinsip yang sama dapat diterapkan pada tumpukan lain, daftar lengkap akan membutuhkan tabel yang tepat, yang saya tidak tahu bagaimana menyajikan di sini, tetapi di sini adalah daftar teknologi yang mungkin tidak ada pada platform tertentu. Anda dapat menganggap bahwa apa pun yang tidak tercantum di sini tersedia (jangan ragu untuk mengirim saya suntingan untuk hal-hal yang saya lewatkan):

Core Runtime Engine [di mana-mana]

  • Reflection.Emit Support [di mana-mana, kecuali WP7, CF, Xbox, MonoTouch, PS3]
  • Dukungan SIMD CPU [Linux, BSD, Solaris, MacOS X; Segera PS3, MonoTouch dan MonoDroid]
  • Lanjutan - Mono.Tasklets [Linux, BSD, Solaris, MacOS, PS3, Wii]
  • Assembly Unloading [Khusus Windows]
  • Injeksi VM [Linux, BSD, MacOS X, Solaris]
  • DLR [Windows, Linux, MacOS X, Solaris, MonoDroid]
  • Generik [beberapa batasan pada PS3 dan iPhone].

Bahasa

  • C # 4 [di mana-mana]
  • C # Compiler sebagai Layanan (Linux, MacOS, Solaris, BSD, Android)
  • IronRuby [di mana-mana, execpt WP7, CF, Xbox, MonoTouch, PS3]
  • IronPython [di mana-mana, execpt WP7, CF, Xbox, MonoTouch, PS3]
  • F # [di mana-mana, execpt WP7, CF, Xbox, MonoTouch, PS3]

Tumpukan Server

  • ASP.NET [Windows, Linux, MacOS, BSD, Solaris]
  • ADO.NET [di mana-mana]
  • LINQ ke SQL [di mana-mana]
  • Kerangka Entitas [di mana-mana]
  • Core XML stack [di mana-mana]
    • Serialisasi XML [di mana-mana, kecuali WP7, CF, Xbox)
  • LINQ ke XML (di mana-mana)
  • System.Json [Silverlight, Linux, MacOS, MonoTouch, MonoDroid]
  • System.Messaging [Windows; di Linux, MacOS dan Solaris membutuhkan RabbitMQ]
  • .NET 1 Layanan Perusahaan [Khusus Windows]
  • WCF [lengkap tentang Windows; subset kecil di Silverlight, Solaris, MacOS, Linux, MonoTouch, MonoDroid]
  • Windows Workflow [Khusus Windows]
  • Identitas Cardspace [khusus Windows]

Tumpukan GUI

  • Silverlight (Windows, Mac, Linux - dengan Moonlight)
  • WPF (hanya Windows)
  • Gtk # (Windows, Mac, Linux, BSD)
  • Windows.Forms (Windows, Mac, Linux, BSD)
  • MonoMac - Integrasi Mac Asli (hanya Mac)
  • MonoTouch - Integrasi iPhone Asli (khusus iPhone / iPad)
  • MonoDroid - Integrasi Android Asli (khusus Android)
  • API Media Center - Hanya Windows
  • Clutter (Windows dan Linux)

Perpustakaan Grafik

  • GDI + (Windows, Linux, BSD, MacOS)
  • Kuarsa (MacOS X, iPhone, iPad)
  • Kairo (Windows, Linux, BSD, MacOS, iPhone, iPad, MacOS X, PS3, Wii)

Mono Libraries - Cross Platform, dapat digunakan dalam. NET tetapi membutuhkan pembangunan secara manual

  • C # 4 Compiler sebagai Layanan
  • Cecil - Manipulasi CIL, alur kerja, instrumentasi CIL, Linker
  • Perpustakaan RelaxNG
  • Mono.Data. * Penyedia basis data
  • Full System.Xaml (untuk digunakan dalam pengaturan di mana .NET tidak menawarkan stack)

MonoTouch berarti Mono berjalan di iPhone; MonoDroid berarti Mono berjalan di Android; Port PS3 dan Wii hanya tersedia untuk pengembang yang memenuhi syarat Sony dan Nintendo.

Saya minta maaf karena kurangnya formalitas.

miguel.de.icaza
sumber
2
IBM, Jika Anda membaca ini, saya ingin AIX (atau bahkan AS / 400) berada di daftar Miguels !!
4
terima kasih untuk jawaban yang pasti, otoritatif (sp?)!
10
Kita tahu bahwa IBM telah melakukan setidaknya dua port dari Mono ke AIX, tetapi tim yang melakukan port tidak diizinkan untuk merilis perubahan kembali.
miguel.de.icaza
3
+1 - Orang ini harusnya mengerjakan Proyek Mono! Tolong jangan mengambil umpan;)
JeffO
1
@ JeffO: Orang ini adalah pencipta Mono ;-)
seoul
114

Pertama, Anda perlu membuat perbedaan antara Common Language Infrastructure (Standar terbuka), dan .NET (Microsoft menerapkan standar itu). Mono adalah implementasi dari CLI, dan tidak pernah mengklaim sebagai ".NET portabel". Juga, bahasa C # adalah standar terbuka, dan tidak sepenuhnya terikat dengan .NET.

Saya tidak tahu apakah Microsoft memiliki alat untuk memvalidasi bahwa suatu implementasi sesuai, tetapi jika mereka melakukannya, saya cukup yakin para mono memilikinya, dan menggunakannya.

Mono tertinggal di belakang. Net, tetapi nyaris tidak. Mono dapat menjalankan kode C # 4.0 (versi .NET saat ini). Selain itu, Microsoft baru-baru ini membuat semua kode DLR dan pustaka sumber terbuka (di bawah lisensi Apache 2.0), yang telah memungkinkan mono untuk menggunakan bahasa seperti IronPython, IronRuby, dan F # telah dibuat open source hanya minggu lalu. Selain itu, Microsoft secara teratur merilis CTP fitur mendatang di .NET, yang memungkinkan pengembang mono tetap mengikuti perkembangan dengan versi rilis saat ini.

Ada sejumlah alat dan ekstensi di .NET, misalnya, Kontrak Kode. Ini tidak selalu diterapkan sepenuhnya dalam mono. (Saat ini, saya pikir ada validator kontrak parsial untuk Membutuhkan kontrak). Ini tidak umum digunakan dalam aplikasi .NET, tetapi jika popularitas mereka meningkat, demikian juga tingkat penerapannya di mono.

WinForms tidak (sepenuhnya) portabel. Mereka adalah. NET spesifik dan bukan bagian dari CLI. CLI tidak menentukan set widget tertentu. Ada set widget lintas platform (GTK # dan Silverlight). Jika Anda menulis aplikasi dari bawah ke atas dengan mempertimbangkan portabilitas, Anda akan menggunakan salah satunya daripada WinForms / WPF. Selain itu, mono menyediakan pembungkus tipis untuk API Winforms - yang memungkinkan aplikasi winforms yang ada untuk lebih mudah diangkut ke GTK # (tanpa seluruh penulisan ulang).

Mono menyediakan alat, Mono Migration Analyzer (MoMA), yang dapat mengambil aplikasi .Net yang ada dan memberi tahu Anda tentang portabilitasnya. (misalnya, mengidentifikasi perpustakaan yang tidak dapat diakses yang digunakan, P / Panggil dll).

Untuk bisnis yang tidak ingin bergantung pada Open Source - mono dapat dilisensikan ulang. Kepemilikan kode yang ditambahkan ke mono diserahkan kepada novell, yang dapat melisensikannya dengan cara-cara alternatif selain dari lisensi LGPL yang biasa (yang toh memiliki batasan sangat sedikit).

Jadi untuk klaim ". NET adalah portable", saya pikir ini bisa menjadi pernyataan yang valid jika Anda menulis kode dari bawah ke atas dan menyadari masalah portabilitas dengan kerangka kerja. Jika klaimnya adalah "Saya punya aplikasi windows yang ditulis dengan .NET, itu harus berjalan pada mono", maka tidak, itu bukan klaim yang valid - tetapi Mono telah berupaya membuat porting aplikasi seperti itu lebih sederhana.

Markus H
sumber
20
+1 untuk paragraf terakhir.
Davy8
4
the C# language is an open standard, and is not strictly tied to .NET.dan C# 4.0 code (current .NET version)saling bertentangan
Jader Dias
9
Poin terakhir Anda adalah yang baik, dan sama-sama berlaku untuk Java. Hanya karena Anda telah membuat kode aplikasi di Java tidak berarti itu otomatis portabel untuk setiap platform yang mendukung Java. Khusus untuk proyek yang lebih kompleks, Anda menemukan banyak aplikasi Java memiliki kode khusus platform.
Dean Harding
5
@ user8057: Winforms 100% diterapkan? Serius? Lihat komponen RichTextBox. Lihat fungsionalitas seret dan lepas pada komponen Tree. Ayunan adalah 100% lintas-platform, di sisi lain, meskipun itu mungkin berarti mengisap semua platform.
Dan Rosenstark
2
@Yar: LOL untuk "walaupun itu mungkin berarti mengisap semua platform" :-)
Wizard79
14

Poin demi poin:

  • OpenJDK dan semua vendor yang disediakan JVM telah melewati Sun TCK resmi yang memastikan semuanya berjalan dengan benar. Saya tidak mengetahui Mono mengoper Microsoft TCK.
    Ada spesifikasi yang sesuai dengan Microsoft CLR. Mono bukan tiruan dari CLR Microsoft, melainkan implementasi dari spesifikasi yang sama. Di satu sisi, ada kemungkinan hal ini menghasilkan ketidakcocokan yang lebih besar. Dalam praktiknya, ini bekerja sangat baik untuk mono.
  • Mono mengikuti rilis .NET. Apa .NET-level saat ini didukung penuh?
    Karena dokumentasi untuk .Net mendahului rilis yang sebenarnya, mono sebenarnya telah menyelesaikan (bukan rilis beta) dukungan untuk .Net 4 sebelum rilis resmi Microsoft. Selain itu, mono melakukan pekerjaan yang sangat baik dalam mendokumentasikan hal-hal yang tidak didukung, dan mereka memiliki beberapa alat yang dapat Anda jalankan melawan proyek yang ada untuk membantu Anda melihat tempat-tempat dengan potensi ketidakcocokan.
  • Apakah semua elemen GUI (WinForms?) Berfungsi dengan benar di Mono?
    Sebagian besar winform berfungsi dengan baik. WPF, tidak banyak. Saya pernah mendengar bahwa hal yang sama berlaku untuk Java - banyak widget / gui toolkit canggih tidak didukung dengan baik di semua platform.
  • Bisnis mungkin tidak ingin bergantung pada kerangka kerja Sumber Terbuka sebagai rencana resmi B.
    Jika itu masalahnya, mereka pasti tidak akan pergi dengan Java, maka, karena menempatkan kerangka kerja sumber terbuka lebih tinggi pada rencana A.

Singkatnya, jika Anda ingin membangun aplikasi lintas platform saat ini , tidak ada yang salah dengan memulai dengan mono sejak awal dan menggunakannya sebagai kerangka kerja Anda. Anda bahkan dapat menggunakan mono di Windows jika diinginkan.

Di sisi lain, jika Anda ingin membangun aplikasi Windows hari ini yang menurut Anda mungkin perlu lintas platform di beberapa titik yang tidak diketahui di masa mendatang, Anda mungkin ingin menggunakan widget dan alat Windows asli. .Net melakukan pekerjaan yang jauh lebih baik di sini daripada di Jawa, dan mono dapat diterima kembali dalam skenario ini.

Dengan kata lain: Ya, .Net jika lintas platform dalam segala hal yang penting bagi pertanyaan Anda. Tidak, mono tidak akan hanya menjalankan setiap program .Net di luar kotak, tetapi pertanyaan Anda adalah dalam konteks proyek baru. Tidak butuh banyak usaha untuk menjaga proyek baru dari masalah dan menghindari masalah kompatibilitas, terutama jika Anda berpikir dalam hal mengembangkan untuk mono daripada mengembangkan untuk. Net.

Namun yang paling penting, saya pikir ini adalah pertanyaan yang salah. Kecuali Anda membangun tim pengembangan baru dari awal, Anda mulai dengan programmer yang memiliki keahlian di satu bidang atau lainnya. Hasil terbaik Anda akan dicapai dengan mengikuti apa yang sudah diketahui oleh programmer Anda. Sama pentingnya dengan membangun aplikasi lintas platform, jika Anda memiliki tim yang penuh dengan programmer .Net dengan sedikit pengalaman java, Anda tidak akan memecat mereka atau membuat mereka semua belajar java untuk proyek Anda berikutnya. Jika Anda memiliki tim yang penuh dengan pemrogram java, Anda tidak akan meminta mereka untuk belajar .Net untuk proyek Windows saja. Salah satu dari mereka akan menjadi gila.

Joel Coehoorn
sumber
Hanya untuk mengklarifikasi masalah "open source": Saya berpikir proyek open source tidak didukung oleh entitas bisnis yang dapat dituntut, bukan sebagai bisnis yang memiliki kode sumber GPL.
3
Novell bukan "entitas bisnis yang cocok"?
svick
@vick - Saya tidak berpikir "suable" adalah kesalahan ketik. Dia khawatir tentang masalah hukum seputar pendukung proyek.
Joel Coehoorn
@Thorbj Dari perspektif bisnis, lebih baik memiliki entitas pendukung yang kuat seperti Novell daripada entitas abstrak seperti JCP.
Joel Coehoorn
@ user8057 Ah, saya belum pernah mendengar kata itu. Itu tampak seperti kesalahan ketik yang aneh.
svick
11

Saya telah bekerja dengan Mono, dan saya akan mengatakan itu sebaik yang Anda bisa dapatkan dengan platform alternatif yang bersifat open-source, dan tidak secara langsung didukung oleh Microsoft. Jika Anda merasa nyaman menggunakan platform open-source alternatif seperti Clojure atau Scala, Anda mungkin bisa merasa nyaman menggunakan Mono.

Level .NET yang didukung oleh Mono selalu dapat ditemukan di halaman Roadmap Mono .

Apakah semua elemen GUI berfungsi? Sejauh yang saya tahu, mereka melakukannya, meskipun saya belum mencoba semua elemen secara mendalam.

Apakah Mono identik dengan .NET? Tidak. Saya curiga akan ada perubahan kecil (dan mungkin besar) yang diperlukan di sana-sini. Anda tidak bisa, saat ini, menjalankan Entity Framework dengannya, misalnya.

Robert Harvey
sumber
Tentu saja Mono bukan tiruan yang tepat tetapi dari apa yang saya lihat itu adalah pilihan yang sangat layak ketika memulai proyek baru.
ChaosPandion
Apakah karakter di dalam kamu pic 美 me3i? dari 美国?
Jader Dias
1
@Jader, sama sekali tidak berhubungan - tapi itulah karakter Cina untuk cantik dan 美国 (bila digabungkan berarti AS, juga secara harfiah berarti negara yang indah)
aggietech
AFAIK Clojure dan Scala adalah bahasa bukan platform. Dan (lagi-lagi AFAIK) Scala harus dijalankan pada implementasi JVM apa pun yang dapat dijalankan oleh Java.
Giorgio
9

Sebagai target, .NET / mono alam semesta bergerak sangat cepat .

Setiap beberapa tahun, Microsoft keluar dengan beberapa perubahan menarik dan inovasi mengenai bahasa, runtime, dan infrastruktur seputar .NET. Sebagai contoh: Generik, LINQ, DLR, Entity Framework - dengan setiap revisi baru dari Visual Studio, secara umum ada peningkatan yang cukup signifikan dalam set fitur dan kegunaan kerangka yang ditargetkan.

Meskipun perbaikan konstan dalam kerangka ini disambut baik, itu juga bermasalah jika Anda ingin kompatibilitas di berbagai platform. Platform dukungan jangka panjang seperti Red Hat Enterprise Linux bergerak sangat lambat dalam hal mengadopsi teknologi baru, dan pada titik tertentu, akan ada peningkatan signifikan dalam platform Mono yang telah terjadi hanya dalam beberapa bulan terakhir. Jadi, jika Anda ingin menjalankan hal-hal yang sedang dibuat oleh anak-anak keren, Anda harus mengkompilasi Mono dari awal dan mengelola tambalan dan pembaruan Anda sendiri. Itu tidak keren.

Jawa, di sisi lain, stagnan seperti kolam anak-anak. Terutama sekarang karena dimiliki oleh perusahaan yang hanya menginginkan Java untuk tuntutan hukum paten, Anda dapat yakin bahwa tidak akan ada perubahan yang terdeteksi dalam bahasa atau runtime di masa mendatang. Java adalah platform yang stabil seperti FORTRAN. Itu tidak begitu baik jika Anda berharap untuk perbaikan, tetapi tidak terlalu buruk jika Anda mencoba untuk menggunakan aplikasi perusahaan.

tylerl
sumber
Lucu Anda menyebutkan Fortran, karena terus berkembang dengan penekanan pada kesesuaian dan kesetaraan serta prinsip-prinsip OOP. Jadi ya Fortran 77 stabil, tetapi karena Fortran 90 keluar, setiap revisi menjadi lebih baik dan lebih baik. Fortran 2008 adalah "hampir" bahasa modern.
ja72
4
Saya akan mengatakan bahwa .Net / C # 1.0 yang terbaik adalah klon Java yang buruk, tetapi oleh .Net 2.0 ada paritas fitur yang cukup baik antara kedua platform. Mulai dari sana hingga .Net 3.5 / C # 3, platform Microsoft telah meninggalkan Jawa jauh di belakang di sebagian besar wilayah dan terus mendapatkan kemajuan dengan fitur-fitur baru seperti pengetikan dinamis dan fitur mendatang seperti konkurensi async. Yang mengatakan, salah satu alasan utama. Net dapat bergerak begitu cepat adalah jejak yang ditinggalkan oleh Jawa. Jika Oracle ingin memajukan Java, mereka akan dapat dengan cepat mengikuti jejak serupa yang sekarang ditinggalkan oleh Microsoft.
Joel Coehoorn
".NET / mono universe bergerak sangat cepat". Ironisnya, alasan utama kami tidak menggunakan Mono adalah bahwa pengembangan GC-nya sangat lambat. Mereka menggambarkan GC stabil saat ini sebagai "langkah sementara" pada tahun 2003! lists.ximian.com/pipermail/mono-gc-list/2003-Austust/000012.html
Jon Harrop
Atau Anda bisa menjalankan Debian / Ubuntu, menggunakan beberapa repositori apt eksternal, dan bermain dengan anak-anak keren tanpa mengkompilasi mono dari awal.
Quandary
7

Dari perspektif pengguna, Mono payah dalam membuat aplikasi Windows .NET yang kompatibel dengan Linux. Jika Anda benar-benar mencoba menjalankan aplikasi Windows yang ditulis dengan sopan di Mono, itu tidak akan berhasil.

Dari perspektif pengemasan (saya dulu melakukan sedikit pekerjaan di PortableApps), .NET bisa menjadi berkah sekaligus kutukan. Jika Anda hanya menggunakan Windows, .NET membuat penyebaran jauh lebih mudah karena lebih banyak pustaka berarti lebih sedikit ketergantungan sistem (terutama antara versi Windows, saya percaya) tetapi juga sangat membingungkan bahkan di Windows karena. Versi NET tidak mundur -kompatibel atau kompatibel ke depan. Anda harus mengunduh berbagai versi .NET untuk berbagai program.

Yang mengatakan, Mono adalah titik awal yang baik untuk membuat program C # lintas-platform. Hanya saja jangan mengemas program dengan WINE terbaru dan menyebutnya selesai. Lihat di mana itu mengambil Picasa.

Seperti dengan dua bahasa / platform stabilitas politik, RMS mungkin akan mulai mengomel tentang bagaimana Mono dipimpin oleh Novell, yang berbulan madu dengan Microsoft cukup terkenal. Kedua platform dapat dianggap tidak stabil secara politis saat ini.

Jika Anda benar-benar menginginkan cross-platform yang mudah, jalur yang dicoba dan benar adalah QT yang cukup stabil secara politis hingga saat ini adalah a) LGPL, b) dilakukan dengan masalah perizinan utama tahun lalu, dan c) didukung oleh Nokia, yang menjual ponsel yang sangat populer.

digitxp
sumber
5
Seberapa cepat hal berubah. Nokia tidak lagi menjual ponsel yang diinginkan orang, dan Novell tidak lagi ada dengan masa depan Qt dan Mono diragukan. Ini mungkin alasan mengapa bisnis tidak suka menggunakan apa pun selain sistem 'yang didukung utama', seperti Microsoft. Itulah sebabnya open source adalah ide yang bagus.
gbjbaanb
4

Mono bukan port 1: 1 dari .net Microsoft. Ada teknologi yang Mono tidak akan menerapkan atau tidak memiliki rencana untuk melakukannya (misalnya, Workflow Foundation atau WPF ) sementara di sisi lain mereka memiliki beberapa teknologi mereka sendiri yang Microsoft. NET tidak lakukan, misalnya, Ekstensi SIMD .

Jawaban Singkat: Mono dan Microsoft .NET didasarkan pada fondasi dasar yang sama - CIL dan BCL - tetapi merupakan proyek yang terpisah.

Michael Stum
sumber
2

Komentar kecil untuk pernyataan di posting asli. Saya akan berpendapat bahwa TCK tetap menjadi alat teoritis yang memungkinkan Oracle untuk mengklaim Java adalah standar terbuka. Karena jika Anda perhatikan, Apache Harmony telah mencoba untuk mendapatkan sertifikasi sebagai "Java" selama beberapa tahun sekarang, tidak berhasil. Jelas bahwa Oracle benar-benar tidak tertarik pada implementasi open source selain dari yang mereka berafiliasi dengan dan lebih atau kurang kontrol (OpenJDK), yang btw. seperti Mono, tidak lengkap (mis. tidak ada dukungan Java Web Start) dan kehilangan beberapa optimasi yang tersedia dalam implementasi HotSpot sumber tertutup.

Jadi bisa dibilang, pada 2010; (sebagian besar) Java adalah open source tetapi bukan standar terbuka, sedangkan (sebagian besar) .NET bukan open source tetapi standar terbuka. Tentu saja ada pengecualian, DLR, IronPython, IronRuby dan F # sebenarnya open source. Mono menarik karena memberikan yang terbaik dari kedua dunia, implementasi open source dari standar terbuka.

Casper Bang
sumber
Keterbukaan Jawa bukan bagian yang penting. Ini adalah pengalaman saya bahwa program saya berjalan dengan baik di JVM yang telah lulus TCK sehingga merupakan parameter penting.
1

Mengesampingkan semua teknis, bagian yang sangat penting terjadi ketika benar-benar menulis kode.

Seperti halnya teknologi lintas-platform (baik itu Java, Python, Ruby ...), jika kode tidak ditulis dengan mudah dibawa dalam pikiran, Anda harus mengasumsikan pada dasarnya tidak ada peluang kode akan berjalan dengan baik (bahkan jika ada kemungkinan seperti itu) pada kenyataannya jauh, jauh lebih tinggi), karena perilaku aneh bisa sangat kritis. Baca: jangan mengambil perakitan acak dan menjalankannya di bawah Mono.

Namun untuk proyek baru (atau yang dapat Anda refactor dengan mudah), memilih .Net / Mono sebagai runtime portabel yang masuk akal, tetapi Anda menghemat banyak kerepotan dengan menguji kode Anda pada Mono sejak awal, bahkan jika proyek tersebut memiliki hanya sedikit perubahan dari multiplatform. Jika Anda menggunakan server integrasi kontinu, ini bisa sesederhana mengatur node Mono build. Banyak masalah dapat diselesaikan sambil berkembang, hanya dengan membiasakan diri (seperti membangun string jalur) dan sejumlah besar kode Anda dapat dibawa-bawa dan diuji unit pada Mono hanya dengan menggunakan praktik yang waras dan sedikit pemikiran ke depan. Sisanya (yaitu tes unit gagal) kemudian platform-spesifik (seperti kode menggunakan PInvoke) tetapi harus dirangkum cukup agar dapat memberikan implementasi alternatif per platform yang ditargetkan.

Tentu saja, menggunakan perpustakaan yang tidak tersedia (.Net) atau kompatibel (pihak ketiga) di Mono menghalangi semua ini, tetapi di bidang saya ini belum terlihat. Itulah strategi yang sebenarnya kami gunakan di tempat kerja, dan ketika menerapkannya saya tidak takut mengklaim bahwa .Net + Mono adalah lintas platform.

Lloeki
sumber
0

Bervariasi adalah jawaban jujur. Saya telah melihat hal-hal server web kecil dipindahkan dari IIS ke Apache, berjalan di bawah mono dengan hampir tanpa kesulitan. Saya telah menjalankan aplikasi Windows .Net yang tidak berubah menggunakan Win Forms di Linux dengan sukses.

Namun, sementara itu bisa bekerja, jika Anda menggunakan panggilan API yang tidak diterapkan pada mono maka itu tidak akan berfungsi, dan satu-satunya solusi adalah dengan menulis ulang aplikasi Anda, tetap menggunakan windows atau menulis hal-hal tambahan dalam mono.

Michael Shaw
sumber