Язык программирования C от Керниган и Ричи

Лучшая книга на букву С!

Язык программирования C Кернигана и Ричи - лучшая книга о языке Си из всех существующих. Это небольшая книга, но, как сказано в предисловии, «C - небольшой язык, и для него не годится большая книга». Я полностью согласен. Книги размером с небольшую башню отпугивают потенциальных читателей и могут напугать.

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

Введение в учебное пособие

Книга начинается с вводного курса, в котором показаны основные элементы языка в реальных программах. Это скорее обзор, поэтому детали и правила не являются предметом внимания. В нем основное внимание уделяется основам: переменным и константам, арифметике, потоку управления, функциям и некоторому вводу и выводу.

Затем книга переходит к типам, операторам, выражениям, потоку управления и всем другим аспектам.

Незначительная критика

Если я и критиковал книгу, то это то, что важная информация часто прячется в середине абзаца. Без фанфар, текст не жирный, просто будет что-то вроде

Если символ, следующий за \, не является одним из указанных, поведение не определено.

(см. §A2.5.2 Символьные константы). Вы действительно не хотите неопределенного поведения в ваших программах¹. Несмотря на то, что эти крупицы важной информации не акцентируются, это небольшая проблема. Информация, необходимая для написания хороших программ на языке C, находится там, вам просто нужно внимательно ее прочитать. (В моем старом и хорошо вывернутом экземпляре книги я действительно подчеркиваю такой важный текст и помечаю его звездочкой на полях!)

Рекомендации по программированию на C ¹Glasswall содержит краткое изложение наиболее распространенных причин неопределенного поведения в языке C, его стоит прочитать.

Упражнения и их решения

Большинство глав книги заканчиваются упражнениями. Это того стоит. Однако мне нравится знать, что мои решения соответствуют передовой практике и являются надежными. Язык программирования C не предлагает этого, но вы можете купить The C Answer Book от Tondo & Gimpel, который предлагает решения для всех упражнений в книге. Сами по себе они предлагают очень полезную информацию о том, как разрабатывать и писать код на C (некоторые вопросы довольно сложные, другие - простые).

Полезные примеры кода

Соавтор Деннис Ричи разработал и реализовал язык C в операционной системе UNIX на DEC PDP-11. Брайан Керниган внес вклад в развитие UNIX. Эти технические знания означают, что примеры кода в книге могут быть полезны программистам и разработчикам, предоставляя некоторые полезные утилиты.

Например, одна из программ-примеров - getbits. Это получает указанное количество битов из указанной позиции в значении (из интереса, эта функция однострочная!). В упражнениях для этой главы читатель должен написать setbits, invert и rightrot. Все очень полезные функции при выделении битовых шаблонов в данных, как это делает Glasswall при судебном анализе документов.

С другой стороны, в главе Системный интерфейс Unix вы познакомитесь с разработкой и реализацией кода, который показывает, как использовать некоторые из наиболее важных системных вызовов из программы на языке C. Глава разделена на три основные части: ввод / вывод, файловая система и распределение памяти. Это все низкоуровневый код и дидактический характер; действительно очень поучительно!

Я довольно часто использовал две связанные программы, представленные в книге: dcl и undlc. dcl преобразует объявление C в словесное описание, а undcl преобразует его обратно. Например, если вы передадите это dcl

char (*(*x())[])()

Он будет отображать

“x is a function returning a pointer to an array of pointers to functions returning char”. 

Вы можете передать описание слова в undcl, и он отобразит синтаксис C. В этом случае мы используем сокращение для текстового описания, поэтому () используется для обозначения функции, [] означает массив, * означает указатель. Приведенное выше описание будет передано undlc следующим образом:

x () * [] * () char 

который отобразит объявление, показанное ранее. Программы наглядны и не являются пуленепробиваемыми. Улучшения оставлены в виде упражнений. Тем не менее, они очень полезны. (Хочется надеяться, что такие сложные декларации требуются нечасто!)

Приложения

Приложение А к книге содержит справочное руководство по языку. Приложение B представляет собой краткое изложение стандартной библиотеки (в нем опущены многобайтовые символы и обсуждение вопросов локали).

Резюме

Мое первоначальное предложение о том, что C - лучшая книга по программированию, звучит слегка иронично, но я не встречал книги по C, в которой также был бы представлен язык, причем в такой сжатой и по существу манере. Я очень рекомендую книгу.