Переносимость программы - PullRequest
       1

Переносимость программы

15 голосов
/ 19 августа 2010

Как сделать так, чтобы моя программа была полностью переносимой?

Ответы [ 12 ]

22 голосов
/ 19 августа 2010

Непрерывная интеграция на всех целевых платформах.

13 голосов
/ 20 августа 2010

1.Тест

Это необходимое, но не достаточное условие для правильной работы.Чтобы проверить переносимость, вам понадобятся несколько платформ и компиляторов.

2.Пишите в стандарт, а не в свою платформу разработки.

Это значит, что делать что-то можно только в том случае, если стандарт говорит, что вы можете это сделать.Ожидайте определенного результата только в том случае, если в стандарте указано, что вы можете этого ожидать.Используйте библиотеку или API только в том случае, если стандарт говорит, что он существует.Стандарт доступен здесь (среди других мест):

http://openassist.googlecode.com/files/C%2B%2B%20Standard%20-%20ANSI%20ISO%20IEC%2014882%202003.pdf

Помогает, если вы предполагаете, что:

  • CHAR_BIT равно 9.
  • sizeof (int) равен 5, а int является 37-битным типом.Или 16-битный тип.
  • базовый набор символов - EBCDIC.
  • Эпок начал в 1721 году.
  • time_t равен double

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

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

Это единственный практический способ дать себе разумный шанс достичь (1).

4.Поймите, что «настоящие компиляторы» не могут правильно или полностью реализовать стандарт, и сделайте некоторые уступки этому факту.

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

5.Поймите, что стандарт C ++ обеспечивает довольно ограниченную среду программирования

В стандарте C ++ некоторые вещи не переносимы, такие как рисование графики на экране, поскольку в стандарте C ++ нет графики или API GUI.Так что не существует такого понятия, как «полностью переносимая» программа с графическим интерфейсом, написанная на C ++.Таким образом, вам может понадобиться или не потребоваться пересмотреть свою цель, в зависимости от того, что ваша программа должна делать.

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

Все это тоже можно предпринятьдалеко, конечно.Вы, вероятно, на самом деле захотите предположить, что CHAR_BIT равно 8 (в противном случае чтение файлов - это безумие), и, возможно, даже полагаться на графический интерфейс, такой как Qt.Но вы сказали «полностью переносимый», и одна из главных вещей, которые вам нужно сделать для написания переносимых программ, - это обычно выяснить, насколько далеко вы готовы пойти на компромисс с «полностью».

6.Утвердите, что вы предполагаете

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

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

12 голосов
/ 19 августа 2010

Ваш вопрос:

Как сделать так, чтобы моя программа была полностью переносимой?

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

В процессе параллельной разработки и тестирования на различныхплатформы или среды, каждый из нас находит свою сумку трюков и исследует свою долю подводных камней.В одном комментарии вы сказали, что работаете в системе Windows.Это отлично.Попробуйте заставить вашу программу работать с компилятором Visual Studio (и окружением).Затем установите CygWin с пакетом компиляторов GCC 4.x .Установите Среда Netbeans IDE & C ++ и создайте проект на основе тех же источников.Netbeans будет использовать Cygwin GCC 4.x.Если ваша скомпилированная программа работает с обоими наборами инструментов, вы, вероятно, освоили около 90% реальных проблем с переносимостью.

С уважением

rbo

10 голосов
/ 19 августа 2010

Избегайте платформенно-зависимых библиотек.

8 голосов
/ 19 августа 2010
  • Обеспечить соответствие стандартам. По крайней мере, общее подмножество стандарта, которое реализуется поставщиками на всех платформах, на которых вы собираетесь развертывать приложение.

  • Выделение отдельных частей платформы из независимых от платформы. Как правило, нижний слой или два должны иметь дело с платформой.

  • Будьте в курсе изменений:

    • API-интерфейсы платформы / ОС
    • Цепочки для инструментов
    • Особенности языка
  • Тест, Развертывание. Промыть и повторить.

4 голосов
/ 19 августа 2010

Модульное тестирование, на каждой платформе, во время разработки

3 голосов
/ 20 августа 2010

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

3 голосов
/ 19 августа 2010

Разработка в самой строгой среде компиляции. Используйте наименьший набор функций из C ++. Разделите зависящие от платформы части кода в отдельные файлы. Разработайте среду конфигурации (make) для каждой платформы как часть программного пакета.

2 голосов
/ 19 августа 2010

невозможно. Что происходит, когда я пишу свою операционную систему со странным компилятором C?

Тем не менее, чтобы быть портативным, вам нужно:

  • Избегайте Win32
  • Избегайте POSIX (что раздражает ... Вы можете просто использовать Cygwin для поддержки Windows)
  • Избегайте какой-либо платформы для конкретной библиотеки. Это обычно ограничивает вас в графике wxWindows, GTK и QT.
  • TEST. Убедитесь, что это работает.
  • Не предполагайте ничего. Windows странная и использует \ r \ n, так что будьте осторожны с этим.
  • Я думаю, что Visual C ++ в Windows выдает предупреждения о «небезопасных функциях c» и просит использовать «безопасные», которые не являются стандартными. Не поддавайтесь на попытки Microsoft монополизировать вашу программу.

Некоторые вещи помогут:

  • Autoconf позволит любой приличной системе (т.е. системе с оболочкой) обнаруживать общие проблемы переносимости и устанавливать правильные заголовки
  • Cmake может сделать это также, но только на платформах, на которых доступен сам Cmake
2 голосов
/ 19 августа 2010

Было бы неплохо начать использовать только те библиотеки, которые существуют на всех целевых платформах.

...