Иллюстрированный самоучитель по практике программирования

Введение

В главе 3 описываются проектирование и реализация небольшой программы, которая иллюстрирует применение алгоритмов и структур данных в реальном программировании. Программа реализована на пяти языках; сравнение версий позволяет увидеть, как в них обрабатываются одни и те же структуры данных и как в зависимости от языка изменяются выразительные возможности и производительность.

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

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

Тестирование – это попытка дать разумное обоснование работоспособности программы. Глава 6 посвящена систематическому тестированию программ как вручную, так и с помощью компьютера. Тесты на граничные условия проверяют потенциальные слабые места программ. Механизация и специальная тестовая оснастка позволяют осуществлять комплексное тестирование с достаточно скромными затратами. Особым типом тестов являются стрессовые тесты, они проверяют устойчивость программ.

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

В главе 8 разговор идет о переносимости. Удачные программы живут достаточно долго, так что меняются системы, в которых их используют; нередко приходится переносить их на другие платформы или на другие машины или использовать в других странах. Смысл переносимости в том, чтобы уменьшить расходы на поддержание программы, минимизировав количество изменений, необходимых для адаптации к новому окружению.

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

Разговор о программировании, естественно, не может обойтись без демонстрации изрядного количества кода. Большинство примеров написано специально для этой книги, но некоторые небольшие фрагменты были взяты из ранее написанных программ. Мы очень старались писать свой код хорошо; все примеры тестировались на нескольких системах. Дополнительную информацию можно получить на web-сайте, посвященном этой книге (в английском варианте – The Practice of Programming): http://tpop.awl.com.

Большинство программ написано на С; есть примеры на C++ и Java; предпринят и краткий экскурс в языки скриптов. На нижнем уровне С и C++ практически идентичны, так что наши программы на С являются вполне приемлемыми программами на C++. Языки C++ и Java – прямые наследники С, они унаследовали изрядную долю синтаксиса, эффективности и выразительности С, добавив более широкие системы типов и библиотек. Мы сами в повседневной работе широко используем и эти три языка, и множество других. Выбор языка зависит от задачи: операционные системы лучше всего писать на эффективном и не давящем языке вроде С или C++; создавать на скорую руку прототипы проще на командных интерпретаторах или языках скриптов вроде Awk или Perl; для пользовательских интерфейсов хорошо подходят Visual Basic, Tcl/Tk и Java.

В выборе языка для наших примеров есть глубокий педагогический смысл. Поскольку нет языка, который был бы одинаково хорош для решения всех задач, ни один конкретный язык не может лучшим образом представить все аспекты. Языки высокого уровня предопределяют некоторые проектные решения. Если же мы используем язык низкого уровня, мы получаем возможность для альтернативных решений проектных вопросов; показывая больше подробностей, мы можем обсуждать эти вопросы лучше. Опыт учит, что даже при использовании возможностей языка высокого уровня важно понимать, как они соотносятся с низким уровнем, без такого понимания можно упереться в проблемы производительности и загадочного поведения программы. Поэтому часто мы используем в своих примерах язык С, даже в тех случаях, когда в реальной работе мы бы выбрали какой-нибудь другой язык.

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

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.