Язык С в XXI веке
Покупка
Тематика:
Программирование на C и C++
Издательство:
ДМК Пресс
Автор:
Клеменс Бен
Перевод:
Слинкин Алексей Александрович
Год издания: 2015
Кол-во страниц: 376
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-97060-101-3
Артикул: 712435.01.99
Язык С — не просто фундамент всех современных языков программирования, он и сам — современный язык, идеальный для написания эффективных приложений передового уровня. Последние 20 лет С не стоял на месте. Сам язык и окружающая его экосистема подвергаются пересмотру. Эта книга начинается там, где другие заканчиваются. В ней рассказано, как изменилась функциональность, поддерживаемая любым компилятором, благодаря двум новым стандартам С, вышедшим со времен оригинального ANSI. Цель книги - рассмотреть то, чего нет в других учебниках по С: инструменты и окружение; библиотеки для работы со связанными списками и анализаторами XML; написание удобочитаемого кода с дружественным программным интерфейсом. Издание предназначено для программистов, имеющих опыт работы на каком-либо языке и обладающими базовыми знаниями о С.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Язык С в XXI веке Бен Клеменс
21st Century C Ben Klemens
Язык С в XXI веке Москва, 2015 Бен Клеменс
УДК 004.6 ББК 32.973.26 К48 Клеменс Бен К48 Язык С в XXI веке / пер. с англ. А. А. Слинкина. – М.: ДМК Пресс, 2015. – 376 с.: ил. ISBN 978-5-97060-101-3 Язык C — не просто фундамент всех современных языков программирования, он и сам — современный язык, идеальный для написания эффективных приложений передового уровня. Последние 20 лет C не стоял на месте. Сам язык и окружающая его экосистема подвергаются пересмотру. Эта книга начинается там, где другие заканчиваются. В ней рассказано, как изменилась функциональность, поддерживаемая любым компилятором, благодаря двум новым стандартам C, вышедшим со времен оригинального ANSI. Цель книги – рассмотреть то, чего нет в других учебниках по C: инструменты и окружение; библиотеки для работы со связанными списками и анализаторами XML; написание удобочитаемого кода с дружественным программным интерфейсом. Издание предназначено для программистов, имеющих опыт работы на каком-либо языке и обладающими базовыми знаниями о С. УДК 004.6 ББК 32.973.26 Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-1-491-90389-6 (анг.) Copyright © 2015 Ben Klemens ISBN 978-5-97060-101-3 (рус.) © Оформление, перевод, ДМК Пресс, 2015
Содержание Предисловие .................................................................11 Часть I Окружение ......................................................23 Глава 1 Настраиваем среду для компиляции ...................24 Работа с менеджером пакетов ..................................................................................................25 Компиляция программ на C в Windows ...............................................................................27 POSIX в Windows .................................................................................................................27 Компиляция программ на C при наличии подсистемы POSIX ...........................28 Компиляция программ на C в отсутствие подсистемы POSIX ...........................29 Как пройти в библиотеку? ........................................................................................................30 Несколько моих любимых флагов ..................................................................................32 Пути ...........................................................................................................................................33 Компоновка во время выполнения ................................................................................36 Работа с файлами makefile ........................................................................................................36 Задание переменных ...........................................................................................................37 Правила ....................................................................................................................................40 Сборка библиотек из исходного кода ...................................................................................43 Сборка библиотек из исходного кода (даже если системный администратор против) .....................................................................................................................................45 Компиляция C-программы с помощью встроенного документа ................................46 Включение файлов-заголовков из командной строки ............................................46 Универсальный заголовок .................................................................................................47 Встроенные документы ......................................................................................................48 Компиляция из stdin ...........................................................................................................50 Глава 2 Отладка, тестирование, документирование .........51 Работа с отладчиком ...................................................................................................................51 Отладка программы как детективная история ..................................................................53 Переменные GDB .................................................................................................................62 Распечатка структур ............................................................................................................63 Использование Valgrind для поиска ошибок .....................................................................67 Автономное тестирование .........................................................................................................69 Использование программы в качестве библиотеки .................................................72 Покрытие .................................................................................................................................73 Встроенная документация ........................................................................................................74 Doxygen ....................................................................................................................................74 Грамотное программирование с помощью CWEB ....................................................76 Проверка ошибок .........................................................................................................................78 Ошибки и пользователи .....................................................................................................78 Учет контекста, в котором работает пользователь ....................................................80 Как следует возвращать уведомление об ошибке? ...................................................81
Содержание Глава 3 Создание пакета для проекта ............................83 Оболочка .........................................................................................................................................84 Замена команд оболочки их выводом ...........................................................................84 Применение циклов for в оболочке для обработки набора файлов ....................86 Проверка наличия файла ...................................................................................................88 Команда fc ...............................................................................................................................90 Файлы makefile и скрипты оболочки ....................................................................................92 Создание пакета с помощью Autotools .................................................................................95 Пример работы с Autotools ...............................................................................................96 Описание Makefile с помощью Makefile.am ............................................................. 100 Скрипт configure ................................................................................................................ 104 Глава 4 Управление версиями ....................................108 Получение списка отличий с помощью diff ..................................................................... 109 Объекты Git ................................................................................................................................ 110 Тайник ................................................................................................................................... 114 Деревья и их ветви .................................................................................................................... 115 Объединение ....................................................................................................................... 116 Перемещение ....................................................................................................................... 117 Дистанционные репозитории ............................................................................................... 118 Глава 5 Мирное сосуществование ...............................121 Динамическая загрузка ........................................................................................................... 121 Ограничения динамической загрузки ........................................................................ 124 Процесс ......................................................................................................................................... 124 Писать так, чтобы можно было понять ...................................................................... 124 Функция-обертка .............................................................................................................. 125 Контрабанда структур данных через границу ......................................................... 126 Компоновка ......................................................................................................................... 128 Python как включающий язык ............................................................................................. 128 Компиляция и компоновка ............................................................................................ 129 Условный подкаталог для Automake .......................................................................... 130 Distutils при поддержке Autotools ............................................................................... 131 Часть II Язык ............................................................134 Глава 6 Ваш приятель – указатель ...............................136 Автоматическая, статическая и динамическая память ................................................ 136 Автоматическая .................................................................................................................. 137 Статическая ......................................................................................................................... 137 Динамическая ..................................................................................................................... 137 Переменные для хранения постоянного состояния ..................................................... 140 Указатели без malloc ................................................................................................................ 142
Содержание 7 Структуры копируются, для массивов создаются псевдонимы ........................ 143 malloc и игрища с памятью ............................................................................................. 146 Виноваты звезды ................................................................................................................ 147 Все, что нужно знать об арифметике указателей ................................................... 148 Typedef как педагогический инструмент ................................................................... 150 Глава 7 Несущественные особенности синтаксиса C, которым в учебниках уделяется чрезмерно много внимания ....................................................................153 Ни к чему явно возвращать значение из main ................................................................ 154 Пусть объявления текут свободно ...................................................................................... 154 Меньше приведений ................................................................................................................ 157 Перечисления и строки ........................................................................................................... 159 Метки, goto, switch и break .................................................................................................... 160 К вопросу о goto ................................................................................................................. 161 Предложение switch ......................................................................................................... 163 Нерекомендуемый тип float .................................................................................................. 164 Сравнение чисел без знака ..................................................................................................... 167 Безопасное преобразование строки в число .................................................................... 168 Глава 8 Важные особенности синтаксиса C, которые в учебниках часто не рассматриваются ............................171 Выращивание устойчивых и плодоносящих макросов ............................................... 172 Приемы работы с препроцессором .............................................................................. 176 Проверочные макросы ..................................................................................................... 179 Защита заголовков ............................................................................................................ 181 Компоновка с ключевыми словами static и extern ........................................................ 183 Переменные с внешней компоновкой в файлах-заголовках .............................. 184 Ключевое слово const .............................................................................................................. 186 Форма существительное–прилагательное ............................................................... 187 Конфликты .......................................................................................................................... 187 Глубина .................................................................................................................................. 188 Проблема char const **..................................................................................................... 189 Глава 9 Текст ...........................................................192 Безболезненная обработка строк с помощью asprintf .................................................. 192 Безопасность ....................................................................................................................... 195 Константные строки ......................................................................................................... 196 Расширение строк с помощью asprintf ....................................................................... 197 Песнь о strtok .............................................................................................................................. 199 Unicode ......................................................................................................................................... 203 Кодировка для программ на C ...................................................................................... 205 Библиотеки для работы с Unicode .............................................................................. 206 Пример кода ........................................................................................................................ 208
Содержание Глава 10 Улучшенная структура ..................................211 Составные литералы ................................................................................................................ 212 Инициализация с помощью составных литералов ................................................ 213 Макросы с переменным числом аргументов ................................................................... 213 Безопасное завершение списков .......................................................................................... 215 Несколько списков ................................................................................................................... 216 Foreach .......................................................................................................................................... 217 Векторизация функции .......................................................................................................... 218 Позиционные инициализаторы ........................................................................................... 219 Инициализация массивов и структур нулями ............................................................... 221 Псевдонимы типов спешат на помощь .............................................................................. 222 К вопросу о стиле .............................................................................................................. 224 Возврат нескольких значений из функции ...................................................................... 225 Извещение об ошибках ........................................................................................................... 226 Гибкая передача аргументов функциям ............................................................................ 228 Объявление своей функции по аналогии с printf ................................................... 229 Необязательные и именованные аргументы ............................................................ 231 Доведение до ума бестолковой функции .................................................................. 233 Указатель на void и структура, на которую он указывает ........................................... 239 Функции с обобщенными входными параметрами ............................................... 239 Обобщенные структуры .................................................................................................. 244 Глава 11 Объектно-ориентированное программирование на C .................................................249 Расширение структур и словарей ........................................................................................ 251 Реализация словаря .......................................................................................................... 253 С без зазоров........................................................................................................................ 257 Функции в структурах ............................................................................................................ 261 V-таблицы ............................................................................................................................ 265 Область видимости .................................................................................................................. 270 Закрытые элементы структуры .................................................................................... 271 Перегрузка ................................................................................................................................... 272 _Generic ................................................................................................................................. 274 Подсчет ссылок .......................................................................................................................... 277 Пример: объект подстроки ............................................................................................. 277 Пример: основанная на агентах модель формирования групп .......................... 281 Заключение .......................................................................................................................... 288 Глава 12 Параллельные потоки ...................................290 Окружение ................................................................................................................................... 291 Составные части ................................................................................................................. 292 OpenMP ........................................................................................................................................ 293 Компиляция для использования OpenMP ............................................................... 294
Содержание 9 Интерференция .................................................................................................................. 295 Map-reduce ........................................................................................................................... 296 Несколько задач ................................................................................................................. 297 Поточная локальность ............................................................................................................. 299 Локализация нестатических переменных ................................................................. 300 Разделяемые ресурсы .............................................................................................................. 300 Атомы ..................................................................................................................................... 305 Библиотека pthread .................................................................................................................. 307 Атомы C ........................................................................................................................................ 311 Атомарные структуры ...................................................................................................... 315 Глава 13 Библиотеки .................................................320 GLib ................................................................................................................................................ 320 Стандарт POSIX ........................................................................................................................ 321 Разбор регулярных выражений .................................................................................... 321 Использование mmap для очень больших наборов данных ............................... 326 Библиотека GNU Scientific Library .................................................................................... 328 SQLite ............................................................................................................................................ 331 Запросы ................................................................................................................................. 332 libxml и cURL ............................................................................................................................. 334 Эпилог ........................................................................338 Приложение Основные сведения о языке C ...................339 Структура .................................................................................................................................... 339 В C необходим этап компиляции, состоящий из одной команды .................... 340 Существует стандартная библиотека, это часть операционной системы ...... 341 Существует препроцессор .............................................................................................. 341 Существуют комментарии двух видов ....................................................................... 342 Нет ключевого слова print .............................................................................................. 342 Объявления переменных ........................................................................................................ 342 Любая переменная должна быть объявлена ............................................................ 342 Даже функции необходимо объявлять или определять ...................................... 343 Базовые типы можно агрегировать в массивы и структуры .............................. 344 Можно определять новые структурные типы ......................................................... 345 Можно узнать размер типа ............................................................................................. 346 Не существует специального типа строки ................................................................ 346 Функции и выражения ........................................................................................................... 347 Правила видимости в C очень просты ....................................................................... 347 Функция main имеет особый смысл ........................................................................... 348 Большая часть работы программы на C сводится к вычислению выражений ........................................................................................................................... 348 При вычислении функций используются копии входных аргументов .......... 349
Содержание Выражения заканчиваются точкой с запятой ......................................................... 349 Есть много сокращенных способов записи арифметических операций ........ 349 В C понятие истины трактуется расширительно ................................................... 350 Результатом деления двух целых всегда является целое .................................... 350 В C имеется тернарный условный оператор ............................................................ 351 Ветвления и циклы несильно отличаются от других языков ............................ 351 Цикл for – просто компактная форма цикла while ................................................ 352 Указатели ..................................................................................................................................... 353 Можно напрямую запросить блок памяти ............................................................... 354 Массивы – это просто блоки памяти, любой блок памяти можно использовать как массив ................................................................................................. 354 Указатель на скаляр – это по существу массив с одним элементом ................ 355 Существует специальная нотация для доступа к полям структур по указателю ........................................................................................................................ 356 Указатели позволяют изменять аргументы функции ........................................... 356 Любой объект где-то находится, и, значит, на него можно указать ................. 357 Глоссарий ...................................................................358 Библиография .............................................................363 Предметный указатель ..................................................365
Предисловие Это ли истинный панк-рок, Верный, как линия партии? Wilco, «Too Far Apart» Язык C и панк-рок В языке C совсем немного ключевых слов, немало острых углов и безграничные возможности. Он позволяет сделать абсолютно все. Его изучение можно сравнить с гитарными аккордами C, G и D – основные движения освоить легко, а потом всю жизнь можно совершенствоваться. Отвергающие C боятся скрытой в нем мощи, считая ее небезопасной. По всем рейтингам C неизменно занимает первое место среди языков, продвижение которых не спонсируется никакими корпорациями или фондами1. Языку уже 40 лет, то есть он достиг среднего возраста. Ребята, создавшие его, сделали это вопреки желанию руководства – полная аналогия с истоками панкрока, – но случилось это в 1970-х годах, и у языка было достаточно времени, чтобы стать популярным. Что происходило, когда панк-рок стал популярным? Зародившись в 1970-х годах, панк, безусловно, вышел с обочины на большую дорогу. Тиражи альбомов таких групп, как The Clash, The Offspring, Green Day и The Strokes, исчисляются миллионами экземпляров, а в местном супермаркете мне доводилось слышать легкие инструментальные переложения песен в стиле отпочковашегося от панкрока музыкального жанра «грандж». Бывший солист группы «Слиттер-Кинни» теперь ведет популярное комедийное шоу, в котором часто язвительно пародируются панк-рокеры2. В ответ на продолжающуюся эволюцию можно было бы занять жесткую позицию и сказать, что панк – это только то, что было в начале, а все остальное – легонький поп-панк для массовой аудитории. Блюстители традиций могут слушать свои пластинки 70-х годов, а когда бороздки износятся – скачать оцифрованное издание. А своих малолетних отпрысков одеть в «кенгурушки» – ностальгируя по группе «Рамонес». Чужим этого не понять. Кто-то, слыша слово «панк», представляет себе канувшее в историю явление 1970-х годов – что-то связанное с парнями, которые делали нечто необычное. Традиционалисты, которые все еще любят и слушают диски Игги Попа, ловят свой кайф, но от того впечатление, что панк закостенел и уже неактуален, лишь усиливается. 1 Это предисловие, вне всяких сомнений, многим обязано статье Криса Адамсона «Punk Rock Languages: A Polemic» по адресу http://pragprog.com/magazines/2011-03/punkrock-languages. 2 С такими стихами, как «Can’t get to heaven with a three-chord song», быть может, Слитера-Кинни стоило отнести к постпанку? К сожалению, на панк нет стандарта ИСО, на который можно было бы ориентироваться, решая, кого куда отнести.
Предисловие Почему именно OCaml? Однако вернемся в мир C. Тут тоже есть как традиционалисты, размахивающие знаменем со словами ANSI 89, так и люди, готовые использовать все, что реально работает, и даже не знающие, что код, который они пишут, в 1990-е годы нельзя было бы откомпилировать или запустить. Чужаки не замечают разницы. Они видят написанные в 1980-е книги, которые все еще лежат на прилавках, читают написанные в 1990-е онлайновые пособия, внимают упертым традиционалистам, которые настаивают, что и сегодня нужно писать, как тогда, и даже не понимают, что сам язык и его пользователи не застыли в развитии. Печально это – ведь они отказываются от поистине замечательных вещей. Эта книга о том, как порвать с традицией и вернуть C новизну панк-рока. Я не собираюсь сравнивать свой код с оригинальной спецификацией, изложенной в книге Кернигана и Ричи 1978 года. В моем смартфоне 512 мегабайт памяти, так зачем же авторы учебников по C продолжают на десятках страниц наставлять, как сократить размер исполняемого файла на несколько килобайтов? Я пишу этот текст на дешевеньком нетбуке, способном выполнять 3 200 000 000 машинных команд в секунду, так какое мне дело до разрядности операндов коман ды: 8 или 16? Мы же в любом случае пишем на C, поэтому наш удобочитаемый, но неидеально оптимизированный код все равно будет работать на порядок быстрее, чем сравнимый код на любом другом распухшем от обилия функциональности языке. Вопросы и ответы (или о параметрах этой книги) В. Чем эта книга отличается от других книг по C? О. Одни книги лучше написаны, другие даже занимательны, но у всех учебников по C есть одна общая особенность (а я прочитал их множество, в том числе [Deitel 2013], [Griffiths 2012], [Kernighan 1978], [Kernighan 1988], [Kochan 2004], [Oualline 1997], [Perry 1994], [Prata 2004] и [Ullman 2004]). По большей части, они были написаны до выхода стандарта C99 , в котором упрощены многие аспекты использования языка. А бывает и так, что в очередное издание книги просто включено несколько замечаний о новшествах, но нет никакого серьезного переосмысления способов работы с языком. Во всех говорится, что, возможно, существуют библиотеки, которые могут пригодиться в собственном коде, но, как правило, ни слова об инструментах установки и экосистеме, благодаря которой эти библиотеки оказываются надежными и в разумной степени переносимыми. Материал, изложенный в этих учебниках, по-прежнему остается в силе и не утратил ценности, только вот современный код на C мало напоминает тот, который приводится в предлагаемых примерах. Эта книга начинается там, где другие заканчиваются. Сам язык и окружающая его экосистема подвергаются пересмотру. Основная сюжетная линия – как пользоваться библиотеками для работы со связанными списками и анализаторами XML, а не разрабатывать собственные с нуля. Это книга о том, как писать удобочитаемый код с дружественным пользователю программным интерфейсом.
Предисловие 13 В. На кого рассчитана эта книга? На экспертов по кодированию? О. Предполагается, что у вас есть опыт кодирования на каком-нибудь языке, к примеру на Java или скриптовом языке типа Perl. Я не собираюсь объяснять, почему программа не должна быть одной длинной процедурой, не разбитой на функции. В тексте книги предполагается, что читатель обладает базовыми знаниями о C, приобретенными в процессе написания кода на этом языке. Для тех, кто подзабыл детали или вообще начинает с азов, в приложении А приводится краткий справочник по основам C, рассчитанный на владеющих такими скриптовыми языками, как Python или Ruby. Наверное, стоит упомянуть, что я написал также учебник по статистическим и научным расчетам «Modeling with Data» [Klemens 2008]. Помимо многочисленных деталей, относящихся к численным методам и использованию статистических моделей для описания данных, там имеется более развернутое и независимое руководство по C, в котором, надеюсь, мне удалось преодолеть многие недостатки прежних руководств. В. Я прикладной программист и не собираюсь копаться в ядре. Зачем мне писать на C, а не на скриптовом языке Python, на котором программировать куда быстрее? О. Если вы прикладной программист, то эта книга как раз для вас. Сколько раз я слышал утверждение, будто C – язык системного программирования; оно страшно далеко от панковского склада ума – да кто они такие, чтобы указывать нам, что можно писать, а что – нет? Высказывания типа «наш язык почти такой же быстрый, как C, но писать на нем проще» уже набили оскомину. Понятно же, что сам C такой же быстрый, как C, а задача этой книги – убедить вас в том, что писать на нем проще, чем это следует из книг десятилетней давности. Вызывать malloc и забираться в дебри управления памятью вам придется даже вполовину не так часто, как системному программисту 1990-х годов. У нас теперь есть простые средства для работы со строками, и даже базовый синтаксис изменился, чтобы сделать код понятнее. Я всерьез начал писать на C, когда понадобилось ускорить программу моделирования, написанную на скриптовом языке R. Как и многие другие скриптовые языки, R имеет интерфейс к C, которым предлагается пользоваться всякий раз, как включающий язык оказывается слишком медленным. В конечном итоге я переписал на C так много функций, что от включающего языка вообще отказался. В. То, что эта книга понравится прикладным программистам с опытом работы на скриптовых языках, конечно, прекрасно, но я-то занимаюсь кодом ядра. Я выучил C в пятом классе, у меня даже сны иногда успешно компилируются. Что тут для меня может быть нового? О. Последние 20 лет C не стоял на месте. Ниже я расскажу о том, как изменилась функциональность, гарантированно поддерживаемая любым компилятором, – благодаря двум новым стандартам C, вышедшим со времен оригинального стандарта ANSI. Загляните в главу 10, может статься, кое-что в ней вас удивит.
Предисловие В некоторых частях книги, например в главе 6, развенчивающей широко распространенные ошибочные представления об указателях, рассматриваются вещи, изменившиеся с 1980-х годов. Прогресс затронул и окружение. Многие рассматриваемые мной инструменты, например make и отладчик, вам, наверное, знакомы, но есть другие, не столь хорошо известные. Комплект инструментов Autotools полностью изменил представление о распространении кода, а система управления версиями Git знаменует новый подход к коллективной разработке кода. В. Не могу не отметить, что примерно в трети книги вообще нет кода на C. О. Цель этой книги – рассмотреть то, чего нет в других учебниках C, а первым номером в этом списке стоят инструменты и окружение. Если вы не пользуетесь отладчиком (автономным или входящим в IDE), то заметно усложняете себе жизнь. Во многих учебниках отладчик вынесен куда-то на задворки, если вообще упоминается. Для совместной работы над кодом нужен другой комплект инструментов, включающий среди прочего Autotools и Git. Код существует не в вакууме, и я полагал, что окажу читателям дурную услугу, написав еще одну книгу, основанную на предпосылке, будто знание синтаксиса – это все, что необходимо для продуктивного использования языка. В. Есть много средств для разработки программ на C. Какими критериями вы руководствовались при отборе? О. Сообщество пользователей C в большей степени, чем многие другие, озабочено следованием стандартам интероперабельности. Существует масса расширений C, предлагаемых в среде GNU, есть интегрированные среды (IDE), которые работают только в Windows, а также расширения компилятора, доступные лишь в LLVM (Low Level Virtual Machine – низкоуровневая виртуальная машина). Быть может, именно поэтому авторы прежних учебников боялись затрагивать тему инструментальных средств. Но в наши дни существуют системы, которые работают на всем, что мы обычно считаем компьютером. Многие являются частью проекта GNU ; LLVM со своим инструментарием быстро набирают популярность, но пока еще не являются преобладающими. Где бы вы ни работали – в Windows, в Linux, на экземпляре, только что полученном от поставщика облачных вычислений, – рассматриваемые здесь инструменты можно будет установить легко и быст ро. Я упомяну о нескольких платформенно-зависимых инструментах, но всякий раз буду явно отмечать это. Я не рассматриваю интегрированных сред разработки (IDE), потому что вряд ли найдутся такие, которые надежно работают на любой платформе (попробуйте поставить Eclipse и подключаемые к ней модули для С на экземпляр Amazon Elastic Compute Cloud), да к тому же выбор IDE в высшей степени субъективен. В состав типичной IDE входит система сборки проектов, которая обычно несовмес тима с аналогичной системой сборки из другой IDE. Поэтому файлы проектов IDE невозможно использовать для распространения проекта; исключением являются случаи, когда все заинтересованные лица обязаны работать с одной и той же IDE (учебные курсы, некоторые офисы, некоторые вычислительные платформы).
Предисловие 15 В. У меня есть Интернет. Чтобы посмотреть справку по команде или нюансы синтаксиса, хватит пары секунд, так зачем мне читать книгу? О. Истинная правда: чтобы посмотреть таблицу приоритетов операторов в системе Linux или Mac, достаточно набрать команду man operator. Почему же тогда я привожу ее в книге? У меня точно такой же Интернет, как у вас, и я немало времени провожу в нем, читая разные материалы. Поэтому я прекрасно знаю, о чем там не пишут, и это именно то, что я включил в книгу. Описывая новый инструмент, например gprof или GDB, я сообщаю то, что необходимо знать, чтобы сориентироваться и задать поисковой системе разумные вопросы, а также то, о чем умалчивают другие учебники (а это ой как много). Стандарты: как много девушек хороших Если явно не оговорено противное, весь код в книге соответствует стандартам ISO C99 и C11. Чтобы вы понимали, о чем идет речь, будет уместно дать краткий исторический обзор и перечислить основные стандарты языка C (опуская мелкие редакционные правки и исправления). K & R (примерно 1978) Деннис Ричи, Кен Томпсон и ряд сподвижников придумали язык для написания операционной системы Unix . Впоследствии Брайан Керниган и Деннис Ричи привели описание языка в первом издании своей книги. Это и был первый стандарт де-факто [Kernighan 1978]. ANSI C89 Компания Bell Labs передала курирование языка Американскому национальному институту стандартов (ANSI). В 1989-м был опубликован первый стандарт, содержавший ряд усовершенствований, по сравнению с K&R. Во второе издание книги K&R была включена полная спецификация языка, а это означало, что на рабочих столах десятков тысяч программистов появился экземпляр стандарта ANSI [Kernighan 1988]. В 1990 году стандарт ANSI был принят Международной организацией по стандартизации (ИСО) без существенных изменений, но ANSI 89 употребляется чаще (и встречается на футболках). Прошло десять лет. Язык C стал общепринятым в том смысле, что базовый код практически всех ПК и всех интернет-серверов написан на C; пожалуй, трудно вообразить более «общепринятое» творение человеческого разума. За это время от C откололся C++ и добился значительного успеха (хотя и не такого значительного, как C). Появление C++ стало лучшим, что когда-либо происходило с C. В то время как другие языки обзаводились дополнительными синтаксическими конструкциями, чтобы следовать в русле объектной ориентированности, и всякими другими фенечками, приходившими на ум их авторам, C строго придерживался стандарта. Те, кто хотел стабильности и переносимости, писали
Предисловие на C. Те же, кому были нужны все новые и новые возможности, чтобы купаться в них, как в ванне с шампанским, получили в свое распоряжение C++. И все были счастливы. ISO C99 Спустя десять лет C подвергся существенному пересмотру. Были добавлены средства для численных и научных расчетов, стандартный тип комплексных чисел и некоторые подобия обобщенных функций, адаптирующихся к типу аргументов. Включены некоторые удобные средства C++, включая однострочные комментарии (впервые появившиеся в предшественнике C – языке BCPL) и возможность объявлять переменные в заголовке цикла for. Упрощена работа со структурами – благодаря новым правилам объявления и инициализации и некоторым нотационным усовершенствованиям. Признано, что безопасность – не последнее дело и что не все в мире говорят поанглийски, и это тоже оказало влияние на модернизацию языка. Размышляя о том, сколько нового появилось в стандарте C89, и учитывая, что нет в мире компьютера, где бы не работал код на C, трудно представить, что ИСО мог придумать нечто такое, что не подверглось бы ожесточенной критике, – его ругали даже за отказ вносить те или иные изменения. И нельзя не признать, что стандарт оказался противоречивым. Существует два общепринятых способа представить комплексное число (в прямоугольных и в полярных координатах) – так почему ИСО отдал предпочтение только одному? Зачем нужен механизм макросов с переменным числом аргументов, если код прекрасно можно писать и без него? Иными словами, блюстители чистоты идеи обвиняли ИСО в том, что тот уступил давлению со стороны жаждущих новой функциональности. В настоящее время большинство компиляторов поддерживают C99 с некоторыми оговорками, например серьезные трудности вызывает тип long double. Однако есть одно заметное исключение из этого широкого консенсуса: корпорация Майкрософт отказывается включать поддержку C99 в свой компилятор Visual Studio C++. В разделе «Компиляция кода на C в Windows» ниже мы увидим некоторые из многочисленных способов откомпилировать код в Windows, так что отказ от Visual Studio – не более чем неудобство, а желание крупного рыночного игрока запретить нам использование стандартов ANSI и ISO только укрепляет дух панк-рока, свойственный C. C11 Сознавая справедливость обвинений в уступке давлению, ИСО внес серьезные изменения в третью редакцию стандарта. Стало возможно писать обобщенные функции, дальнейшее развитие получили также идеи безопасности и интернационализации. Стандарт C11 вышел в декабре 2011 года, но разработчики компиляторов на удивление быстро поддержали его. Сейчас большинство основных компиляторов заявляет о почти полном соответствии. Однако стандарт опреде