basic-c/sections/02-basics.tex

53 lines
14 KiB
TeX
Raw Permalink Normal View History

\section{Основные понятия}
\subsection{Компиляция}
\label{text:naming}
2022-11-10 19:30:16 +03:00
Прежде, чем говорить о языках программирования и о том, что такое компиляция, как она работает и прочих интересных вещах, нам необходимо познакомиться с понятием, которое будет сопровождать весь курс и в целом всю программистскую жизнь - это понятие имени. Имя - это некий символьный идентификатор (переменная, контейнер) для некоторого числа (числом в свою очередь является адрес ячейки памяти, куда записывается значение). Именовать можно как переменные, так и функции. Простейший пример - запись равенства: \code{name = 123456}. Различие между именем и числом задает признак числа: в программах для компьютеров признаком числа является первый символ, так как имя (идентификатор) не должно начинаться с цифры. Таким образом, компиляторы однозначно могут определить, что является именем, а что — числом. Это отличие накладывает на программиста очевидное ограничение: невозможность создать идентификаторы, начинающиеся с цифр. Также, чтобы не создавать неоднозначности в поведении программы, нельзя, чтобы имена в рамках одной программы повторялись. Общий алгоритм работы со всеми компилируемыми языками, в том числе С++, выглядит следующим образом:
\begin{enumerate}
\item программист пишет текст программы на каком-либо языке программирования, в нашем случае это С;
2022-11-10 19:30:16 +03:00
\item при помощи программы-транслятора и зачастую ассемблера этот текст преобразуется в исполняемые машинные коды: этот процесс обычно состоит из нескольких этапов и называется общим словом <<компиляция>>;
\item исполняемые коды запускаются на целевом компьютере (чаще всего это сервер или персональный компьютер пользователя).
\end{enumerate}
Применим этот общий алгоритм для написания первой программы. Предполагается, что на данный момент у Вас установлена либо среда разработки, либо текстовый редактор и компилятор по отдельности, чтобы иметь возможность повторить этот и все последующие примеры самостоятельно.
\paragraph{Первая программа, файл \code{program.c}}
2022-11-10 19:30:16 +03:00
Для написания программы откроем выбранный текстовый редактор или среду программирования и напишем следующие строки (важно отличать заглавные и строчные буквы, то есть, например \code{Int} и \code{int} - это разные слова, и первое, написанное с заглавной буквы, будет не понято компилятором):
\begin{figure}[h!]
\lstinputlisting[language=C,style=CCodeStyle]{../sources/helloworld.c}
\label{code:firstprogram}
\end{figure}
\paragraph{Запуск компиляции и исполнение программы}
В зависимости от выбранного инструментария и ОС процесс компиляции (трансляции) и запуска программы на исполнение может незначительно отличаться, далее будут приведены несколько вариантов. Естественно, что не нужно выполнять их все, а следует выбрать один, который сработает именно с Вашим набором инструментов. Трансляция (компиляция):
\begin{figure}[h!]
\begin{verbatim}
clang -o program program.c
(или) gcc -o program program.c
\end{verbatim}
\end{figure}
2022-11-10 19:30:16 +03:00
Запуск будет отличаться только для Windows (символами доллара и угловой скобки обозначены приглашения unix-терминала и командной строки windows соответственно):
\begin{figure}[h!]
\begin{verbatim}
non-windows $ ./program
windows > .\program.exe
\end{verbatim}
\end{figure}
2022-11-10 19:30:16 +03:00
Далее в тексте в целях демонстрации будет использоваться запуск в стиле non-windows, а также будет опускаться демонстрация этапа компиляции (кроме случаев, когда сам процесс компиляции отличается).
\subsection{Шаблон программы}
2022-11-10 19:30:16 +03:00
Как и программы на любом другом языке, программы на языке С имеют ряд обязательных элементов, также называемых шаблоном программы. Рассмотрим эти элементы подробнее на примере только что написанной первой программы (\hyperref[code:firstprogram]{\ref{code:firstprogram}}). Некоторые незначительные аспекты будут рассмотрены сразу и полностью, комментарии, например, но некоторые будут рассмотрены поверхностно, поскольку являются масштабными, сложными для понимания фундаментальными механизмами языка, которым будут посвящены целые специальные разделы.
\paragraph{Комментарии} Некоторые среды разработки оставляют в шапке файла комментарии об авторе и дате создания файла. Некоторые команды разработки регламентируют такие комментарии и рекомендуют их написание каждым участником. Комментарий — это любой текст, написанный для удобства программиста и игнорируемый компилятором. Комментарии бывают как однострочные, так и многострочные. В редких случаях можно встретить внутристрочные комментарии, но их лучше стараться не использовать, они считаются дурным тоном, поскольку резко снижают читаемость кода.
\frm{\textbf{Комментарий} - это фрагмент текста программы, который будет проигнорирован компилятором языка.}
2022-11-10 19:30:16 +03:00
Очень старые компиляторы допускали только комментарии в стиле \code{/* xxx */}, сейчас допустим также стиль \code{// xxx}, завершается такой комментарий концом строки (то есть вся оставшаяся строка после символов \code{//} будет проигнорирована компилятором). Комментарии в коде важны, особенно для описания и пояснения неочевидных моментов, но важно соблюсти баланс и не превратить программу в один сплошной комментарий, иногда прерывающийся на работающий код.
2021-08-25 16:52:36 +03:00
\label{text:directive}
\paragraph{Директивы препроцессора} это такие команды, которые будут выполняться не просто до запуска программы, но даже до компиляции.
\frm{Есть мнение, что С/С++ программисты - это не программисты на языке С/С++, а программисты на языке препроцессора используемых ими компиляторов.}
2022-11-10 19:30:16 +03:00
В директивах препроцессора подключаются внешние заголовочные файлы и определяются некоторые абсолютные значения проекта. Обратите внимание, что директивы препроцессора — это достаточно сложный инструмент, и использовать его, например, только для определения константных значений - не лучшее архитектурное решение. Для нашего проекта нам понадобится директива \code{\#include <stdio.h>} - эта директива подключит библиотеку стандартного ввода-вывода в наш проект, что позволит нам "общаться" с пользователем нашей программы, используя терминал операционной системы (командную строку в терминах Windows).
\label{text:main}
2022-11-10 19:30:16 +03:00
\paragraph{Функция \code{main()\{\}}} это точка входа в программу. Программа может состоять из огромного числа файлов и функций, но операционная система как-то должна понять, откуда ей начинать исполнение программы. Такой точкой начала исполнения является функция \code{main}, которая должна быть написана именно так:
\frm{\centering\code{int main(int argc, char** args)}}
2022-11-10 19:30:16 +03:00
более подробно о функциях, их синтаксисе и аргументах мы поговорим позднее, на данном этапе можно просто запомнить такое (или же упрощённое \code{int main()}) описание главной функции любой программы на языке С. Далее в фигурных скобках пишется так называемое <<тело>> программы, то есть именно те операторы, функции и алгоритмы, которые являются программой. По сути, всё наше программирование будет происходить либо в этой функции, либо будет довольно тесно с ней связано.
\paragraph{Возврат из функции \code{return;}} это оператор явно завершающий выполнение функции \code{main} и, соответственно, программы. Все операторы, кроме директив препроцессора, комментариев и описаний тел функций, должны заканчиваться точкой с запятой.
\label{text:simplify}
\frm{\textbf{Внимание!} Далее Вы прочитаете тезис, который является значительным упрощением реальной ситуации. Автор пошёл на такое упрощение по двум причинам: во-первых, поскольку в классическом С дела обстояли именно так, а в современных компьютерах ситуация меняется настолько быстро, что никакой текст не сможет оставаться актуальным, и во-вторых, поскольку целью данного документа не является детальное описание архитектур современных операционных систем.}
2022-11-10 19:30:16 +03:00
Поскольку программа, написанная на языке С, работает на одном уровне с операционной системой, а не в средах виртуализации, как это происходит в Java, например, она должна сообщить операционной системе, что она отработала нормально. Это делается посредством возврата в качестве результата работы программы кода ноль. В нашем случае, оператор \code{return} сообщает код \code{0}, говорящий об успешности завершения работы программы. Такой возвратный код - исторически сложившаяся договорённость между программистами: ненулевой код означает аварийное завершение программы и сообщает системе, что программа завершена некорректно и необходимо дополнительно и явно освобождать занятые ею ресурсы.