Введение

Компьютерное программное обеспечение, реализованное на нескольких вычислительных платформах.

В области вычислительной техники, кроссплатформенное программное обеспечение (также называемое многоплатформенным, платформенно-независимым или платформенно-агностическим программным обеспечением) – это компьютерное программное обеспечение, разработанное для работы на различных вычислительных платформах. Для некоторых кроссплатформенных программ требуется отдельная сборка для каждой платформы, в то время как другие могут быть запущены непосредственно на любой платформе без специальной подготовки, благодаря тому, что они написаны на интерпретируемом языке или скомпилированы в переносимый байт-код, для которого интерпретаторы или пакеты времени выполнения являются общедоступными или стандартными компонентами всех поддерживаемых платформ. Например, кроссплатформенное приложение может работать в Linux, macOS и Microsoft Windows. Кроссплатформенное программное обеспечение может поддерживать множество платформ или всего две. Некоторые фреймворки для кроссплатформенной разработки включают Codename One, ArkUI X, Kivy, Qt, GTK, Flutter, NativeScript, Xamarin, Apache Cordova, Ionic и React Native.

Ява

Язык Java обычно компилируется для выполнения на виртуальной машине, являющейся частью платформы Java. Виртуальная машина Java (Java VM, JVM) – это процессор, реализованный аппаратно-программным способом, который выполняет весь код Java. Это позволяет одному и тому же коду выполняться на всех системах, реализующих JVM. Программное обеспечение Java может выполняться и на аппаратном Java-процессоре, что чаще всего используется во встраиваемых системах. Код Java, выполняемый в JVM, имеет доступ к сервисам операционной системы, таким как ввод-вывод данных на диск (I/O) и сетевой доступ, при наличии соответствующих прав. JVM выполняет системные вызовы от имени Java-приложения, позволяя пользователям определять соответствующий уровень защиты в зависимости от списка контроля доступа (ACL). Например, доступ к диску и сети обычно разрешен для настольных приложений, но не для апплетов, работающих в браузере. Для доступа к функциям, специфичным для операционной системы, можно также использовать Java Native Interface (JNI), однако это снижает переносимость кода. В настоящее время программное обеспечение Java Standard Edition может работать в Microsoft Windows, macOS, различных Unix-подобных операционных системах и нескольких операционных системах реального времени для встраиваемых устройств. Для мобильных приложений используются плагины для браузеров на Windows и Mac, а Android имеет встроенную поддержку Java. Существуют также подмножества Java, такие как Java Card или Java Platform, Micro Edition, разработанные для устройств с ограниченными ресурсами.

Реализация

Для того чтобы программное обеспечение считалось кроссплатформенным, оно должно функционировать на более чем одной компьютерной архитектуре или операционной системе. Разработка такого программного обеспечения может быть длительным процессом, поскольку различные операционные системы имеют различные интерфейсы прикладного программирования (API). Программное обеспечение, разработанное для одной операционной системы, может не работать автоматически на всех архитектурах, которые эта операционная система поддерживает. Сам факт того, что программное обеспечение написано на популярном языке программирования, таком как C или C++, не гарантирует его работы на всех операционных системах, поддерживающих этот язык, или даже на разных версиях одной и той же операционной системы.

Веб-приложения

Веб-приложения обычно описываются как кроссплатформенные, поскольку в идеале они доступны из любого веб-браузера: браузер и является платформой. Веб-приложения, как правило, используют клиент-серверную модель, но значительно различаются по сложности и функциональности. Иногда бывает сложно согласовать стремление к расширенным возможностям с необходимостью обеспечения совместимости. Простые веб-приложения выполняют всю или большую часть обработки на сервере, не сохраняющем состояние, и передают результат клиентскому веб-браузеру. Все взаимодействие пользователя с приложением состоит из простых запросов данных и ответов сервера. Этот тип приложений был распространен в начальный период разработки веб-приложений. Такие приложения следуют простой модели транзакций, аналогичной модели обслуживания статических веб-страниц. Сегодня они по-прежнему достаточно распространены, особенно когда кроссплатформенная совместимость и простота важнее расширенной функциональности. Яркими примерами продвинутых веб-приложений являются веб-интерфейсы Gmail и Google Maps. Такие приложения часто полагаются на дополнительные функции, доступные только в последних версиях популярных веб-браузеров. К этим функциям относятся Ajax, JavaScript, Dynamic HTML, SVG и другие компоненты, составляющие основу насыщенных веб-приложений.

Дизайн

Из-за конкурирующих интересов совместимости и функциональности возникло множество стратегий проектирования. Во многих программных системах используется многоуровневая архитектура, в которой платформозависимый код ограничивается верхним и нижним уровнями.

Благородная деградация

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

Многочисленные кодовые базы

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

Единая кодовая база

Эта стратегия основана на использовании единой кодовой базы, которую можно скомпилировать в несколько форматов, специфичных для различных платформ. Один из способов реализации – условная компиляция. При этом общий для всех платформ код не дублируется. Участки кода, актуальные только для определенных платформ, делаются условными и интерпретируются или компилируются только при необходимости. Другой способ – разделение функциональности, при котором отключается функциональность, не поддерживаемая браузерами или операционными системами, но пользователю по-прежнему предоставляется полноценное приложение. (См. также: Разделение ответственности.) Этот подход широко используется в веб-разработке, где интерпретируемый код (например, в скриптовых языках) может определять платформу, на которой он выполняется, и условно выполнять различные блоки кода.

Библиотеки третьих сторон

Библиотеки сторонних разработчиков стремятся упростить кроссплатформенность, скрывая сложности различий между клиентами за единым унифицированным API, но это достигается ценой привязки к конкретному поставщику.

Реагирующий веб-дизайн

Адаптивный веб-дизайн (RWD) — это подход к веб-дизайну, целью которого является создание визуальной компоновки сайтов, обеспечивающей оптимальное восприятие информации — удобное чтение и навигацию с минимальной потребностью в изменении масштаба, горизонтальной прокрутке и прокрутке — на широком спектре устройств, от мобильных телефонов до настольных мониторов. При использовании этой техники требуется небольшое количество или полное отсутствие платформенно-зависимого кода.

Испытания

Приложения для разных платформ нуждаются в значительно большем объеме интеграционного тестирования. Некоторые веб-браузеры запрещают установку различных версий на одном компьютере. Существует несколько подходов для поддержки нескольких платформ, но все они приводят к созданию программного обеспечения, требующего существенных ручных усилий для тестирования и поддержки. Методы, такие как полная виртуализация, иногда используются как обходное решение этой проблемы. Инструменты, такие как Page Object Model, позволяют создавать сценарии для кроссплатформенных тестов, чтобы один тестовый случай покрывал несколько версий приложения. Если разные версии имеют схожие пользовательские интерфейсы, их все можно протестировать одним тестовым случаем.

Традиционные приложения

Веб-приложения становятся все более популярными, но многие пользователи компьютеров по-прежнему используют традиционное программное обеспечение, которое не опирается на клиент-серверную архитектуру. Граница между традиционными и веб-приложениями не всегда четкая. Функциональные возможности, способы установки и архитектура веб-приложений и традиционного программного обеспечения пересекаются и размывают это различие. Тем не менее, такое упрощенное разграничение является распространенным и полезным обобщением.

Видеоигры

Кросплатформенные или мультиплатформенные – это термин, который также может применяться к видеоиграм, выпущенным на ряде игровых консолей. Примеры кроссплатформенных игр включают: Miner 2049er, Tomb Raider: Legend, серии FIFA, серии NHL и Minecraft. Каждая из них была выпущена на различных игровых платформах, таких как Wii, PlayStation 3, Xbox 360, персональные компьютеры и мобильные устройства. Разработка для некоторых платформ сложнее, чем для других, и требует больше времени для достижения одинакового уровня качества. Чтобы компенсировать это, видеоигра может быть выпущена сначала на нескольких платформах, а затем и на остальных. Обычно это происходит при выходе новой игровой системы, поскольку разработчикам видеоигр необходимо ознакомиться с её аппаратным и программным обеспечением. Некоторые игры могут быть не кроссплатформенными из-за лицензионных соглашений между разработчиками и производителями игровых консолей, которые ограничивают разработку одной конкретной консолью. Например, Disney может создать игру с намерением выпустить её на новейших консолях Nintendo и Sony. Если Disney сначала лицензирует игру для Sony, она может быть обязана выпустить её исключительно на консоли Sony на определенный срок или бессрочно.

Кроссплатформенная игра

Несколько разработчиков реализовали возможность играть в игры онлайн на разных платформах. Psyonix, Epic Games, Microsoft и Valve располагают технологиями, позволяющими игрокам на Xbox 360 и PlayStation 3 играть с пользователями ПК, предоставляя потребителям возможность выбора платформы. Первой игрой, предложившей такой уровень взаимодействия между ПК и консольными играми, была Quake 3. К играм с поддержкой кроссплатформенной онлайн-игры относятся Rocket League, Final Fantasy XIV, Street Fighter V, Killer Instinct, Paragon, Fable Fortune, а также Minecraft с обновлением Better Together для Windows 10, VR-версии, Pocket Edition и Xbox One.

Программирование

Кроссплатформенное программирование — это практика намеренного создания программного обеспечения, способного работать на нескольких платформах.

Подходы

Существуют различные способы создания кроссплатформенных приложений. Один из подходов — разработка нескольких версий одного и того же программного обеспечения в разных кодовых базах — иными словами, версия приложения для Microsoft Windows может иметь один набор файлов исходного кода, версия для Macintosh — другой, а для FOSS *nix системы — третий. Хотя это и прямолинейно, по сравнению с разработкой только для одной платформы, это может потребовать больших затрат на оплату труда более крупной команды или замедлить выпуск продуктов. Это также может привести к увеличению количества ошибок, которые необходимо отслеживать и исправлять. Другой подход — использование программного обеспечения, которое скрывает различия между платформами. Этот уровень абстракции изолирует приложение от платформы. Такие приложения платформенно-независимы. Приложения, работающие на JVM, создаются именно таким образом. Некоторые приложения комбинируют различные методы кроссплатформенного программирования для создания конечного продукта. Примером является веб-браузер Firefox, который использует абстракцию для создания некоторых низкоуровневых компонентов, отдельные кодовые базы для реализации платформенно-специфичных функций (например, графического интерфейса) и реализацию нескольких языков сценариев для упрощения переносимости программного обеспечения. Firefox использует XUL, CSS и JavaScript для расширения функциональности браузера, в дополнение к классическим плагинам браузера в стиле Netscape. Большая часть самого браузера написана на XUL, CSS и JavaScript.

Вызовы

Существует множество сложностей при разработке кроссплатформенного программного обеспечения. Тестирование кроссплатформенных приложений может быть значительно сложнее, поскольку различные платформы могут демонстрировать несколько иное поведение или скрытые ошибки. Эта проблема привела к тому, что некоторые разработчики иронично называют кроссплатформенную разработку "напиши один раз, отлаживай везде", пародируя маркетинговый слоган Sun Microsystems "напиши один раз, запускай везде". Разработчики часто ограничены использованием минимального набора функций, доступного на всех платформах. Это может снизить производительность приложения или лишить разработчиков возможности использовать самые передовые функции каждой платформы. Различные платформы часто имеют разные соглашения о пользовательском интерфейсе, которые кроссплатформенные приложения не всегда учитывают. Например, приложения, разработанные для macOS и GNOME, обычно размещают наиболее важную кнопку справа от окна или диалогового окна, в то время как Microsoft Windows и KDE придерживаются обратного соглашения. Хотя многие из этих различий незначительны, кроссплатформенное приложение, не соответствующее этим соглашениям, может показаться пользователю неудобным или непривычным. При быстрой работе такие противоположные соглашения могут даже привести к потере данных, например, в диалоговом окне подтверждения сохранения или отмены изменений. Скриптовые языки и байт-код виртуальной машины должны быть преобразованы в нативный исполняемый код при каждом использовании, что снижает производительность. Это снижение можно уменьшить с помощью таких методов, как JIT-компиляция, но некоторые вычислительные накладные расходы могут быть неизбежны. Различные платформы требуют использования собственных форматов пакетов, таких как RPM и MSI. Многоплатформенные установщики, такие как InstallAnywhere, решают эту задачу. Кроссплатформенные среды выполнения могут быть подвержены кроссплатформенным уязвимостям безопасности, создавая благоприятную среду для кроссплатформенного вредоносного ПО.