Керниган и Ритчи - Язык программирования Си (793773), страница 5
Текст из файла (страница 5)
Однако благодаря широким возможностям и универсальности для решения многих задач онудобнее и эффективнее, чем предположительно более мощные языки.Первоначально Си был создан Деннисом Ритчи как инструмент написания операционной системы UNIX длямашины PDP-11 и реализован в рамках этой операционной системы.
И операционная система, и Сикомпилятор, и, по существу, все прикладные программы системы UNIX (включая и те, которыеиспользовались для подготовки текста этой книги1) написаны на Си. Фирменные Си-компиляторы существуюти на нескольких машинах других типов, среди которых IBM/370, Honeywell 6000 и Interdata 8/32. Си непривязан к конкретной аппаратуре или системе, однако на нем легко писать программы, которые без какихлибо изменений переносятся на другие машины, где осуществляется его поддержка.Цель нашей книги — помочь читателю научиться программировать на Си. Издание включает введениеучебник, позволяющий новичкам начать программировать как можно скорее, а также главы, посвященныеосновным свойствам языка, и справочное руководство.
В ее основу положены изучение, написание ипроработка примеров, а не простое перечисление правил. Почти все наши примеры — это законченныереальные программы, а не разобщенные фрагменты. Все они были оттестированы на машине точно в томвиде, как приводятся в книге. Помимо демонстрации эффективного использования языка, там, где это быловозможно, мы стремились проиллюстрировать полезные алгоритмы и принципы хорошего стиля написанияпрограмм и их разумного проектирования.Эта книга не является вводным курсом по программированию.
Предполагается, что читатель знаком с такимиосновными понятиями, как "переменная", "присваивание", "цикл", "функция". Тем не менее и новичоксможет изучить язык, хотя для него будет очень полезным общение с более знающими специалистами.Наш опыт показал, что Си — удобный, выразительный и гибкий язык, пригодный для программированияширокого класса задач. Его легко выучить, и чем больше работаешь с Си, тем он становится удобнее. Мынадеемся, что эта книга поможет вам хорошо его освоить.Вдумчивая критика и предложения многих друзей и коллег помогали нам написать книгу. В частности, МайкБианки, Джим Блу, Стью Фелдман, Дуг Макилрой, Билл Рум, Боб Розин и Ларри Рослер со вниманием прочливсе многочисленные варианты этой книги. Мы в долгу у Ала Ахо, Стива Бьерна, Дана Дворака, Чака Хейли,Марион Харрис, Рика Холта, Стива Джонсона, Джона Машея, Боба Митца, Ральфа Мухи, Питера Нельсона,Эллиота Пинсона, Билла Плейджера, Джерри Спивака, Кена Томпсона и Питера Вайнбергера за полезныесоветы, полученные от них на различных стадиях подготовки рукописи, а также у Майка Леска и Джо Оссанныза помощь при подготовке ее к изданию.Брайан В.
Керниган,Деннис М. Ритчи1Имеется в виду оригинал этой книги на английском языке. — Примеч. пер.ВведениеСи — универсальный язык программирования. Он тесно связан с системой UNIX, так как был разработан вэтой системе, которая как и большинство программ, работающих в ней, написаны на Си. Однако язык непривязан жестко к какой-то одной операционной системе или машине. Хотя он и назван "языком системногопрограммирования", поскольку удобен для написания компиляторов и операционных систем, оказалось, чтона нем столь же хорошо писать большие программы другого профиля.Многие важные идеи Си взяты из языка BCPL, автором которого является Мартин Ричарде.
Влияние BCPL наСи было косвенным — через язык В, разработанный Кеном Томпсоном в 1970 г. для первой системы UNIX,реализованной на PDP-7.BCPL и В — "бестиповые" языки. В отличие от них Си обеспечивает разнообразие типов данных. Базовымитипами являются символы, а также целые и числа с плавающей точкой различных размеров. Кроме того,имеется возможность получать целую иерархию производных типов данных из указателей, массивов,структур и объединений.
Выражения формируются из операторов и операндов. Любое выражение, включаяприсваивание и вызов функции, может быть инструкцией. Указатели обеспечивают машинно-независимуюадресную арифметику.В Си имеются основные управляющие конструкции, используемые в хорошо структурированных программах:составная инструкция ({...}), ветвление по условию (if-else), выбор одной альтернативы из многих(switch), циклы с проверкой наверху (while, for) и с проверкой внизу (do), а также средство прерыванияцикла (break).В качестве результата функции могут возвращать значения базовых типов, структур, объединений иуказателей.
Любая функция допускает рекурсивное обращение к себе. Как правило, локальные переменныефункции — "автоматические", т. е. они создаются заново при каждом обращении к ней. Определенияфункций нельзя вкладывать друг в друга, но объявления переменных разрешается строить в блочноструктурной манере. Функции программы на Си могут храниться в отдельных исходных файлах икомпилироваться независимо. Переменные по отношению к функции могут быть внутренними и внешними.Последние могут быть доступными в пределах одного исходного файла или всей программы.На этапе препроцессирования выполняется макроподстановка в текст программы, включение другихисходных файлов и у словная компиляция.Си — язык сравнительно "низкого уровня".
Однако это вовсе не умаляет его достоинств, просто Си имеет делос теми же объектами, что и большинство компьютеров, т. е. с символами, числами и адресами. С ними,можно оперировать при помощи арифметических и логических операций, выполняемых реальнымимашинами.В Си нет прямых операций над составными объектами, такими как строки символов, множества, списки имассивы.
В нем нет операций, которые бы манипулировали с целыми массивами или строками символов,хотя структуры разрешается копировать целиком как единые объекты. В языке нет каких-либо средствраспределения памяти, помимо возможности определения статических переменных и стекового механизмапри выделении места для локальных переменных внутри функций. Нет в нем "кучи" и "сборщика мусора".Наконец, в самом Си нет средств ввода-вывода, инструкций READ (читать) и WRITE (писать) и каких-либометодов доступа к файлам.
Все это — механизмы высокого уровня, которые в Си обеспечиваютсяисключительно с помощью явно вызываемых функций. Большинство реализованных Си-систем содержат всебе разумный стандартный набор этих функций.В продолжение сказанного следует отметить, что Си предоставляет средства лишь последовательногоуправления ходом вычислений: механизм ветвления по условиям, циклы, составные инструкции,подпрограммы — и не содержит средствсинхронизации и организации сопрограмм.мультипрограммирования,параллельныхпроцессов,Отсутствие некоторых из перечисленных средств может показаться серьезным недостатком ("выходит, чтобысравнить две строки символов, нужно обращаться к функции?"). Однако компактность языка имеет реальныевыгоды.
Поскольку Си относительно мал, то и описание его кратко, и овладеть им можно быстро.Программист может реально рассчитывать на то, что он будет знать, понимать и на практике регулярнопользоваться всеми возможностями языка.В течение многих лет единственным определением языка Си было первое издание книги "Языкпрограммирования Си". В 1983 г. Институтом американских национальных стандартов (ANSI) учреждаетсякомитет для выработки современного исчерпывающего определения языка Си.
Результатом его работыявился стандарт для Си ("ANSI-C"), выпущенный в 1988 г. Большинство положений этого стандарта уже учтенов современных компиляторах.Стандарт базируется на первоначальном справочном руководстве. По сравнению с последним языкизменился относительно мало. Одной из целей стандарта было обеспечить, чтобы в большинстве случаевсуществующие программы оставались правильными или вызывали предупреждающие сообщениякомпиляторов об изменении поведения.Для большинства программистов самое важное изменение — это новый синтаксис объявления иопределения функций. Объявление функции может теперь включать и описание ее аргументов. Всоответствии с этим изменился и синтаксис определения функции.
Дополнительная информация значительнооблегчает компилятору выявление ошибок, связанных с несогласованностью аргументов; по нашему мнению,это очень полезное добавление к языку.Следует также отметить ряд небольших изменений. В языке узаконены присваивание структур иперечисления, которые уже некоторое время широко используются. Вычисления с плавающей точкой теперьдопускаются и с одинарной точностью. Уточнены свойства арифметики, особенно для беззнаковых типов.Усовершенствован препроцессор.
Большинство программистов эти изменения затронут очень слабо.Второй значительный вклад стандарта — это определение библиотеки, поставляемой вместе с Сикомпилятором, в которой специфицируются функции доступа к возможностям операционной системы(например чтения-записи файлов), форматного ввода-вывода, динамического выделения памяти,манипуляций со строками символов и т.
д. Набор стандартных заголовочных файлов обеспечиваетединообразный доступ к объявлениям функций и типов данных. Гарантируется, что программы,использующие эту библиотеку при взаимодействии с операционной системой, будут работать также и надругих машинах. Большинство программ, составляющих библиотеку, созданы по образу и подобию"стандартной библиотеки ввода-вывода" системы UNIX. Эта библиотека описана в первом издании книги ишироко используется в других системах. И здесь программисты не заметят существенных различий.Так как типы данных и управляющих структур языка Си поддерживаются командами большинствасуществующих машин, исполнительная система (run-time library), обеспечивающая независимый запуск ивыполнение программ, очень мала. Обращения к библиотечным функциям пишет сам программист (некомпилятор), поэтому при желании их можно легко заменить на другие. Почти все программы, написанныена Си, если они не касаются каких-либо скрытых в операционной системе деталей, переносимы на другиемашины.Си соответствует аппаратным возможностям многих машин, однако он не привязан к архитектуре какой-либоконкретной машины.















