Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #65, АПРЕЛЬ 2006 г.

эволюция

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #065, стр. 065-022-5


в основном касаются шаблонов, причем многие из них носят «отвоевательный» характер. Большой победой стало утверждение экспортируемых (export) шаблонов. Формально эта возможность присутствовала еще в старом стандарте, однако мало кем поддерживалась из-за невостребованности и технических сложностей реализации. Примеры, приведенные в учебниках по С++, не транслировались ни GCC, ни Microsoft С/C++ Comiler. Долгое время их переваривал только уже упомянутый компилятор EDG, на котором, кстати, основан популярный Borland C++ Builder и малоизвестный Comeau C++.

Секретарь комитета по стандартизации Эрб Саттер (Herb Sutter) выступил с предложением убрать экспортируемые шаблоны из нового стандарта (смотри дискуссию под лозунгом «Why We Can't Afford Export» — http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1459.html). Однако предложение не прошло: восемь участников проголосовали за удаление export'а, а 28 были за то, чтобы оставить его. В итоге export оставили, что заставило разработчиков компиляторов сильно нервничать. Поддержка экспортируемых шаблонов требует значительных переделок не только компилятора, но и линкера. Многие куски кода вообще придется переписывать заново… Не поддерживать export нельзя — перестанут уважать. Полнота поддержки стандарта стала вполне весомым критерием при выборе компилятора.

Другим немаловажным достижением можно считать проработку шаблонов с частичной специализацией (partial specialisation), которые в старом стандарте описывались весьма туманно и никем, кроме EDG, не поддерживались, а зря. Как известно, шаблоны представляют собой механизм абстрактной работы с данными, «переваривающий» целочисленные переменные наряду с векторными и любыми другими типами. Удобно, но непроизводительно, поэтому для достижения максимума производительности необходимо создать специализированный шаблон (specialized template), обрабатывающий «свой» тип данных. Таким образом, у нас будет уже два шаблона: общий (general/genetic template), обрабатывающий все типы данных, и специализированный, обрабатывающий какой-то один конкретный класс с высшей эффективностью. Вот она — специализация, которая худо-бедно поддерживается большинством компиляторов еще со времен старого стандарта.

Теперь возьмем шаблон класса с несколькими параметрами. Полная специализация требует специфицировать либо все параметры шаблона, либо ни одного, что есть зло. При частичной же специализации можно специфицировать любое подмножество параметров, а остальные обрабатывать в общем виде. Дела обстоят так только по стандарту, в реальной же жизни большинство компиляторов либо совсем не поддерживают частичную специализацию, выдавая ошибку трансляции, либо молчаливо игнорируют ее, постепенно добивая программиста возле напрочь убитой программы, которая работает совсем не так, как задумывалось. Подробнее можно почитать в статье «Partial template specialisation» (www.absoluteastronomy.com/reference/partial_template_specialisation).

В целом, ситуация с шаблонами выглядит как откат к старым парадигмам и знаменует приближающийся провал. Большинство задач, решаемых шаблонами, легко решаются в рамках классического процедурного программирования и ассемблерных макросов. Если бы не убогость «сишного» препроцессора, шаблоны могли бы и не возникнуть — в них просто не было бы потребности. Специализированные шаблоны — это возврат к прежним способам обработки данных (своему типу — свой метод), но на «качественно новом уровне», который можно проиллюстрировать так. У нас было сверло отдельно по дереву и отдельно по металлу. Мы решили, что два сверла, дублирующие друг друга, — это не только невыгодно экономически, но и совсем не элегантно. Вот и изобрели универсальное сверло, берущее и дерево, и металл. Быстро выяснилось, что сверло режет погано, так как каждый материал имеет свои особенности обработки. Вместо того чтобы честно признать свое поражение, мы усовершенствовали сверлильный механизм — пусть самостоятельно распознает тип материала и автоматически изменяет геометрию профиля сверла. Конструкторы крякнули и послали всю эту раджу в небытие, даже не пытаясь ее реализовать... Ничего не напоминает?

Назад на стр. 065-022-4  Содержание  Вперед на стр. 065-022-6