Для приложений, ориентированных на несколько платформ, я вижу в основном два подхода к разработке:
Перейти на какую-то JAVA-подобную платформу разработки. Иметь одно решение кода и позволить промежуточной среде выполнения работать с разными платформами. Если что-то пойдет не так на любой платформе, немного подправьте код. Но оставь это для всех.
Создайте модульный код, разделяющий основную логику и пользовательский интерфейс. Разработайте отдельные интерфейсы для соответствующих платформ, которые будут вызывать одни и те же основные библиотеки. Создайте приложение отдельно для каждой целевой платформы.
Итак, какой из них следовать? Я знаю, ответ начнется с « Это зависит ». Но я хочу услышать ваше мнение об этих подходах и факторах, которые следует учитывать при выборе любого из них.
Ответы:
Нынешние склоки Oracle / Apache / Google в стороне, все еще трудно победить JVM для этой цели. Это действительно очень высокое качество на большинстве платформ, универсальное, и у вас есть множество языков на выбор (Java, Clojure, Scala и т. Д.). Это позволяет вам ориентироваться на архитектуру одного компьютера (ВМ) и не беспокоиться о конкретном оборудовании конечного пользователя.
Тем не менее, существуют определенные типы приложений, которые могут быть не такими подходящими: на ум приходят низкоуровневые сети, как и тяжелая обработка графики / видео.
источник
Перейти на HTML5. Любая платформа с браузером HTML5 может запустить ваше приложение. Хотя HTML5 еще не готов к этому, подход с использованием веб-приложений есть.
источник
В звуковом редакторе Audacity мы используем wxWidgets в качестве нашей кроссплатформенной библиотеки. Поскольку нам нужно соединиться с библиотеками C, и нам нужны скорость и низкоуровневый доступ, подход JVM не будет работать для нас. Код GUI на 95% одинаков на всех платформах. Мы используем #ifdefs для небольших вариаций. Однако мы считаем необходимым, чтобы разработчик работал на каждой из трех платформ (Mac, Windows Linux), потому что даже при использовании кроссплатформенной библиотеки изменение на одной машине слишком просто, чтобы сломать вещи на другой.
Если вы можете получить необходимую производительность, перейдите на JVM. Если вы не можете, используйте QT или wxWidgets, и я бы посоветовал QT поверх wxWidgets, так как это не так сложно, чтобы он выглядел красиво.
источник
Как разработчик в реальном времени, я успешно использовал опцию, похожую на 2 - отдельные модули для конкретной платформы с общим API, используемым базовой логикой. Тем не менее, ничто из того, что я сделал, не имело пользовательского интерфейса - сети, аудио, потоковой передачи данных - в данном случае это аппаратный интерфейс низкого уровня, который зависит от платформы.
Я сделал это таким образом по нескольким причинам:
1) Чтобы получить оптимальную производительность на каждой платформе
2) Чтобы воспользоваться преимуществами, предлагаемыми только на 1 платформе
3) (J) Виртуальные машины не существовали для некоторых платформ (встроенные системы, игровые приставки ...)
источник
Это зависит от того, что важно для вас :)
Когда около 10 лет назад мы столкнулись с этим выбором для кроссплатформенного приложения Mac / Windows, мы хорошо рассмотрели различные кроссплатформенные варианты - Java, Qt, wxWidgets и т. Д. Проблема, с которой мы столкнулись, заключалась в том, что внешний вид пользовательский интерфейс был действительно важен для нас, и все «кроссплатформенные» приложения выглядели, ну, скомпрометированы. Мы закончили тем, что кусали пулю и строили наше собственное кроссплатформенное ядро с настраиваемым пользовательским интерфейсом для каждой платформы сверху (написано на PowerPlant для Mac и MFC на Windows). Со временем мы стали достаточно хорошими, и «кроссплатформенная» часть стала толще без ущерба для пользовательского интерфейса.
Сейчас мы снова смотрим на это решение для нового проекта. Глядя на варианты сейчас, я бы, наверное, выбрал Qt - он бесплатный и действительно хорошо созрел. Java могла бы быть вариантом, но мы не можем реально снизить производительность (мы занимаемся обработкой трехмерных изображений).
Если пользовательский интерфейс действительно важен для вас, я подозреваю, что вам придется потратить довольно много времени на то, чтобы все выглядело правильно на каждой платформе, используете ли вы что-то вроде Qt или катите свое. Для внутреннего или специализированного приложения, где пользователи могут больше воспринимать менее отточенный пользовательский интерфейс, это может быть хорошо!
источник
Каждый суетится из-за того, что такие языки, как Java, являются «кроссплатформенными», но на самом деле они говорят о том, что вы можете один раз скомпилировать и запустить везде. Даже в таком языке, как Java (или C # / mono), вам все равно понадобятся уровни абстракции для работы с деталями, специфичными для ОС, в некоторых областях.
C ++ и фактически большинство языков кроссплатформенные, вам просто нужно скомпилировать для каждой платформы.
Ключевым является процесс, а не инструменты / языки:
Эти шаги одинаковы независимо от того, какой язык / набор инструментов / рамки вы используете.
источник
Используйте Интернет!
Серьезно, если вы хотите получить максимальную отдачу, напишите веб-приложение.
Почему?
Даже два упомянутых вами подхода очень похожи. Веб-браузер отображает HTML для нескольких базовых архитектур. Точно так же JVM интерпретирует код Java таким образом, который имеет смысл для базового оборудования. Сеть, однако, просто имеет более широкую клиентскую базу!
источник
Мне очень повезло с Моно. Я могу написать тот же код для машин Windows, что и для машин Linux, и по большей части он работает на обоих. И я могу использовать навыки, которые я уже знаю в C # и Winforms.
источник
Сначала сделайте проверку концепции.
Если это довольно сложное приложение, то вы получите подтверждение концепции, которая даст вам представление о том, какие языковые функции вам нужны и какие области вам понадобятся для использования фреймворка или сторонних библиотек.
Функции языка и библиотеки, которые вам нужны, определят, какой язык вы выберете (и, следовательно, как вы приблизитесь к межплатформенной поддержке)
источник
Я создал систему, начав с настольного приложения, 15 лет назад, когда Java еще только начинала развиваться и не была готова для использования при создании приложений такого типа. Я знал, что мне нужно иметь ядро в C ++ и с самого начала проектировал его как кроссплатформенное, включая использование размерных типов (например, int32 вместо int или long), чтобы оно могло работать на Mac, Windows и UNIX (до Linux) дней).
В то время, когда я пытался найти хорошую среду кроссплатформенного интерфейса, их было несколько, включая XVT. Я прошел обучение для XVT, и когда я начал создавать настоящее приложение, я понял, что не смогу создать чистый, естественный вид на платформе (начиная с Mac). Поэтому я отказался от этой идеи и создал собственный интерфейс Mac (PowerPlant) поверх портативного ядра.
Пару лет спустя мы перешли на Windows (пользовательский интерфейс в MFC). Во второй раз процесс создания пользовательского интерфейса был быстрее, мы некоторое время поддерживали параллельный интерфейс Mac и Windows, а затем перешли на Windows. Позже ядро перешло на различные разновидности UNIX и Linux, что позволило нам запускать серверные вычисления. Ядро работало хорошо, с некоторыми изменениями, когда мы сделали его готовым для 64-битной системы.
Теперь я вернулся к использованию Mac и хотел бы, чтобы мы могли вернуться к Mac, но размер и сложность приложения делают этот выбор трудным. Для большей части этого приложения все еще имеет смысл быть настольным приложением - это похоже на среду САПР. Но вместо того, чтобы снова создавать пользовательский интерфейс на платформенно-зависимом языке C / C ++ (и продолжать поддерживать пользовательский интерфейс на основе MFC), я более склонен переписывать весь стек в Java, чтобы он мог работать на нескольких платформах.
Могут все еще быть причины для запуска не-Java ядра, скажем C ++, как мы это сделали. Но я хотел бы провести ранние тесты производительности, чтобы увидеть, действительно ли это необходимо. И я бы внимательно посмотрел на свой пользовательский интерфейс, чтобы посмотреть, смогу ли я создать его как веб-приложение, подключенное к ядру через веб-сервисы, чтобы у меня был целый ряд клиентов - настольные приложения, мобильные приложения, веб-приложения и т. Д. Если мне нужен кусок в C или C ++, может ли он быть написан под слоем Java? Или как веб-сервис?
Еще одно соображение - как долго будет ваше приложение? Насколько сложным это будет расти? Если у вас есть какие-либо идеи по этому поводу, подумайте о возможной долговечности любых библиотек пользовательского интерфейса, которые вы используете, и о своей способности со временем помогать людям поддерживать их. Это может быть трудно рассмотреть сейчас, но стоит подумать.
Алекс
источник
Если вы можете сделать это веб-приложением, сделайте это веб-приложением. Используя наборы инструментов, такие как ExtJS , относительно легко сделать хорошо выглядящий GUI-подобный кросс-браузер-совместимый пользовательский интерфейс.
В противном случае, Java или QT + C ++ или C + Wx являются возможными вариантами, чтобы иметь один источник для всех.
Ваш второй подход уместен, если вы хотите, чтобы приложение выглядело и чувствовалось на каждой целевой платформе. Нативные Mac-приложения выглядят и выглядят иначе, чем нативные Windows-приложения, просто использование другого скина и привязок клавиш будет недостаточно для этого
источник