Перейти к содержимому

Почему у c кроссплатформенность чем c

  • автор:

Кроссплатформенный подход как средство унификации обучения программированию в различных операционных системах Текст научной статьи по специальности «Компьютерные и информационные науки»

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Слива М.В.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Слива М.В.

Обзор современных технологий создания RIA-приложений
обзор языка программирования Python и его библиотек
Автоматизированное проектирование пользовательских интерфейсов
Анализ современных средств для разработки мобильных приложений под ОС Android
Информационные технологии разработки электронных образовательных ресурсов
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Cross-platform approach as a means of teaching programming unification in a context of various operational systems

The article concerns the cross-platform programming technologies such as Java , Qt , GTK+. Their advantages and disadvantages analyzed. The technique of gradual learning using cross-platform approach is presented. The main points of moving from structured programming to object-oriented programming using GTK+ library are described.

Текст научной работы на тему «Кроссплатформенный подход как средство унификации обучения программированию в различных операционных системах»

М. В. Слива, канд. пед. наук, доцент Нижневартовского государственного гуманитарного университета

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

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

В последнее время все больше студентов вузов выбирают для своих компьютеров в качестве основной операционной системы (ОС) представителей семейства Linux (Debian, Ubuntu, Gentoo, CentOS и т. д.) [2]. Для этого есть несколько причин: наличие бесплатных версий ОС Linux, открытость кода ядра ОС, возможность экспериментирования с составом ОС, наличие бесплатного и открытого программного обеспечения для операционных систем семейства Linux и т. д., в том числе IT-мода (что для студентов является не последним фактором при выборе операционной системы). И в IT-сфере (как в бизнес-сообществе, так и в научных исследованиях) операционные системы семейства Linux также составляют все большую конкуренцию ОС Windows (в том числе на рынке мобильных устройств в виде ОС Android). Также не стоит забывать о Mac OS и iOS, занимающих определенную долю рынка операционных систем (причем в России — меньшую по сравнению с остальным миром, но увеличивающуюся с приростом устройств под управлением iOS). Естественно, что программы для одной операционной системы не работают под управлением другой ОС (за исключением переносимых исполнимых jar-файлов программ, созданных на языке программирования Java). Поэтому создателям программно-

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

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

На данный момент существует несколько подходов к созданию кроссплатформенных приложений. Рассмотрим их подробнее.

Подходы к кроссплатформенному программированию

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

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

Среди языков программирования в плане кроссплатформенности отдельно от всех стоит Java. Его подход состоит в том, что программы сначала транслируются в байт-код, который потом выполняется виртуальной машиной Java (JVM — Java Virtual Machine) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор [4]. То есть программы, написанные на Java, могут работать под управлением любой операционной системы на любом устройстве, если установлена виртуальная машина Java и есть все необходимые библиотеки.

Выделяютя следующие достоинства языка Java для кроссплатформенного программирования:

• это изначально объектно-ориентированный язык программирования, в котором сведено к минимуму влияние недостатков структурного подхода (но используется синтаксис языков программирования семейства С);

• поддержка java-апплетов большинством современных браузеров;

• кроссплатформенность на уровне установки виртуальной машины.

Недостатки языка Java для кроссплат-форменного программирования следующие:

• сложность изучения на начальном этапе обучения в высшем учебном заведении (1 — 2 курс) (хотя опыт преподавателей Стэн-фордского университета1 показывает, что

1 URL: http://www.stanford.edu/class/cs106a/cgi-bin/ — страница курса CS106A Стэнфордского университета.

такая возможность есть, но это достойно от- I дельной статьи); ^

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

Баланс достоинств и недостатков сделал язык программирования Java одним из самых популярных языков профессионального программирования2 (хотя это необязательно должно говорить о качестве самого языка как средства программирования, статистика отображает именно популярность). Заметим, что при этом одновременно наблюдается тенденция к постепенному спаду интереса3 к языку программирования Java, что можно связать с растущей популярностью языков C# и Objective-C. Особенно актуальным стало изучение данного языка в связи с распространением мобильных платформ (в частности, ОС Android, приложения для которой пишутся в основном на языке программирования Java [3]).

Аналогичный подход реализован для языка C# от корпорации Microsoft, который создавался после выхода языка Java. То есть существует среда выполнения .NET Runtime, которая и выполняет все программы, написанные на языке C#. На данный момент имеется несколько кроссплатформен-ных проектов (Mono4, DotGNU5), реализующих выполнение С#-программ на различных

2 URL: http://www.tiobe.com/index.php/content/ paperinfo/tpci/index.html — TIOBE Programming Community Index (индекс популярности языков программирования).

3 URL: http://www.tiobe.com/index.php/paperinfo/tpci/ Java. html — статистика изменения популярности языка программирования Java.

4 URL: http://www.mono-project.com — официальный сайт проекта Mono.

5 URL: http://dotgnu.org — официальный сайт проекта DotGNU.

платформах. Достоинства и недостатки использования языка C# для кроссплатфор-менного программирования в основном такие же, как и у Java-подхода (хотя Java является более распространенным средством кроссплатформенного программирования по сравнению с C#).

Другой подход — это использование кроссплатформенных библиотек в стандартном языке (С, С++, Perl, Python, Ruby и др.). В настоящее время существует не-| сколько библиотек, активно используемых ^ в данных целях: GTK+, Qt, wxWidgets, FLTK, § Tk. Наиболее популярны в силу различных ! обстоятельств библиотеки GTk+6 и Qt. Из-I начально они создавались для программи-<| рования в ОС Linux: GTk+ — для рабоче-! го стола Gnome (а точнее, для создания й графического редактора GIMP, бесплат! ного аналога программы Adobe Photoshop), Qt — для рабочего стола KDE. В дальней-^ шем эти библиотеки получили развитие

‘5 Существуют следующие достоинства ic подхода к кроссплатформенному програм-

к 6 URL: http://www.gtk.org — официальный сайт про-

¿с проекта Glade.

мированию с использованием кроссплат-форменных библиотек:

• используется стандартный язык программирования, новыми являются только средства, предоставляемые самой кросс-платформенной библиотекой;

• возможность использовать не только ООП, но и более простое структурное программирование (предшественник ООП).

Недостатки подхода к кроссплатфор-менному программированию с использованием кроссплатформенных библиотек следующие:

• необходимо устанавливать на базовую компьютерную платформу все содержимое используемой библиотеки для создания исходного кода, а с исполняемыми файлами готового приложения требуется устанавливать используемые средства библиотеки для целевой платформы (данный недостаток можно считать относительным, так как и в стандартном подходе к программированию все используемые библиотеки обычно переносятся с установочными файлами программы — если, конечно, они не являются стандартными для целевой платформы);

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

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

ствует даже понятие кроссбраузерности — свойство сайта отображаться и работать во всех популярных браузерах идентично. Под идентичностью здесь понимается отсутствие развалов верстки и способность отображать материал с одинаковой степенью читабельности [5]. Кроссплатформен-ными на данный момент уже можно считать технологии flash8 и java-апплетов/сервлетов [6, 7]. Поэтому еще одним подходом к созданию кроссплатформенного ПО считается веб-программирование.

Выделим достоинства веб-подхода к кроссплатформенному программированию:

• для работы созданного программного продукта в большинстве случаев достаточно программы-браузера;

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

Отметим недостатки веб-подхода к кросс-платформенному программированию:

• необходимость наличия специальной программы-браузера для работы созданного приложения (но такие программы есть во всех современных операционных системах);

• при использовании дополнительных веб-технологий (поддержка которых не поставляется вместе с браузером) требуется установка специального программного обеспечения (так называемых плагинов);

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

• проблематичность работы с графикой (либо слишком сложная реализация, особенно приложений с использованием трех-

8 URL: http://www.adobe.com/products/flash.html — официальная страница Adobe Flash Professional CS5.5.

мерной графики, хотя с появлением новых | технологий ситуация постепенно улучша- ^ ется). ^

Отдельно следует сказать о кроссплат-форменных IDE (Integrated development environment — интегрированная среда разработки — система программных средств, используемая программистами для разработки программного обеспечения [8]). Причем, если выявлять свойства, определяющие кроссплатформенность IDE, то они должны удовлетворять следующим параметрам:

• интегрированная среда разработки выглядит и действует одинаково в нескольких из основных на данный момент линиях операционных систем для персональных компьютеров: Linux, Windows, Mac OS;

• поддерживает программирование на кроссплатформенном языке программирования или позволяет использовать связку стандартный язык плюс кроссплатформен-ная библиотека;

• созданный исходный код является кроссплатформенным с учетом компиляции для целевой операционной системы.

В настоящее время можно выделить следующие кроссплатформенные IDE: Net-Beans, MonoDevelope, Qt Creator, Eclipse, IntelliJ IDEA.

Рассмотрим некоторые из них.

Qt Creator9 — кроссплатформенная IDE для работы с библиотекой Qt преимущественно на языке С++, т. е. это аналог среды разработки Visual Studio или Embarcadero RAD Studio (наследие Delphi) для создания программ с графическим интерфейсом на основе использования языка С++ с библиотекой Qt, что позволяет создавать кросс-платформенные (с учетом компиляции) приложения с использованием дизайнера интерфейсов. Основные достоинства среды разработки Qt Creator:

9 URL: http://qt.nokia.com — официальная страница

• она выглядит и действует одинаково во всех трех основных на данный момент линиях операционных систем для персональных компьютеров: Linux, Windows, Mac OS;

• поддерживает разработку приложений для мобильных устройств (ОС Symbian, MeeGo);

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

• совместим с QML10 — языком декла-| ративного описания интерфейсов, кото-^ рый используется в связке с библиотекой § Qt и С++ [14];

1 ровать и запустить там, и то же самое — для

¡1 ной разработки приложения в разных опе-

| рационных системах (т. е. один программист

Ц делает свой модуль в операционной систе-

|| ме Linux, другой — в ОС Windows, третий —

§ в Mac OS, далее все модули собираются

| в любой операционной системе и готовое приложение опять-таки можно компилиро-

g NetBeans11 — кроссплатформенная сво-

■ц бодная IDE для программирования на языках Java, JavaFX, Ruby, Python, PHP, JavaScript,

§ C++, Ada и ряде других. Из этого описания

Ц следует одно из достоинств NetBeans — количество поддерживаемых языков (расши-

& 10 URL: http://doc.trolltech.com/4.7-snapshot/ qdeclarativeintroduction.html — Introduction to the QML g Language (Введение в язык QML). u ii

о 11 URL: http://netbeans.org — официальная страница ¿с проекта NetBeans.

если в качестве кроссплатформенного инструментария выбран язык Java. Сама интегрированная среда разработки NetBeans написана также на языке Java [9].

Eclipse12 — свободная интегрированная среда разработки модульных кроссплат-форменных приложений. В своем назначении похожа на NetBeans (создавалась для программирования на языке Java, сама написана на Java, поэтому, как и NetBeans, естественно подходит для кроссплатфор-менного программирования с использованием Java). Эта среда является очень популярной благодаря возможности расширения с помощью плагинов, коих написано очень много (собственно, в этом Eclipse соревнуется с NetBeans, равно как и в звании лучшей среды программирования на языке Java) [10].

Кроссплатформенный подход в обучении программированию

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

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

Этап I: структурный. Изучаются основы языка С (изначально кроссплатформенного по определению), после чего возможно приступить к изучению использования кросс-

12 URL: http://www.eclipse.org — официальная страница проекта Eclipse.

i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

платформенной библиотеки GTk+, с примерами как для Linux, так и для Windows (все отличия будут, в основном, в компиляции исходного кода). При этом использование неявной работы с объектами подготавливает обучаемых к объектно-ориентированному подходу в программировании [1]. Например, проанализируем простое приложение, написанное на языке С с использованием библиотеки GTK+:

int main (int argc, char *argv[])

// объявление переменной-указателя // типа GtkWidget gtk_init(&argc, &argv); // инициализация библиотеки GTK+ //создание окна

window = gtk_window_new(GTK_WINDOW_ TOPLEVEL);

//установка заголовка окна gtk_window_set_title(GTK_WINDOW (window),»1″); gtk_widget_show(window); //делаем окно видимым gtk_main();

// передаем управление GTK+ return 0;

Данная программа создает простое окно с заголовком, как показано на рис. 1.

Рис. 1. Вид простого окна, созданного с помощью GTK+

В рассмотренном примере неявно используется создание указателя на объект

window типа GtkWidget, но обращение к не- | му происходит обычным для С образом че- ^ рез функции, которым в качестве параметра ^ передается имя нужного объекта.

Если бы программирование велось с применением объектно-ориентированного подхода, то те же самые действия производились бы с помощью свойств и методов класса GtkWidget. Но в данном примере студенту, обучающемуся по специальности «Программное обеспечение вычислительной техники и автоматизированных систем» или «Прикладная математика», хватило бы тех знаний языка С, которые он получил на первом курсе (в ходе изучения таких дисциплин, как, например, «Программирование на ЯВУ» или «Алгоритмические языки и программирование», соответственно для выше обозначенных специальностей).

Также на этом этапе использование редактора интерфейсов Glade поможет освоить принцип WYSIWYG (What You See is What You Get — «что видишь, то и получишь» — принцип функционирования современных IDE со встроенными редакторами интерфейсов), который будет использоваться на дальнейших этапах изучения программирования (хотя можно создавать современные программы и без редакторов интерфейсов) [11].

Особое место на данном этапе следует уделить принципу соединения сигналов и слотов (аналог события и обработчика события), так как этот принцип используется и на следующих этапах (и не только при использовании библиотеки GTK+ — библиотека Qt также использует этот принцип). Сигнал (в терминологии GTk+ и Qt) — аналог события в терминологии программирования для операционной системы Windows, т. е. его порождает объект, на который воздействует пользователь (например, при щелчке левой кнопкой мыши на объекте в окне). Слот (или функция обратного вызова) — функция, которая соединяется с соответствующим сигналом конкретного объекта и вызывается каждый раз при срабатывании этого сигна-

Топ-5 языков и фреймворков для кроссплатформенной разработки — рейтинг Dice

За последние несколько лет многие компании и отдельные программисты пытались создать идеальные инструменты для кроссплатформенной разработки. Благодаря их усилиям стало немного проще использовать один и тот же код на разных платформах. О лучших из них в блоге на Dice рассказал Analyst Developer Дэвид Болтон.

Професійний курс від mate.academy: Python Вечірній.
Поглиблене вивчення Python.

Методология исследования

При анализе Дэвид Болтон учитывал возможность того или иного инструмента поддерживать следующие платформы:

    десктоп (Windows, MacOS и Linux);

Захоплюючий курс від laba: HR-менеджер.
Розвивайте персонал і підтримуйте бізнес.

Лучшие инструменты для кроссплатформенной разработки

Flutter — 79/100

Flutter подходит для всех вышеперечисленных платформ, кроме веб-сайтов. Flutter для Windows появился всего несколько месяцев назад, а рабочие столы Flutter для Mac OS/Linux все еще находятся в бета-версии; для IoT и автомобилей пока еще рано, но в BMW уже работает команда Flutter/Dart из 300 человек, а Toyota использует его для разработки информационно-развлекательных систем. Flutter отлично сочетается с CarPlay (iOS), начиная с iOS 14, по крайней мере, в теории.

  • 20 для настольных систем (по 5 для Linux и Mac OS);
  • 0 для веб-сайтов;
  • 10 для веб-приложений;
  • 20 для мобильных;
  • 20 для IoT/Automobile;

Ефективний курс від skvot: Основи 3D-моделювання в ZBrush.
Звільніть свою творчість.

C# — 71 из 100

На C# кроссплатформенная разработка кажется менее цельной, это, скорее, куча технологий, собранных вместе. С разработкой для десктопов, веб-сайтами и веб-приложениями все хорошо, а разработка мобильных приложений еще хромает. По мнению Дэвида, использование XAML в настольном WPF и Xamarin Forms/Maui кажется ошибкой. К тому же, у Xamarin крутая и слишком сложная кривая обучения.

    30 для настольных ПК;

Haxe — 70 из 100

Язык программирования Haxe существует с 2005 года, но не так широко известен. Он даже не входит в список 50 лучших по версии TIOBE. Haxe имеет открытый исходный код, а код, написанный на нем, может быть скомпилирован в JavaScript, C++, Java, JVM, PHP, C#, Python, Lua и Node.js. Изначально он поддерживал Flash и до сих пор поддерживает платформу OpenFl.

Есть ряд компаний , которые используют Haxe, вероятно, из-за его возможностей Flash.

Освітній курс від laba: Клієнтський сервіс.
Залучайте та зберігайте клієнтів.

  • 30 для настольных компьютеров;
  • 10 для мобильных устройств;
  • 20 для веб-сайтов и приложений;

Java — 45 из 100

Когда-то Java была очень популярна на десктопных компьютерах и в вебе, но, по данным w3techs, сейчас только 4% всех веб-сайтов работают на Java.

Использование Java на настольных компьютерах сокращалось в течение многих лет, а на смартфонах технология ограничена Android, где испытывает давление со стороны Kotlin.

  • 15 баллов для десктопных систем;
  • пять баллов для мобильных;
  • пять баллов для веб-сайтов и приложений;
  • 10 баллов для IoT;
  • 10 баллов для кросс-платформы.

C++ — 43 из 100

C и C++ были первыми кроссплатформенными языками, но не попали в веб и мобильный мир.

Писать на C++ для десктопной разработки трудно. Язык пришел в упадок примерно в начале 2000-х, хотя есть несколько старых приложений, таких как MS Office, Adobe Creative Suite, и различные браузеры, написанные на нем. Сильные стороны C++ — в разработке операционных систем, компиляторов, движков баз данных, игровых движков и серверов.

  • 30 для настольных компьютеров;
  • 1 для мобильных;
  • 1 для веб-сайтов и приложений;
  • 10 для IoT;
  • 1 из 10 для кросс-платформы.

Заключение

Нет идеального языка программирования, поддерживающего все платформы, но Flutter, C# и Haxe — одни из лучших.

Что не даёт на C++ писать кроссплатформенные приложения?

Скажите пожалуйста, что не даёт легко писать кроссплатформенные приложения на C++, изза как следствие их так мало редакций под разные операционные системы, вроде ведь при компиляции линкер добавляет к коду указанный загрузчик, неужели трудно откомпилировать под разные платформы, или код для разных ОС както принципиально друг от друга особым образом отличается?

P.S. в институт не посчастливилось пойти как счастливчикам, по этому приходится спрашивать в интернете (что конечно следовало бы делать там), как все нормальные люди. Может это недостаток подключаемых библиотек, какието API, разные переменные области хранения данных, может конструкции языка не предназначены для этого и всё такое. Или нельзя дать однозначного ответа на этот вопрос и он подлежит немедленному удалению?

  • Вопрос задан более трёх лет назад
  • 4043 просмотра

Комментировать
Решения вопроса 8
Евгений Шатунов @MarkusD Куратор тега C++
все время мелю чепуху 🙂

Да, как бы, ничего не мешает писать один С++ код для множества платформ. Почти весь мой трудовой стаж связан именно с разработкой кроссплатформенных игр. Я работал с несколькими (самодельными и не очень) движками и имею свое собственное детище, прекрасно и однозначно собирающееся на 5 целевых платформ (Win, Mac, Linux, ios, Android), к которым без труда можно добавить и консоли, и новые платформы.

Нет, вру, не без труда. Попотеть над слоем абстракции придется. Но попотеть придется только над ним, все остальное заведется само, т.к. изначально написано в стандарте C++, без расширений под конкретные компиляторы, и с применением ряда очень важных для кроссплатформенности подходов.

Кроссплатформенность подразумевает решение ряда вопросов, которые и выливаются в слой абстракции над операционной системой. Эти вопросы, зачастую, решать никто не хочет. Несколько раз встречал такое сам и еще мне рассказывали о том, как тот или иной движок сперва был только под конкретную ###, а потом решили портировать на @@@. Оказалось, что компилятор, которым всегда и собирали движок, нашпигован расширениями языка, которые конечно же все пользовали на 100%, и при смене компилятора ни один файл исходников не остался без доброй сотни ошибок. Т.е. переписывать надо было ВСЁ.

Mercury13 хорошо рассказал про Unicode пути к файлам. Drakonoved правильно подметил про разделители путей к файлам. Максим Гришин очень хорошо напомнил про порядок следования байт. Это все и есть часть этого ряда вопросов.
У каждой платформы есть свой API, которого не будет на другой платформе. Но на другой платформе будет свой API, со своими именами и схожей функциональностью. И работу с API надо абстрагировать от универсального кода.
Еще, на одной платформе у тебя может быть разомкнутый главный цикл обработки сообщений (Win), а на другой — замкнутый (Android). Надо подстраиваться. GUI везде разный, надо подстраиваться. Сама структура приложения на одной платформе может быть монолитной, а на другой — композиционной. Графические и звуковые API могут быть и кроссплатформенными, однако простоты использования это им не прибавляет. Инициализация все равно будет платформозависимой.
На самом деле даже в рамках работы на одной платформе надо соблюдать ряд правил, чтобы иметь возможность из одного кода получать и 32-битное приложение, и 64-битное тоже. Об этом неплохо написано на сайте разработчиков PVS-Studio.

И все это решается. От части — с помощью архитектурных приемов. Один из таких я уже показывал в другом своем ответе.
И еще эти вопросы можно не решать.
ДубльГИС, например, уже давно работает на базе Qt, что сильно упростило им кроссплатформенную жизнь. Qt решает ряд проблем кроссплатформенности.

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

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Шикуть Алла Васильевна

Статья посвящена вопросам переносимости кода в приложениях на языке С/С++. Рассмотрены основные проблемные вопросы, связанные с переносимостью кода на другую платформу , а также некоторые наиболее широко используемые способы и пути повышения переносимости, в том числе, путем использования кроссплатформенного программного обеспечения . Особое внимание уделено использованию в приложениях кроссплатформенного графического интерфейса . Рассмотрена возможность создания графического интерфейса с помощью кроссплатформенной библиотеки GTK+ в среде свободного программирования QT creator.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Шикуть Алла Васильевна

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

Кроссплатформенный инструментарий разработки программных продуктов
Изучение и оценка походов к разработке графического интерфейса пользователя
Методы обеспечения переносимости по
Методы профилирования и оптимизации кода для процессоров семейства Blackfin
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

On issue of code portability and some possibilities of using cross-platform software

Article is dedicated to questions of the transference of the code in the applications in the language C/C++. Are examined the basic problematic questions, connected with the transference of the code to another platform, and also some most widely utilized methods and ways of increasing the transference, including by the way of using krossplatform software. Special attention is given to use in the applications of the krossplatform graphic interface. Is examined the possibility of designing ofgraphic interface with the aid of the krossplatform library GTK+ on Wednesday of the free programming QT of creator. Is examined the possibility of use an example of the creation of graphic interface with the aid of the krossplatform library GTK+ on Wednesday of the free programming QT of creator.

Текст научной работы на тему «К вопросу о переносимости кода и некоторых возможностях использования кроссплатформенного программного обеспечения»

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

© А.В. Шикуть МГТУ им. Н.Э. Баумана, Москва, 105005, Россия

Статья посвящена вопросам переносимости кода в приложениях на языке С/С++. Рассмотрены основные проблемные вопросы, связанные с переносимостью кода на другую платформу, а также некоторые наиболее широко используемые способы и пути повышения переносимости, в том числе, путем использования кроссплатформенного программного обеспечения. Особое внимание уделено использованию в приложениях кроссплатформенного графического интерфейса. Рассмотрена возможность создания графического интерфейса с помощью кроссплатформенной библиотеки GTK+ в среде свободного программирования QT creator.

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

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

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

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

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

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

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

Один из путей повышения переносимости программы заключается в том, чтобы сделать параметры независимыми от системы или процессора путем использования макроса #ёе^гпе [1]. Это позволит сделать параметры независимыми от операционной системы или от процессора. С помощью #ёе^гпе можно определять данные, которые могут изменяться при переносе программы, например, размер буфера, используемого при обращении к диску, или специальные команды при распределении памяти БеГте-определения упрощают выполнение всей работы, так как при этом значения таких данных необходимо изменить только один раз и в одном месте, а не во всей программе.

Кроме того, если надо получить переносимый код, не следует ориентироваться на ожидаемые размеры данных. При этом стоит учитывать различия между 16- и 32-разрядной средой разработки. Известно, что размер слова в 16-разрядном процессоре равен 16 бит = = 2 байта, а в 32-разрядном — 32 бита = 4 байта. Размер слова часто совпадает с размером данных типа int. Код, созданный в предположении, что переменные типа int являются, например, 16-разрядными, не будет корректно работать после переноса его в 32-разрядную среду. Чтобы избежать жесткой привязки к размеру типа, следует вначале определить размер типа в байтах с помощью оператора sizeof().

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

Для того чтобы создать программу под разные платформы, в общем случае требуется набор компиляторов (и компоновщиков) под разные платформы, каждый из которых способен компилировать (и компоновать) под платформу, на которую он установлен, а также набор библиотек под разные платформы. При этом для выбора компилируемого кода можно использовать директивы условной компиляции. Так, например, при использовании компилятора С++ из GCC можно использовать Common Predefined Macros _GNUG_, который, в свою очередь, можно применять для выбора компилируемого кода на этапе работы препроцессора:

. код для компилятора GCC .

..код для компилятора MSVS.

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

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

Для получения объектного кода программы программистами используются трансляторы, которые, в свою очередь, могут быть ком-

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

Компилятор GCC (GNU Compiler Collection) — это кроссплат-форменный, свободно распространяемый набор компиляторов, в который входит в том числе и компилятор языка С++ — g++ [2]. GCC включает в себя возможности компоновщика и позволяет создавать программы под несколько десятков аппаратных платформ и под множество операционных систем, включая GNU/Linux, MS Windows, Mac OC и BSD.

Известны кроссплатформенные интерпретируемые языки, интерпретаторы которых существуют для многих платформ. Примерами интерпретируемых языков являются ActionScript, Perl, Python, Ruby, PHP, MathCad.

Некоторые языки, например, Java и С#, находятся между компилируемыми и интерпретируемыми [3]. В таком случае сначала программа компилируется не в машинный код, а в машинно-независимый код низкого уровня, байт-код; затем байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime. Среды исполнения Java Virtual Machine и .NET также являются кроссплатформенными, а программы, написанные на Java и С#, могут быть запущены под разными ОС без предварительной перекомпиляции.

Виртуальные машины также можно запускать под разные платформы. В таком случае программы будут являться кроссплат-форменными. Таковыми можно назвать большинство современных языков программирования. Например, С, С++ и Free Pascal — кроссплатформенные языки на уровне компиляции, т.е. для этих языков имеются компиляторы под различные платформы. Не менее важным для кроссплатформенности являются стандартизованные библиотеки времени выполнения. Так, например, стандартом является библиотека языка С. Из крупных кроссплатформенных библиотек следует назвать Qt, GTK+, STL, FLTK, Boost, SDL, OpenAl, OpenCl.

Использование кроссплатформенного пользовательского интерфейса. Особого внимания заслуживает кроссплатформенный пользовательский интерфейс. Дело в том, что на разных ОС стан-

дартные элементы интерфейса имеют разные размеры. Именно поэтому позиционирование элементов интерфейса требует особого подхода [4]. При этом существует несколько подходов.

1. Единый стиль, общий для всех ОС. Программы выглядят одинаково под всеми ОС. Так работают интерфейсные библиотеки Java. При этом можно жестко расставлять элементы управления, наподобие Delphi; имеет место оригинальный стиль. Но системе приходится иметь свои экранные шрифты, а стиль отличается от стиля ОС.

2. Самоадаптирующийся интерфейс, подстраивающий сетку под реальные размеры элементов управления. Так работают интерфейсные библиотеки wxWidgets. При этом используется стандартный очень быстрый стиль ОС под Windows XP, Vista. Но для того, чтобы собрать самоадаптирующуюся сетку, требуется квалифицированный программист, а плотная компоновка затруднена.

3. Гибридный подход реализации, наподобие GTK+. При этом шрифты можно брать из системы, а не свои. Но в этом случае имеют место все недостатки первых двух подходов. Стиль отличается от стиля ОС, а плотная компоновка затруднена.

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

Большое количество прикладных программ также являются крос-сплатформенными, особенно те программы, которые изначально разрабатывались для Unix-подобных операционных систем. Важным условием их переносимости на другие платформы является использование компилятора GCC для платформы, на которую осуществляется перенос. GNU Compiler Collection представляет собой набор компиляторов для различных языков программирования [2]. При использовании GCC для компиляции кода под разные платформы применяется один и тот же синтаксический анализатор.

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

Так или иначе, основными препятствиями на пути обеспечения полной кроссплатформенности остаются средства работы с динамическими библиотеками, связанные с .dll.

Использование графического интерфейса. Рассмотрим некоторые особенности создания графического интерфейса с помощью кроссплатформенной среды GTK+ [5].

Кроссплатформенная среда GTK+ (сокращение от GIMP ToolKit) представляет собой библиотеку функций графического интерфейса, так называемых виджетов (Widget). GTK+ написана на языке С и предназначена для работы в операционной системе GNU/Linux, Mac OS X, других Unix-подобных системах, а также в операционной среде Windows. Наряду с Qt, GTK+ является одной из наиболее популярных на сегодняшний день библиотек для X Window System. Изначально среда GTK+ являлась частью графического редактора GIMP, впоследствии развилась в отдельный самостоятельный проект и приобрела значительную популярность. GTK+ представляет собой свободное программное обеспечение и позволяет создавать как свободное, так и проприетарное программное обеспечение. Кроме того, GTK+ является официальной библиотекой для создания графического интерфейса проекта GNU. Несмотря на то, что GTK+ написана на языке С, она является объектно-ориентированной средой и позволяет легко создавать интерфейсы для других языков программирования таких как Ada, C, C++, C# и других языков программирования платформы .NET, а также Fortran, FreeBASIC, Free Pascal, Java, JavaScript, PureBasic, Python, Smalltalk.

Рассмотрим некоторые особенности создания приложений на языке С++ с использованием графического интерфейса кроссплат-форменной библиотеки GTK+ в среде разработки Qt Creator и компилятора GCC. Для решения задачи преобразования матриц организуем обработку событий взаимосвязанных объектов с помощью системы управления событиями. При этом для реализации событий используются сигналы (signal) и слоты (slot) [5].

Сигнал генерируется в ответ на некоторое событие и несет в себе информацию об этом событии

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

К сигналам и слотам предъявляются следующие требования:

1) сигналы ничего не должны знать о слотах, в которые они отправляются;

2) сигналы несут в себе некоторые обобщенные данные;

3) слот должен знать, какие данные он хочет получить от сигнала;

4) слот не должен знать, кто отправил сигнал;

5) допускаются множественные соединения (сигнал может быть присоединен к разным слотам, и к одному слоту может быть подсоединено несколько сигналов);

6) сигналы и слоты должны иметь свои имена.

С точки зрения разработчика, система сигнал/слот состоит из трех частей:

3) менеджер соединений.

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

Самая простая часть в реализации — сигналы. Учитывая предоставляемые требования, реализация сигнала для рассматриваемого случая может иметь вид

void on spnMatrix1NRow valueChanged(int nrow); void on spnMatrix1NCol valueChanged(int ncol); void on spnMatrix2NRow valueChanged(int nrow); void on spnMatrix2NCol valueChanged(int ncol); void setStretch(QTableWidget *table); void setCentered(QTableWidget *table); void fillZero(QTableWidget *table); void makeGood(QTableWidget *table); void on btnTranspose clicked();

qreal value(QTableWidget *table, int I, int j);

Менеджер сигналов должен реализовывать набор базовой функциональности [5].

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

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

3. Соединение и рассоединение сигнала и слота (connect/ disconnect) необходимы, чтобы задать соответствие слота и сигнала; при этом соединение слота сводится к одной вставке в SignalMap. А его отсоединение — задача более сложная, требует удалить из SignalMap все записи для указанного сигнала;

4. Посылка сигнала — такой метод, который должен обеспечивать поиск слота и отправку ему сигнала. Также важно иметь воз-

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

5. Определенный метод посылки сигнала по указанному адресу. При этом получить данный сигнал должен только указанный слот.

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

Заключение. Таким образом, рассмотрены основные проблемные вопросы, связанные с переносимостью кода на другую платформу, а также некоторые наиболее широко используемые способы и пути повышения переносимости, в том числе путем использования кроссплатформенного программного обеспечения. Показано, что с помощью кроссплатформенной библиотеки GTK+ с большим успехом может быть создан графический интерфейс приложения на языке С++. На практике при использовании ее в лабораторных работах библиотека показала себя быстрой в работе и легко переносимой на разные платформы. Делать интерфейсы пользователя достаточно легко, особенно при использовании дизайнера формы.

[1] Шилдт Герберт. Полный справочник по С. Москва, Издательский дом «Вильямс», 2005, 704 с.

[2] Bertrand Meyer. Approaches to portability. JOOP (Journal of Object-Oriented Programming), vol. 11, N б, July-August 1998, pp. 93-95.

[3] Tanenbaum A.S. Structured computer organization 5th Print. Amazon Prentice Hall, 2005, 800 p.

[4] Hook B. Write portable code: an introduction to developing software for multiple platforms. No Starch Press, 2005, 248 p.

[5] Переносимость. alice.pnzgu.ru/~dvn/uproc/books/site_tarasov/c15_port.html

Статья поступила в редакцию 10.0б.2013

Ссылку на эту статью просим оформлять следующим образом:

Шикуть А.В. К вопросу о переносимости кода и некоторых возможностях использования кроссплатформенного программного обеспечения. Инженерный журнал: наука и инновации, 2013, вып. б. URL: http://engj ournal.ru/catalog/it/hidden/817.html

Шикуть Алла Васильевна — канд. техн. наук, доцент кафедры «Программное обеспечение ЭВМ и информационные технологии» МГТУ им. Н.Э. Баумана. Автор около 10 научных работ. Область научных интересов: информатика, программирование, переносимость кода. е-mail: alla.shikut@rambler.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *