Перейти к основному содержимому

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

Разработчику Архитектору

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

Что происходит, когда вы запускаете программу на Си

Программа на Си не исполняется напрямую процессором. Она проходит несколько этапов преобразования, прежде чем станет машинным кодом — последовательностью команд, которые понимает центральный процессор.

Этот процесс называется компиляцией. Он состоит из следующих шагов:

  1. Препроцессирование — обработка директив, начинающихся с символа #, таких как #include или #define. На этом этапе подключаются заголовочные файлы, раскрываются макросы, и исходный текст программы превращается в единый файл без ссылок на внешние ресурсы.
  2. Компиляция — перевод подготовленного текста программы в ассемблерный код, специфичный для целевой архитектуры (например, x86-64 или ARM).
  3. Ассемблирование — преобразование ассемблерного кода в объектный файл, содержащий машинные инструкции в двоичной форме, но ещё не готовый к запуску.
  4. Компоновка (линковка) — объединение одного или нескольких объектных файлов с библиотеками (например, стандартной библиотекой Си) в единый исполняемый файл.

Результат этого процесса — исполняемый файл, который можно запустить на компьютере с совместимой операционной системой и архитектурой процессора.

Для выполнения этих этапов требуется специальная программа — компилятор. Наиболее распространённые компиляторы для Си — это GCC (GNU Compiler Collection) и Clang. В среде Windows также часто используется компилятор от Microsoft — MSVC (Microsoft Visual C++).

Можно ли писать и запускать программы на Си в Windows

Да, программы на Си можно писать, компилировать и запускать в операционной системе Windows. Для этого существует несколько подходов, каждый из которых имеет свои особенности.

Подход 1: Использование MinGW-w64 и GCC

MinGW-w64 — это порт компилятора GCC и связанных инструментов для Windows. Он позволяет компилировать программы на Си без необходимости устанавливать дополнительные подсистемы. MinGW-w64 генерирует нативные исполняемые файлы Windows (с расширением .exe), которые работают без установки дополнительных библиотек.

Чтобы начать работу с MinGW-w64:

  1. Перейдите на официальный сайт https://www.mingw-w64.org/ или используйте доверенный установщик, такой как WinLibs.
  2. Скачайте сборку MinGW-w64, соответствующую вашей архитектуре (обычно x86_64).
  3. Распакуйте архив в удобное место на диске, например, в папку C:\mingw64.
  4. Добавьте путь к папке bin внутри этой директории (например, C:\mingw64\bin) в переменную среды PATH вашей системы.
  5. Откройте новое окно командной строки и введите gcc --version. Если система отображает версию компилятора, установка прошла успешно.

После этого вы можете использовать команду gcc для компиляции программ прямо из терминала.

Подход 2: Использование Visual Studio Community

Visual Studio — полноценная интегрированная среда разработки от Microsoft. Бесплатная версия Community включает компилятор MSVC, отладчик, редактор кода и средства управления проектами.

Для работы с Си в Visual Studio:

  1. Скачайте и установите Visual Studio Community с официального сайта https://visualstudio.microsoft.com/ru/.
  2. Во время установки обязательно выберите рабочую нагрузку «Разработка классических приложений на C++». Несмотря на название, эта нагрузка включает поддержку языка Си.
  3. После установки создайте новый проект типа «Пустой проект».
  4. Добавьте новый файл с расширением .c (например, main.c) в проект.
  5. Напишите код на Си и нажмите кнопку запуска. Visual Studio автоматически скомпилирует и выполнит программу.

Этот подход удобен тем, что предоставляет мощные инструменты отладки и навигации по коду, но требует больше ресурсов и времени на установку.

Подход 3: Использование Windows Subsystem for Linux (WSL)

Если вы предпочитаете работать в Unix-подобной среде, Windows предлагает подсистему WSL, которая позволяет запускать дистрибутивы Linux прямо внутри Windows.

Для этого:

  1. Включите компонент WSL через PowerShell (от имени администратора):
    wsl --install
  2. Установите дистрибутив из Microsoft Store, например Ubuntu.
  3. После первого запуска создайте учётную запись пользователя.
  4. Установите GCC в Linux-среде командой:
    sudo apt update && sudo apt install build-essential
  5. Теперь вы можете писать, компилировать и запускать программы на Си так, как это делают в Linux.

Этот метод особенно полезен, если вы планируете в будущем работать с серверными или встраиваемыми системами, где доминируют Unix-подобные ОС.


Написание первой программы

Традиционно первая программа на любом языке программирования выводит на экран фразу «Hello, World!». Эта простая задача демонстрирует базовую структуру программы, подключение стандартных библиотек и использование функций ввода-вывода.

Вот как выглядит такая программа на языке Си:

#include <stdio.h>

int main(void)
{
printf("Hello, World!\n");
return 0;
}

Разберём каждую часть этого кода по порядку.

Директива #include <stdio.h>

Эта строка — директива препроцессора. Она указывает компилятору включить содержимое заголовочного файла stdio.h в начало программы. Заголовочный файл содержит объявления функций, связанных со стандартным вводом и выводом: printf, scanf, puts, gets и других.

Без подключения stdio.h компилятор не узнает, что такое printf, и выдаст ошибку. В языке Си все используемые функции должны быть объявлены до их вызова, и заголовочные файлы служат для этого.

Функция main

Каждая программа на Си начинается с функции main. Это точка входа — место, с которого операционная система передаёт управление вашей программе после её запуска.

Объявление int main(void) означает следующее:

  • int — тип возвращаемого значения. Функция main возвращает целое число, которое передаётся операционной системе как код завершения программы.
  • main — имя функции.
  • (void) — список параметров. Слово void в скобках говорит о том, что функция не принимает аргументов извне.

Альтернативный вариант — int main(int argc, char *argv[]) — используется, когда программа должна обрабатывать аргументы командной строки. Для первой программы такой сложности не требуется.

Тело функции

Фигурные скобки { } ограничивают тело функции. Всё, что находится между ними, выполняется при запуске программы.

Внутри тела вызывается функция printf("Hello, World!\n");.

  • printf — функция вывода форматированной строки на стандартное устройство вывода (обычно терминал).
  • "Hello, World!\n" — строковый литерал. Он заключён в двойные кавычки и передаётся функции как аргумент.
  • \n — управляющая последовательность, обозначающая символ новой строки. Без неё курсор останется в конце выведенного текста, и следующий вывод начнётся сразу после него.

После вывода строки программа выполняет инструкцию return 0;.

  • return — команда, которая завершает выполнение функции и возвращает значение вызывающей стороне.
  • 0 — стандартное значение, означающее успешное завершение программы. Любое другое число обычно интерпретируется как ошибка.

Эта структура — минимально необходимая для корректной программы на Си. Она соответствует стандарту языка и будет работать на любой совместимой системе.


Сохранение и компиляция программы

Чтобы превратить текст программы в исполняемый файл, нужно выполнить несколько шагов.

Шаг 1: Создание файла с исходным кодом

Откройте любой текстовый редактор: Блокнот (Notepad), Notepad++, Visual Studio Code, Sublime Text или другой. Важно использовать простой текстовый редактор, а не программы вроде Microsoft Word, которые добавляют невидимое форматирование.

Скопируйте в редактор код:

#include <stdio.h>

int main(void)
{
printf("Hello, World!\n");
return 0;
}

Сохраните файл с расширением .c, например, как hello.c. Расположение файла может быть любым — удобно создать отдельную папку для ваших проектов, например, C:\projects\hello.

Шаг 2: Открытие терминала

В Windows откройте Командную строку (cmd) или PowerShell. Перейдите в папку, где сохранён файл, с помощью команды cd:

cd C:\projects\hello

Убедитесь, что файл присутствует, выполнив:

dir

Вы должны увидеть hello.c в списке.

Шаг 3: Компиляция

Если вы установили MinGW-w64 и добавили GCC в PATH, выполните:

gcc hello.c -o hello.exe

Эта команда говорит компилятору:

  • взять файл hello.c как исходный код,
  • скомпилировать его,
  • создать исполняемый файл с именем hello.exe.

Если всё сделано правильно, команда завершится без сообщений. В той же папке появится файл hello.exe.

Шаг 4: Запуск программы

Введите в терминале:

hello.exe

Или просто:

hello

На экране появится:

Hello, World!

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


Что делать, если возникли ошибки

Ошибки при компиляции — нормальная часть процесса обучения. Компилятор всегда сообщает о проблемах максимально точно.

Например, если вы забыли точку с запятой:

printf("Hello, World!\n")

Компилятор выдаст сообщение вроде:

error: expected ';' before 'return'

Это означает, что после вызова printf ожидалась точка с запятой, но она отсутствует. Исправьте строку, добавив ;, и повторите компиляцию.

Если вы написали prinft вместо printf, компилятор сообщит:

warning: implicit declaration of function 'prinft'
error: undefined reference to 'prinft'

Первое предупреждение говорит, что функция не объявлена. Вторая ошибка — линковщик не может найти реализацию этой функции. Исправьте опечатку, и программа заработает.

Главное правило: читайте сообщения компилятора внимательно. Они указывают номер строки и тип проблемы. Со временем вы научитесь быстро находить и исправлять такие ошибки.


Альтернативные способы запуска: Visual Studio и WSL

Хотя компиляция через командную строку с использованием GCC — это прямой и прозрачный путь, многие начинающие программисты предпочитают использовать интегрированные среды разработки (IDE), которые автоматизируют многие рутинные действия. Рассмотрим два популярных варианта в Windows: Visual Studio Community и Windows Subsystem for Linux (WSL).

Запуск через Visual Studio Community

После установки Visual Studio и выбора рабочей нагрузки «Разработка классических приложений на C++», вы можете создать проект следующим образом:

  1. Откройте Visual Studio.
  2. Выберите «Создать проект».
  3. В списке шаблонов найдите «Пустой проект» (Empty Project) и нажмите «Далее».
  4. Укажите имя проекта, например HelloWorld, и путь для сохранения.
  5. Нажмите «Создать».

Теперь проект создан, но он пока пуст. Чтобы добавить код:

  1. В Обозревателе решений (Solution Explorer) щёлкните правой кнопкой мыши по папке «Файлы исходного кода».
  2. Выберите «Добавить → Создать элемент».
  3. В открывшемся окне выберите «Файл C++ (.cpp)», но измените расширение на .c в поле имени файла — например, введите main.c.
  4. Нажмите «Добавить».

В открывшемся редакторе введите тот же код:

#include <stdio.h>

int main(void)
{
printf("Hello, World!\n");
return 0;
}

Теперь нажмите Ctrl+F5 (или кнопку «Запуск без отладки»). Visual Studio автоматически скомпилирует проект, соберёт исполняемый файл и запустит консольное окно с результатом.

Преимущество этого подхода — автоматическая настройка путей к компилятору, библиотекам и отладчику. Недостаток — зависимость от тяжёлой IDE, которая может отвлекать от понимания базовых принципов компиляции.

Запуск через WSL (Windows Subsystem for Linux)

Если вы активировали WSL и установили, например, Ubuntu, процесс становится почти идентичным тому, что используется в Linux:

  1. Откройте терминал WSL (например, через поиск Windows: «Ubuntu»).
  2. Создайте директорию для проекта:
    mkdir ~/hello && cd ~/hello
  3. Создайте файл с помощью текстового редактора, например nano:
    nano hello.c
  4. Вставьте код программы и сохраните файл (Ctrl+O, затем Enter; выход — Ctrl+X).
  5. Скомпилируйте программу:
    gcc hello.c -o hello
  6. Запустите:
    ./hello

На экране появится надпись Hello, World!.

Этот метод особенно ценен тем, что даёт доступ к Unix-среде, где большинство серверных и системных программ разрабатываются. Вы учитесь не только языку Си, но и экосистеме, в которой он чаще всего применяется.


Сравнение подходов: какой выбрать?

КритерийGCC + MinGW-w64Visual StudioWSL + GCC
Требуемое место на диске~200 МБ5–10 ГБ~1–2 ГБ (плюс дистрибутив)
Скорость установкиБыстроДолгоСредняя
Понимание процесса сборкиПолноеЧастичное (автоматизация)Полное
Поддержка отладкиЧерез GDB (вручную)Встроенная, мощнаяЧерез GDB в терминале
Переносимость навыковВысокая (работает везде)Ограничена WindowsОчень высокая (Linux)
Подходит для новичковДа, при желании учитьсяДа, особенно визуальноДа, если знакомы с терминалом

Для первого знакомства с языком рекомендуется начать с MinGW-w64 и командной строки. Это позволяет увидеть каждый этап: от создания файла до запуска программы. После освоения основ можно перейти к IDE или WSL в зависимости от целей.


Советы по организации рабочего пространства

  1. Создайте отдельную папку для каждого проекта. Это предотвращает путаницу между файлами разных программ.
  2. Используйте осмысленные имена файлов. Например, calculator.c, temperature_converter.c, а не prog1.c.
  3. Комментируйте код. Даже в простых программах полезно писать комментарии, объясняющие, что делает каждая часть. Это помогает при возвращении к коду через неделю или месяц.
  4. Не бойтесь ошибок. Каждая ошибка — это шаг к пониманию. Компилятор — ваш союзник, а не противник.
  5. Экспериментируйте. Измените текст в printf, попробуйте вывести два сообщения, добавьте пустую строку. Наблюдение за результатом укрепляет интуицию.

Что дальше?

После успешного запуска первой программы открывается путь к изучению фундаментальных концепций языка Си:

  • переменные и типы данных,
  • операторы и выражения,
  • условные конструкции (if, else),
  • циклы (for, while),
  • функции и модульность,
  • работа с массивами и строками,
  • указатели и управление памятью.

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

Язык Си требует внимания к деталям, но вознаграждает глубоким пониманием того, как работает программное обеспечение. Первая программа — это не просто «Hello, World!». Это первый шаг в мир создания технологий.