Что такое переносимость программ

Переносимость (программное обеспечение)

Кроссплатформенное программное обеспечение — программное обеспечение, работающее более чем на одной аппаратной платформе и/или операционной системе.

Содержание

Языки программирования

Кроссплатформенными можно назвать большинство современных высокоуровневых языков программирования. Например, C, С++ и Free Pascal — кроссплатформенные языки на уровне компиляции, то есть для этих языков есть компиляторы под различные платформы. C# — кроссплатформенные языки на уровне выполнения, то есть их исполняемые файлы можно запускать на различных платформах без предварительной перекомпиляции. Perl, Tcl и кроссплатформенные интерпретируемые языки, их интерпретаторы существуют для многих платформ.

Прикладные программы

Большое количество прикладных программ также являются кроссплатформенными. Особенно это качество выражено у программ, изначально разработанных для POSIX, а также существование компилятора GCC для платформы, на которую осуществляется перенос.

Операционные системы

Современные операционные системы также часто являются кроссплатформенными. Например, операционные системы с открытым исходным кодом, например, GNU/Linux, AROS могут работать на нескольких различных платформах, чаще всего это m68k, Alpha, SPARC. Microsoft Windows может работать как на платформе x86, так и на Intel NetBSD является самой переносимой, она портирована на большинство существующих платформ.

Эмуляция

Если программа не предназначена для исполнения (запуска) на определённой платформе, но для этой платформы существует эмулятор платформы, базовой для данной программы, то программа может быть исполнена в среде эмулятора.

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

См. также

Ссылки

Полезное

Смотреть что такое «Переносимость (программное обеспечение)» в других словарях:

TrueCrypt — (Windows XP) Тип Криптография Разработчик TrueCryp … Википедия

Pro Tools — Для улучшения этой статьи желательно?: Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное. Викифицировать статью … Википедия

MPlayer — MPlayer … Википедия

GNU Coreutils — GNU Core Utilities Тип Miscellaneous Utilities Разработчик GNU Project Написана на C Операционная система Unix подобные ОС Последняя версия 8.20 (23 октября 2012) … Википедия

UNetbootin — в Ubuntu Linux Тип установщик Linux … Википедия

UNIX — Генеалогическое древо UNIX систем UNIX (читается юникс) семейство переносимых, многозадачных и многопользовательских … Википедия

OpenSSH — Тип Удалённый доступ Разработчик Проект OpenBSD Операционная система … Википедия

bash — У этого термина существуют и другие значения, см. Bash (значения). GNU Bourne Again SHell Типичная сессия в bash … Википедия

базовый стандарт — 4.2 базовый стандарт (base standard): Стандарт, относящийся к данной серии стандартов, в котором определяются и регламентируются понятия, не определенные в настоящем стандарте. Источник … Словарь-справочник терминов нормативно-технической документации

Исходный код — У этого термина существуют и другие значения, см. Исходный код (фильм). Исходный код HTML страницы со вставкой на языке JavaScript Исходный код (также исходный текст) текст компьютерной программы на каком либо языке программирования или… … Википедия

Источник

Использование программ и их переносимость

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

Для того чтобы программа могла выполняться, её нужно преобразовать понятный процессору формат или передать другому исполнителю.

Преобразование программы из исходного кода в исполняемый процессором называется трансляцией в бинарный (двоичный) код или компиляцией.

Этот процесс осуществляется специальной программой-компилятором, она, как правило, создается высококвалифицированными разработчиками ЯП или разработчиками ПО. Многократно тестируются и оптимизируются для быстрой работы.

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

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

На этапе компиляции кроме преобразования исходного кода в исполняемый происходит еще ряд оптимизаций.

Исполняемый код, полученный по итогам компиляции, может выполняться на конкретной архитектуре – совокупности процессора и ОС.

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

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

Например, непереносимы программы на ASSEMBLER, использующие команды конкретного процессора (другой процессор может эти команды частично или полностью не поддерживать).

Другие языки ограничивают переносимость, делая ее возможной только на уровне исходного кода.

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

Переносимость на уровне исходного хода ограничивает такие языки, как С/С++.

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

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

Java Virtual Machine (JVM) – основа исполняющей среды.

Java (JRE), который необходимо установить везде, где программа должна работать.

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

Эти ресурсы будут отниматься от программы.

К недостаткам виртуальной машины относят замедление вычислений из-за посредника в виде JVM(виртуальной машины).

Но описанная проблема решается за счет ряда усовершенствований, главной из которых стала технология JIT(Just In Time)- компиляция, которая предусматривает во время выполнения программы превращение отдельных её фрагментов не в байт-код, а в код исполняемый непосредственно процессором и ОС.

Также в рамках Java многие методы реализован таким образом, что она сразу же выполняются в ОС и на процессоре.

Программа, исполняемая в JVM, изолирована от ресурсов компьютера, что обеспечивает дополнительную безопасность. Есть несколько ограниченных уровней.

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

Уточненное определение JAVA:

Источник

youinf.ru

Переносимость

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

Разработка переносимого кода

Портирование требует строгого учета множества факторов, а именно:

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

Выбор языка программирования C — первый шаг в сторону уменьшения затрат на переносимость. Но есть ещё много других вещей, которые придется учитывать.

Отметим, что низкоуровневый код и код, который должен выполняться очень быстро, следует разрабатывать аппаратно зависимым и обычно на языке ассемблера.

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

При создании переносимого кода изолируйте аппаратно-зависимый и системно-зависимый код в отдельных модулях. Дозировано используйте препроцессор для облегчения переносимости. Минимизируйте аппаратно-зависимый объем кода.

МОБИЛЬНОСТЬ ПРОГРАММ НА ЯЗЫКЕ СИ

Мобильность программ — это свойство, позволяющее выполнять программы на разных ЦП, работающих под управлением разных версий ОС UNIX, с минимальными изменениями.

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

Верификатор lint

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

Верификатор lint — это хорошее сервисное средство для разработки мобильных программ. Однако не надейтесь, что ваша программа является мобильной, если верификатор lint «не имеет к ней никаких претензий», ине полагайтесь на него, если программа написана плохо, так как верификатор может пропустить некоторые немобильные конструкции. Следуйте изложенным в этом разделе рекомендациям, улучшающим стиль программ.

Зависимость от компилятора

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

Зависимость от аппаратуры

Не полагайтесь на определенный размер машинного слова.

Размер данных типа int зависит от размера машинного слова, различающегося у разных ЦП. Если вы не уверены в результате операций над целыми числами, используйте тип long, чтобы избежать проблемы переполнения.

Не гарантируется, что размер данных типа int совпадает с размером машинного слова. В языке Си определяется только, что размер данных типа short меньше или равен размеру данных типа int, который, в свою очередь, меньше или равен размеру данных типа long. Размер слова может сказаться на обработке двоичных масок.

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

Этот пример корректен для всех ЦП независимо от размера данных типа int.

Тщательно проверяйте операции сдвига

Максимальное число бит, которые могут быть сдвинуты вправо или влево, различно на разных ЦП. Если заданный в операции сдвиг превысит допустимый максимум, то результаты операции будут непредсказуемы.

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

Используйте поименованные константы

Использование в программе числовых констант, особенно когда смысл их неочевиден, является плохим стилем программирования. Числовые константы лучше определять в программе символическими именами, связанными с числовыми константами командой препроцессора #define. Такие определения легко находить и модифицировать, если ониразмещены в некоторомстандартном месте. Обычно это начало программы или файл заголовка.

Такое определение позволяет использовать поименованную константу SCREENWIDTH вместо числа 80.

Определяйте размер объекта операцией sizeof

Для определения размера некоторого объекта часто используют константы, что снижает мобильность программ. Использование операции sizeof позволяет решить эту проблему.

Такое макроопределение обеспечивает мобильный способ определения числа элементов в массиве ARRAY.

Не используйте несколько символов в одной символьной константе

Поскольку символьные константы представляются значениями типа int, определение языка Си позволяет в принципе задать символьную константу, состоящую из нескольких символов. Однако порядок размещения символов в машинном слове различен на разных ЦП.

Не полагайтесь на внутреннюю кодировку целых чисел

Большинство ЦП представляет целые числа в дополнительном коде, но некоторые — вобратном коде. Поэтому не используйте возможности, которые предоставляет дополнительный код. Например, сдвиг на 1 бит влево отрицательного числа (чтобы уменьшить его значение в два раза) не приведет к желаемому результату на ЦП с обратным двоичным кодом.

Формат чисел с плавающей точкой различен на разных ЦП

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

Не полагайтесь на определенный порядок и число байт в слове

Число байт и порядок их размещения а машинном слове различны у разных ЦП.

Следующая функция определена неправильно — на выход будет записан нулевой символ, есликакой-тобайт в слове имеет меньший адрес, чем младший байт;

В данном примере аргумент с должен описываться как имеющий тип char; в этом случае преобразование типа данных станет ненужным.

Не полагайтесь на определенное число бит в байте

Поскольку число бит в байте у разных ЦП различно, то не предполагайте, что байт всегда занимает 8 бит. Чтобы определить число бит в байте, используйте поименованную константу, содержащуюся в стандартном файле:

З а м е ч а н и е. Все системные файлы-заголовкиразмещаются в каталоге /usr/include.

Будьте осторожны с символами, имеющими знак

На некоторых ЦП символы представляются как целые значения со знаком, и при вычислении выражений данные типа char обрабатываются с учетом знака. Для повышения мобильности можно использовать явное описание типа unsigned char или преобразовывать символы перед обработкой к типу unsigned char. В других случаях надо использовать данные целого типа.

Если на данной ЦП допустимы символы со знаком, то существует опасность, что индексация символом некоторого массива приведет к выходу за его границы:

Чтобы избежать этого, опишите переменную с как имеющую тип unsigned char или индексируйте таблицу значением, преобразованным к типу unsigned char.

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

Если значение символа не может быть отрицательным, то переменная с никогда не станет равной поименованной константе EOF, которая равна-1.Библиотечная функция getchar возвращает значение типа int, поэтому с надо описать как переменную типа int.

Не комбинируйте разные поля бит

Не используйте поля бит для представления данных на внешних носителях

Поля бит можно сделать мобильными, если не объединять разные поля. Максимальный размер поля бит зависит от размера машинного слова, и поля бит не могут пересекать границу слова. Кроме того, порядок размещения полей в слове (слева направо или справа налево) зависит от типа ЦП.

Использование полей бит для описания размещения данных на внешних носителях делает программу немобильной. Для того чтобы упростить эту проблему, поместите определения полей бит в файл заголовка и укажите, что они зависят от типа ЦП.

Используйте операцию преобразования типа для указателей

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

Учитывайте выравнивание при изменении значения указателя

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

Следите за сравнением указателей, имеющих знак

Единственная константа, которую можно «безопасно» присваивать указателю, — это нуль, преобразованный к типу соответствующего указателя.

Следите за переполнением значения указателей

Арифметические преобразования указателей могут привести к переполнению или потере значимости. Такие циклические преобразования значений (от наибольшего к наименьшему или наоборот) могут возникнуть при адресации массива, расположенного в начале или в конце машинной памяти

Этот фрагмент программы показывает возможность появления потери значимости:

Если массив х расположен в начале памяти, то возможна ситуация, при которой х — 1 будет не меньше, а больше х вследствие перехода через нижнюю границу диапазона значений указателей (потери значимости).

Не полагайтесь на конкретную кодировку символов

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

Такая проверка символа с на принадлежность к строчным буквам не является мобильной. Чтобы такая проверка правильно выполнялась на других ЦП, сделайте так:

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

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

Не используйте программные трюки, зависящие от аппаратуры

Любое повышение эффективности выполнения программы, достигаемое за счет знания особенностей конкретной ЦП, обычно не оправдывает связанную с этим потерю мобильности.

Хорошо организованные программы

Программа называется хорошо организованной, если ее легко читать, модифицировать,

эксплуатировать и, следовательно,переносить на другие ЦП.

Все определения, связанные с конкретной операционной средой и конкретной ЦП, помещайте в файл заголовка.

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

С помощью этой команды в программу включается стандартный файл заголовка /usr/include/values.h, который содержит аппаратные константы.

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

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

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

Для локализации программных фрагментов, зависящих от ЦП, используйте функции, условную компиляцию и команду #define.

Функции, зависящие от конкретной ЦП, объедините в отдельный исходный файл. Если таких файлов несколько, то соберите их в отдельном каталоге.

Фрагменты исходного кода, зависящие от аппаратуры, заключайте в команды условной компиляции

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

Для локализации характеристик конкретной ЦП можно использовать макроопределения

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

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

В файле /usr/mclude/varargs.h описаны средства для мобильного определения функций с переменным числом аргументов. Например, библиотечная функция printf реализована с использованием этих средств.

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

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

Тщательно определяйте внешние имена

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

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

Используйте описание typedef для локализации определения типов данных, зависящих от ЦП

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

Этот пример показывает типичное использование определения типа в файле

Мобильность файлов данных

Для переноса файлов, содержащих двоичные данные, используйте символьный ввод-вывод.

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

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

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • Что такое переносимая программа
  • Что такое переменные среды в windows
  • что такое переменные среды в windows 10
  • Что такое переменные программирование
  • Что такое переменные окружения windows

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии