Изучение нового языка программирования — непростая задача. Конечно, вы можете прочитать несколько статей за день или заблудиться в аду учебных пособий и быть уверенным, что усвоили концепции, но есть вероятность, что эта новая информация не приживется. Основатель C++ Бьерн Страуструп приводит прекрасный пример в своей книге «Путешествие по C++».

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

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

Во-первых, я хочу начать с темы, которую я изучал не в колледже, а в свой первый рабочий день. Процесс компиляции. Я не изучал эту тему, потому что в школе мы работали в IDE, которые занимались компиляцией наших программ на C++. Поскольку C++ является компилируемым языком, мы, как разработчики, должны понимать, как работает компиляция, чтобы создавать наши программы, а не полагаться на IDE. Чтобы программа C++ могла работать, исходный код (.cpp) должен быть обработан компилятором, который вернет объектные файлы (.o), которые затем будут объединены с компоновщиком для создания окончательной исполняемой программы. Чтобы лучше понять это, давайте визуализируем это с помощью блок-схемы.

Чтобы упростить этот процесс, мы используем Makefiles в качестве инструмента для этого руководства. В этой статье не объясняется, как создать Makefile, но вы можете ознакомиться с другой моей статьей по ссылке здесь, в которой объясняется, как написать свой первый Makefile для работы с проектами C/C++.

C++ — это язык программирования со статической типизацией. Это означает, что любой объект, значение, имя и выражение должны быть известны компилятору в момент его выполнения. Давайте напишем нашу первую программу «Hello World».

Начните с создания исходного файла C++ и назовите его как хотите. Я назову свой «helloworld.cpp» и добавлю следующее:

#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}

Первая строка нашей программы дает указание компилятору включить объявления стандартной библиотеки ввода/вывода из iostream. Каждая программа на C++ должна иметь ровно одну глобальную функцию с именем main(). Мы можем создать основную функцию для нашей программы, определив тип возвращаемого значения int и задав имя функции main. Значение int, возвращаемое функцией main, указывает, что программа возвращает значение функции система. Если значение не возвращено, системы получат значение, указывающее на успех. В C++ ненулевое значение из main указывает на сбой.

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

#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!\n";
return 0;
}

Если мы создадим и выполним нашу программу, мы увидим ожидаемый вывод, напечатанный в командной строке.

make;./build/final_program                                                                                                             0 (0.005s) < 13:57:21
mkdir -p build/./src/
c++ -I./src -MMD -MP  -c src/helloworld.cpp -o build/./src/helloworld.cpp.o
g++ ./build/./src/helloworld.cpp.o -o build/final_program 
Hello World!