2010-07-10 2 views
6

Я искал некоторую литературу о кросс-платформенном программировании, и я не нашел ничего хорошего.Как написать кросс-платформенную программу?

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

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

+2

Как вы определяете кросс-платформенный? Например, программы ANSI C могут быть скомпилированы на многих платформах. –

+3

Какие функции требуется вашей программе? Какие платформы вы хотите поддерживать? Если вы полагаетесь на функции, указанные в POSIX, ваша программа будет переноситься во многие устройства, но не может компилироваться в Windows - по крайней мере, она, вероятно, не будет, если вы не будете полагаться на подмножество POSIX, поддерживаемое окнами. Другой способ сделать вашу программу переносимой - полагаться на уровень абстракции, который заботится о конкретных вещах для вас, таких как сетевые и потоковые средства Qt. Проблема с этим подходом заключается в том, что ваша программа в лучшем случае будет переносной для систем, поддерживаемых вашим уровнем абстракции. – George

+0

Например, программа, использующая сокет. Он имеет разные реализации в Linux или Windows. – rigon

ответ

4

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

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

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

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

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

Как вы собираетесь настраивать CI, зависит от того, сколько у вас потенциальных целей. Возможно, вам нужно запускать их каждый на компьютере Sepearte или в отдельной виртуальной машине. Если вы выбрали 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

1

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

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

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

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

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

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

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

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

+1

@Jack - это не совсем так. Используя условную компиляцию на C или C++, вы можете написать программу, которая будет использовать специфичные для ОС функции и просто скомпилировать по-разному на каждой платформе. Разумеется, в этом случае усилия могут быть почти такими же, как написание двух приложений. –

+2

Да, но это не написание кросс-платформенного приложения. Это пишут два разных приложения, которые полагаются на некоторые общие (кросс-платформенные) компоненты, которые не используют расширенные функции. Условная компиляция - это способ компиляции на многих платформах без реальной кросс-платформенной программы (поскольку, как вы заявляете, это почти столько же, сколько для написания 2 приложений) – Jack

+0

Существует множество программ с открытым исходным кодом, которые компилируются в Windows и различных Unix Например, операционные системы, поэтому, например, используя autoconf, вы можете адаптировать среду таким образом, чтобы она могла скомпилировать практически любую комбинацию OS/hardware. –

0

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

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

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

7

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

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

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

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

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

0

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

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

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

+0

На самом деле вы можете выбрать следующий Photoshop в основном Python и некоторые портативные C-расширения для производительности, около 80% Adobe Lightroom и все его плагины написаны в Lua. И у Google есть версия Quake, работающая в JavaScript @ 30+ fps. –

2

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

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

2

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

Я нашел книгу под названием «Кросс-платформенная разработка на 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 
Смежные вопросы