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

война миров

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

Спецвыпуск: Хакер, номер #071, стр. 071-024-2


Ассемблерная программа, оптимизированная вручную, становится совершенно немобильной. Если потребуется внести в код даже незначительные изменения или выйдет процессор с новыми правилами оптимизации — всю работу придется начинать заново. А на языке высокого уровня просто перекомпилировал, и все! Большинство программных комплексов, написанных на Си/Си++, никогда бы не увидели свет, если бы в качестве основного языка разработки был выбран ассемблер, требующий неимоверной концентрации труда. Механизация придумана как раз для того, чтобы облегчать человеку жизнь и воплощать его грандиозные замыслы. Никто же не спорит, что на дачном участке ручной уход за растениями дает намного больший урожай, чем тракторист на колхозном поле, но обработать колхозное поле вручную практически невозможно!

Несколько десятилетий тому назад, когда счет памяти шел на килобайты и приходилось экономить каждый такт, ручная оптимизация еще имела смысл, поскольку откомпилированные программы на массовом железе тормозили со страшной силой, но сейчас все изменилось. Системные требования уже давно перестали быть основным потребительским фактором. Теперь в ассемблере нуждаются лишь критичные к быстродействию модули, связанные с обработкой огромного количества данных в реальном времени. Во всех остальных случаях лучше воспользоваться качественным оптимизирующим компилятором (например, Microsoft Visual C++, GCC 2.95).

Более новые версии компиляторов в основном пекутся о качестве поддержки очередной редакции Си++ стандарта, оставляя оптимизирующий движок без изменений, поскольку новых идей ни у кого нет. Единственное исключение составляет Intel Fortran/C++, реализующий режим глобальной оптимизации (остальные компиляторы оптимизируют код только в пределах одной функции) и проложивший мост между профилировщиком и компилятором. Используя данные профилировки, компилятор, в частности, может размещать в регистрах наиболее интенсивно используемые переменные, а остальные — гнать в память. К сожалению, эта методика далека от совершенства, и хотя «официально» Intel C++ обгоняет GCC, с этим согласны далеко не все: поклонники GCC демонстрируют множество программ, на которых Intel C++ значительно отстает от GCC.

[эффективность кодогенерации си-компиляторов.]

Желая продемонстрировать превосходство ассемблера над Си, обычно берут программы типа «hello, world!» и сравнивают размеры откомпилированных файлов, причем ассемблер использует прямые вызовы API-функций GetStdHandle()/WriteFile(), а программу на Си заставляют обращаться к printf(), которая тащит за собой библиотеку времени исполнения (Run Time Library или сокращенно RTL). Ну, и где же здесь честность?! Как будто на Си нельзя программировать без RTL! Можно! Для этого достаточно переименовать функцию main() во что-то другое, указав линкеру точку входа в файл вручную. Размер откомпилированного файла сразу же сократится, вплотную приближаясь к ассемблированному файлу (или даже совпадая с ним). Но 99% пространства будет занимать служебная информация PE-формата и место, оставленное линкером для выравнивания секций. На этом фоне различия между компилятором и ассемблером становятся совершенно незаметными!

Назад на стр. 071-024-1  Содержание  Вперед на стр. 071-024-3