124
некоторого промежуточного языка. Подавляющее большинство
современных языков высокого уровня воплощает принципы структурного
программирования [10], а это означает, что, с одной стороны,
эффективность алгоритма зачастую приносится в жертву его ясности, но, с
другой, – что логическая структура программы получается строгой и,
следовательно, легко анализируемой и оптимизируемой. Общность
принципов структурного программирования для разных языков позволяют
также формировать единое промежуточное представление разноязыковых
программ и применять оптимизационные процедуры, не зависящие от
языка.
Системно-зависимая стадия оптимизации связана более всего с
дисциплинами управления памятью в ОС. Если компилятор "знает", какие
алгоритмы управления памятью (например, страничного обмена)
применяет ОС, он может "помочь" ОС. Поскольку компилятор, в отличие
от ОС, обладает возможностью глобального анализа программы, он может
предсказывать будущую потребность в тех или иных страницах памяти,
влиять на размер и состав рабочего набора процесса. Компилятор может
также перестроить программу таким образом, чтобы повысить степень
локализации обращений к памяти и тем самым снизить интенсивность
страничного обмена.
Роль аппаратно-зависимой оптимизации все более возрастает с
развитием процессорных архитектур. Мы уже отмечали, что на
компилятор, таким образом, возлагается задача расположения команд
программы в такой последовательности, чтобы обеспечить максимальную
загрузку конвейерных линий. Рассмотрим пример возможного
дальнейшего развития этой идеи.
Недостатком современных суперскалярных процессоров является
необходимость для процессора в каждом цикле анализировать поток
команд, чтобы определить, какие конвейерные линии могут быть