Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Какойm

инструмент необходим?

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

171Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Если же после модификации сгенерированного кода вы снова запусти% те помощник, вся ваша ручная работа будет, увы, стерта.

Можно даже самому писать скрипты, чтобы генерировать повторяю% щиеся разделы кода. Иногда это свидетельствует о том, что ваш код недостаточно тщательно спроектирован. Но порой такой технический подход оправдан. Мне приходилось писать на Perl скрипты, которые автоматически генерировали для меня код. Когда я сам пишу такой генератор, то доверяю сгенерированному им коду. Посторонний про% граммист может отнестись к такому коду с недоверием, так же как к ре% зультату работы любого «чужого» генератора кода.

Декораторы кода

Эти инструменты обеспечивают единообразное форматирование кода, создавая расположение кода по принципу наименьшего общего крат# ного. Лично я считаю, что от них больше вреда, чем пользы – с одина% ковым успехом они могут как разрушить важное и полезное формати% рование, так и исправить его.

Средства построения кода

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

Компилятор

Это самый часто используемый инструмент программирования после редактора исходных текстов. Компиляторы преобразуют исходный код в исполняемый модуль, чтобы вы могли полюбоваться, как ваша программа отказывается работать. Этот инструмент используется столь часто, что совершенно необходимо научиться правильно им управ% лять. Известны ли вам все его параметры и возможности? Во многих компаниях есть особый мастер сборки, который следит за правиль% ным применением всех инструментов сборки, но даже наличие такой должности не освобождает вас от ответственности за знание своего компилятора.

Известно ли вам, какой уровень оптимизации следует применять и какое влияние он оказывает на генерируемый код? Это важно – в частности от вашего выбора зависит поведение кода в отладчике и выявление ошибок компиляции.

Включаете ли вы вывод всех предупреждений при компиляции? Если нет, вашему поведению нет оправдания (исключая сопровож% дение старого кода, уже пестрящего предупреждениями). Преду% преждения сигнализируют о возможности возникновения ошибок,

а если они отсутствуют, это усиливает вашу уверенность в коде.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

172m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 7. Инструментарий программистаClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Совместим ли ваш компилятор по умолчанию со стандартами? Со стандартом C++ (ISO 98), стандартом 1999 года C (ISO 98), со стан% дартом Java (Gosling et al. 00)) и стандартом ISO для C# (ISO 05)? Есть ли у компилятора нестандартные расширения, какие и как их отключить?

Задана ли генерация кода для нужного набора команд CPU? Вы ста% нете генерировать 386%совместимый код, когда известно, что ваша программа будет выполняться только на новейших чипах Intel? По% старайтесь, чтобы компилятор выдавал наиболее приемлемый код.

Кросс#компилятор создает исполняемые модули для платформы, от% личной от той, на которой ведется разработка. Обычно это применяет% ся для создания встроенного программного обеспечения (не будете же вы запускать Visual C++ на посудомоечной машине!).

Мне нужен инструмент…

Вам нужно выполнить задачу. Скучную и повторяющуюся. Как раз с этим лучше справился бы компьютер: будет меньше оши% бок, не так монотонно и гораздо быстрее. Для чего вообще изо% бретали компьютеры? Как узнать, нет ли какого%нибудь инстру% мента, который сделает все вместо вас?

Если вы найдете его в списке, значит, такой инструмент есть.

Если его нет в списке, но вы уверены, что не вам первому при% шлось столкнуться с такой проблемой, вероятно, можно где% то найти подходящий инструмент. Быстрый поиск в Интерне% те может дать самые неожиданные и приятные результаты.

Если задача кажется вам уникальной, можете попытаться на% писать собственную программу для ее решения. Подробнее об этом на стр. 178 в разделе «Мастерим сами».

При поиске инструмента постарайтесь получить как можно больше дополнительной информации:

Поинтересуйтесь у коллег, не сталкивались ли они с подоб% ным.

Займитесь поиском в Сети и телеконференциях.

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

Собрав перечень имеющихся инструментов, сделайте обоснован% ный выбор исходя из критериев, предложенных в первом разде% ле. Чтобы принять решение, нужно определить свои требования. Нужен ли вам непременно бесплатный инструмент? Или важнее получить его немедленно? Трудно ли будет воспользоваться им другим членам вашей группы? Часто ли вы собираетесь им поль% зоваться – будут ли оправданы затраты?

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Какойm

инструмент необходим?

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

173Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Компилятор – это лишь одно звено длинной цепочки инструментов, в которую входят редактор связей, ассемблер, отладчик, профайлер и прочие манипуляторы объектных файлов.

В число популярных компиляторов входят gcc, Microsoft Visual C++ и Borland’s C++ builder.

Редактор связей

Редактор связей (linker, компоновщик) тесно связан с компилятором. Из всех объектных файлов, созданных компилятором, он собирает единый исполняемый модуль кода. Редакторы связей C и C++ так тес% но связаны с компилятором, что иногда две задачи выполняются одной и той же программой. В Java и C# редактор связей относится к среде исполнения.

При работе с редактором связей нужно знать:

Чистит ли он двоичные файлы? То есть удаляет ли отладочные символы типа имен переменных и функций? С их помощью отлад% чик показывает важную диагностическую информацию, но при этом значительно увеличивается размер исполняемых модулей и за% медляется их загрузка.

Исключает ли он повторяющиеся разделы кода?

Может ли он создавать библиотеки вместо исполняемых модулей? Есть ли возможность выбирать тип библиотек – статически или динамически загружаемых?

Среда сборки

Среда сборки включает в себя не только компилятор и редактор свя% зей. При сборке применяются такие инструменты, как UNIX%програм% ма make или средства сборки, включенные в IDE. Они автоматизируют процесс компиляции. Во многих проектах с открытым кодом для упро% щения сборки применяются такие инструменты UNIX, как autoconf и automake.

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

Тестовая цепочка

Обратите внимание, что это инструмент создания программного обес% печения, а не его отладки! Правильно организованное тестирование совершенно необходимо для создания надежного, высококачественно% го программного обеспечения. Этим этапом часто пренебрегают, веро% ятно, из%за связанных с ним трудозатрат, отвлекающих силы от глав% ного – написания кода. Такой подход может нанести большой ущерб качеству программного обеспечения. Нельзя построить надежный

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

174m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 7. Инструментарий программистаClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

фрагмент кода, не проверив корректности его работы, а сделать это можно только путем создания тестов во время написания кода.

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

Помимо инструментов автоматизированного тестирования блоков, есть средства для генерации тестовых данных и составления контроль% ных примеров. Существуют и средства эмуляции целевых платформ, часто с возможностью моделирования конкретных аварийных ситуа% ций (нехватки памяти, высокой нагрузки и т. п.).

Инструменты для отладки и тестирования

Эти инструменты оценивают работу кода и способствуют обнаруже% нию проблем как наглядно проявляющихся, так и имеющихся в по% тенциале. Подробнее мы рассмотрим их на стр. 231 в разделе «Спрей от ос, репеллент для мух, липучки…».

Отладчик

Наличие хорошего отладчика и умение пользоваться им может сбе% речь вам массу времени, которое было бы потрачено на выяснение при% чин непонятного поведения программы. Вы сможете проследить ветви выполнения программы, вмешаться в выполнение, получить текущие значения переменных, установить контрольные точки и препариро% вать работающий код различными способами. Это на порядок эффек% тивнее, чем усеивать программу отладочными операторами printf!

gdb – это отладчик GNU с открытым исходным кодом, портированный едва ли не на все мыслимые платформы. ddd – его вполне законченный графический интерфейс. В каждой IDE или инструментальной цепоч% ке есть свой отладчик.

Профайлер

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

Валидаторы кода

Валидаторы кода бывают статическими и динамическими. Первые из них изучают код подобно компилятору, находя в файлах с исход% ным кодом источники возможных проблем и ошибочное применение языка. Известным примером такого рода является lint – программа, выполняющая статическую проверку ряда стандартных ошибок коди%

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Какойm

инструмент необходим?

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

175Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

рования на C. Их функции в значительной мере интегрированы в со% временные компиляторы, однако сохраняются отдельные инструмен% ты для дополнительных проверок.

Динамические валидаторы модифицируют и настраивают код во время компиляции, а затем осуществляют проверку на этапе исполнения. Хорошим примером служат средства выделения памяти/проверки гра% ниц – они гарантируют правильное освобождение всей динамически выделяемой памяти и пресекают выход за границы памяти при обра% щении к элементам массивов.1 Эти средства избавляют от долгой и кро% потливой работы при поиске ошибок неясного происхождения. Часто они оказываются гораздо полезнее отладчиков, поскольку выступают в качестве профилактических, а не лечебных средств: ошибки обнару% живаются раньше, чем им удается нарушить работу программы.

Измерительные средства

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

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

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

Дизассемблер

Этот инструмент работает с исполняемыми модулями, позволяя иссле% довать машинный код. Подобные функции поддерживаются и отлад% чиками, но развитые дизассемблеры могут попытаться восстановить код при отсутствии в нем символической информации и создать интер% претацию двоичного программного файла на языке высокого уровня.

Система учета ошибок

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

1Языки с более высокой степенью социальной ответственности, такие как

Java, решают такие проблемы на уровне архитектуры языка.