Читаем Журнал «Компьютерра» № 34 от 18 сентября 2007 года полностью

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

Кстати говоря, чтение чужого хорошо написанного кода является неплохим подспорьем для самообучения (в том числе – обучения собственно искусству чтения).

Продолжим. Для анализа чужого кода, особенно кода крупного проекта, "с высоты птичьего полета" (построение ментальной модели, выяснение основных знаковых систем) исходники принято сводить к набору "основных сущностей" [Мы здесь не останавливаемся на том, что "объективные знаковые системы" – использованные языки программирования, API и библиотеки – все же придется изучить. Впрочем, для некоторых частных случаев, наиболее востребованных, существуют автоматизированные средства перевода с одного языка на другой (например, Cobol->Java)]. Для популярных языков программирования, в «обиходе» которых существует множество инструментов анализа и проектирования, это может выглядеть как автоматизированное построение диаграмм классов (иерархий наследования и включения и т. п.) или функций и процедур (иерархий вызовов). Здесь еще может помочь спецификация или другая документация на проект (на более низких уровнях, как правило, любая документация малорелевантна коду).

Как только мы спускаемся уровнем ниже "общего плана" – до отдельных строк кода, параметров функций и времени жизни переменных [Знаменитый теоретик computer sciense Гради Буч называет это "археологией при помощи зубной щетки"], – никакого другого метода понять и разобраться, кроме чтения строки за строкой, не остается.

Более того, и чтение кода без готовых, заранее поставленных вопросов – то есть просто "просмотр для галочки" – практически бесполезно. Самый же эффективный метод исследования – «деятельное» чтение, то есть участие в работе исследуемых исходников. В зависимости от свойств исследуемых кусков кода и окружающей среды "деятельное чтение" может означать, например, многократное выполнение «древней» программы с постепенным изменением различных частей ее кода; или прогонку в отладчике, с отслеживанием значений разных переменных; или «заимствование» непонятного куска в «чистую» среду (программу-заглушку) для выяснения принципов работы этого куска. Здесь же могут помочь модульные тесты (специальный код, тестирующий различные аспекты функциональности) – если они прилагались к исходникам, это куда полезнее любой спецификации; если же нет – могут быть написаны с нуля как один из видов деятельности в процессе исследования.

Придирчивый читатель мог бы заметить, что автор упускает из виду "объективно древние" исходники, которые по той или иной причине – нет старого компилятора, нет старой ОС, нет старой библиотеки – просто не могут быть собраны и запущены. Автор не упускает. В этом случае "деятельное чтение" просто становится сложнее – приходится изучать "древнюю драгоценность" почти вслепую; в простейшем случае (чтение интереса ради) – «запуская» код в уме; в более сложном (необходимо таки заставить старую библиотеку работать; или переписать старый алгоритм на новом языке) – по кусочку переводя проект "на новые рельсы" и тщательно анализируя результат.

Короче говоря, практически единственный честный и полноценный способ исследования "археологических древностей" – полное переписывание; не обязательно «честное», оно может выглядеть просто как удаление частей исходника и постепенное их возвращение на место – тем не менее других вариантов "качественного ознакомления" с артефактом человечество пока не придумало [Другой вопрос, многие ли «древности» стоят таких трудов?].

Но самое смешное, что когда «старый» код [Или извлеченные из него идеи] станет «новым», твоим, родным, частью проекта, – он неизбежно начнет стареть, чуть только отведешь глаза, перестанешь обновлять и пересматривать эти части исходников. Остается лишь повторять, как и все, вслед за Черной Королевой: "Здесь, знаешь ли, приходится бежать со всех ног, чтобы только остаться на том же месте!"


Примеры и иллюстрации

Пример довольно простого кода, который для понимания может потребовать длительных изысканий, – быстрый алгоритм нахождения обратного квадрата числа (1/яx), приписываемый разработчику Quake Джону Кармаку. Алгоритм использует метод быстрых приближений Ньютона и включает следующую «очевидную» строчку с использованием магического числа (сопутствующий ей комментарий, как правило, встречается во всех популярных описаниях алгоритма):


i = 0x5f3759df – (i >> 1); // what the f..k?


Перейти на страницу:

Все книги серии Компьютерра

Похожие книги

«Если», 2005 № 12
«Если», 2005 № 12

Алексей ЗАРУБИН КРУГИ НА ПЕСКЕ Дороги, которые мы не выбираем, все равно приводят к желанной цели… если к тому времени остаются какие-либо желания. Екатерина СЕДАЯ, Дэвид БАРТЕЛЛ УЛЫБАЮЩИЕСЯ ПАРАЗИТЫ Это не конец света, это всего-навсего подарок генетика любимой женушке к годовщине свадьбы. Майкл СУЭНВИК Я ТОЖЕ ЖИЛ В АРКАДИИ Не сотвори себе кумира: из бронзы ли, плоти, полимера или какой другой материи… Получив премию «Хьюго» за действия неунывающей парочки друзей, писатель втравил их в новую историю. Эдуард ЯКУБОВИЧ ЛИНИЯ ЖИЗНИ Герой забыл одну простую истину: попытки узнать свою судьбу часто кончаются плохо. Или очень плохо. Джеффри ЛЭНДИС ДОРАДО Время — весьма жестокая штука. Нил ЭШЕР СТРУД Кто из этих братьев-инопланетян человечеству младший, а кто старший? Поди разберись! Мэтью ДЖАРП ГОРОД ЗДРАВОМЫСЛИЯ …стоит под угрозой уничтожения. Предотвратить взрыв берется бывший пират. Тимофей ОЗЕРОВ СПАСИТЕ БАБОЧКУ! Более странной экранизации у Брэдбери, пожалуй, еще не бывало. Дмитрий БАЙКАЛОВ РАЗГОВОРНИК ДЛЯ КИНОМАНА Фантастика или мелодрама: кто «крылатее»? Вероника РЕМИЗОВА ОЖИВЛЯЮЩИЙ ЧУДОВИЩ Один из сотрудников журнала «Если» в детстве даже подрался с одноклассником, поспорив о том, как же движется скелет в знаменитом фильме о Синдбаде. Раскрываем секрет — и ему, и читателям. ВИДЕОРЕЦЕНЗИИ Взбесившийся ИИ и другие герои. Эдуард ГЕВОРКЯН АЛЬТЕРНАТИВА ЗДРАВОМУ СМЫСЛУ Итоги очередного интернет-голосования заставили погрузиться в воспоминания известного писателя и публициста. РЕЦЕНЗИИ Кнут и пряник, убеждены рецензенты, есть идеальный метод в деле воспитания фантастов. КУРСОР Неужели у нас снимут фильм по «Обитаемому острову»? Дмитрий ВОЛОДИХИН, Аркадий ШТЫПЕЛЬ ПРОРОКИ И БУРЕВЕСТНИКИ Кажется, «фантастика ближнего прицела» вновь обретает популярность. Пока только у авторов. ЭКСПЕРТИЗА ТЕМЫ Определенно, прозаики что-то скрывают. Наверняка у них припрятана где-то машина времени — иначе как еще объяснить наличие у экспертов этих «завтрашних» документов? ПЕРСОНАЛИИ Геолог, биохимик, астрофизик, юрист — кого только нет в нашем общем доме. ПРИЗ ЧИТАТЕЛЬСКИХ СИМПАТИЙ Вниманию Большого жюри: срок для определения лучших из лучших сокращается!

Аркадий Штыпель , Дмитрий Байкалов , Дмитрий Володихин , ЕСЛИ Журнал , Журнал «Если» , МАЙКЛ СУЭНВИК

Фантастика / Журналы, газеты / Научная Фантастика