Книга «Алгоритмические трюки для программистов» в оригинале называется «Hacker’s Delight» («Восторг хакера»), однако у нас уже забылось изначальное значение слова «хакер» — программист, пытающийся использовать нестандартные приемы для решения поставленных перед ним задач. В основном эти приемы были необходимы для уменьшения размеров программы, увеличения производительности и создания более эффективного кода вычислительных приложений, однако в России термин «хакер» получил отрицательный оттенок, поэтому переводчики выбрали бесцветное и лишенное эмоциональной окраски название. Однако на самом деле книга Уоррена призвана вызывать у понимающих программистов именно восторг от простоты и элегантности предлагаемых в ней решений. Автор на протяжении долгих лет тщательно собирал и систематизировал используемые различными программистами находки и уловки, которые позволяли сделать код программы более эффективным, производительным и компактным.
В книге собраны советы и лучшие практики для работы с битовыми массивами, и автор рекомендует максимально задействовать особенности процессорной архитектуры — если система команд предоставляет возможность применить специализированную команду для решения задачи, то лучше использовать именно ее. Сам же Уоррен для иллюстрации предлагаемых трюков вводит специальный набор команд, котовый не соответствует ни одному реальному процессору, а является синтетическим для RISC-архитектуры. Таким образом, речь в книге идет о серьезных процессорных архитектурах RS/6000, SPARC, ARM, и у программистов могут возникнуть определенные сложности при переносе предлагаемых трюков на архитектуры x86 или x64. Тем не менее базовыми операциями для работы с битовыми массивами в основном являются арифметические и логические команды, сочетание которых и позволяет добиться хороших результатов, — такие команды есть во всех процессорных архитектурах, хотя их использование может несколько отличаться.
В качестве базовых языков программирования используются Си и ассемблер, однако автор отмечает, что предлагаемые им приемы можно реализовать и в других языках, таких как Java или Фортран. При этом предполагается, что прерывания, связанные с переполнением целых чисел, замаскированы и не приведут к останову программы, поэтому в языках, контролирующих среду исполнения, таких как Pascal и ADA, а также сценарных, предлагаемые методы могут вызвать определенные трудности и неадекватную реакцию программы.
Книга охватывает пять тем: главы с 1-й по 4-ю определяют базовые операции, главы с 5-й по 7-ю посвящены битовым функциям (подсчет, поиск, перестановка), с 8-й по 11-ю описывают математические операции, такие как умножение, деление и другие, но для больших чисел, с 12-й по 15-ю обсуждают реализацию различных кодов, а с 16-й по 18-ю определяют работу со специфичными типами чисел (кривой Гильберта, плавающей точкой и простыми числами). Предлагаемые приемы позволяют эффективно организовать работу с различными математическими объектами, которые могут использоваться для решения задач шифрования, обработки сигналов и т. п. В книге даже есть теоремы, поясняющие корректность реализации тех или иных приемов программирования, правда не все они с доказательствами. В конце разделов даны упражнения для самостоятельного решения, что позволяет использовать книгу в качестве учебника по оптимизации программирования высокопроизводительных систем.
Книга очень пригодится программистам, которые занимаются разработкой базовых технологий для конкретной платформы, где есть возможность оптимизации вычислительных возможностей программы за счет использования специфических команд процессора. Также стоит обратить внимание на советы Уоррена разработчикам высоконагруженных систем, поскольку предлагаемый ими код должен быть компактен и производителен. Кроме того, компиляторы и базовые библиотеки полезно разрабатывать, зная предложенные в книге приемы. Однако стоит помнить о предупреждении, вынесенном в эпиграф: «Стоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста». Это предупреждение для руководителей, активно привлекающих таких творческих программистов в свои проекты, — чрезмерное злоупотребление советами и трюками из книги может привести к тому, что постороннему программисту будет очень сложно разобраться в коде, а тем более исправить обнаруженные ошибки. Поэтому стоит использовать нестандартные приемы программирования обдуманно и взвешенно — только когда это действительно необходимо для решения поставленной задачи оптимальным способом. Важно также, чтобы каждое применение нестандартного приема программирования было снабжено комментарием, это позволит программистам из команды сопровождения лучше разобраться в коде.
Уоррен, Генри С. Алгоритмические трюки для программистов, 2-е изд.: Пер. с англ. — М.: ООО «И.Д. Вильямс», 2014. — 512 с.
Валерий Коржов (osmag@osp.ru) — обозреватель, Computerworld Россия (Москва).