Как работает перенос между Linux и Windows? - PullRequest
6 голосов
/ 19 апреля 2010

Если определенная часть программного обеспечения предназначена для запуска на одной платформе, а программист / компания / все, что хочет перенести ее на другую, что именно делается? Я имею в виду, они просто переписывают Linux или специфичные для Windows ссылки на эквивалент в другом? Или необходимо полное переписывание?

Просто пытаюсь понять, что делает его настолько дорогим, что многие крупные поставщики не переносят свое программное обеспечение на Linux (особенно думая о Adobe)

Спасибо

Ответы [ 8 ]

4 голосов
/ 19 апреля 2010

это точка кроссплатформенного инструментария, такого как qt или gtk, они предоставляют независимый от платформы API, который делегирует любую платформу, для которой скомпилирована программа.

некоторые компании не используют такой инструментарий и пишут свои собственные (по любой причине - вполне могут быть связаны с оптимизацией), то есть они не могут просто перекомпилировать свой код для другой ОС.

2 голосов
/ 11 января 2017

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

  • Компиляторы могут отличаться по конфигурации и стандартным функциям, которые они предоставляют. В Windows наиболее популярным компилятором для C / C ++ является Visual Studio, а в Unix - gcc и llvm (в сочетании со стандартной библиотекой glibc или BSD libc). Они ожидают разные флаги, разные формы декларации, создают разные форматы файлов исполняемых файлов и разделяемых библиотек. Хотя C и C ++ имеют стандартные библиотеки, они реализованы по-разному на разных платформах. Есть некоторые системы, целью которых является сделать компиляцию переносимой, например, Autotools, CMake и SCons.

  • Помимо стандартных библиотек существуют дополнительные функции, которые предоставляет ОС. В Windows они защищены Win32 API, в Unix-системах они являются частью стандарта POSIX, с различными расширениями, специфичными для GNU, BSD и Linux, а также существуют простые системные вызовы (интерфейс самого низкого уровня между приложениями и операционной системой). , Функции POSIX доступны в Windows через такие системы, как cygwin и mingw, функция win32 API доступна в unix через Wine. Проблема заключается в том, что эти реализации не являются полными, и часто существуют незначительные (но важные) различия.

  • Связь с настольной системой (для создания интерфейса GUI) осуществляется по-другому. В Linux это может быть система X Window (вместе с библиотеками freedesktop) или Wayland, в то время как Windows имеет свои собственные системы. Существуют библиотеки GUI, которые пытаются предоставить для них абстрактный интерфейс, такие как Qt, GTK, wxWidgets, EFL.

  • Другие сервисы, предоставляемые ОС, такие как сетевая связь, могут быть реализованы по-другому. В Windows многие приложения используют библиотеки .NET, поддержка которых в системах Unix ограничена. Некоторые приложения Unix используют специфические для Linux функции, такие как systemd, / proc, KMS, cgroups, пространства имен. Это ограничивает переносимость даже среди систем Unix (Linux, BSD системы, Mac OS X, ...). Даже библиотеки .NET не очень совместимы между различными версиями и могут быть недоступны в более старых версиях Windows или во встроенных системах. У Android и iOS совершенно разные интерфейсы.

  • Веб-приложения обычно являются наиболее переносимыми, но HTML5 является живым стандартом, и многие интерфейсы могут быть еще недоступны в некоторых браузерах / веб-движках. Это требует использования полифилов, но обычно это гораздо менее болезненно, чем ситуация с «нативными» приложениями.

Из-за всех этих ограничений перенос может быть довольно тяжелой работой, и иногда проще создать новое приложение с нуля, либо специально для другой платформы, используя кросс-платформенные библиотеки / платформы абстракции (такие как Qt или Java) или как веб-приложение (возможно, в комплекте с чем-то вроде Electron). Рекомендуется использовать их с самого начала, но многие программисты предпочитают этого не делать, потому что приложения имеют тенденцию выглядеть и вести себя не так, как «родные» приложения на платформе, и они также могут быть медленнее и более ограничены в способе взаимодействия. с ОС.

2 голосов
/ 26 мая 2013

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

2 голосов
/ 19 апреля 2010

По моему опыту, есть три основные причины, по которым использование большой существующей программы на одной платформе и перенос ее на другую запрещает:

  1. он (не обязательно намеренно) широко использовал некоторую библиотеку или API (часто GUI, но есть и много других вещей), которые, как оказалось, не существуют на другой платформе

  2. он по незнанию перепутан с зависимостью от нестандартных функций или странностей компилятора или других инструментов

  3. это было написано кем-то, кто не знал, что у вас было , чтобы использовать какую-то странную функцию, чтобы заставить работать на другой платформе (например, в библиотеке Linux, которая не содержит правильные директивы __declspec, необходимые для хорошей библиотеки Windows).

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

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

  • Все программирование в GUI выполняется с использованием кроссплатформенной библиотеки. Мой любимый в наши дни Qt, но есть и другие достойные.

  • Сборка и тестирование каждый день на обеих платформах, никогда не позволяйте коду развить зависимость только на одной платформе и обнаружить ее слишком поздно.

1 голос
/ 19 апреля 2010

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

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

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

0 голосов
/ 19 апреля 2010

Большая часть программного обеспечения в некоторой степени переносима. В случае приложения C - в области будет много #ifdefs, кроме изменений пути и т. Д.

Редко Windows / Linux версии того же программного обеспечения не имеют общую кодовую базу - это на самом деле означает, что они имеют только общее имя. Поддерживать большее количество кодовых баз всегда сложнее, но я думаю, что реальная проблема с портированием приложений имеет мало общего с технической стороной и со стороны бизнеса. В Linux гораздо меньше пользователей Windows / OSX, большинство из них ожидают, что все будет бесплатным, как в пиве, или просто ненавидят коммерческое программное обеспечение по религиозным соображениям.

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

P.S. Отказ от ответственности - я заядлый сторонник свободного и открытого программного обеспечения, я не хочу никого оскорблять - я просто делюсь своим взглядом на эту тему.

0 голосов
/ 19 апреля 2010

В Mono вы можете написать программу C # Winforms, которая работает на обеих платформах. Но чтобы сделать это возможным, команде Mono пришлось написать собственную библиотеку Winforms, которая по сути дублирует все функции Winforms. Так что до сих пор нет бесплатного обеда.

0 голосов
/ 19 апреля 2010

Если программное обеспечение было написано для одной ОС, вероятна серьезная переделка. Первый шаг - переместить абсолютно весь специфичный для платформы код в одну область базы кода; эта область должна иметь мало или не иметь специфических для приложения вещей. Затем перепишите эту изолированную часть кода для новой целевой ОС.

Конечно, это затмевает некоторые чрезвычайно важные последствия. Например, если ваша первая версия была ориентирована на Win32 API, то любой код GUI будет сильно привязан к Windows, и чтобы сохранить надежду на сохранение вашего здравомыслия, вам нужно будет переместить весь этот код в кроссплатформенную среду GUI, такую ​​как Qt или GTK.

...