netlib.narod.ru< Назад | Оглавление | Далее >

Введение

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

Многие важные идеи Си взяты из языка BCPL, автором которого является Мартин Ричардс (Martin Richards). Влияние BCPL на Си было косвенным — через язык В, разработанный Кеном Томпсоном (Ken Thompson) в 1970 г. для первой системы UNIX, реализованной на PDP-7.

BCPL и B — «бестиповые» языки. В отличие от них Си обеспечивает разнообразие типов данных. Базовыми типами являются символы, а также целые числа и числа с плавающей точкой различных размеров. Кроме того, имеется возможность получать целую иерархию производных типов данных из указателей, массивов, структур и объединений. Выражения формируются из операций и операндов; любое выражение, включая присваивание и вызов функции, может быть инструкцией. Указатели обеспечивают машинно-независимую адресную арифметику.

В Си имеются основные управляющие конструкции, используемые в хорошо структуированных программах: возможность группировки инструкций, ветвление по условию (if-else), выбор одной альтернативы из многих (switch), циклы с проверкой в начале (while, for) и с проверкой в конце (do), а также досрочный выход из цикла (break).

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

На этапе препроцессирования выполняется макроподстановка в текст программы, включение других исходных файлов и условная компиляция.

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

В Си нет операций для непосредственной обработки составных объектов, таких как строки символов, множества, списки и массивы. В нем нет операций, которые бы манипулировали с целыми массивами или строками символов, хотя структуры разрешается копировать целиком как единые объекты. В языке не определены какие-либо средства распределения памяти, кроме статических переменных и стека для локальных переменных внутри функций; нет ни кучи ни сборщика мусора. Наконец, в самом Си нет средств ввода-вывода, инструкций READ и WRITE и каких-либо средств для доступа к файлам. Все эти высокоуровневые механизмы должны реализовываться посредством явно вызываемых функций. Большинство реализаций Си содержат стандартный набор таких функций.

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

Отсутствие некоторых из перечисленных средств может показаться серьезным недостатком («Выходит, чтобы сравнить две строки символов, нужно обращаться к функции?»). Однако компактность языка имеет реальные выгоды. Поскольку Си относительно мал, то и описание его кратко, и изучить его можно быстро. Программист может реально рассчитывать на то, что он будет знать, понимать и на практике регулярно пользоваться всеми возможностями языка.

В течение многих лет единственным определением языка Си было первое издание книги «Язык программирования Си». В 1983 г. Американским институтом национальных стандартов (ANSI) учреждается комитет для выработки современного исчерпывающего определения языка Си. Результатом его работы явился стандарт для Си, или ANSI-C, выпущенный в 1988 г. Большинство положений этого стандарта уже учтено в современных компиляторах.

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

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

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

Второй значительный вклад стандарта — это определение библиотеки, поставляемой вместе с компилятором Си, в которой специфицируются функции доступа к возможностям операционной системы (например, чтения-записи файлов), форматного ввода-вывода, динамического выделения памяти, манипуляций со строками символов и т.д. Набор стандартных заголовочных файлов обеспечивает единообразный доступ к объявлениям функций и типов данных. Гарантируется переносимость программ, использующих при взаимодействии с операционной системой эту библиотеку. Большинство программ, составляющих библиотеку, созданы по образу и подобию стандартной библиотеки ввода-вывода системы UNIX. Эта библиотека описана в первом издании книги и широко используется в других системах. И здесь программисты не заметят существенных различий.

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

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

Си не является «строго типизированным» языком, но в процессе его развития контроль типов стал более жестким. В первой версии Си хоть и не одобрялась, но допускалась взаимозаменяемость указателей и целых, что вызвало большие нарекания. Подобная практика давно прекращена и стандарт требует наличия явного объявления или явного указания преобразования типа, что уже реализовано в хороших компиляторах. Новый синтаксис объявления функций — еще один шаг в этом направлении. Компилятор теперь предупреждает о большей части ошибок вызываемых несоответствием типов и не выполняет автоматическое преобразование данных несовместимых типов. Однако основная философия Си по прежнему предполагает, что программист знает, что он делает; язык лишь требует явного указания о намерениях.

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


Книга имеет следующую структуру. Глава 1 представляет собой обзор основных средств языка Си. Ее назначение — побудить читателя как можно быстрее приступить к программированию, так как мы убеждены, что единственный способ изучить новый язык — это писать на нем программы. Эта часть книги предполагает знание основ программирования программирования. Никаких пояснений того, что такое компьютер, компиляция или что означает выражение вида n = n + 1 не дается. Хотя мы и пытались там, где это возможно, показать полезные приемы программирования, эта книга не является справочником ни по структурам данных и алгоритмам; когда нам приходилось делать выбор, мы концентрировали внимание на языке.

В главах 2 – 6 различные средства языка обсуждаются более подробно и несколько более формально, чем в главе 1; при этом по-прежнему упор делается на примеры, являющиеся законченными программами, а не изолироваными фрагментами. Глава 2 знакомит с базовыми типами данных, с операторами и выражениями. В главе 3 рассматриваются средства управления последовательностью вычислений: if-else, switch, while, for и т.д. В главе 4 речь идет о функциях и структуре программы — внешних переменных, правилах видимости, делении программ на несколько исходных файлов и т.д. В этой же главе обсуждается препроцессор. В главе 5 обсуждаются указатели и адресная арифметика. Глава 6 посвящена структурам и объединениям.

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

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

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


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz