هل .NET/Mono أو Java هو الخيار الأفضل للتطوير عبر الأنظمة الأساسية؟[مغلق]

StackOverflow https://stackoverflow.com/questions/61559

سؤال

ما هو عدد المكتبات المتوفرة لـ Mono مقارنةً بـ Java؟

أفتقر إلى نظرة عامة على كلا البديلين ولكن لدي حرية كبيرة في الاختيار لمشروعي القادم.أنا أبحث عن حقائق فنية صعبة في مجالات

  • الأداء (على سبيل المثال، قيل لي أن Java جيدة لترابط العمليات، وسمعت أن تحسين كود وقت التشغيل أصبح جيدًا جدًا مؤخرًا لـ .NET)
  • العالم الحقيقي قابلية النقل (من المفترض أن يكون كلاهما محمولاً، ما هو Catch-22 لكل منهما؟)
  • توفر الأداة (سي آي, ، بناء الأتمتة، التصحيح، IDE)

أنا أبحث بشكل خاص عما اختبرته بالفعل في عملك بدلاً من الأشياء التي يمكنني البحث عنها في جوجل.سيكون طلبي عبارة عن خدمة خلفية تعالج كميات كبيرة من البيانات من السلاسل الزمنية.

النظام الأساسي المستهدف الرئيسي هو Linux.

يحرر: لصياغة سؤالي بشكل أكثر ملاءمة، أنا مهتم بالحزمة بأكملها (مكتبات الطرف الثالث وما إلى ذلك)، وليس فقط اللغة.بالنسبة للمكتبات، ربما يتلخص ذلك في السؤال "ما هو عدد المكتبات المتوفرة لـ Mono مقارنة بمكتبات Java"؟


لمعلوماتك، لقد اخترت Java لهذا المشروع منذ ذلك الحين، لأنها بدت أكثر اهتراءًا من ناحية قابلية النقل وكانت موجودة منذ فترة على الأنظمة القديمة أيضًا.أنا حزين بعض الشيء بشأن ذلك، لأنني أشعر بالفضول تجاه لغة C# وأود أن أقوم بمشروع كبير فيها، ولكن ربما في المرة القادمة.شكرا على كل النصائح.

هل كانت مفيدة؟

المحلول

حسنًا.... Java هي في الواقع أكثر قابلية للنقل.لا يتم تطبيق Mono في كل مكان، كما أنه يتخلف عن تطبيق Microsoft بشكل كبير.يبدو أن Java SDK يظل متزامنًا بشكل أفضل عبر الأنظمة الأساسية (ويعمل على المزيد من الأنظمة الأساسية).

أود أيضًا أن أقول إن Java لديها المزيد من الأدوات المتاحة عبر جميع تلك الأنظمة الأساسية، على الرغم من وجود الكثير من الأدوات المتاحة لـ .NET على أنظمة Windows الأساسية.

تحديث لعام 2014

وما زلت أحمل هذا الرأي في عام 2014.ومع ذلك، سأؤهل هذا بالقول إنني بدأت الآن في إيلاء بعض الاهتمام لـ Mono بعد فترة طويلة من عدم الاهتمام حقًا، لذلك قد تكون هناك تحسينات في وقت تشغيل Mono (أو النظام البيئي) لم أقم بإجرائها مدرك ل.AFAIK، لا يوجد حتى الآن أي دعم لـ WPF، وWCF، وWF، وWIF.يمكن تشغيل Mono على نظام iOS، ولكن على حد علمي، لا يزال وقت تشغيل Java يعمل على منصات أكثر بكثير من Mono.أيضًا، بدأت Mono في رؤية بعض الأدوات المحسنة كثيرًا (Xamarin)، ويبدو أن Microsoft لديها نوع أكبر بكثير من التوجه والرغبة في العمل عبر الأنظمة الأساسية مع الشركاء لجعلها مجانية، وليست تنافسية (على سبيل المثال، ستكون Mono جزء مهم جدًا من مشهد OWIN/Helios ASP.NET القادم).أظن أنه في السنوات القادمة سوف تقل الاختلافات في قابلية النقل بسرعة، خاصة بعد أن أصبح .NET مفتوح المصدر.

تحديث لعام 2018

وجهة نظري في هذا الأمر بدأت تسير في الاتجاه الآخر.أعتقد أن .NET، على نطاق واسع، وخاصة مع .NET Core، قد بدأ في تحقيق "تكافؤ قابلية النقل" مع Java.هناك جهود جارية لجلب WPF إلى .NET Core لبعض الأنظمة الأساسية، ويعمل .NET Core نفسه على عدد كبير جدًا من الأنظمة الأساسية الآن.يعد Mono (المملوك لشركة Xamarin، المملوكة الآن لشركة Microsoft) منتجًا أكثر نضجًا وصقلًا من أي وقت مضى، ولم تعد كتابة التطبيقات التي تعمل على منصات متعددة مجالًا للتعمق في قرصنة .NET، ولكنها مسعى مباشر نسبيًا .هناك، بالطبع، مكتبات وخدمات وتطبيقات تعمل بنظام Windows فقط أو يمكنها استهداف منصات محددة فقط - ولكن يمكن قول الشيء نفسه عن Java (على نطاق واسع).

إذا كنت مكان OP في هذه المرحلة، فلا يمكنني التفكير في أي سبب متأصل في اللغات أو مجموعات التكنولوجيا نفسها التي من شأنها أن تمنعني من اختيار .NET لأي تطبيق من الآن فصاعدا.

نصائح أخرى

يقوم Mono بعمل أفضل في استهداف الأنظمة الأساسية التي أرغب في دعمها.بخلاف ذلك، كل شيء ذاتي.

أشارك كود C# عبر الأنظمة الأساسية التالية:- iOS (iPhone/iPad) - Android - الويب (HTML5) - Mac (OS X) - Linux - Windows

يمكنني مشاركته في المزيد من الأماكن:- Windows Phone 7 - Wii - Xbox - PS3 - إلخ.

الشيء الكبير هو iOS منذ ذلك الحين مونو تاتش يعمل بشكل خيالي.لا أعرف أي طريقة جيدة لاستهداف iOS باستخدام Java.لا يمكنك استهداف Windows Phone 7 باستخدام Java، لذا أود أن أقول إن الأيام التي كانت فيها Java أفضل للجوال قد ولّت.

لكن العامل الأكبر بالنسبة لي هو الإنتاجية الشخصية (والسعادة).تتفوق لغة C# كلغة على لغة Java IMHO بسنوات، ويُعد استخدام إطار عمل .NET ممتعًا.معظم ما تتم إضافته في Java 7 وJava 8 كان موجودًا في C# لسنوات.لغات JVM مثل Scala وClojure (كلاهما متاحان على CLR) تعتبر رائعة جدًا.

أرى Mono بمثابة منصة في حد ذاتها (منصة رائعة) وأتعامل مع .NET باعتباره تطبيق Microsoft لـ Mono على نظام التشغيل Windows.هذا يعني أنني أقوم بالتطوير والاختبار على Mono أولاً.هذا يعمل بشكل رائع.

إذا كان كل من Java و.NET (على سبيل المثال Mono) عبارة عن مشروعات مفتوحة المصدر دون أي دعم من الشركة، فسأختار Mono بدلاً من Java في كل مرة.أعتقد أنها مجرد منصة أفضل.

يعد كل من .NET/Mono وJVM خيارين رائعين، على الرغم من أنني شخصيًا سأستخدم لغة أخرى غير Java على JVM.

رأيي في بعض التعليقات الأخرى:

مشكلة:أداء.

**إجابة:أداء كل من JVM وCLR أفضل مما يقول المنتقدون.أود أن أقول أن أداء JVM أفضل.Mono بشكل عام أبطأ من .NET (وإن لم يكن دائمًا).

أنا شخصياً سأستخدم ASP.NET MVC عبر J2EE في أي يوم كمطور ومستخدم نهائي.الدعم ل عميل جوجل الأصلي رائع جدًا أيضًا.أعلم أيضًا أن الأداء الضعيف لواجهة المستخدم الرسومية لتطبيقات Java لسطح المكتب من المفترض أن يكون شيئًا من الماضي ولكني أجد أداءً بطيئًا باستمرار.ثم مرة أخرى، أستطيع أن أقول الشيء نفسه بالنسبة لـ WPF.GTK# سريع للغاية، لذا لا يوجد سبب يجعلهم بطيئين.

مشكلة:تمتلك Java نظامًا بيئيًا أكبر من المكتبات المتاحة.

إجابة:ربما يكون هذا صحيحا، ولكن هذه ليست مشكلة في الممارسة العملية.

عمليًا، تعمل كل مكتبة Java (بما في ذلك JDK) بشكل رائع على .NET/Mono بفضل IKVM.NET.هذه القطعة من التكنولوجيا هي أعجوبة حقيقية.التكامل مذهل.يمكنك استخدام مكتبة Java كما لو كانت أصلية.لقد اضطررت فقط إلى استخدام مكتبات Java في تطبيق .NET واحد فقط.يقدم النظام البيئي .NET/Mono بشكل عام أكثر مما أحتاج إليه.

مشكلة:تتمتع Java بدعم أفضل (أوسع) للأدوات

إجابة:ليس على ويندوز.وإلا فأنا أوافق.بالرغم من ذلك، فإن MonoDevelop جميل.

أريد أن أعطي صرخة ل MonoDevelop;إنها جوهرة.يدمج MonoDevelop معظم الأدوات التي أرغب في استخدامها بما في ذلك إكمال التعليمات البرمجية (التحسس الذكي)، وتكامل Git/Subversion، ودعم اختبارات الوحدة، وتكامل SQL، وتصحيح الأخطاء، وإعادة البناء السهل، وتصفح التجميع مع إلغاء الترجمة بسرعة.من الرائع استخدام نفس البيئة لكل شيء بدءًا من الويب من جانب الخادم وحتى تطبيقات الهاتف المحمول.

مشكلة:التوافق عبر المنصات.

إجابة:Mono عبارة عن قاعدة تعليمات برمجية واحدة عبر جميع الأنظمة الأساسية، بما في ذلك Windows.

قم بالتطوير لـ Mono أولاً ثم قم بالنشر على .NET على نظام التشغيل Windows إذا كنت ترغب في ذلك.إذا قمت بمقارنة .NET من MS إلى Java، فإن Java تتمتع بالميزة من حيث الاتساق عبر الأنظمة الأساسية.شاهد الإجابة التالية...

مشكلة:تأخر أحادي .NET.

إجابة:لا، ليس كذلك. IMHO، هذا بيان كثيرًا ما يتم ذكره ولكنه غير صحيح.

توزيعة Mono من Xamarin تأتي مع C#، VB.NET، F#، IronPython، IronRuby، وأعتقد أنه ربما يكون Boo خارج الصندوق.برنامج التحويل البرمجي Mono C# محدث تمامًا مع MS.برنامج التحويل البرمجي Mono VB.NET يتأخر عن إصدار MS.المترجمات الأخرى هي نفسها على كلا النظامين الأساسيين (كما هو الحال مع لغات .NET الأخرى مثل Nemerle وBoo وPhalanger (PHP)).

يأتي Mono مزودًا بالكثير من التعليمات البرمجية الفعلية المكتوبة من Microsoft بما في ذلك Dynamic Language Runtime (DLR) و Managed Extensibility Framework (MEF) وF# وASP.NET MVC.نظرًا لأن Razor ليس مفتوح المصدر، فإن Mono يأتي حاليًا مع MVC2 ولكن MVC3 يعمل على Mono بشكل جيد.

لقد واكب النظام الأساسي Mono الأساسي .NET أو سنوات عديدة وكان التوافق مثيرًا للإعجاب.يمكنك استخدام لغة C# 4.0 الكاملة وحتى بعض ميزات C#5.0 اليوم.في الواقع، غالبًا ما يقود Mono .NET بعدة طرق.

تقوم Mono بتنفيذ أجزاء من مواصفات CLR التي لا تدعمها حتى Microsoft (مثل صفائف 64 بت).واحدة من أكثر القطع التكنولوجية الجديدة إثارة في عالم .NET هي روزيلين.لقد عرضت Mono مترجم C# كخدمة لسنوات عديدة.بعض ما تقدمه Rosylyn متاح عبر Nمقاوم للحرارة أيضًا.من الأمثلة على ما إذا كان Mono لا يزال في المقدمة هو تعليمات SIMD لتسريع أداء الألعاب.

تقدم Microsoft عددًا من المنتجات بالإضافة إلى .NET غير المتوفرة في Mono والتي نشأت من المفهوم الخاطئ حول تأخر Mono.تعد Windows Presentation Foundation (WPF)، وEntity Framework (EF)، وWCF (Windows Communication Foundation) أمثلة على المنتجات التي لا تعمل، أو أنها مدعومة بشكل سيئ، على Mono.الحل الواضح هو استخدام البدائل عبر الأنظمة الأساسية مثل GTK# وNHibernate وServiceStack بدلاً من ذلك.

مشكلة:مايكروسوفت شريرة.

إجابة:حقيقي.وماذا في ذلك.

يقدم العديد من الأشخاص الأسباب التالية لتجنب استخدام Mono:

1) لا ينبغي عليك استخدام Mono لأنه يجب تجنب تقنيات Microsoft

2) Mono سيء لأنه لا يسمح لك باستخدام كل التقنيات التي تقدمها Microsoft

بالنسبة لي، من الواضح أن هذه التصريحات غير متوافقة.أنا أرفض البيان الأول ولكنني سأتخطى هذه الحجة هنا.العبارة الثانية صحيحة لكافة بدائل .NET.

تعد JVM منصة رائعة كما أن انفجار لغات JVM أمر رائع.استخدم ما يجعلك سعيدًا.في الوقت الحالي، غالبًا ما يكون هذا هو .NET/Mono بالنسبة لي.

أنا في الواقع أقوم بالتطوير في .NET، وأجري جميع اختباراتي أولاً على Mono، ثم على Windows.بهذه الطريقة أعرف أن تطبيقاتي مشتركة بين الأنظمة الأساسية.لقد قمت بذلك بنجاح كبير على كل من تطبيقات ASP.NET وWinforms.

لست متأكدًا حقًا من أين يحصل بعض الأشخاص على الانطباع بأن Mono فظيع جدًا، لكنه بالتأكيد قام بعمله في حالاتي وآرائي. صحيح أنه سيكون لديك بعض التأخير بالنسبة لأحدث وأعظم الاختراعات في .NET العالم، ولكن حتى الآن، يعد .NET 2.0 على نظامي التشغيل Windows وLinux متينًا للغاية بالنسبة لي.

ضع في اعتبارك أنه من الواضح أن هناك العديد من المراوغات في هذا الأمر، ولكن معظمها يأتي من التأكد من أنك تكتب تعليمات برمجية محمولة.في حين أن أطر العمل تقوم بعمل رائع في استخلاص نظام التشغيل الذي تعمل عليه، فإن الأشياء الصغيرة مثل حساسية حالة الأحرف في Linux في المسارات وأسماء الملفات تتطلب بعض الوقت للتعود عليها، كما هو الحال مع أشياء مثل الأذونات.

.NET هو بالتأكيد نظام متعدد المنصات نظرًا لـ Mono بناءً على تجربتي حتى الآن.

Java هي في الواقع منصة مشتركة كما يقول الجميع.يوجد تطبيق JVM لأي نظام تشغيل رئيسي تقريبًا (حتى Mac OS X، أخيرًا)، وجميعها تعمل بشكل جيد.وهناك الكثير من الأدوات مفتوحة المصدر المتوفرة عبر الأنظمة الأساسية.

المشكلة الوحيدة هي أن هناك بعض العمليات الأصلية التي لا يمكنك إجراؤها في Java دون كتابة بعض ملفات DLL أو SOs.ومن النادر جدًا أن يتم تنفيذ هذه الأمور عمليًا.ومع ذلك، في جميع هذه الحالات، تمكنت من الالتفاف حولها عن طريق إنشاء عمليات أصلية ومسح النتائج على الشاشة.

أعتقد أن السؤال تمت صياغته بشكل غير صحيح.سي # مقابل.تعد Java أقل إثارة للاهتمام من حيث الاستخدام عبر الأنظمة الأساسية مقارنة بـ (أ) الأنظمة الأساسية التي تحتاج إلى دعمها، و (ب) النظر في المكتبات الأساسية ومكتبات الطرف الثالث المتاحة.تعتبر اللغة تقريبًا الجزء الأقل أهمية في عملية صنع القرار.

تعد Java خيارًا أفضل للتطوير عبر الأنظمة الأساسية.

  • أداء.تتمتع Java و.Net بمستوى أداء مماثل بسبب الجهاز الظاهري، لكن أداء JVM عادةً ما يكون أفضل بسبب سنوات التحسين.

  • مكتبة.على الرغم من أن هذا يعتمد على مهمتك، إلا أن Java لديها الكثير من المكتبات مفتوحة المصدر أو مكتبات الطرف الثالث المتاحة هناك.لتطبيق الخادم، J2EE، Spring، Struts، إلخ.بالنسبة لواجهة المستخدم الرسومية، على الرغم من أن .Net يوفر واجهة برمجة تطبيقات طبقة Win32 إلا أن هذا يسبب مشكلات في التوافق.تحتوي Java على Swing وSWT وAWT وما إلى ذلك.إنه يعمل في معظم الحالات.

  • التوافق.هذه هي القضايا الرئيسية التي يجب مراعاتها عند تطوير البرنامج عبر الأنظمة الأساسية.مسألتان:أولاً، التوافق مع النظام الأساسي.لا تزال Java تفوز نظرًا لأن JDK تتم صيانته جيدًا بواسطة شركة Sun الفردية والأصلية.لا تتم صيانة Mono بواسطة MS، لذلك ليس لديك ضمان حتى الآن لتوافق التحديث.2.التوافق.تحتفظ شركة Sun بسمعة جيدة فيما يتعلق بتوافقها مع الإصدارات السابقة، على الرغم من أن هذا يبدو في بعض الأحيان جامدًا للغاية ويؤدي إلى إبطاء الوتيرة.

  • أدوات.تحتوي Java على بيئة تطوير متكاملة جيدة عبر الأنظمة الأساسية.نتبيانز، إكليبس، الخ.معظمها مجانا.يعد VS Studio جيدًا ولكن على نظام التشغيل Windows فقط، ولا يكلف الكثير.يوفر كلاهما اختبارات وحدة جيدة وتصحيحات وملفات تعريف وما إلى ذلك.

ومن هنا أقترح أن Java هي الخيار الأفضل.على سبيل المثال، هناك بعض تطبيقات سطح المكتب الشهيرة عبر الأنظمة الأساسية التي طورتها Java:Vuze، وLimewire، وBlogBridge، وCrossFTP، ناهيك عن بيئات التطوير المتكاملة (IDEs).أما بالنسبة لـ .Net، فمعلوماتي محدودة عن مثل هذه التطبيقات الناجحة.

لقد كنت أطرح نفس السؤال في وقت متأخر ويبدو أن IMHO، .NET/Mono هو الخيار الأفضل لأنه ببساطة يتمتع Mono بسجل حافل في مجال تطبيقات سطح المكتب عبر الأنظمة الأساسية (على عكس جافا) وبالطبع، مونو يتحسن على قدم وساق هذه الأيام.

سأقول جافا أيضًا.إذا نظرت إلى الأمر من حيث النضج، فقد أنفق Sun (وآخرون) الكثير من الوقت والجهد لجعل JVM يعمل على منصات غير Windows.

في المقابل، يعد Mono بالتأكيد مواطنًا من الدرجة الثانية في النظام البيئي .NET.

اعتمادًا على عملائك المستهدفين، قد تجد أيضًا معارضة حقيقية لاستخدام Mono - هل تقدم Novell نفس النوع من دعم الموردين لـ Mono الذي ستحصل عليه لـ Java أو .NET على نظام التشغيل Windows؟

إذا كنت تستهدف في المقام الأول استضافة خدمتك على Windows، فمن المنطقي أن تفكر في هذا الاختيار، ولكن بما أنك تستهدف Linux في المقام الأول، يبدو الأمر وكأنه نوع من عدم التفكير بالنسبة لي.

تم تصميم Java لتكون مشتركة بين الأنظمة الأساسية؛C#/.Net لم يكن كذلك.عندما تكون في شك، استخدم الأداة التي تم تصميمها لغرضك.

يحرر:في الإنصاف، تم تصميم .NET للعمل على بيئات مضمنة/كمبيوتر شخصي/خادم، لذا فهذا نوع من الأنظمة الأساسية المشتركة.لكنها لم تكن مصممة لنظام التشغيل Linux.

أعتقد أن الجواب "يعتمد". تعمل Java على أي شيء تقريبًا ، لكن .NET/MONO هي (IMHO) إطارًا أفضل لسطح المكتب.لذا أعتقد أن الإجابة تعتمد حقًا على الأنظمة الأساسية التي تخطط لاستهدافها.

لإضافة المزيد إلى المحادثة، تعد Java أكثر قابلية للنقل إذا بقيت متخلفًا عن إصدار واحد تقريبًا - لا يزال Java 5 يحتوي على العديد من الميزات الممتازة لذا يمكنك انتظار Java 6 ولا يزال لديك نطاق كبير من حيث اللغة والمكتبات لتطويرها مع.يعد جهاز Mac هو النظام الأساسي الأساسي الذي قد يستغرق بعض الوقت للوصول إلى أحدث إصدار من Java.

جافا لديها أيضا ممتازة هيئة المعايير التي تعمل على تطوير النظام الأساسي بذكاء بناءً على مدخلات من العديد من الشركات المختلفة.غالبًا ما يتم التغاضي عن هذه الميزة ولكنها تحافظ على عمل الميزات الجديدة بشكل جيد عبر منصات متعددة وتوفر نطاقًا كبيرًا في دعم المكتبة لبعض الأشياء الباطنية (كملحقات اختيارية).

سأصوت لصالح كون Java أكثر قابلية للنقل من C#.من المؤكد أن Java لديها أيضًا مجموعة غنية جدًا من المكتبات القياسية.هناك أيضًا مجموعة واسعة من مكتبات الطرف الثالث مفتوحة المصدر مثل تلك التي يوفرها مشروع جاكرتا (http://jakarta.Apache.org/).

جميع المشتبه بهم المعتادين موجودون في CI واختبار الوحدة وما إلى ذلك أيضًا.يعد دعم IDE عبر الأنظمة الأساسية جيدًا جدًا أيضًا مع أمثال Eclipse وNetbeans وIntelliJ IDEA وما إلى ذلك.

هناك خيارات لغة أخرى أيضًا.لقد أصبحت مغرمًا جدًا ببايثون، التي تعمل جيدًا على أنظمة التشغيل Windows وLinux وMac، وتحتوي على مجموعة غنية من المكتبات.

في حين أن مونو لديه حصة من المشاكل أعتقد أن لديها قصة توافق أفضل عبر الأنظمة الأساسية خاصةً إذا كنت تعتمد على استدعاء النظام الأساسي الأصلي.

لا توجد كلمات كافية في Stack Overflow للتأكيد على مدى سلاسة الحصول على شيء أصلي يتم استدعاؤه وتنفيذه في .NET/Mono (على الأقل في تجربتي 3...) على منصات متعددة مقابل منصات متعددة.جهد جافا المكافئ.

جاتورهول هل لديك بعض البيانات لدعم ذلك؟

أداء.تتمتع Java و.Net بمستوى أداء مماثل بسبب الجهاز الظاهري، لكن أداء JVM عادةً ما يكون أفضل بسبب سنوات التحسين.

خلفية:أنا من مستخدمي Windows منذ Windows 3.1 وحاليًا مستخدم Linux (لا أزال أستخدم Windows 7، ونظام تشغيل رائع، على جهاز افتراضي لـ Visual Studio 2010 وأدوات أخرى).

النقطة:أعلم أنني والعديد من المستخدمين (Windows و Linux وما إلى ذلك) قد نختلف معك.تميل Java إلى الأداء بشكل أبطأ حتى على تطبيق Linux لسطح المكتب، ويكون أداء ASP.NET أسرع من صفحات خادم Java في كثير من الأحيان.قد يتفق البعض على أنه حتى لغة PHP غير المترجمة تعمل بشكل أفضل في عدة سيناريوهات.

جافا أكثر عبر منصة؟ليس لدي أي شك في هذا (التاريخ يعود إلى ذلك)، ولكن الأسرع (لا أقول إن .NET) ليس مؤكدًا تمامًا وأود أن أرى بعض المعايير الحقيقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top