Буценко Никита Олегович
студент Харьковского национального университета радиоэлектроники
г. Харьков
руководитель Голян Вера Владимировна
к.т.н., доцент кафедры Програмной инженерии
Харьковского национального университета радиоэлектроники
г. Харьков
Аннотация: в данной статье автор рассматривает преимущества и недостатки C++, опираясь на правила создателя С++, Бьёрна Страуструпа. Автор также приводит данные, касающиеся популярности и актуальности С++ с международных сайтов, посвященных программированию, и проводит анализ эффективности и читаемости кода, написанного на С++, решая базовые алгоритмические задачи.
Ключевые слова: C++, АЛГОРИТМЫ, БИБЛИОТЕКИ, ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ, ЯЗЫК ПРОГРАММИРОВАНИЯ
С каждым годом профессия разработчика программного обеспечения становится все более популярной и востребованной. Соответственно, у начинающих разработчиков возникает вопрос: «Каким языком программирования стоит овладеть в первую очередь?» Многие высшие учебные заведения, равно как и программисты с большим опытом работы[1], рекомендуют именно C++ как первый язык программирования. По данным TIOBE Index за февраль 2018 года, C++ занимает 3 место по популярности среди всех языков программирования[2]; по данным Stack Overflow (Developers Survey 2017) –7 место[3]. Если рассматривать обе сводки в одной плоскости, то C++ заметно уступает по популярности лишь языку прикладного программирования Java.
Прежде чем рассматривать преимущества и недостатки C++, следует ознакомиться с правилами, которые использовал Бьёрн Страуструп при проектировании данного языка[4]:
Си++:
- Разработан как универсальный язык со статическими типами данных, эффективностью и переносимостью языка Си.
- Разработан так, чтобы непосредственно и всесторонне поддерживать множество стилей программирования (процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование).
- Разработан так, чтобы давать программисту свободу выбора, даже если это даёт ему возможность выбирать неправильно.
- Разработан так, чтобы максимально сохранить совместимость с Си, тем самым делая возможным лёгкий переход от программирования на Си.
- Избегает таких особенностей, которые зависят от платформы или не являются универсальными.
- Не накладывает никакой избыточной нагрузки на программу, не использующую какие-либо возможности.
- Разработан так, чтобы не требовать слишком усложнённой среды программирования.
Первое правило явно показывает на одно из ключевых преимуществ C++ - переменная не может менять свой тип данных. Это значит, что при автодополнении интегрированная среда разработки будет предлагать исключительно те методы, которые применимы к данному типу данных. Статическая типизация также значительно уменьшает количество ошибок; многие из них исключаются уже на стадии компилирования приложения. Тем не менее, применение статической типизации влечет за собой определенные трудности с реализацией алгоритмов и читаемостью кода.
Универсальность C++ - еще одно значительное преимущество данного языка программирования. Овладев основами, разработчик сможет писать на C++ простые десктопные приложения для Windows с помощью Windows Forms, более сложные программы для Windows и Linux, игры для разных платформ (включая Windows и Android), серверную часть сайтов (back-end) и так далее.
Второе правило также следует отнести к преимуществам C++. Начинающий разработчик сможет сперва освоить процедурное программирование, а затем перейти к изучению ООП. Третье правило невозможно охарактеризовать исключительно как положительную или негативную особенность данного языка программирования. На начальном этапе основные ошибки (несовместимость методов с типом переменной, попытки привести одну и ту же переменную к другому типу данных) исключаются еще на стадии компилирования, поэтому пункт о «свободе выбора» для начинающих программистов не является действительным.
Так как автор данной статьи рассматривает преимущества и недостатки языка программирования С++ как первой платформы для начинающего разработчика, то четвертый пункт (совместимость с Си) не является существенным. Однако с приобретением опыта разработчик заметит, что некоторые функции, работающие на C, также поддерживаются и C++ (например, функции ввода/вывода на экран информации scanf() и printf(), библиотека stdio.h). Вследствие этого некоторые программисты называют С++ не иначе как «Ц с классами»[5].
Кроссплатформенность C++ является весомым преимуществом для начинающих программистов. Есть множество компиляторов и IDE, которые имеют версии для Windows, MacOS и Linux (Code::BlocksIDE предназначена для Windows и Linux, CLion – для Windows, Linux и MacOS). Разработчик может создавать приложения для разных платформ, используя «родную» для системы IDE и компилятор. QT-framework, разработанный в 1996 году, особенно упростил задачу кроссплатформенности.
Шестое правило Страуструпа говорит об эффективности программ, написанных на C++. Если функционал программы не задействуется, то она будет потреблять меньше системных ресурсов и выполняться быстрее. Для начинающих разработчиков этот пункт означает то, что приложение будет компилироваться быстрее. Это показывают независимые тесты: так, программа, высчитывающая числа Фибоначчи[6], написанная на C++ и скомпилированная через GCC, собралась за 0.014 секунд. В данном тесте C++ уступил только Си: программа на Си скомпилировалась за 0.013 секунд. C++ быстрее компилирует программы благодаря статической типизации: компилятор не тратит время на определения типа переменной, как это происходит со многими интерпретируемыми языками наподобие JavaScript, Python, PHP и так далее (к слову, алгоритм Фибоначчи выполнился за 0.689 сек, 1.109сек и 1.307 сек на JavaScript, Python 2 и PHP соответственно).
Преимущества седьмого правила выглядят весьма условными, так как сегодня множество производителей предлагают удобные IDE для разных языков программирования. Более того, тут C++ заметно уступает, например, JavaScript. Для разработки на JavaScript необходим минимальный инструментарий – блокнот и веб-обозреватель (эти приложения в большинстве операционных систем встроены изначально), в то время как для C++ необходим компилятор, который необходимо дополнительно скачивать и настраивать. В большинстве случаев начинающему разработчику придется устанавливать пакет «среда разработки + компилятор».
Несмотря на такие преимущества, как кроссплатформенность и эффективность, C++ обладает высоким порогом вхождения. Вот что говорит о данном языке программирования Бондарев В.М.: «Программы на С++ обгоняют программы на других языках, как гоночный автомобиль обгоняет обычные. Но учиться программировать на них – все равно, что учиться азам вождения, сев за руль гоночного автомобиля – дорого и долго» [7]. Так, простая операция приведения числа в строку и вывода каждой из цифр числа на консоль имеет громоздкое решение в С++:
Решение аналогичной задачи в JavaScript:
Очевидно, что код на JavaScript проще для понимания начинающего разработчика с базовым знанием английского языка, чем код на C++. Это происходит из-за статической типизации C++: в отличие от того же JavaScript, мы не можем в пределах одной переменной перевести число в строку, к тому же метод String(), принимающий один параметр в JS выглядит логичнее, чем метод itoa() в C++, принимающий три параметра.
Выводы
Все эти сложности делают С++ довольно противоречивым языком. С одной стороны, это низкоуровневый кроссплатформенный язык программирования, который еще долгое время будет актуальным из-за своей универсальности и эффективности. С другой стороны, начинающим разработчиками будет сложнее овладевать различными алгоритмами и принципами программирования на C++ именно из-за его статической типизации, ограничивающей работу с переменными. Тем не менее, начинающим разработчикам стоит начать знакомство с программированием именно с С++, так как они смогут освоить С-подобный синтаксис, а затем – парадигмы ООП, используя при этом универсальный язык программирования, который в будущем поможет им в реализации больших проектов.
Литература
1. https://www.kv.by/post/1052468-kakie-yazyki-programmirovaniya-izuchat-chtoby-nayti-rabotu-v-2018-godu
2. https://www.tiobe.com/tiobe-index/
3. https://insights.stackoverflow.com/survey/2017#technology
4. Страуструп Б. Дизайн и эволюция C++/ Страуструп Б. - М.: ДМК Пресс; Спб.: Питер, 2006. - 448 с.
5. https://habrahabr.ru/company/intel/blog/156863/
6. https://www.ibm.com/developerworks/ru/library/ManySpeed_08_1/index.htm
7. Бондарев В.М. Основы программирования.js : учеб. пособ.[Текст]/ В.М. Бондарев. – Х. : ФОП Коряк С. Ф., 2015. – 182 с.