- •1. Стиль 10
- •3. Проектирование и реализация 63
- •4. Интерфейсы 85
- •5. Отладка 115
- •6. Тестирование 134
- •7. Производительность 157
- •8. Переносимость 180
- •9. Нотация 203
- •Введение
- •Брайан в. Керниган
- •1.1. Имена
- •1.2. Выражения
- •Упражнение 1 -6
- •1.3. Стилевое единство и идиомы
- •1.4. Макрофункции
- •1.5. Загадочные числа
- •1.6. Комментарии
- •1.7. Стоит ли так беспокоиться?
- •Дополнительная литература
- •2.1. Поиск
- •2.2. Сортировка
- •2.3. Библиотеки
- •2.4. Быстрая сортировка на языке Java
- •2.5. "О большое"
- •2.6. Динамически расширяемые массивы
- •2.7. Списки
- •Упражнение 2-8
- •2.8. Деревья
- •Упражнение 2-15
- •2.10. Заключение
- •Дополнительная литература
- •Проектирование и реализация
- •3.1. Алгоритм цепей Маркова
- •3.2. Варианты структуры данных
- •3.3. Создание структуры данных в языке с
- •3.4. Генерация вывода
- •3.5.Java
- •Into the air. When water goes into the air it
- •3.7. Awk и Perl
- •3.8. Производительность
- •3.9. Уроки
- •Дополнительная литература
- •4. Интерфейсы
- •4.1. Значения, разделенные запятой
- •4.2. Прототип библиотеки
- •4.3. Библиотека для распространения
- •Упражнение 4-4
- •4.5 Принципы интерфейса
- •4.6. Управление ресурсами
- •4.7. Abort, Retry, Fail?
- •4.8. Пользовательские интерфейсы
- •Дополнительная литература
- •5. Отладка
- •5.1. Отладчики
- •5.2. Хорошие подсказки, простые ошибки
- •5.3, Трудные ошибки, нет зацепок
- •5.4. Последняя надежда
- •5.5. Невоспроизводимые ошибки
- •5.6. Средства отладки
- •5.7. Чужие ошибки
- •5.8. Заключение
- •Дополнительная литература
- •6. Тестирование
- •6.1. Тестируйте при написании кода
- •6.2. Систематическое тестирование
- •6.3. Автоматизация тестирования
- •6.4. Тестовые оснастки
- •6.5. Стрессовое тестирование
- •6.6. Полезные советы
- •6.7. Кто осуществляет тестирование?
- •6.8. Тестирование программы markov
- •6.9. Заключение
- •Дополнительная литература
- •7.Производительность
- •7.1. Узкое место
- •7.2. Замеры времени и профилирование
- •7.3. Стратегии ускорения
- •7.4. Настройка кода
- •7.5. Эффективное использование памяти
- •7.6. Предварительная оценка
- •7.7. Заключение
- •Дополнительная литература
- •8. Переносимость
- •8.1. Язык
- •8.2. Заголовочные файлы и библиотеки
- •8.3. Организация программы
- •8.4. Изоляция
- •8.5. Обмен данными
- •8.6. Порядок байтов
- •8.7. Переносимость и внесение усовершенствований
- •8.8. Интернационализация
- •8.9. Заключение
- •Дополнительная литература
- •9.1. Форматирование данных
- •9.2. Регулярные выражения
- •Упражнение 9-12
- •9.3. Программируемые инструменты
- •9.4. Интерпретаторы, компиляторы и виртуальные машины
- •9.5. Программы, которые пишут программы
- •9.6. Использование макросов для генерации кода
- •9.7. Компиляция "налету"
- •Дополнительная литература
- •Интерфейсы
- •Отладка
- •Тестирование
- •Производительность
- •Переносимость
7. Производительность 157
7.1. Узкое место....................................................................................................………158
7.2. Замеры времени и профилирование.....................................................………… 162
7.3. Стратегии ускорения.................................................................................…………166
7.4. Настройка кода...........................................................................................………. .169
7.5. Эффективное использование памяти...................................................………… 173
7.6. Предварительная оценка..........................................................................………….175
7.7. Заключение................................................................................. .................………. 178
Дополнительная литература..........................................................................…………..179
8. Переносимость 180
8.1. Язык.................................................................................................................……...181
8.2. Заголовочные файлы и библиотеки......................................................…………...186
8.3. Организация программы..........................................................................………….188
8.4. Изоляция........................................................................................................……….191
8.5. Обмен данными............................................................................................………..192
8.6. Порядок байтов.............................................................................................………..193
8.7. Переносимость и внесение усовершенствований.............................……………..197
8.8. Интернационализация........................................................................…………........199
8.9. Заключение...................................................................................................…………201
Дополнительная литература..........................................................................………….…201
9. Нотация 203
9.1. Форматирование данных..........................................................................…………...203
9.2. Регулярные выражения.............................................................................………… ..210
9.3. Программируемые инструменты...........................................................…………….216
9.4. Интерпретаторы, компиляторы и виртуальные машины..............……………… ..219
9.5. Программы, которые пишут программы.............................................……………...225
9.6. Использование макросов для генерации кода...................................……………….228
9.7. Компиляция "налету"...............................................................................……………229
Дополнительная литература...........................................................................……………233
Эпилог 234
Приложение: свод правил 236
Стиль.......................................................................................................................………..236
Интерфейсы..........................................................................................................…………236
Отладка.................................................................................................................……….....237
Тестирование........................................................................................................…………237
Производительность..........................................................................................…………..237
Переносимость.....................................................................................................…………238
Предисловие
редактора перевода
Программировать трудно. Программировать хорошо — очень трудно. И о том, как нужно правильно программировать, пишут много. Но... сколько людей — столько мнений, и часто создатели очередной стройной системы программирования становятся жертвами этой стройности. Объявляют, например, что имена перемaенных должны быть осмысленными, и пишут (не преувеличивая):
basicmatrix[basicmatrixrow, basicmatrixcolumn] :=
basicmatrix[basicmatrixrow, basicmatrixcolumn] + 1;
начинают следить за правильными отступами и превращают программу в бесконечную кишку; заявляют, что "структурное программирование" и "программирование без goto" — это синонимы, и "из принципа" уродуют программную логику, лишь бы извести опальный оператор.
Эта книга НЕ ТАКАЯ. В ней систематически изложен колоссальный опыт известных специалистов — известных авторов (в том числе авторов книг, переведенных на русский язык) и известных программистов (разрабатывавших ОС UNIX, язык программирования Си, язык скриптов AWK, систему полиграфической подготовки текстов TROFF, во многом повлиявшую на ТЕХ Д. Кнута), а также их многочисленных коллег. Книга учит тому, как надо программировать: как разрабатывать программу, как ее писать, как отлаживать, какие средства выбирать. Интересно, что рекомендации даже слегка противоречат друг другу, тем самым делая невозможным их использование "оголтелыми пуристами". Сам стиль изложения, вся книга побуждают к разумному выбору сбалансированных средств. С моей точки зрения, эта книга нужна каждому активно работающему программисту.
Может быть, мне она так понравилась потому, что, не будучи в состоянии так красиво все это написать, по самим рекомендациям я был с авторами почти во всем согласен. Многим из этих рекомендаций я следую уже много лет, другие, новые для меня, оказывались вполне по душе и сразу же брались на вооружение. Все время хотелось восклицать "И я..." или "А я...", скажем: "И я предпочитаю отладчикам свои отладочные печати", "А я еще использую отладочные печати, создающие ПостСкрип-товый файл". Некоторые из несдерживаемых эмоций нашли выход в примечаниях (все подстрочные примечания появились в книге в процессе перевода).
Я надеюсь, что "Практику программирования" ждет у российского
читателя не меньший успех, чем был (и есть) у других книг этих
авторов.
И. В. Романовский
