§ 8.1. Общие сведения о языке программирования С++

Текст программы говорит о том, как, а комментарии должны объяснять, почему

Swaroop Chitlur («A Byte of Python»)
Школьный курс python
Содержание

История языка

Язык C++ (читается си-плюс-плюс) возник в начале 1980-х годов, когда сотрудник фирмы Bell Labs Бьёрн Страуструп придумал ряд усовершенствований к языку C под собственные нужды. Страуструп решил дополнить язык C возможностями, имеющимися в языке Симула. Из этого языка были позаимствованы возможности объектно-оринтированного программирования (возможность работы с классами и объектами). К 1983 году в язык были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Получившийся язык уже перестал быть просто дополненной версией классического C (“C с классами“) и был переименован в «C++». Его первый коммерческий выпуск состоялся в октябре 1985 года.

Bjarne Stroustrup – создатель языка C++

Вот как повествует историю создания C++ сам разработчик языка:


До начала официальной стандартизации язык развивался в основном силами Страуструпа в ответ на запросы программистского сообщества. Функцию стандартных описаний языка выполняли написанные Страуструпом печатные работы по C++ (описание языка, справочное руководство и так далее). Лишь в 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language». В настоящее время стандарт языка C++ разрабатывает Комитет ISO C++, который называется WG21 (официально ISO/IEC JTC1 (Объединенный технический комитет 1) / SC22 (Подкомитет 22) / WG21 (Рабочая группа 21)). WG21 был создан в 1990/91 годах и состоит из аккредитованных экспертов из стран-членов ISO/IEC JTC1/SC22, которые заинтересованы в разработке C++.
Более 20 лет С++ находится в тройке самых популярных и востребованных языков программирования. (В этом можно убедиться, посетив сайт TIOBE).
C++ продолжает развиваться, чтобы отвечать современным требованиям. Одна из групп, разрабатывающих язык C++ и направляющих комитету по стандартизации C++ предложения по его улучшению — это Boost. Последний стандарт языка вышел в 2020 году и носит наименование С++20. Следующий стандарт не заставит себя долго ждать и появится, как ожидают, в 2023 году.
Никто не обладает правами на язык C++, он является свободным.

Общая характеристика языка

C++ — компилируемый, статически типизированный язык программирования общего назначения, на котором можно создавать программы любого уровня сложности. С++ – это мультипарадигмальный язык (от слова парадигма – стиль написания компьютерных программ), включающий широкий спектр различных стилей и технологий программирования. Часто его причисляют к объектно-ориентированным языкам, но, строго говоря, это не так. В процессе работы разработчик получает абсолютную свободу в выборе инструментов для того, чтобы задача, решаемая с помощью того или иного подхода, была решена максимально эффективно. Иными словами, С++ не понуждает программиста придерживаться только одного стиля разработки программы (например, объектно-ориентированного).
Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C. Со временем, практическая совместимость между языками C и C++ постепенно будет утрачиваться, так как языки разрабатывают разные группы по стандартизации, не взаимодействующие друг с другом.
C++ повлиял на многие языки программирования, в их числе: Java, C#, PHP, Perl, D, Lua, Rust.
C++ имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. (Подробнее)
За время своего существования за языком С++ закрепились устойчивые мифы, которые легко опровергаются (см. здесь: Часть1 и Часть2)

Алфавит языка

Алфавит языка C++ составляют символы включенные в 7-битную кодировку ISO 646/ECMA-6:
space, !, ", %, &, (, ), *, +, -, ., /, 0..9, :, ;, <, =, >, ?, A..Z, _, a..z.
Тем не менее, часть символов, используемых в алфавите C++, не входит в кодовую базу этой кодировки: {, }, [, ], #, \, ^, |, ~.
Символы алфавита образуют лексемы. Лексема (англ. – token) – это минимальная единица языка, имеющая самостоятельный смысл. Лексемы – формируют базовый словарь языка, понятный компилятору.
Набор лексем представляет собой текст на языке программирования, который понятен компилятору языка. Текст программы на языке программирования называется исходным кодом (или, на жаргоне программистов, “исходником“).
Всего существует пять видов лексем:

  • Ключевые слова (keywords)
  • Идентификаторы (identifiers)
  • Литералы (literals)
  • Операции (operators)
  • Знаки пунктуации (разделители, punctuators)
Лексемы (как и слова в естественном языке) разделяются непечатаемыми (пробельными) символами (пробел, символы табуляции, перевода строки, возврат каретки, перевода страницы) и знаками пунктуации: [, ], (, ), {, }, *, ,, :, =, ;, ..., #.

Комментарии

Комментарии служат для описания и документирования исходного кода. В C++ применяются два вида комментариев: многострочный и однострочный. Например:

/* Многострочный комментарий часто используется
   для заголовков в описании исходного кода */

// Однострочный комментарий используется в пределах одной строки

В комментариях можно использовать любые, доступные в среде, символы – компилятор игнорирует содержимое закомментированного блока или строки.
Далеко не все программисты позитивно относятся к комментариям (“лучший комментарий – это его отсутствие”). Они считают, что хорошо написанный код сам говорит о том, для чего составлена данная программа и как она работает. С этим не поспоришь. Но когда текст программы должен быть задокументирован (например, по требованию заказчика), то к комментированию кода нужно отнестись достаточно серьезно.

Структура программы на языке C++

Самая простая программа на C++ может содержать следующий код:

Программа 8.1.1
int main() {
    // Это пустая программа
}
Алгоритм создания проекта в среде Code::Blocks изложен в методичке здесь.

В С++ main() называется главной функцией программы. В ней осуществляется связь всех компонентов программы в единое целое: выполняются вызовы функций, обращения к объектам библиотечных и пользовательских классов, производится инициализация, ввод и вывод данных, взаимодействие с операционной системой.
Спецификатор типа данных int (целое число) перед именем главной функции (main) означает, что эта функция возвращает числовые коды ошибок (или 0, если таковые отсутствуют). Согласно стандарту языка C++, требуется обязательно указывать тип int перед main.
Если откомпилировать и запустить эту программу, то появится консольное окно содержащее только служебную информацию. Поскольку в теле главной функции не реализован какой-либо алгоритм, то и программа не выводит никаких полезных данных.
Консольное окно (или окно консоли) операционной системы используется для организации стандартного ввода/вывода. В нем отображаются вводимые с клавиатуры команды и печатаются (выводятся в виде символов) результаты работы программ. Программы, которые используют в своей работе консольное окно (текстовую консоль) для ввода и вывода данных, называются консольными. Если работа в ОС Linux осуществляется в графическом режиме (KDE), то, в качестве консоли, применяется программа “эмулятора терминала”. В KDE – это программа Konsole. Некоторые IDE (например, Eclipse) имеют встроенную консоль.

Первая программа

Традиционно, первой программой на изучаемом языке является программа вывода на экран строки приветствия “Здравствуй, мир!”. Чтобы в консольном окне появился текст приветствия, программу необходимо дополнить следующими инструкциями и директивами:

Программа 8.1.2
#include <iostream>
using namespace std;

int main() {
    cout << "Здравствуй, мир!" << endl;
    return 0;
}

Для вывода строки нам потребуется включить (с помощью директивы #include) библиотечный класс iostream, содержащий функции ввода/вывода. Исторически так сложилось, что библиотечный класс ввода/вывода автоматически не включается в программу.

Окно эмулятора терминала Konsole и программа nano

Результат работы первой программы в консольном окне

Для вывода символьной строки необходимо использовать объект потока cout и операцию вставки “<<” (два символа “меньше”, следующих друг за другом, без пробела). Символьная строка должна быть заключена в двойные кавычки. Завершает вывод данных манипулятор endl (end line – конец строки). Конец программы обозначен инструкцией return (возврат значения). Эта инструкция является необязательной (поскольку программа, в случае её отсутствия, будет возвращать значения операционной системе не явно). Но мы возьмем за хороший навык всегда использовать эту инструкцию в конце программы. Возвращаемое значение – 0 (признак успешного завершения). Обратите внимание, что любая инструкция (предложение языка) в C++ должна заканчиваться точкой с запятой.
Объявление

using namespace std;

говорит о том, что мы будем использовать пространство имен стандартной библиотеки (STD). Это позволит сделать код более лаконичным. В противном случае, строка 5 выглядела бы следующим образом:

std::cout << "Здравствуй, мир!" << std::endl;

Для составления консольной программы можно использовать обычный plain text редактор, например, nano. Редактор nano - это консольный редактор в Fedora Linux, который умеет "подсвечивать" синтаксис программы написанной на C++. Код программы, набранный в редакторе, необходимо сохранить в файле с расширением .cpp, например, pro1.cpp. Для компиляции программы нужно ввести в командной строке команду запуска компилятора GCC так, как показано ниже. Если процесс компиляции завершился успешно, то запустить программу на выполнение можно простым вводом имени исполняемого файла в строке приглашения ввода команд:

[user@host ~]$ g++ -o pro1 pro1.cpp
[user@host ~]$ ./pro1
Здравствуй, мир!

Результат работы программы будет выведен строкой ниже.

Интегрированные среды разработки (IDE)

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

Под рефа́кторингом (англ. - refactoring) понимают перепроектирование или переработку кода, равносильное преобразование алгоритма, процесс изменения внутренней структуры программы, который позволяет облегчить понимание её работы.

Ниже, в порядке увеличения функциональных возможностей, перечислены свободно распространяемые среды разработки на C++. Этим списком, конечно, не исчерпывается все разнообразие существующих IDE, как свободных, так и коммерческих, но данное ПО (кроме QT Creator) является рекомендованным на Всероссийской предметной олимпиаде школьников по информатике. Обратите внимание, что из легковесности среды вовсе не вытекает удобство верстки программного кода. Легковесные среды предназначены для разработчиков, которые хорошо понимают особенности языка без навязчивых подсказок IDE и предупреждений дотошных анализаторов. С другой стороны, составлять небольшие программы (в несколько строк кода) гораздо удобнее и быстрее как раз в такой легковесной среде, как Geany.
Пользователи Windows должны обратить внимание на то, что данные среды поставляются без компилятора! Только для Qt Creator и Code::Blocks можно установить компилятор совместо со средой разработки. Но, как правило, это будет не самая свежая версия GCC. Последнии версии копилятора необходимо устанавливать отдельно. Для пользователей GNU/Linux этот процесс является менее трудоемким, т. к. все необходимое ПО уже находится в пакетной базе дистрибутива, включая последние версии компиляторов. Как установить компилятор GCC в ОС Windows см. здесь.

Geany

Geany - это мощный, стабильный и легкий текстовый редактор и IDE для программистов, который предоставляет большой набор полезных функций. Он написан на C/C++ c использованием графической библиотеки GTK+. Это кроссплатформенное ПО, которое работает на Linux, Windows и macOS. Geany переведен на более чем 40 языков и имеет встроенную поддержку более чем 50 языков программирования. Geany не включает в свой состав компилятор. Для создания исполняемого кода используется GNU Compiler Collection или любой другой компилятор.

Окно IDE Geany v. 1.37

Сайт Geany: https://geany.org/

Code::Blocks

Code::Blocks написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей. Поддерживает языки программирования С, С++, D и Fortran. Code::Blocks - это кроссплатформенное ПО, которое разрабатывается для Windows, Linux и Mac OS X. Поддерживает большой набор компиляторов. Можно установить версию сборки со встроенным компилятором MinGW.

Окно Code::Blocks v. 20.03

Code::Blocks является базовой средой для разработки консольных приложений курса.
Сайт Code::Blocks: https://www.codeblocks.org/

Qt Creator

Qt Creator — кроссплатформенная свободная IDE для разработки на С, С++ и QML. Разработана Trolltech для работы с фреймворком Qt. Включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием QtWidgets, так и QML.

Окно Qt Creator v. 4.14

Данная IDE является базовой средой курса для разработки как консольных приложений, так и приложений с оконным интерфейсом.
Сайт фреймворка Qt5: https://www.qt.io/

Eclipse CDT

Eclipse — свободная интегрированная среда разработки модульных кроссплатформенных приложений. Развивается и поддерживается Eclipse Foundation. Eclipse IDE for C/C++ Developers - это одна из большого количества IDE, которые разрабатываются на платформе Eclipse. Интерфейс написан на Java.

Окно Eclipse CDT v. (Eclipse Platform) 4.19

Более подробные сведения об Eclipse вы можете найти в этом разделе нашего сайта: Eclipse Platform
Сайт CDT Downloads: https://www.eclipse.org/cdt/downloads.php

Синтаксис и семантика

Синтаксис определяет правила по которым пишутся слова и составляются предложения языка. Нарушение этих правил, безусловно, приведет к ошибкам во время компиляции программы. Пока все ошибки не будут устранены, собрать программу будет невозможно. Современные IDE позволяют производить синтаксический анализ в процессе кодирования и способны предупреждать разработчика об ошибочности кода. Самый глубокий анализ кода производят анализаторы кода основанные на Clang. Возможно, для новичков такой дотошный анализ будет излишним, тогда можно ограничиться более простым анализатором Cppcheck. Но более естественный способ выявления ошибок - это синтаксический анализ, который производит компилятор, и процесс отладки. Однако, отсутствие сообщений об ошибках в процессе компиляции является необходимым, но недостаточным для правильной работы программы.
Помимо синтаксических ошибок могут существовать и семантические ошибки. Семантика определяет смысловые значения предложений языка, какой алгоритм описан текстом программы. Семантические ошибки компилятор выявить не может. Такие ошибки выявляются в процессе тестирования.

Приложение

Примеры решения задач
Вопросы
  1. Что такое лексема, перечислите все виды лексем
  2. Какие фундаментальные типы данных вы знаете?
  3. Почему C++ является мультипарадигмальным языком?
  4. Для чего нужны комментарии, какие виды комментариев используются в C++?
Темы сообщений
  • История С++
  • Критика C++. Обоснованность критики
  • Мифы о C++
  • Сравнение C++ с другими языками
  • Интегрированные среды разработки на C++
Задания А
Задания Б
Задания С
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (4 оценок, среднее: 4,00 из 5)
Загрузка...
            Следующий урок    

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.


Обсуждение закрыто.