Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

Дополнительная литература

В книге Брайана Кернигана и Роба Пайка "The Unix Programming Environment" (Brian Kernighan, Rob Pike. The Unix Programming Environment. Prentice Hall, 1984) широко обсуждается инструменталь­ный подход к программированию, который так хорошо поддерживается в Unix. В восьмой главе ее содержится полная реализация — от грамма­тики уасс до выполнимого кода — простого языка программирования.

Дон Кнут в своей книге "ТЕХ: The Program" (Don Knuth. TEX: The Program. Addison-Wesley, 1986) описывает этот сложнейший текстовый процессор, приводя всю программу целиком — около 13 000 строк на Pascal — в стиле "грамотного программирования"21, при котором пояснения комбинируются с текстом программы, а для форматирования документа­ции и выделения соответствующего кода используются соответствующие программы. То же самое для компилятора ANSI С проделано у Криса Фрейзера и Дэвида Хэнсона в книге "A Retargetable С Compiler" (Chris Eraser, David Hanson. A Retargetable С Compiler. Addison-Wesley, 1995).

Виртуальная машина Java описана в книге Тима Линдхольма и Фран­ка Еллина "Спецификация виртуальной Java-машины", 2-е издание (Tim Lindholm, Frank Yellin. The Java Virtual Machine Specification. 2nd ed. Addison-Wesley, 1999).

Кен Томпсон (Ken Thompson) описал свой алгоритм (это один из са­мых первых патентов в области программного обеспечения) в статье "Regular Expression Search Algorithm" в журнале Communications of the ACM (11, 6, p. 419-422, 1968). Работа с регулярными выражениями весьма подробно освещена в книге Джеффри Фридла "Mastering Regular Expressions" (Jeffrey Friedl. Mastering Regular Expressions. O'Reilly, 1997).

JIT-компилятор для операций двумерной графики описан в статье Роба Пайка, Барта Локанти (Bart Locanthi) и Джона Рейзера (John Reiser) "Hardware/Software Tradeoffs for Bitmap Graphics on the Blit", опубликованной в Software — Practice and Experience (15, 2, p. 131-152, February 1985).

Эпилог

Если бы люди могли учиться у истории, какие уроки она могла

бы нам преподать! Но страсть и компания слепят наши очи, и

свет, даваемый опытом, — как кормовой огонь, освещает

только волны позади нас.

Сэмюэль Тейлор Колридж. Воспоминания

Компьютерный мир постоянно изменяется, причем во все возраста­ющем темпе. Программисты вынуждены овладевать новым: новыми язы­ками, новыми инструментами и новыми системами и, конечно, измене­ниями, не совместимыми со старым. Программы становятся все объемнее, интерфейсы все сложнее, а сроки все жестче.

Однако есть некоторые неизменные моменты, позволяющие осмыс­лить уроки прошлого, что может помочь в будущем. Основные вопросы, освещенные в этой книге, базируются как раз на этих неизменных кон­цепциях.

Простота и ясность — первые и наиболее важные среди этих ос­нов, поскольку все остальное так или иначе из них следует. Делайте все самым простым способом. Выбирайте наиболее простой алгоритм, кото­рый выглядит достаточно быстрым, и наиболее простую структуру дан­ных, позволяющую решить поставленную задачу; объединяйте их про­стым, понятным кодом. Не усложняйте ничего до тех пор, пока в этом не возникнет настоятельной необходимости, — например, пока замеры производительности не покажут неудовлетворительных результатов. Интерфейсы должны быть ограничены и лаконичны, по крайней мере до тех пор, пока не станет совершенно очевидно, что преимущества от ново­введений перевесят недостатки дополнительного усложнения.

Универсальность нередко идет рука об руку с простотой, поскольку является, по сути, возможностью решить проблему раз и навсегда (так сказать, "в общем виде"), а не возвращаться к ней снова и снова для рас­смотрения специфических случаев. Зачастую это является и хорошим подспорьем для обеспечения переносимости: лучше найти одно общее решение, которое будет работать во всех системах, чем разбираться в от­личительных особенностях каждой системы.

Далее стоит назвать эволюцию. Невозможно написать совершенную программу с первой попытки. Глубокое и всестороннее осознание про­блемы рождается только из сочетания размышлений и опыта; с помо­щью чисто умозрительных заключений не удастся создать хорошей сис­темы, как не удастся сделать этого и чистым хакерством. Очень важна реакция пользователей; наиболее эффективным будет цикл развития системы, включающий в себя создание прототипа, экспериментирова­ние, обратную связь с пользователем и дальнейшие усовершенствова­ния. Программы, которые мы пишем для себя, часто не развиваются достаточным образом; большие программы, которые мы покупаем у дру­гих, изменяются слишком быстро без нужного улучшения.

Интерфейсы являются одним из камней преткновения в программи­ровании, и аспекты, связанные с ними, проявляются во многих местах. Наиболее очевидный случай — библиотеки, но существуют еще интер­фейсы между программами и между пользователями и программами. В проектировании интерфейсов идеи простоты и универсальности име­ют особое значение. Делайте интерфейсы как можно более последова­тельными, чтобы их можно было без труда выучить и использовать; к этому надо подойти очень тщательно. Эффективным способом являет­ся абстрагирование: представьте себе идеальный компонент, библиоте­ку или программу; постарайтесь, чтобы ваш интерфейс как можно более полно соответствовал такому идеалу; спрячьте детали реализации — от греха подальше.

Роль автоматизации часто недооценивается. Гораздо эффективнее заставить компьютер выполнять вашу работу, чем делать ее вручную. Мы увидели примеры применения автоматизации при тестировании, отладке, анализе производительности и, что особенно важно, в написа­нии кода, когда для решения конкретной задачи программы могут пи­сать программы, которые было бы трудно написать вручную.

Нотация также зачастую недооценивается; и не только в качестве способа, которым программист сообщает компьютеру, что надо сделать. Способ записи представляет собой основу для реализации широкого спектра инструментов, а также обусловливает структуру программы, предназначенной для написания программ. Мы все хорошо владеем большими языками общего назначения, которые служат нам для созда­ния основной части наших программ. Однако, как только задания стано­вятся настолько специализированными и хорошо понятными, что за­программировать их можно почти механически, стоит задуматься о том, чтобы создать нотацию, в которой задание выражалось бы естественно, и язык, реализующий эту нотацию. Регулярные выражения — один из наших любимых примеров, но возможностей создания рабочих языков для специализированных приложений существует бесчисленное множе ство. Для того чтобы дать хорошие результаты, языки эти вовсе не долж­ны быть сложны.

У рядового программиста может иногда возникнуть ощущение что он является винтиком в огромной машине: ему приходится использо­вать навязанные ему языки, системы и инструменты, выполняя задания которые должны были бы быть уже сделаны для него и за него. Однако, по большому счету, наша работа оценивается по тому, как много мы мо­жем сделать с помощью того, что у нас есть. Применяя идеи, изложен­ные в этой книге, вы обнаружите, что с вашим кодом стало удобнее рабо­тать, отладка стала гораздо менее болезненным процессом, да и в своих программах вы стали более уверены. Мы надеемся, что эта книга дала вам что-то, что сделает программирование более продуктивным и ус­пешным для вас.

Приложение:

свод правил

Каждая открытая мной истина становилась правилом,

которое слу­жило мне в дальнейшем для поиска других

истин.

Рене Декарт. Рассуждение о методе

Во многих главах были выделены правила или какие-то основные мо­менты, подводящие итог обсуждению. Для удобства поиска правила со­браны здесь воедино. Не забывайте, что в соответствующих частях кни­ги объясняется назначение и способы применения этих правил.

Стиль

Используйте осмысленные имена для глобальных переменных и короткие — для

локальных.

Будьте последовательны.

Используйте активные имена для функций.

Будьте точны.

Форматируйте код, подчеркивая его структуру.

Используйте естественную форму выражений.

Используйте скобки для устранения неясностей.

Разбивайте сложные выражения.

Будьте проще.

Будьте осторожны с побочными эффектами.

Будьте последовательны в применении отступов и фигурных скобок.

Используйте идиомы для единства стиля.

Используйте else-if для многовариантных ветвлений.

Избегайте макрофункций.

Заключайте тело макроса и аргументы в скобки.

Давайте имена загадочным числам.

Определяйте числа как константы, а не как макросы.

Используйте символьные константы, а не целые.

Используйте средства языка для определения размера объекта.

Не пишите об очевидном.

Комментируйте функции и глобальные данные.

Нe комментируйте плохой код, а перепишите его.

Не противоречьте коду.

Вносите ясность, а не сумятицу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]