Блог → Как программировать грамотно на языке Си. Часть 1

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

Разумеется, языком Си могут пользоваться не только профессионалы высокого класса, ведь в-сущности, он ничуть не сложнее Паскаля или Фортрана. Но вместе с тем, он обладает свойствами, которые привлекательны прежде всего для профессионалов: это лаконичность, сочетающаяся с большой мощностью языка, это возможность использовать машинно-ориентированные средства, с одной стороны, и создавать мобильные программы, с другой. Язык включает в себя все управляющие конструкции структурного программирования, что способствует созданию программ в хорошем стиле. Однако из-за того, что язык разрешает практически всё, его нельзя считать языком надёжного программирования, и вся ответственность за надёжность создаваемой на языке Си программы лежит на программисте. Поэтому программист должен хорошо знать особенности языка и реализации, чтобы со знанием дела их использовать.

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

В цикле статей о грамотном программировани на Си, я дам кое-какую информацию относительно описания языка Си, реализованного в системе программирования Си на персональных ЭВМ ЕС, для операционной системы Альфа-ДОС и совместимых с ними систем. Необходимую информацию о персональных ЭВМ ЕС (Единой системы) и работе в операционной системе можно найти в специализированной литературе, либо на сайтах.

В качестве введения в программирование в среде Си для ПЭВМ ЕС рассмотрим пример простой программы, которую можно ввести и выполнить.



Первые две строки программы содержат директивы препроцессора. Первая директива #define определяет имя КОНЕЦ для нулевого символа конца строки. Препроцессор заменит все появления константы КОНЕЦ в программе символьной константой. Вторая директива #include предписывает препроцессору включить содержимое файла с именем stdio.h в указанное место исходной Си-программы. Этот файл поставляется в дистрибутивной системе программирования Си и содержит определения констант, типов данных, прототипы функций, связанных с вводом-выводом (в частности, для этой программы он позволяет использовать функцию printf для вывода информации на экран). Си-программа всегда должна содержать функцию с зарезервированным именем main, с которой начинается выполнение программы. Третья строка программы содержит заголовок функции main() без параметров. Далее следуют объявления переменных и операторы, выполняющие копирование содержимого исходной строки в результирующую и вывод результирующей строки иа дисплей.

Каждое объявление и каждый оператор в Си-программе заканчивается точкой с запятой. Точка с запятой не ставится в конце группы операторов, заключенных в фигурные скобки, определения функции и директивы препроцессора. В данном примере использованы русские идентификаторы, но ключевые слова языка (char, int, while) применяются в английской нотации. Я не предлагаю для них русской нотации, сразу по нескольким причинам. Во-первых, ключевых слов в языке Си всего лишь 32. Их русские эквиваленты не стандартизованы, длиннее при написании без сокращений и менее мнемоничны при сокращении. Во-вторых, каждый пользователь может ввести свои собственные эквиваленты ключевых слов, используя возможности препроцессора.

Состав системы программирования

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



Интегрированная среда

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

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

Текст исходной программы, создаваемый при работе в интегрированной среде, может быть сохранён для последующего использования или в интегрированной среде, или с автономным оптимизирующим компилятором системы программирования Си. С другой стороны, текст исходной программы может быть создан вне интегрированной среды с помощью любого другого подходящего текстового редактора, и использоваться при работе в среде или с оптимизирующим компилятором. Более того, интегрированная среда может быть настроена на использование другого текстового редактора, вместо встроенного в среду.

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

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

Однако помните, что при работе в режиме командной строки пользователю доступны все возможности, предоставляемые компилятором, без ограничений, которые имеются при работе в интегрированной среде. Интегрированная среда предоставляет пользователю мошную контекстно чувствительную систему получения справочной информации о всех аспектах работы в среде: назначении команд в меню, элементах языка Си, формате вызова и назначении функций библиотеки, возможных, причинах сообщений об ошибках, выдаваемых компилятором и редактором связей. Для получения справки достаточно подвести курсор к интересующей теме и нажать функциональную клавишу F1 (стандартная клавиша вызова помощи).

Для облегчения ведения многомодульного программного проекта в интегрированной среде заложена возможность отслеживать соответствие времени последнего изменения исходного и объектного модуля из программного списка, представляющего разрабатываемый проект. При возникновении несоответствия может быть произведено автоматическое пересоздание исполняемой программы. При этом средой создается файл во внешней памяти, который имеет формат, пригодный для обработки утилитой MAKE. Благодаря этому сопровождение многомодульного проекта может выполняться и вне интегрированной среды.