Война миров - ассемблер против си


Введение - часть 2


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

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

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

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




Начало  Назад  Вперед



Книжный магазин