Является ли .NET/Mono или Java лучшим выбором для кросс-платформенной разработки?

Сколько меньше библиотек для Mono, чем для Java?

Мне не хватает обзора по обеим альтернативам, но у меня есть довольно большая свобода выбора для моего следующего проекта. Я ищу сложные технические факты в областях

  • (например, мне говорят, что Java хорош для потоковой передачи, и я слышал, что оптимизация кода времени выполнения в последнее время стала очень хорошей для .NET).
  • переносимость реального мира (он должен быть портативным, что Catch-22 для каждого?)
  • доступность инструмента (CI, автоматизация сборки, отладка, IDE)

Я особенно ищу то, что вы на самом деле переживали в своей собственной работе, а не то, что я могу сделать Google. Мое приложение было бы вспомогательным сервисом, обрабатывающим большие объемы данных из временных рядов.

Моей основной целевой платформой будет Linux.

Edit: Чтобы более точно рассказать о моем вопросе, меня интересует весь пакет (сторонние библиотеки и т.д.), А не только язык. Для библиотек это, вероятно, сводится к вопросу "насколько меньше библиотек для Mono, чем для Java"?


FYI, с тех пор я выбрал Java для этого проекта, потому что он казался просто более изношенным на стороне переносимости, и это было какое-то время на старых системах. Я немного немного грустен об этом, потому что мне очень любопытно, что С#, и мне бы хотелось сделать в нем какой-то большой проект, но, возможно, в следующий раз. Спасибо за все советы.

Ответ 1

Ну... Java на самом деле более портативен. Моно не реализовано повсеместно, и оно значительно отстает от реализации Microsoft. Java SDK, похоже, лучше синхронизируется на разных платформах (и он работает на других платформах).

Я бы также сказал, что Java обладает большей доступностью для инструментов на всех этих платформах, хотя для платформы .NET на платформах существует множество инструментов.

Обновление для 2014

Я по-прежнему придерживаюсь этого мнения в 2014 году. Однако я буду квалифицировать это, сказав, что сейчас я начинаю уделять некоторое внимание Моно после долгого времени, не очень заботясь, поэтому могут быть улучшения в среде исполнения Mono (или экосистеме), о которой я не знал. AFAIK, до сих пор нет поддержки WPF, WCF, WF, WIF. Моно может работать на iOS, но, насколько мне известно, среда исполнения Java по-прежнему работает на гораздо больших платформах, чем Mono. Кроме того, Mono начинает видеть некоторые улучшенные инструменты (Xamarin), и Microsoft, похоже, имеет гораздо более кросс-платформенное отношение и готовность работать с партнерами, чтобы сделать их бесплатными, а не конкурентоспособными (например, Mono будет довольно важная часть предстоящего ландшафта OWIN/Helios ASP.NET). Я подозреваю, что в ближайшие годы различия в переносимости будут уменьшаться быстро, особенно после того, как .NET будет открытым.

Ответ 2

Mono лучше справляется с таргетингом на платформы, которые я хочу поддерживать. Помимо этого, все это субъективно.

Я использую код С# на следующих платформах: - iOS (iPhone/iPad) - Android - Веб (HTML5) - Mac OS X) - Linux - Windows

Я мог бы поделиться им еще больше мест: - Windows Phone 7 - Wii - XBox - PS3 - и т.д.

Biggie - iOS, поскольку MonoTouch работает фантастически. Я не знаю, какой хороший способ настроить iOS на Java. Вы не можете настроить таргетинг на Windows Phone 7 на Java, поэтому я бы сказал, что дни, когда Java лучше для мобильных устройств, позади.

Самый большой фактор для меня - это личная производительность (и счастье). С# как язык на многие годы впереди Java IMHO и .NET framework - это радость в использовании. Большая часть того, что добавляется в Java 7 и Java 8, уже много лет находится на С#. Например, языки JVM, такие как Scala и Clojure (оба доступны на CLR), довольно приятны.

Я вижу Mono как платформу в своем собственном праве (отличный) и рассматриваю .NET как реализацию Microsoft Mono в Windows. Это означает, что я сначала разрабатываю и тестирую Mono. Это прекрасно работает.

Если и Java, и .NET(Mono let say) были проектами с открытым исходным кодом без какой-либо корпоративной поддержки, я бы выбрал Mono over Java каждый раз. Я считаю, что это просто лучшая платформа.

Оба .NET/Mono и JVM - отличный выбор, хотя я лично использовал бы какой-то другой язык, чем Java на JVM.

Могу воспользоваться некоторыми другими комментариями:

Проблема: производительность.

** Ответ: И JVM, и CLR работают лучше, чем недоброжелатели говорят, что делают. Я бы сказал, что JVM работает лучше. Моно, как правило, медленнее, чем .NET(хотя и не всегда).

Я лично принимал ASP.NET MVC над J2EE в любой день как разработчиком, так и конечным пользователем. Поддержка Google Native Client довольно крутая. Кроме того, я знаю, что плохая производительность графического интерфейса для настольных приложений Java должна быть ушедшей в прошлое, но я продолжаю находить медленные. Опять же, я могу сказать то же самое для WPF. GTK # довольно быстро, поэтому нет причин, по которым они должны быть медленными.

Проблема: Java имеет большую экосистему доступных библиотек.

Ответ: Возможно, это правда, но на практике это не проблема.

Практически каждая библиотека Java (включая JDK) работает только под управлением .NET/Mono благодаря IKVM.NET. Эта технология - настоящее чудо. Интеграция изумительна; вы можете использовать библиотеку Java так же, как и родную. Однако мне пришлось использовать только библиотеки Java в одном приложении .NET. Обычно экосистема .NET/Mono предлагает больше, чем мне нужно.

Проблема: у Java есть лучшие (более широкие) инструменты поддержки

Ответ: не в Windows. В противном случае я согласен. MonoDevelop приятно, но.

Я хочу выкрикнуть MonoDevelop; это жемчужина. MonoDevelop интегрирует большинство инструментов, которые я хочу использовать, включая завершение кода (intellisense), Git/интеграцию Subversion, поддержку модульных тестов, интеграцию SQL, отладку, простой рефакторинг и просмотр сборок с помощью декомпиляции на лету. Замечательно использовать одну и ту же среду для всего: от серверного веб-приложения до мобильных приложений.

Проблема: Совместимость на разных платформах.

Ответ: Mono - это единая база кода на всех платформах, включая Windows.

Сначала создайте для Mono и разверните приложение .NET на Windows, если хотите. Если вы сравниваете .NET с MS на Java, тогда как Java имеет преимущество в отношении согласованности между платформами. См. Следующий ответ...

Проблема: Mono lags.NET.

Ответ: Нет, это не так. IMHO, это часто заявленное, но неверное утверждение.

Распределение Mono от кораблей Xamarin с С#, VB.NET, F #, IronPython, IronRuby, и я думаю, может быть, Boo из коробки. Компилятор Mono С# полностью обновлен с помощью MS. Компилятор Mono VB.NET делает отставание от версии MS. Другие компиляторы одинаковы на обеих платформах (как и другие языки .NET, такие как Nemerle, Boo и Phalanger (PHP)).

Моно поставляется с большим количеством фактического письменного кода Microsoft, включая Dynamic Language Runtime (DLR), Managed Extensibility Framework (MEF), F # и ASP.NET MVC. Поскольку Razor не является Open Source, Mono в настоящее время поставляется с MVC2, но MVC3 работает на Mono просто отлично.

Основная платформа Mono не отстает от .NET или много лет, и совместимость впечатляет. Сегодня вы можете использовать полный язык С# 4.0 и даже некоторые функции С# 5.0. На самом деле Mono часто приводит .NET во многих отношениях.

Mono реализует части спецификации CLR, которые даже Microsoft не поддерживает (например, 64-битные массивы). Одна из самых интересных новых технологий в мире .NET - Rosylyn. Mono предлагает компилятор С# как услугу в течение многих лет. Некоторые из предложений Rosylyn доступны через NRefractory. Примером того, что Mono все еще впереди, будет инструкция SIMD для ускорения игровой производительности.

Microsoft предлагает ряд продуктов поверх .NET, которые недоступны в Mono, и это связано с неправильным представлением о задержке Mono. Windows Presentation Foundation (WPF), Entity Framework (EF), WCF (Windows Communication Foundation) являются примерами продуктов, которые не работают или плохо поддерживаются в Mono. Очевидным решением является использование кросс-платформенных альтернатив, таких как GTK #, NHibernate и ServiceStack.

Проблема: Microsoft зла.

Ответ: Верно. Итак, что.

Многие люди предлагают следующие причины, чтобы избежать использования Mono:

1) Вы не должны использовать Mono, потому что следует избегать использования технологии Microsoft

2) Моно отстой, потому что он не позволяет вам использовать каждую технологию, предлагаемую Microsoft

Для меня ясно, что эти утверждения несовместимы. Я отклоняю первое утверждение, но пропущу этот аргумент здесь. Второй оператор относится ко всем .NET-альтернативам.

JVM - отличная платформа, и взрыв JVM-языков потрясающий. Используйте то, что делает вас счастливым. На данный момент это часто .NET/Mono для меня.

Ответ 3

Я действительно развиваюсь в .NET, сначала запускаю все свои тесты в Mono, а затем в Windows. Таким образом, я знаю, что мои приложения являются кросс-платформенными. Я сделал это очень успешно как в приложениях ASP.NET, так и в Winforms.

Я не уверен, что некоторые люди получают впечатление, что Моно настолько ужасно, но это, безусловно, сделало это работу в моих делах и мнениях. Правда, у вас будет немного отставания от последних и самых больших изобретений в мир .NET, но до сих пор .NET 2.0 для Windows и Linux очень прост для меня.

Имейте в виду, что в этом есть много причуд, но большинство из них связано с тем, что вы пишете переносимый код. В то время как в рамках каркаса очень много внимания уделяется абстрагированию от того, на какой ОС вы работаете, небольшие вещи, такие как чувствительность к регистру Linux в путях и именах файлов, немного привыкают, как и такие, как разрешения.

.NET определенно очень перекрестная платформа из-за Моно, основанного на моем опыте.

Ответ 4

Java на самом деле является кросс-платформенной, как все говорят. Там реализация JVM практически для любой основной ОС (даже Mac OS X, наконец), и все они работают очень хорошо. И там множество инструментов с открытым исходным кодом, которые так же кросс-платформенные.

Единственный улов в том, что есть определенные собственные операции, которые вы не можете сделать в Java, не написав некоторые библиотеки DLL или SO. Очень редко это происходит на практике. Тем не менее, во всех этих случаях я смог обойти это, создав собственные процессы и очистив экран от результатов.

Ответ 5

Я думаю, что вопрос сформулирован неправильно. С# и Java гораздо менее интересны с точки зрения межплатформенного использования, чем (а), какие платформы вам необходимо поддерживать, и (б) рассмотрение основных библиотек и доступных сторонних библиотек. Этот язык является почти наименее важной частью процесса принятия решений.

Ответ 6

Java - лучший выбор для кросс-платформенной разработки.

  • Производительность

    . Java и .Net имеют схожий уровень производительности благодаря виртуальной машине, но JVM обычно имеет лучшую производительность из-за оптимизации лет и лет.

  • Библиотека. Хотя это зависит от вашей задачи, в Java есть гораздо больше открытых источников или сторонних библиотек, доступных там. Для сервера App, J2EE, Spring, Struts и т.д. Для GUI, хотя .Net предоставляет API уровня Win32, но это вызывает проблемы совместимости. Java имеет Swing, SWT, AWT и т.д. Он работает в большинстве случаев.

  • Совместимость. Это ключевые проблемы, которые необходимо учитывать при разработке кросс-платформенной программы. Два вопроса: во-первых, совместимость платформ. Java по-прежнему выигрывает, так как JDK хорошо поддерживается единой и оригинальной компанией Sun. Моно не поддерживается MS, поэтому у вас пока нет гарантии совместимости обновлений. 2. Обратная совместимость. Sun сохраняет хорошую репутацию на их обратной совместимости, хотя иногда это кажется слишком жестким и замедляет темп.

  • Инструменты. Java имеет хорошие межплатформенные IDE. Netbeans, Eclipse и т.д. Большинство из них бесплатны. VS Studio хороша, но только в Windows, и не стоит немного. Оба они обеспечивают хорошие модульные тесты, отладки, профили и т.д.

Следовательно, я бы предположил, что Java - лучший выбор. В качестве примера для шоу есть несколько известных настольных межплатформенных приложений, разработанных Java: Vuze, Limewire, BlogBridge, CrossFTP, не говоря уже о тех IDE. Что касается .Net, у меня ограниченные знания о таких успешных приложениях.

Ответ 7

Я тоже буду говорить о Java. Если вы посмотрите на это с точки зрения зрелости, от Sun (и других) затрачивается больше времени и усилий на то, чтобы JVM работал на платформах, отличных от Windows.

Напротив, Mono определенно является гражданином второго класса в экосистеме .NET.

В зависимости от того, кем являются ваши целевые клиенты, вы также можете найти реальный откат от использования Mono - делает ли Novell такую ​​же поддержку поставщиков Mono, что и для Java или .NET в Windows?

Если вы в первую очередь ориентировались на размещение своей службы в Windows, было бы разумно рассматривать этот выбор, но поскольку вы ориентируетесь на Linux в первую очередь, мне кажется, что это не просто для меня.

Ответ 9

Java была разработана как кросс-платформенная; С#/. Сеть не была. Если вы сомневаетесь, используйте инструмент, который был разработан для вашей цели.

EDIT: честно говоря,.NET был разработан для работы в средах с встроенным/ПК/сервером, поэтому SORT межплатформенного. Но он не был разработан для Linux.

Ответ 10

Чтобы добавить немного больше к разговору, Java более портативен, если вы останетесь примерно на одной версии - Java 5 по-прежнему обладает множеством отличных функций, поэтому вы можете дождаться Java 6 и по-прежнему иметь большой диапазон в плане языка и библиотеки для разработки. Mac является основной платформой, которая может занять некоторое время, чтобы догнать последнюю версию Java.

Java также обладает отличным стандартным телом, который интеллектуально развивает платформу на основе данных, поступающих от разных компаний. Это часто забываемая функция, но она поддерживает даже новые функции, хорошо работающие на нескольких платформах, и предоставляет множество возможностей для поддержки библиотеки для некоторых эзотерических вещей (в качестве дополнительных расширений).

Ответ 11

Я думаю, что ответ "зависит". Java работает практически во всем, но .NET/Mono (IMHO) - лучшая среда для рабочего стола. Поэтому я думаю, что ответ действительно зависит от того, на каких платформах вы планируете таргетинг.

Ответ 12

Я бы проголосовал за то, что Java более переносима, чем С#. Java определенно также имеет очень богатый набор стандартных библиотек. Существует также широкий набор сторонних библиотек с открытым исходным кодом, таких как те, которые предоставляются проектом Джакарты (http://jakarta.apache.org/).

Все обычные подозреваемые существуют для CI, модульного тестирования и т.д. Кросс-платформенная поддержка IDE также очень хороша с такими, как Eclipse, Netbeans, IntelliJ IDEA и т.д.

Ответ 13

Существуют и другие варианты выбора языка. Я очень увлекаюсь Python, который хорошо работает на Windows, Linux и Mac и имеет богатый набор библиотек.

Ответ 14

В то время как Mono имеет долю проблем, я думаю, что он имеет лучшую кросс-платформенную историю совместимости, особенно если у вас есть зависимость от вызова собственной платформы.

Недостаточно слов о переполнении стека, чтобы подчеркнуть, насколько более гладким является получение чего-то родного, вызванного и выполняемого в .NET/Mono (по крайней мере, в моем опыте 3...) на нескольких платформах по сравнению с эквивалентными усилиями Java.

Ответ 15

Gatorhall Есть ли у вас данные для резервного копирования?

Производительность. Java и .Net имеют аналогичный уровень производительности благодаря виртуальной машине, но JVM обычно имеет лучшую производительность из-за многолетней оптимизации.

Фон: я парень Windows с Windows 3.1 и в настоящее время пользователь Linux (по-прежнему работает под Windows 7, отличная ОС, на виртуальной машине для Visual Studio 2010 и других инструментах).

Точка: я и множество пользователей (windows, linux и т.д.), я знаю, может не согласиться с вами. Java, как правило, работает медленнее даже в настольном приложении Linux, ASP.NET выполняет быстрее, чем страницы Java-сервера во многих случаях. Некоторые могут согласиться с тем, что даже не скомпилированный PHP лучше выполняет несколько сценариев.

Java более кросс-платформенная? Я не сомневаюсь в этом (история вернулась к этому), но быстрее (не говоря уж об .NET) не так уверен, и мне бы хотелось увидеть некоторые реальные тесты.