Как записать межплатформенную программу?

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

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

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

6
задан rigon 16 July 2010 в 11:17
поделиться

7 ответов

@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

4
ответ дан 8 December 2019 в 12:57
поделиться

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

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

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

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

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

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

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

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

1
ответ дан 8 December 2019 в 12:57
поделиться

Я бы сказал, что это сводится к следующему:

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

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

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

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

7
ответ дан 8 December 2019 в 12:57
поделиться

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

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

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

1
ответ дан 8 December 2019 в 12:57
поделиться

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

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

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

1
ответ дан 8 December 2019 в 12:57
поделиться

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

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

2
ответ дан 8 December 2019 в 12:57
поделиться

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

Я нашел книгу под названием «Кросс-платформенная разработка на 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
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: