Как написать кроссплатформенную программу? - PullRequest
6 голосов
/ 10 июля 2010

Я искал литературу по разработке кроссплатформенного программирования и не нашел ничего действительно хорошего.

Я не ищу виртуальную машину для кросс-платформенности, как это делает Java.

Есть ли какая-нибудь книга или литература по этому поводу?

Ответы [ 7 ]

7 голосов
/ 10 июля 2010

Я бы сказал, что это сводится к:

  • Не использовать нестандартные функции «стандартной библиотеки», где нестандартность зависит от того, на какие платформы вы ориентируетесь (например, POSIX-совместимые системы). Например, если вы используете C, не используйте popen(), если хотите, чтобы ваше приложение работало в системах, отличных от POSIX.
  • Убедитесь, что вы правильно обрабатываете endianess там, где он должен быть, например, при передаче данных по сети на другой компьютер, возможно, с использованием другого порядка байтов.
  • Написать только совместимый код, например, не зависит от особенностей GCC / VC / name-your-compiler.

На более практическом уровне мой совет:

  • Используйте кроссплатформенные библиотеки, которые абстрагируют нестандартную функциональность, которая вам нужна, или напишите свой код для обработки всех платформ, на которые вы ориентируетесь.
  • И, что касается вышеизложенного, держитесь подальше от непросистемных зависимостей. Например. используйте OpenGL вместо Direct3D и Qt / Gtk / что угодно вместо ваших собственных инструментов виджетов платформ.

РЕДАКТИРОВАТЬ: есть над чем подумать, например, не предполагая, что / используется в качестве разделителя пути, или делая недопустимые предположения о том, какие символы допускаются в именах файлов.

4 голосов
/ 10 июля 2010

@ Staffan и другие дали отличный совет, поэтому я не собираюсь предлагать решение - просто предложите подход.

Есть много возможных решений, и я бы сказал, что главное решение - это вы или нетхочу графический интерфейсЕсли нет, то вы, вероятно, можете использовать C. С графическим интерфейсом, использовать Java (что вам не нужно) или использовать NetBEans в качестве IDE с Qt для виджетов.

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

Установите систему непрерывной интеграции, такую ​​как Hudson, для регулярного построения всего и убедитесь, что у вас есть множество модульных тестов с автоматическим заданием (с использованием CppUnit или аналогичных) и используйтеодин и тот же тест на каждой платформе с тестами, ориентированными на проблемы переносимости.

Возможно, рассмотрим Posix или использование только Ansi C или другого языка, соответствующего стандартам.

То, как вы настроите CI, зависит от того, сколько у вас потенциальных целей.Может быть, вам нужно запустить каждый на отдельном ПК или в отдельной виртуальной машине.Если вы выбрали C или C ++, возможно, вам понравится использование GCC в Cygwin для Windows и компилятор C / C ++ по вашему выбору (нужен совет относительно хорошего бесплатного?)

См. Также:

http://www.hookatooka.com/wpc/

и, конечно же, http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-sg&q=portable+code

2 голосов
/ 17 июля 2010

Я попросил книгу, но никто не отсылал ее.

Я нашел книгу под названием «Кроссплатформенная разработка на C ++: создание приложений для Mac OS X, Linux и Windows».

Там идет ссылка на Amazon и описание для тех, кто заинтересован:

http://www.amazon.com/exec/obidos/tg/detail/-/032124642X/

   Cross-Platform Development in C++ is the definitive guide to developing 
   portable C/C++ application code that will run natively on Windows, 
   Macintosh, and Linux/Unix platforms without compromising functionality, 
   usability, or quality. 

   Long-time Mozilla and Netscape developer Syd Logan systematically 
   addresses all the technical and management challenges associated with 
   software portability from planning and design through coding, testing, 
   and deployment. Drawing on his extensive experience with cross-platform 
   development, Logan thoroughly covers issues ranging from the use of 
   native APIs to the latest strategies for portable GUI development. Along 
   the way, he demonstrates how to achieve feature parity while avoiding 
   the problems inherent to traditional cross-platform development 
   approaches. 

   This book will be an indispensable resource for every software 
   professional and technical manager who is building new cross-platform 
   software, porting existing C/C++ software, or planning software that may 
   someday require cross-platform support. 

   Build Cross-Platform Applications without Compromise

   Throughout the book, Logan illuminates his techniques with realistic 
   scenarios and extensive, downloadable code examples, including a 
   complete cross-platform GUI toolkit based on Mozilla's XUL that you can 
   download, modify, and learn from. Coverage includes 
     - Policies and procedures used by Netscape, enabling them to ship Web 
   browsers to millions of users on Windows, Mac OS, and Linux 
     - Delivering functionality and interfaces that are consistent on all 
   platforms 
     - Understanding key similarities and differences among leading 
   platform-specific GUI APIs, including Win32/.NET, Cocoa, and Gtk+ 
     - Determining when and when not to use native IDEs and how to limit 
   their impact on portability 
     - Leveraging standards-based APIs, including POSIX and STL
     - Avoiding hidden portability pitfalls associated with floating point, 
   char types, data serialization, and types in C++ 
     - Utilizing platform abstraction libraries such as the Netscape 
   Portable Runtime (NSPR) 
     - Establishing an effective cross-platform bug reporting and tracking 
   system 
     - Creating builds for multiple platforms and detecting build failures 
   across platforms when they occur 
     - Understanding the native runtime environment and its impact on 
   installation 
     - Utilizing wxWidgets to create multi-platform GUI applications from a 
   single code base 
     - Thoroughly testing application portability
     - Understanding cross-platform GUI toolkit design with Trixul
2 голосов
/ 10 июля 2010

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

Я знаю о программе, которая скомпилирована в две версии, одну для Mac и одну для Windows.Хотя большая часть кода была идентична для любой платформы, часть была специфична для хоста O / S и часто требовала модификаций и тестирования, уникальных для двух сред.Продажи составили 98% Windows, 2% Mac, но две версии по существу требовали равного времени разработки / программирования / тестирования / документации.Владельцы решили, что вместо того, чтобы тратить половину каждого будущего программиста на версию для Mac только с возвратом в 2%, они просто использовали эту версию.Их кроссплатформенные проблемы немедленно исчезли, а производительность их программистов существенно удвоилась (что порадовало клиентов Windows).

1 голос
/ 10 июля 2010

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

Это потому, что никто никогда серьезно не заботился о том, чтобы просто определить способ делать то же самое, главным образом потому, что, например, наличие DirectX10 является преимуществом перед другими операционными системами.

Я бы сказал, что довольно просто написать кроссплатформенное приложение, которое может работать на MacosX и Linux, просто потому, что вы можете воспользоваться многими вещами, которые могут работать на обеих машинах (например, X11 или GTK) и одновременно из них Unix под капотом. Обычно с некоторыми усилиями вы можете заставить свои программы работать также под Windows (возможно, с MinGW или Cygwin), даже если отсутствует совместимость некоторых функций.

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

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

(я предполагаю, что мы говорим о C / C ++ только потому, что обычно другими языками управляет всего одна группа людей, каждая из которых заботится о том, чтобы выпустить как можно больше кроссплатформенных программ)

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

Просто факт: я действительно испытывал боль при попытке перенести виртуальную машину, которую я написал из Unix (Linux / OSX), в Windows из-за функции freopen. К сожалению, Windows управляет потоками по-другому, по сравнению с другими ОС поэтому MinGW не хватало этой функции, и я должен был найти способ обойти эту проблему ..

0 голосов
/ 10 июля 2010

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

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

Если вы хотите что-то конкретное, взгляните на http://tkdocs.com, который демонстрирует инструментарий Tk, работающий на нескольких платформах и с несколькими языками (Tcl, Ruby, Perl, Python)

0 голосов
/ 10 июля 2010

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

Например, программа на C может работать как в Windows, так и в Linux, но ее следует скомпилировать с соответствующим компилятором ОС, в которой вы работаете.Запустите приложение.

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

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