Как устроена программа на C++
Чему вы научитесь:
- объяснять, как текст программы на C++ становится исполняемым файлом;
- отличать ошибку компилятора от ошибки компоновщика;
- читать код возврата программы и понимать, откуда он берётся;
- писать свою функцию, которая принимает числа и возвращает результат.

Программа на C++ — это текст, а процессор выполняет только машинный код. Поэтому файл с программой нельзя запустить сразу: сначала его переводит в машинный код другая программа.
Представьте книгу, которую написали на русском для читателя, знающего только свой язык. Прежде чем попасть к нему, рукопись проходит через двух мастеров:
- Переводчик проверяет, что рукопись написана по правилам языка, и переводит её. Найдёт ошибку — вернёт рукопись с пометкой, и перевода не будет.
- Переплётчик сшивает переведённые листы с готовыми страницами из библиотеки. Получается книга, которую можно отдать читателю.
С программой происходит то же самое: читатель — это процессор, а переводчик и переплётчик — две программы. Вот программа, которая печатает одну строку:
#include <iostream>
int main() {
std::cout << "Hello, world\n"; // Hello, world
}Строка #include <iostream> вставляет в файл описание средств ввода и вывода из стандартной библиотеки. Среди них есть std::cout — стандартный вывод программы. Приставка std:: означает, что имя взято из стандартной библиотеки. Оператор << отправляет в вывод текст, а \n в конце текста переводит строку.
Где начинается выполнение
Функция — это именованный набор инструкций: её можно вызвать по имени, и она может вернуть результат. Это похоже на рецепт с названием: достаточно сказать «омлет», и повар выполнит все шаги рецепта.
Выполнение программы начинается с функции main, и в программе она ровно одна. Её тело — это инструкции в фигурных скобках:
- инструкции выполняются по очереди, сверху вниз;
- инструкция с
std::coutзаканчивается точкой с запятой; - после последней инструкции
mainпрограмма завершается.
От текста к программе
Давайте проследим путь программы от текста до запуска:
- Файл
hello.cppс текстом программы называют исходным. - Компилятор — это переводчик. Он проверяет, что текст написан по правилам C++, и переводит его в машинный код. Код он записывает в промежуточный объектный файл, например
hello.o. - Компоновщик — это переплётчик. Он соединяет переведённый код с готовым кодом стандартной библиотеки, в том числе с кодом
std::cout. - Получается исполняемый файл — его и запускает операционная система.
Если исходных файлов несколько, компилятор переводит каждый отдельно, а компоновщик собирает из них одну программу. Обычно оба шага запускает одна команда, поэтому промежуточные файлы вы почти не видите.
Ошибки до запуска и после
Если текст нарушает правила языка, компилятор сообщает об ошибке компиляции и называет строку, где её нашёл. Исполняемый файл тогда не появляется, и запускать нечего.
Здесь аналогия с переводчиком заканчивается. Живой переводчик заметил бы опечатку, а компилятор проверяет только правила, а не замысел автора. Опечатку в "Helo, world\n" он пропустит, и её будет видно только во время выполнения — в том, что напечатает программа.
Кроме ошибок, компилятор выдаёт предупреждения. С предупреждениями исполняемый файл всё же появляется, но компилятор показывает место, которое похоже на ошибку.
Частая ошибка
Здесь после инструкции с std::cout нет точки с запятой:
#include <iostream>
int main() {
std::cout << "Hello, world\n" // ✗
}error: expected ';' after expressionЭто ошибка компиляции: исполняемый файл не появился, поэтому программа не запускалась ни разу.
Главное
- Компилятор проверяет текст программы по правилам C++ и переводит его в машинный код.
- Компоновщик соединяет переведённый код с кодом стандартной библиотеки в исполняемый файл.
- Выполнение начинается с функции
main, и её инструкции идут сверху вниз. - После ошибки компиляции исполняемого файла нет, и запускать нечего.