С момента публикации в 1978 г. книги «Язык программирования Си» в мире компьютеров произошла революция. Большие машины стали еще больше, а возможности персональных ЭВМ теперь сопоставимы с возможностями больших машин десятилетней давности. Язык Си за это время также изменился, хотя и не очень сильно; что же касается сферы применения Си, то она далеко вышла за рамки его начального назначения как инструментального языка операционной системы UNIX.
Рост популярности Си, накапливающиеся с годами изменения, создание компиляторов коллективами разработчиков, ранее не причастных к проектированию языка, — все это послужило стимулом к более точному и отвечающему времени определению языка по сравнению с первым изданием книги. В 1983 г. Американским институтом национальных стандартов (American National Standards Institute — ANSI) учреждается комитет, перед которым ставится цель выработать «однозначное и машинно-независимое определение языка Си», полностью сохранив при этом его стилистику. Результатом работы этого комитета и явился стандарт ANSI языка Си.
Стандарт формализует средства языка, которые в первом издании были только намечены, но не описаны, как, например, присваивание структурам и перечислимый тип; вводит новый вид описания функций, который позволяет проводить повсеместную проверку согласованности вызовов функции с ее определением; специфицирует стандартную библиотеку с широким набором функций ввода-вывода, управления памятью, манипуляций со стрингами (цепочками литер) и другими функциями; уточняет семантику, которая в первоначальном определении была неясной, и явно очерчивает то, что остается машинно-зависимым.
Второе издание книги «Язык программирования Си» описывает версию Си, принятую в качестве стандарта ANSI. Мы решили описать язык заново, отметив при этом те места, в которых он претерпел изменения. В большинство разделов это не привнесло существенных изменений, самые заметные различия касаются новой формы описания и определения функции. Следует отметить, что современные компиляторы уже обеспечили поддержку значительной части свойств стандарта.
Мы попытались сохранить краткость первого издания. Си — небольшой язык, и в качестве описания ему мало подходит большая книга. В новом издании улучшено описание наиболее важных средств, таких, как указатели, которые занимают центральное место в программировании на Си; доработаны старые примеры, а в некоторые главы добавлены новые. Так, для усиления трактовки сложных деклараций в качестве примеров включены программы перевода деклараций в их словесные описания и обратного преобразования. Все примеры, текст которых хранится в машине, протестированы строго в том виде, как они приведены в книге.
Приложение A — справочное руководство, но отнюдь не документ стандарта. В нем мы попытались «предметы первой необходимости языка» уложить на минимуме страниц. По замыслу это приложение должно легко читаться программистом-пользователем; для разработчиков компилятора в качестве определения языка предназначен сам стандарт. В приложении В собраны функции стандартной библиотеки. Оно также представляет собой справочник для программистов, но не для реализаторов. Приложение C содержит краткий перечень отличий от начальной версии языка.
В предисловии к первому изданию мы говорили о том, что «чем больше работаешь с Си, тем он становится удобнее». Это впечатление только усилилось после десяти лет работы с ним. Мы надеемся, что данная книга поможет вам изучить Си и успешно его использовать.
Мы в большом долгу перед друзьями, которые помогали нам в выпуске второго издания. Джон Бентли, Дуг Гунн, Дуг Макилрой, Питер Нельсон и Роб Пайк дали нам четкие замечания почти по каждой странице первого варианта рукописи. Мы благодарны Алу Ахо, Деннису Аллиссону, Джою Кемпбеллу, Г.Р.Эмлину, Карей Фортганг, Аллену Голубу, Эндрю Хьюму, Дэйву Кристолу, Джону Линдерману, Дэйву Проссеру, Гину Спаффорду и Крис Ван Уику за внимательное прочтение книги. Мы получили полезные советы от Била Чезвика, Марка Кернигана, Эндрю Коэнига, Робина Лейка, Тома Лондона, Джима Ридза, Кловиза Тондо и Питера Вайнбергера. Дэйв Проссер ответил на многочисленные вопросы, касающиеся деталей стандарта ANSI. Мы широко пользовались транслятором с Си++ Бьерна Строустрапа для локальной проверки наших программ, а Дэйв Кристол предоставил нам ANSI-Си-компилятор для окончательной их проверки. Рич Дрешлер очень помог в наборе книги.
Мы искренне благодарим всех.