Насколько меньше библиотек для Mono, чем для Java?
Мне не хватает обзора обеих альтернатив, но у меня есть большая свобода выбора для моего следующего проекта. Я ищу неопровержимые технические факты в области
- производительность (например, мне сказали, что Java хороша для многопоточности, и я слышал, что оптимизация кода времени выполнения в последнее время стала очень хорошей для .NET)
- переносимость в реальном мире (оба предназначены для переносимости, что такое Catch-22 для каждого?)
- доступность инструмента ( CI , автоматизация сборки, отладка, IDE)
Я особенно ищу то, что вы действительно испытали в своей работе, а не то, что я мог бы найти в Google. Мое приложение было бы серверной службой, обрабатывающей большие объемы данных из временных рядов.
Моей основной целевой платформой будет Linux.
Изменить: чтобы сформулировать мой вопрос более адекватно, меня интересует весь пакет (сторонние библиотеки и т. Д.), А не только язык. Для библиотек это, вероятно, сводится к вопросу «насколько меньше библиотек для Mono, чем для Java»?
К вашему сведению, с тех пор я выбрал Java для этого проекта, потому что он казался более вымотанным в плане переносимости и какое-то время существовал и на старых системах. Мне это немного грустно, потому что мне очень любопытен C #, и я хотел бы поработать над этим большим проектом, но, может быть, в следующий раз. Спасибо за все советы.
Ответы:
Что ж .... Java на самом деле более портативна. Mono реализован не везде и значительно отстает от реализации Microsoft. Кажется, что Java SDK лучше синхронизируется между платформами (и работает на большем количестве платформ).
Я бы также сказал, что для Java доступно больше инструментов на всех этих платформах, хотя для .NET на платформах Windows доступно множество инструментов.
Обновление за 2014 год
Я все еще придерживаюсь этого мнения в 2014 году. Тем не менее, я уточню это, сказав, что я только сейчас начинаю уделять некоторое внимание Mono после долгого времени без особого внимания, поэтому могут быть улучшения в среде выполнения Mono (или экосистеме ), о которых я не знал. AFAIK, до сих пор нет поддержки WPF, WCF, WF, of WIF. Mono может работать на iOS, но, насколько мне известно, среда выполнения Java по-прежнему работает на гораздо большем количестве платформ, чем Mono. Кроме того, Mono начинает видеть некоторые значительно улучшенные инструменты (Xamarin), и Microsoft, похоже, имеет гораздо более кроссплатформенное отношение и готовность работать с партнерами, чтобы сделать их взаимодополняющими, а не конкурентоспособными (например, Mono будет довольно важная часть будущего ландшафта OWIN / Helios ASP.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, поскольку MonoTouch работает фантастически. Я не знаю ни одного хорошего способа настроить таргетинг на iOS с помощью Java. Вы не можете настроить Java для Windows Phone 7, поэтому я бы сказал, что времена, когда Java была лучше для мобильных устройств, остались позади.
Но самым большим фактором для меня является личная продуктивность (и счастье). C # как язык на годы опережает Java. IMHO, и .NET framework доставляет удовольствие. Большая часть того, что добавляется в Java 7 и Java 8, уже много лет написано на C #. Хотя языки JVM, такие как Scala и Clojure (оба доступны в CLR), довольно хороши.
Я рассматриваю Mono как самостоятельную платформу (отличную платформу) и отношусь к .NET как к реализации Microsoft Mono в Windows. Это означает, что я сначала разрабатываю и тестирую на Mono. Это прекрасно работает.
Если бы и Java, и .NET (скажем, Mono) были проектами с открытым исходным кодом без какой-либо корпоративной поддержки, я бы каждый раз выбирал Mono вместо Java. Я считаю, что это просто лучшая платформа.
И .NET / Mono, и JVM - отличный выбор, хотя я бы лично использовал для JVM другой язык, кроме Java.
Мое мнение о некоторых других комментариях:
Проблема: Производительность.
** Ответ: И JVM, и CLR работают лучше, чем говорят недоброжелатели. Я бы сказал, что JVM работает лучше. Mono обычно медленнее, чем .NET (хотя и не всегда).
Я лично возьму ASP.NET MVC вместо J2EE в любой день как разработчик, так и конечный пользователь. Поддержка собственного клиента Google тоже довольно крутая. Кроме того, я знаю, что плохая производительность графического интерфейса для настольных приложений 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 отстает от .NET.
Ответ: Нет. ИМХО, это часто повторяющееся, но неверное утверждение.
Дистрибутив Mono от Xamarin поставляется с C #, VB.NET, F #, IronPython, IronRuby и, я думаю, может быть Boo из коробки. Компилятор Mono C # полностью обновлен с помощью MS. Компилятор Mono VB.NET отстает от версии MS. Остальные компиляторы одинаковы на обеих платформах (как и другие языки .NET, такие как Nemerle, Boo и Phalanger (PHP)).
Mono поставляется с большим количеством фактического написанного кода Microsoft, включая среду динамического языка (DLR), платформу управляемой расширяемости (MEF), F # и ASP.NET MVC. Поскольку Razor не является Open Source, Mono в настоящее время поставляется с MVC2, но MVC3 отлично работает с Mono.
Базовая платформа Mono идет в ногу с .NET за многие годы, и ее совместимость впечатляет. Сегодня вы можете использовать весь язык C # 4.0 и даже некоторые функции C # 5.0. Фактически, Mono часто опережает .NET во многих отношениях.
Mono реализует части спецификации CLR, которые не поддерживает даже Microsoft (например, 64-битные массивы). Одна из самых захватывающих новых технологий в мире .NET - это Rosylyn . Mono уже много лет предлагает компилятор C # в качестве услуги. Кое-что из того, что предлагает 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) Mono - отстой, потому что он не позволяет использовать все технологии, которые предлагает Microsoft
Мне ясно, что эти утверждения несовместимы. Я отвергаю первое утверждение, но пропущу здесь этот аргумент. Второе утверждение верно для всех альтернатив .NET.
JVM - отличная платформа, и рост количества языков JVM впечатляет. Используйте то, что делает вас счастливым. На данный момент для меня это чаще всего .NET / Mono.
источник
На самом деле я занимаюсь разработкой в .NET, запускаю все свои тесты сначала в Mono, а затем в Windows. Таким образом, я знаю, что мои приложения кроссплатформенны. Я сделал это очень успешно как для приложений ASP.NET, так и для Winforms.
Я не совсем уверен, откуда у некоторых людей сложилось впечатление, что Mono настолько ужасен, но он определенно сделал свою работу в моих случаях и мнениях. Это правда, что у вас будет небольшое отставание от последних и величайших изобретений в .NET. world, но пока что .NET 2.0 для Windows и Linux мне очень подходит.
Имейте в виду, что здесь, очевидно, есть много причуд, но большинство из них связано с тем, что вы пишете переносимый код. В то время как фреймворки отлично справляются с абстрагированием от того, на какой ОС вы работаете, такие мелочи, как чувствительность к регистру в путях и именах файлов в Linux, требуют некоторого привыкания, как и такие вещи, как разрешения.
.NET определенно очень кроссплатформенный из-за Mono, исходя из моего опыта.
источник
Java на самом деле настолько кроссплатформенна, как все говорят. Существует реализация JVM практически для любой основной ОС (даже Mac OS X, наконец), и все они работают очень хорошо. И существует множество инструментов с открытым исходным кодом, которые столь же кроссплатформенны.
Единственная загвоздка в том, что есть определенные собственные операции, которые вы не можете выполнять в Java без написания некоторых библиотек DLL или SO. Это очень редко встречается на практике. Однако во всех этих случаях мне удавалось обойти это, порождая собственные процессы и очищая экран результатов.
источник
Думаю, вопрос сформулирован неправильно. C # и Java гораздо менее интересны с точки зрения межплатформенного использования, чем (а) какие платформы вам нужно поддерживать, и (б) с учетом основных библиотек и доступных сторонних библиотек. Язык - едва ли не наименее важная часть процесса принятия решений.
источник
Java - лучший выбор для кроссплатформенной разработки.
Производительность. Java и .Net имеют схожий уровень производительности из-за виртуальной машины, но JVM обычно имеет лучшую производительность из-за многолетней оптимизации.
Библиотека. Хотя это зависит от вашей задачи, в Java доступно гораздо больше библиотек с открытым исходным кодом или сторонних разработчиков. Для серверного приложения J2EE, Spring, Struts и т. Д. Для графического интерфейса .Net предоставляет API уровня Win32, но это вызывает проблемы совместимости. В Java есть Swing, SWT, AWT и т.д. Он работает в большинстве случаев.
Совместимость. Это ключевые вопросы, которые необходимо учитывать при разработке кроссплатформенной программы. Два вопроса: во-первых, совместимость платформ. Java по-прежнему выигрывает, поскольку JDK хорошо поддерживается единственной оригинальной компанией Sun. Mono не поддерживается MS, поэтому у вас еще нет гарантии совместимости обновлений. 2. Обратная совместимость. Sun поддерживает хорошую репутацию в отношении своей обратной совместимости, хотя иногда это кажется слишком жестким и замедляет темп.
Инструменты. У Java есть хорошие кроссплатформенные IDE. Netbeans, Eclipse и др. Большинство из них бесплатны. VS Studio хороша, но только для Windows и стоит недорого. Оба они предоставляют хорошие модульные тесты, отладки, профили и т. Д.
Следовательно, я бы предположил, что Java - лучший выбор. В качестве примера можно привести несколько известных настольных кроссплатформенных приложений, разработанных Java: Vuze, Limewire, BlogBridge, CrossFTP, не говоря уже об этих IDE. Что касается .Net, у меня ограниченные знания о таких успешных приложениях.
источник
Я поздно задаю тот же вопрос, и IMHO, .NET / Mono кажется лучшим вариантом просто потому, что Mono имеет большой послужной список для кроссплатформенных настольных приложений (в отличие от Java) и, конечно же, Mono улучшается семимильными шагами в наши дни.
источник
Я тоже скажу Java. Если вы посмотрите на это с точки зрения зрелости, 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 также есть отличная организация по стандартизации, которая разумно расширяет платформу на основе предложений многих различных компаний. Это функция, о которой часто забывают, но она позволяет даже новым функциям хорошо работать на нескольких платформах и обеспечивает широкий диапазон библиотечной поддержки для некоторых эзотерических вещей (в качестве дополнительных расширений).
источник
Я бы проголосовал за то, чтобы Java была более портативной, чем C #. В Java определенно также есть очень богатый набор стандартных библиотек. Существует также широкий набор сторонних библиотек с открытым исходным кодом, например, предоставленных проектом Jakarta ( http://jakarta.apache.org/ ).
Все обычные подозреваемые существуют также для CI, модульного тестирования и т. Д. Кросс-платформенная поддержка IDE также очень хороша с такими, как Eclipse, Netbeans, IntelliJ IDEA и т. Д.
источник
Есть и другие варианты языка. Я очень полюбил Python, который хорошо работает в Windows, Linux и Mac и имеет богатый набор библиотек.
источник
Хотя у Mono есть свои проблемы я думаю, что у него лучшая кроссплатформенная совместимость, особенно если вы полагаетесь на вызов собственной платформы.
Недостаточно слов о переполнении стека, чтобы подчеркнуть, насколько плавнее получить что-то родное, вызываемое и выполняемое в .NET / Mono (по крайней мере, по моему опыту 3 ...) на нескольких платформах по сравнению с эквивалентными усилиями Java.
источник
Гаторхолл, у вас есть данные для подтверждения ?
Предыстория: я работаю с Windows начиная с Windows 3.1 и в настоящее время использую Linux (все еще использую Windows 7, отличную ОС, на виртуальной машине для Visual Studio 2010 и других инструментов).
Дело в том, что я и многие пользователи (windows, linux и т. Д.), Которых я знаю, могу не согласиться с вами. Java имеет тенденцию работать медленнее даже в настольном приложении Linux, ASP.NET во многих случаях работает быстрее, чем страницы сервера Java. Некоторые могут согласиться с тем, что даже некомпилированный PHP работает лучше в нескольких сценариях.
Java более кроссплатформенная? Я не сомневаюсь в этом (история говорит об этом), но быстрее (не говоря уже о .NET) не так уверенно, и я хотел бы увидеть несколько реальных тестов.
источник