Перейти к содержимому
Теория · Первая программа · урок 1 из 7

Как устроена программа на C++

Чему вы научитесь

Чему вы научитесь:

  • объяснять, как текст программы на C++ становится исполняемым файлом;
  • отличать ошибку компилятора от ошибки компоновщика;
  • читать код возврата программы и понимать, откуда он берётся;
  • писать свою функцию, которая принимает числа и возвращает результат.
Рукопись hello.cpp проходит стол переводчика и пресс переплётчика, где её сшивают со страницей std::cout в книгу hello

Программа на C++ — это текст, а процессор выполняет только машинный код. Поэтому файл с программой нельзя запустить сразу: сначала его переводит в машинный код другая программа.

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

  1. Переводчик проверяет, что рукопись написана по правилам языка, и переводит её. Найдёт ошибку — вернёт рукопись с пометкой, и перевода не будет.
  2. Переплётчик сшивает переведённые листы с готовыми страницами из библиотеки. Получается книга, которую можно отдать читателю.

С программой происходит то же самое: читатель — это процессор, а переводчик и переплётчик — две программы. Вот программа, которая печатает одну строку:

C++
#include <iostream>

int main() {
    std::cout << "Hello, world\n";  // Hello, world
}

Строка #include <iostream> вставляет в файл описание средств ввода и вывода из стандартной библиотеки. Среди них есть std::cout — стандартный вывод программы. Приставка std:: означает, что имя взято из стандартной библиотеки. Оператор << отправляет в вывод текст, а \n в конце текста переводит строку.

Где начинается выполнение

Функция — это именованный набор инструкций: её можно вызвать по имени, и она может вернуть результат. Это похоже на рецепт с названием: достаточно сказать «омлет», и повар выполнит все шаги рецепта.

Выполнение программы начинается с функции main, и в программе она ровно одна. Её тело — это инструкции в фигурных скобках:

  • инструкции выполняются по очереди, сверху вниз;
  • инструкция с std::cout заканчивается точкой с запятой;
  • после последней инструкции main программа завершается.

От текста к программе

Давайте проследим путь программы от текста до запуска:

  1. Файл hello.cpp с текстом программы называют исходным.
  2. Компилятор — это переводчик. Он проверяет, что текст написан по правилам C++, и переводит его в машинный код. Код он записывает в промежуточный объектный файл, например hello.o.
  3. Компоновщик — это переплётчик. Он соединяет переведённый код с готовым кодом стандартной библиотеки, в том числе с кодом std::cout.
  4. Получается исполняемый файл — его и запускает операционная система.

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

Ошибки до запуска и после

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

Здесь аналогия с переводчиком заканчивается. Живой переводчик заметил бы опечатку, а компилятор проверяет только правила, а не замысел автора. Опечатку в "Helo, world\n" он пропустит, и её будет видно только во время выполнения — в том, что напечатает программа.

Кроме ошибок, компилятор выдаёт предупреждения. С предупреждениями исполняемый файл всё же появляется, но компилятор показывает место, которое похоже на ошибку.

Частая ошибка

Здесь после инструкции с std::cout нет точки с запятой:

C++
#include <iostream>

int main() {
    std::cout << "Hello, world\n"  // ✗
}
TEXT
error: expected ';' after expression

Это ошибка компиляции: исполняемый файл не появился, поэтому программа не запускалась ни разу.

Главное

  • Компилятор проверяет текст программы по правилам C++ и переводит его в машинный код.
  • Компоновщик соединяет переведённый код с кодом стандартной библиотеки в исполняемый файл.
  • Выполнение начинается с функции main, и её инструкции идут сверху вниз.
  • После ошибки компиляции исполняемого файла нет, и запускать нечего.