реклама
Бургер менюБургер меню

Зара Горенко – Мыслим на Си (страница 3)

18

Скомпилировала. Запустила.

Я учу язык Си

"Ты только что написала свою первую программу, солнышко. В шесть лет".

Той ночью я не могла уснуть. В голове крутились символы, фигурные скобки, слова printf и return. Я не понимала их смысла, но чувствовала – чувствовала! – что за ними стоит логика.

Часть 1: Что такое "Hello, World" и почему именно это?

Когда Брайан Керниган и Деннис Ритчи писали свою легендарную книгу "Язык программирования Си" в 1978 году, они начали с одной программы:

c#include <stdio.h>

main()

{

printf("hello, world\n");

}

Эта программа стала традицией. Каждый программист в мире начинает с "Hello, World". Почему?

Потому что это минимальная программа, которая делает что-то видимое. Она показывает вам, что цепочка работает: вы пишете код → компилятор переводит его в машинный язык → процессор выполняет команды → вы видите результат на экране.

Это как первое слово ребёнка. Он не говорит "Уважаемая мама, не соизволите ли вы подать мне молоко?". Он говорит: "Ма-ма". Просто. Понятно. Работает.

"Hello, World" – это ваше первое слово на языке Си.

Часть 2: Анатомия программы

Давайте разберём эту программу построчно. Я объясню каждый символ так, чтобы понял даже первоклассник.

c#include <stdio.h>

Это директива препроцессора. Представьте, что вы пишете письмо, но вам нужен словарь, чтобы проверить правописание. #include говорит: "Эй, компилятор, перед тем как переводить мою программу, подключи вот этот файл".

stdio.h – это "standard input/output header" (заголовочный файл стандартного ввода-вывода). В нём хранятся описания функций, которые работают с вводом и выводом: printf, scanf, getchar и другие.

Знак # означает, что это команда не для процессора, а для препроцессора – программы, которая обрабатывает ваш код до компиляции.

Угловые скобки < > говорят: "Ищи этот файл в системных директориях". Если бы вы написали #include "myfile.h" с кавычками, препроцессор искал бы файл сначала в текущей папке.

cint main() {

Это главная функция. Каждая программа на Си начинается с main(). Всегда. Без исключений.

Почему? Потому что когда операционная система запускает вашу программу, она ищет функцию с именем main и говорит: "Начинай отсюда".

int означает "integer" – целое число. Это тип возвращаемого значения. Функция main возвращает целое число в операционную систему. Обычно 0 означает "всё прошло хорошо", а любое другое число – "произошла ошибка".

Круглые скобки () – это место для параметров. Сейчас они пустые, но позже мы научимся передавать в main аргументы командной строки

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

cprintf("Hello, World!\n");

Это вызов функции printf. printf расшифровывается как "print formatted" – "печатать форматированно".

Что она делает? Выводит текст на экран.

"Hello, World!\n" – это строковый литерал. Двойные кавычки говорят: "Это текст, не код".

Символ \n – это escape-последовательность. Он означает "перевод строки" (newline). Без него курсор останется на той же строке после вывода, и следующий текст будет печататься сразу после "Hello, World!".

Точка с запятой ; – это конец оператора. В Си каждая команда должна заканчиваться точкой с запятой. Это как точка в конце предложения.

creturn 0;

Это оператор возврата. Он говорит: "Функция main закончила работу. Верни операционной системе число 0".

Почему 0? Потому что в Unix (и в Си) 0 означает "успех". Любое другое число означает ошибку. Это может показаться странным (обычно ноль ассоциируется с "ничем"), но в Unix-философии "ноль ошибок" – это хорошо.

c}

Закрывающая фигурная скобка. Конец функции main.

Часть 3: Компиляция – как превратить текст в программу

Вы написали код. Теперь нужно превратить его в программу, которую может выполнить процессор.

Компьютер не понимает Си. Он понимает только машинный код – последовательности нулей и единиц. Компилятор – это переводчик, который берёт ваш текст на Си и превращает его в инструкции для процессора.

Мы будем использовать компилятор GCC (GNU Compiler Collection). Это свободный компилятор, созданный в рамках проекта GNU Ричарда Столлмана.

Сохраните вашу программу в файл hello.c (расширение .c означает, что это код на Си).

Откройте терминал и введите:

bashgcc hello.c -o hello

Что происходит?

gcc – это команда запуска компилятора

hello.c – исходный файл (ваш код)

–o hello – опция "output" (выход). Говорит: "Назови скомпилированную программу hello"

Если всё прошло без ошибок, в вашей директории появится файл hello (или hello.exe в Windows).

Теперь запустите его:

bash./hello

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

textHello, World!

Поздравляю! Вы только что написали, скомпилировали и запустили свою первую программу на Си.

Часть 4: Что происходит внутри?

Давайте заглянем под капот. Что на самом деле делает компилятор?

Шаг 1: Препроцессор

Препроцессор обрабатывает директивы #include, #define и другие. Он берёт содержимое файла stdio.h и вставляет его в начало вашей программы.

Вы можете увидеть результат работы препроцессора:

bashgcc -E hello.c

Вы увидите сотни строк кода – всё содержимое stdio.h. Ваша маленькая программа превратилась в огромный текстовый файл!

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

Компилятор берёт препроцессированный код и переводит его в ассемблер – язык, близкий к машинному коду.