В программной инженерии, перенос - это процесс адаптации программного обеспечения с целью достижения некоторой формы выполнения в вычислительной среде , которая отличается от той, для которой данная программа (предназначенная для такого выполнения) была изначально разработана (например, другой ЦП, операционная система или сторонняя библиотека ). Этот термин также используется, когда программное обеспечение / аппаратное обеспечение изменяется, чтобы сделать его пригодным для использования в различных средах.
Программное обеспечение переносимо, когда затраты на перенос на новую платформу значительно меньше, чем стоимость написания с нуля. Чем ниже стоимость портирования программного обеспечения по сравнению со стоимостью его реализации, тем более портативным оно считается.
Термин «порт» происходит от латинского portāre, что означает «переносить». Если код несовместим с конкретной операционной системой или архитектурой, код необходимо «перенести» в новую систему.
Этот термин обычно не применяется к процессу адаптации программного обеспечения для работы с меньшим объемом памяти на том же ЦП и операционной системе, а также не применяется к переписыванию исходного кода на другом языке (т.е. преобразование языка или перевод).
Разработчики программного обеспечения часто заявляют, что программное обеспечение, которое они пишут, портативно, а это означает, что не требуется больших усилий для адаптации его к новой среде. Фактически необходимые усилия зависят от нескольких факторов, включая степень, в которой исходная среда (исходная платформа) отличается от новой среды (целевая платформа), опыт первоначальных авторов в знании того, какой язык программирования конструкции и вызовы сторонних библиотек вряд ли будут переносимыми, а количество усилий, вложенных авторами в использование только переносимых конструкций (конструкции, специфичные для платформы, часто обеспечивают более дешевое решение).
Сегодня на настольных компьютерах используется гораздо меньше процессоров и операционных систем, которые существенно отличаются друг от друга, чем в прошлом. Преобладание архитектуры x86 означает, что большая часть программного обеспечения для настольных ПК никогда не переносится на другой ЦП. На том же рынке выбор операционных систем фактически сократился до трех: Microsoft Windows, macOS и Linux. Однако на рынках встраиваемых систем и мобильных переносимость остается серьезной проблемой, а ARM является широко используемой альтернативой.
Международные стандарты, такие как стандарты, провозглашенные ISO, значительно облегчают перенос, определяя детали вычислительной среды таким образом, чтобы уменьшить различия между различными платформами, соответствующими стандартам . Написание программного обеспечения в рамках, установленных этими стандартами, представляет собой практическое, хотя и нетривиальное усилие. Перенос такой программы между двумя совместимыми со стандартами платформами (такими как POSIX.1 ) может заключаться только в загрузке исходного кода и его повторной компиляции на новой платформе. Однако практикующие часто обнаруживают, что из-за тонких различий в платформе требуются различные незначительные исправления. Большинство стандартов страдают от «серых зон», где различия в интерпретации стандартов приводят к небольшим отклонениям от платформы к платформе.
Существует также постоянно растущее число инструментов для облегчения портирования, таких как Коллекция компиляторов GNU, которая обеспечивает согласованные языки программирования на разных платформах, и Autotools, который автоматизирует обнаружение незначительных изменений в среде и соответствующим образом адаптирует программное обеспечение перед компиляцией.
Компиляторы для некоторых языков программирования высокого уровня (например, Eiffel, Esterel ) получают переносимость за счет вывода исходного кода на другом высоком уровне промежуточный язык (например, C ), для которого обычно доступны компиляторы для многих платформ.
Два действия, связанные с переносом (но отличные от него): эмуляция и кросс-компиляция.
вместо прямого преобразования в машинный код, современные компиляторы преобразуют машинно-независимый промежуточный код, чтобы улучшить переносимость компилятора и минимизировать усилия по проектированию. Промежуточный язык определяет виртуальную машину, которая может выполнять все программы, написанные на промежуточном языке (машина определяется своим языком и наоборот). Команды промежуточного кода преобразуются в эквивалентные последовательности машинного кода генератором кода для создания исполняемого кода. Также можно пропустить генерацию машинного кода, фактически реализовав интерпретатор или JIT для виртуальной машины.
Использование промежуточного кода улучшает переносимость компилятор, потому что только машинно-зависимый код (интерпретатор или генератор кода) самого компилятора должен быть перенесен на целевую машину. Остальная часть компилятора может быть импортирована как промежуточный код и затем обработана портированным генератором кода или интерпретатором, таким образом создавая программное обеспечение компилятора или напрямую выполняя промежуточный код в интерпретаторе. Независимая от машины часть может быть разработана и протестирована на другой машине (хост-машине). Это значительно сокращает усилия по проектированию, поскольку машинно-независимая часть должна быть разработана только один раз для создания переносимого промежуточного кода.
Интерпретатор менее сложен и, следовательно, его легче переносить, чем генератор кода, поскольку он не может выполнять оптимизацию кода из-за его ограниченного представления программного кода (он видит только одну инструкцию за раз, и вам нужна последовательность для оптимизации). Некоторые интерпретаторы чрезвычайно легко переносить, потому что они делают только минимальные предположения о наборе команд базового оборудования. В результате виртуальная машина даже проще, чем целевой ЦП.
Написание исходных текстов компилятора полностью на языке программирования, который компилятор должен переводить, делает следующий подход, более известный как начальная загрузка компилятора, возможно на целевой машине:
Сложная часть кодирования подпрограмм оптимизации выполняется с использованием языка высокого уровня вместо языка ассемблера целевого объекта.
По мнению разработчиков языка BCPL, интерпретируемый код (в случае BCPL) более компактен, чем машинный код; обычно в два раза больше. Однако интерпретируемый код работает примерно в десять раз медленнее, чем скомпилированный код на той же машине.
Разработчики языка программирования Java пытаются воспользоваться преимуществами компактности интерпретируемого кода, потому что программа Java может потребоваться передача через Интернет, прежде чем выполнение может начаться на целевой виртуальной машине Java.
Перенос также используется, когда видеоигра разработан для работы на одной платформе, будь то аркада, игровая консоль или персональный компьютер, преобразован для работы на другой платформе. С начала видеоигр до 1990-х годов «порты», в то время часто известные как «преобразования», часто были не настоящими портами, а скорее переработанными версиями игр. Однако многие видеоигры 21-го века разрабатываются с использованием программного обеспечения (часто на C ++ ), которое может выводить код для одной или нескольких консолей, а также для ПК без необходимости фактического переноса (вместо этого полагаясь на общий перенос отдельных компонентных библиотек ).
Перенести аркадные игры на домашние системы с некачественным оборудованием было сложно. В перенесенной версии Pac-man для Atari 2600 были опущены многие визуальные особенности оригинальной игры, чтобы компенсировать нехватку ROM пространство и оборудование боролись, когда на экране появилось несколько призраков, создающих эффект мерцания. Низкая производительность портированного Pac-Man упоминается некоторыми учеными как причина сбоя видеоигры в 1983 году..
Многие ранние порты страдали от серьезных проблем с качеством игрового процесса, поскольку компьютеры сильно отличались. 40>Ричард Гэрриот заявил в 1984 году на Origins Game Fair, что Origin Systems сначала разработала компьютерные игры для серии Apple II, а затем перенесла их на Commodore 64 и Atari 8-bit, потому что последние машинные спрайты и другие сложные функции сделали перенос с них на Apple «гораздо более трудным, возможно, даже невозможным». Обзоры жаловались на порты, которые пострадали от «конверсии Apple», сохранив «паршивый звук Apple и черно-бело-зелено-пурпурную графику»; после заявления Гэрриота, когда Дэн Бунтен спросил: «Люди из Atari и Commodore в аудитории, довольны ли вы переписыванием Apple?» публика кричала: «Нет!» Гэрриот ответил: «[в противном случае] версия для Apple никогда не будет готова. С точки зрения издателя, это не с деньгами».
Другие работали иначе. Ozark Softscape, например, сначала написал M.U.L.E. для Atari, потому что он предпочитал разрабатываться для самых современных компьютеров, удаляя или изменяя при необходимости функции во время портирования. Такая политика не всегда была осуществима; Бунтен заявил, что «MULE нельзя сделать для Apple», и что версии Семь городов золота, не относящиеся к Atari, уступают. Газета Compute! написала в 1986 г., при переносе с Atari на Commodore оригинал обычно был лучше. Качество последних игр улучшилось, когда в конце 1983 года разработчики начали создавать для них новое программное обеспечение, заявил журнал.
Когда игра упоминается как «идеальная аркада», это означает, что игра была перенесена из аркадная версия для другой платформы, такой как консоль или компьютер, без каких-либо существенных изменений в работе игры. Это означает, что графика, звук и игровой процесс, наряду с другими характеристиками игры (включая ошибки), соответствуют аркадной версии. Этот термин чаще всего используется профессиональными критиками и иногда, но не всегда, означает, что игра на 100% идентична. Обычно это означает, что различия могли быть незначительными (например, более длительное время загрузки), или просто порт мог быть тем, который больше всего сохранил впечатления от оригинальной игры.
«(Консольный) порт» - это игра, которая изначально была создана для консоли (такой как Wii или Xbox 360 ) до создания идентичной версии, в которую можно играть на персональный компьютер или любую другую консоль. Этот термин широко используется игровым сообществом. Процесс переноса игры с консоли на ПК часто рассматривается отрицательно из-за более высоких уровней производительности, которые компьютеры, как правило, недоиспользуются, частично из-за того, что консольное оборудование ремонтировалось на протяжении всего их запуска (игры разрабатывались для консольных спецификаций), в то время как ПК становятся более мощными по мере развития оборудования, но также из-за того, что портированные игры иногда плохо оптимизированы для ПК или переносятся лениво. Хотя в целом они схожи, могут существовать архитектурные различия, такие как использование объединенной памяти на консоли.