02-basics.tex changed #3
|
@ -1,15 +1,15 @@
|
||||||
\section{Основные понятия}
|
\section{Основные понятия}
|
||||||
\subsection{Компиляция}
|
\subsection{Компиляция}
|
||||||
\label{text:naming}
|
\label{text:naming}
|
||||||
Прежде, чем говорить о языках программирования и о том, что такое компиляция, как она работает и прочих интересных вещах, нам необходимо познакомиться с понятием, которое будет сопровождать весь курс и в целом всю программистскую жизнь - это понятие имени. Имя - это некий символьный идентификатор (переменная, контейнер) для некоторого числа (числом в свою очередь является адрес ячейки памяти, куда записывается значение). Именовать можно как переменные, так и функции. Простейший пример - запись равенства: \code{name = 123456}. Различие между именем и числом задает признак числа, в программах для компьютеров признаком числа является первый символ, имя (идентификатор) не должно начинаться с цифры. Таким образом компиляторы однозначно могут определить, что является именем, а что числом. Это отличие накладывает на программиста очевидное ограничение: невозможность создать идентификаторы, начинающиеся с цифр. Также, чтобы не создавать неоднозначности в поведении программы нельзя, чтобы имена в рамках одной программы повторялись. Общий алгоритм работы со всеми компилируемыми языками, в том числе С++ выглядит следующим образом:
|
Прежде, чем говорить о языках программирования и о том, что такое компиляция, как она работает и прочих интересных вещах, нам необходимо познакомиться с понятием, которое будет сопровождать весь курс и в целом всю программистскую жизнь - это понятие имени. Имя - это некий символьный идентификатор (переменная, контейнер) для некоторого числа (числом в свою очередь является адрес ячейки памяти, куда записывается значение). Именовать можно как переменные, так и функции. Простейший пример - запись равенства: \code{name = 123456}. Различие между именем и числом задает признак числа: в программах для компьютеров признаком числа является первый символ, так как имя (идентификатор) не должно начинаться с цифры. Таким образом, компиляторы однозначно могут определить, что является именем, а что — числом. Это отличие накладывает на программиста очевидное ограничение: невозможность создать идентификаторы, начинающиеся с цифр. Также, чтобы не создавать неоднозначности в поведении программы, нельзя, чтобы имена в рамках одной программы повторялись. Общий алгоритм работы со всеми компилируемыми языками, в том числе С++, выглядит следующим образом:
|
||||||
|
|||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item программист пишет текст программы на каком-либо языке программирования, в нашем случае это С;
|
\item программист пишет текст программы на каком-либо языке программирования, в нашем случае это С;
|
||||||
\item при помощи программы-транслятора и, зачастую, ассемблера этот текст преобразуется в исполняемые машинные коды, этот процесс, обычно, состоит из нескольких этапов и называется общим словом <<компиляция>>;
|
\item при помощи программы-транслятора и зачастую ассемблера этот текст преобразуется в исполняемые машинные коды: этот процесс обычно состоит из нескольких этапов и называется общим словом <<компиляция>>;
|
||||||
\item исполняемые коды запускаются на целевом компьютере (чаще всего, это сервер или персональный компьютер пользователя).
|
\item исполняемые коды запускаются на целевом компьютере (чаще всего это сервер или персональный компьютер пользователя).
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
Применим этот общий алгоритм для написания первой программы. Предполагается, что на данный момент у Вас установлена либо среда разработки, либо текстовый редактор и компилятор по отдельности, чтобы иметь возможность повторить этот и все последующие примеры самостоятельно.
|
Применим этот общий алгоритм для написания первой программы. Предполагается, что на данный момент у Вас установлена либо среда разработки, либо текстовый редактор и компилятор по отдельности, чтобы иметь возможность повторить этот и все последующие примеры самостоятельно.
|
||||||
\paragraph{Первая программа, файл \code{program.c}}
|
\paragraph{Первая программа, файл \code{program.c}}
|
||||||
Для написания программы, откроем выбранный текстовый редактор или среду программирования, и напишем следующие строки (важно отличать заглавные и строчные буквы, то есть, например \code{Int} и \code{int} - это разные слова, и первое, написанное с заглавной буквы, будет не понято компилятором):
|
Для написания программы откроем выбранный текстовый редактор или среду программирования и напишем следующие строки (важно отличать заглавные и строчные буквы, то есть, например \code{Int} и \code{int} - это разные слова, и первое, написанное с заглавной буквы, будет не понято компилятором):
|
||||||
|
|
||||||
\begin{figure}[h!]
|
\begin{figure}[h!]
|
||||||
\lstinputlisting[language=C,style=CCodeStyle]{../sources/helloworld.c}
|
\lstinputlisting[language=C,style=CCodeStyle]{../sources/helloworld.c}
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
(или) gcc -o program program.c
|
(или) gcc -o program program.c
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
Запуск будет отличаться только для Windows (символами доллара и угловой скобки обозначены приглашения unix-терминала и командной строки windows, соответственно):
|
Запуск будет отличаться только для Windows (символами доллара и угловой скобки обозначены приглашения unix-терминала и командной строки windows соответственно):
|
||||||
|
|
||||||
\begin{figure}[h!]
|
\begin{figure}[h!]
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
|
@ -32,21 +32,21 @@ non-windows $ ./program
|
||||||
windows > .\program.exe
|
windows > .\program.exe
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
Далее в тексте в целях демонстрации будет использоваться запуск в стиле non-windows, а также, будет опускаться демонстрация этапа компиляции (кроме случаев, когда сам процесс компиляции отличается).
|
Далее в тексте в целях демонстрации будет использоваться запуск в стиле non-windows, а также будет опускаться демонстрация этапа компиляции (кроме случаев, когда сам процесс компиляции отличается).
|
||||||
\subsection{Шаблон программы}
|
\subsection{Шаблон программы}
|
||||||
Как и программы на любом другом языке, программы на языке С имеют ряд обязательных элементов, также называемых шаблоном программы. Рассмотрим эти элементы подробнее на примере только что написанной первой программы (\hyperref[code:firstprogram]{\ref{code:firstprogram}}). Некоторые, незначительные аспекты, будут рассмотрены сразу и полностью, комментарии, например, но некоторые будут рассмотрены поверхностно, поскольку являются масштабными, сложными для понимания фундаментальными механизмами языка, которым будут посвящены целые специальные разделы.
|
Как и программы на любом другом языке, программы на языке С имеют ряд обязательных элементов, также называемых шаблоном программы. Рассмотрим эти элементы подробнее на примере только что написанной первой программы (\hyperref[code:firstprogram]{\ref{code:firstprogram}}). Некоторые незначительные аспекты будут рассмотрены сразу и полностью, комментарии, например, но некоторые будут рассмотрены поверхностно, поскольку являются масштабными, сложными для понимания фундаментальными механизмами языка, которым будут посвящены целые специальные разделы.
|
||||||
\paragraph{Комментарии} Некоторые среды разработки оставляют в шапке файла комментарии об авторе и дате создания файла. Некоторые команды разработки регламентируют такие комментарии и рекомендуют их написание каждым участником. Комментарий это любой текст, написанный для удобства программиста и игнорируемый компилятором. Комментарии бывают как однострочные, так и многострочные. В редких случаях можно встретить внутристрочные комментарии, но их лучше стараться не использовать, они считаются дурным тоном, поскольку резко снижают читаемость кода.
|
\paragraph{Комментарии} Некоторые среды разработки оставляют в шапке файла комментарии об авторе и дате создания файла. Некоторые команды разработки регламентируют такие комментарии и рекомендуют их написание каждым участником. Комментарий — это любой текст, написанный для удобства программиста и игнорируемый компилятором. Комментарии бывают как однострочные, так и многострочные. В редких случаях можно встретить внутристрочные комментарии, но их лучше стараться не использовать, они считаются дурным тоном, поскольку резко снижают читаемость кода.
|
||||||
\frm{\textbf{Комментарий} - это фрагмент текста программы, который будет проигнорирован компилятором языка.}
|
\frm{\textbf{Комментарий} - это фрагмент текста программы, который будет проигнорирован компилятором языка.}
|
||||||
Очень старые компиляторы допускали только комментарии в стиле \code{/* xxx */}, сейчас допустим также стиль \code{// xxx}, завершается такой комментарий концом строки (то есть вся оставшаяся строка, после символов \code{//} будет проигнорирована компилятором). Комментарии в коде важны, особенно для описания и пояснения неочевидных моментов, но важно соблюсти баланс и не превратить программу в один сплошной комментарий, иногда прерывающийся на работающий код.
|
Очень старые компиляторы допускали только комментарии в стиле \code{/* xxx */}, сейчас допустим также стиль \code{// xxx}, завершается такой комментарий концом строки (то есть вся оставшаяся строка после символов \code{//} будет проигнорирована компилятором). Комментарии в коде важны, особенно для описания и пояснения неочевидных моментов, но важно соблюсти баланс и не превратить программу в один сплошной комментарий, иногда прерывающийся на работающий код.
|
||||||
\label{text:directive}
|
\label{text:directive}
|
||||||
\paragraph{Директивы препроцессора} это такие команды, которые будут выполняться не просто до запуска программы, но даже до компиляции.
|
\paragraph{Директивы препроцессора} это такие команды, которые будут выполняться не просто до запуска программы, но даже до компиляции.
|
||||||
\frm{Есть мнение, что С/С++ программисты - это не программисты на языке С/С++, а программисты на языке препроцессора используемых ими компиляторов.}
|
\frm{Есть мнение, что С/С++ программисты - это не программисты на языке С/С++, а программисты на языке препроцессора используемых ими компиляторов.}
|
||||||
В директивах препроцессора подключаются внешние заголовочные файлы, и определяются некоторые абсолютные значения проекта. Обратите внимание, что директивы препроцессора это достаточно сложный инструмент, и использовать его, например, только для определения константных значений - не лучшее архитектурное решение. Для нашего проекта нам понадобится директива \code{\#include <stdio.h>} - эта директива подключит библиотеку стандартного ввода вывода в наш проект, что позволит нам "общаться" с пользователем нашей программы, используя терминал операционной системы (командную строку в терминах Windows)
|
В директивах препроцессора подключаются внешние заголовочные файлы и определяются некоторые абсолютные значения проекта. Обратите внимание, что директивы препроцессора — это достаточно сложный инструмент, и использовать его, например, только для определения константных значений - не лучшее архитектурное решение. Для нашего проекта нам понадобится директива \code{\#include <stdio.h>} - эта директива подключит библиотеку стандартного ввода-вывода в наш проект, что позволит нам "общаться" с пользователем нашей программы, используя терминал операционной системы (командную строку в терминах Windows).
|
||||||
\label{text:main}
|
\label{text:main}
|
||||||
\paragraph{Функция \code{main()\{\}}} это точка входа в программу. Программа может состоять из огромного числа файлов и функций, но операционная система как-то должна понять, откуда ей начинать исполнение программы. Такой точкой начала исполнения является функция \code{main} которая должна быть написана именно так:
|
\paragraph{Функция \code{main()\{\}}} это точка входа в программу. Программа может состоять из огромного числа файлов и функций, но операционная система как-то должна понять, откуда ей начинать исполнение программы. Такой точкой начала исполнения является функция \code{main}, которая должна быть написана именно так:
|
||||||
\frm{\centering\code{int main(int argc, char** args)}}
|
\frm{\centering\code{int main(int argc, char** args)}}
|
||||||
более подробно о функциях, их синтаксисе и аргументах мы поговорим позднее, на данном этапе можно просто запомнить такое (или же упрощённое \code{int main()} описание главной функции любой программы на языке С. Далее в фигурных скобках пишется так называемое <<тело>> программы, то есть именно те операторы, функции и алгоритмы, которые являются программой. По сути, всё наше программирование будет происходить либо в этой функции, либо будет довольно тесно с ней связано.
|
более подробно о функциях, их синтаксисе и аргументах мы поговорим позднее, на данном этапе можно просто запомнить такое (или же упрощённое \code{int main()}) описание главной функции любой программы на языке С. Далее в фигурных скобках пишется так называемое <<тело>> программы, то есть именно те операторы, функции и алгоритмы, которые являются программой. По сути, всё наше программирование будет происходить либо в этой функции, либо будет довольно тесно с ней связано.
|
||||||
\paragraph{Возврат из функции \code{return;}} это оператор явно завершающий выполнение функции \code{main} и, соответственно, программы. Все операторы, кроме директив препроцессора, комментариев и описаний тел функций должны заканчиваться точкой с запятой.
|
\paragraph{Возврат из функции \code{return;}} это оператор явно завершающий выполнение функции \code{main} и, соответственно, программы. Все операторы, кроме директив препроцессора, комментариев и описаний тел функций, должны заканчиваться точкой с запятой.
|
||||||
\label{text:simplify}
|
\label{text:simplify}
|
||||||
\frm{\textbf{Внимание!} Далее Вы прочитаете тезис, который является значительным упрощением реальной ситуации. Автор пошёл на такое упрощение по двум причинам: во-первых, поскольку в классическом С дела обстояли именно так, а в современных компьютерах ситуация меняется настолько быстро, что никакой текст не сможет оставаться актуальным, и во-вторых, поскольку целью данного документа не является детальное описание архитектур современных операционных систем.}
|
\frm{\textbf{Внимание!} Далее Вы прочитаете тезис, который является значительным упрощением реальной ситуации. Автор пошёл на такое упрощение по двум причинам: во-первых, поскольку в классическом С дела обстояли именно так, а в современных компьютерах ситуация меняется настолько быстро, что никакой текст не сможет оставаться актуальным, и во-вторых, поскольку целью данного документа не является детальное описание архитектур современных операционных систем.}
|
||||||
Поскольку программа написанная на языке С работает на одном уровне с операционной системой, а не в средах виртуализации, как это происходит в Java, например, она должна сообщить операционной системе, что она отработала нормально. Это делается посредством возврата в качестве результата работы программы кода ноль. В нашем случае, оператор \code{return} сообщает код \code{0}, говорящий об успешности завершения работы программы. Такой возвратный код - исторически сложившаяся договорённость между программистами: ненулевой код означает аварийное завершение программы и сообщает системе, что программа завершена некорректно и необходимо дополнительно и явно освобождать занятые ею ресурсы.
|
Поскольку программа, написанная на языке С, работает на одном уровне с операционной системой, а не в средах виртуализации, как это происходит в Java, например, она должна сообщить операционной системе, что она отработала нормально. Это делается посредством возврата в качестве результата работы программы кода ноль. В нашем случае, оператор \code{return} сообщает код \code{0}, говорящий об успешности завершения работы программы. Такой возвратный код - исторически сложившаяся договорённость между программистами: ненулевой код означает аварийное завершение программы и сообщает системе, что программа завершена некорректно и необходимо дополнительно и явно освобождать занятые ею ресурсы.
|
||||||
|
|
Loading…
Reference in New Issue
Хочу обратить внимание на приведенный пример name = 123456 : из написанного ранее (имя - это идентификатор числа, адреса ячейки памяти) возможно неверное трактование примера и понимание числа 123456 как адреса ячейки памяти. Можно добавить к предложению ", где name — это имя адреса ячейки памяти, в которой будет храниться значение 123456".
Ну либо я утрирую и все ок :)
от добавления такого уточнения хуже точно не будет. Если Вы добавите это для меня - будет круто)