» » » Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ


Авторские права

Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ

Здесь можно скачать бесплатно "Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Рейтинг:
Название:
Генерация высококачественного кода для программ, написанных на СИ
Издательство:
неизвестно
Год:
неизвестен
ISBN:
нет данных
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "Генерация высококачественного кода для программ, написанных на СИ"

Описание и краткое содержание "Генерация высококачественного кода для программ, написанных на СИ" читать бесплатно онлайн.








¦ j5 = j5 + 1; dec AX inc j5 ¦

¦ i5 = (k5 * 3) / mov k5,AX mov AX,j5 ¦

¦ (j5 * constant5); mov AX,j5 mov SI,AX ¦

¦} while (k5 > 0); inc AX sal SI,2 ¦

¦ mov j5,AX add SI,AX ¦

¦ mov AX,k5 mov AX,k5 ¦

¦ imul AX,AX,3 mov DX,AX ¦

¦ push AX add DX,DX ¦

¦ mov AX,j5 add DX,AX ¦

¦ imul AX,AX,5 xchg AX,DX ¦

¦ mov BX,AX cwd ¦

¦ pop AX idiv SI ¦

¦ cwd mov I5,AX ¦

¦ idiv BX cmp k5,0 ¦

¦ mov i5,AX jnle L00e3 ¦

¦ cmp k5,0 ¦

¦ jg @10 ¦

+-------------------------------------------------------------+

¦ MICROSOFT WATCOM ¦

¦ C 5.0 C 6.0 ¦

¦ (46) (91) ¦

+-------------------------------------------------------------+

¦ mov j5,10000 mov j5,0 ¦

¦ mov k5,0 mov DI,10000 ¦

¦ mov CX,30000 L4 dec DI ¦

¦ sub SI,SI imul AX,DI,3 ¦

¦ $0265: inc j5 ¦

¦ sub CX,3 imul BX,j5,5 ¦

¦ add SI,5 cwd ¦

¦ mov AX,CX idiv BX ¦

¦ cwd mov i5,AX ¦

¦ idiv SI test DI,DI ¦

¦ mov DI,AX jg L4 ¦

¦ or CX,CX ¦

¦ jg $0265 ¦

¦ mov i5,DI ¦

+-------------------------------------------------------------+

¦ Компилятор Microsoft C 5.0 выполнил снижение мощности на ¦

¦ константном выражении и разместил в регистрах все ¦

¦ переменные внутри простого цикла, включая вычисляемое ¦

¦ значение i5. Высокая степень проведенного анализа цикла ¦

¦ демонстрируется тем, что заключительные состояния k5 и j5 ¦

¦ были определены заранее компилятором, а не позже, во ¦

¦ время выполнения. ¦

L--------------------------------------------------------------

"Вынесение инвариантного (неизменяющегося) кода" - один из путей ускорения циклов, заключающийся в вынесении выражений за пределы цикла, если значения, ими вычисляемые, являются неизменными во время выполнения цикла. Если инвариантный код выносится из следующего цикла:

unsigned char i,j,k,v,x;

for( i = 0; i < v; i++)

x = i * (j+k);

его логический эквивалент будет:

T1 = j + k;

for(i = 0; i < v; i++)

x = i * T1;

 

--------------------------------------------------------------¬

¦РИСУНОК 3: Вынесение инвариантного кода - Microsofr C 5.0 ¦

+-------------------------------------------------------------+

¦Исходный текст на Си MICROSOFT COMPUTER INNOVATIONS ¦

¦ C 5.0 C86Plus 1.10 ¦

+-------------------------------------------------------------+

¦for(i4=0;i4<=2;i4++) sub SI,SI mov i4,0 ¦

¦ ivector2[i4] =j*k; mov AX,j jmp L44@2 ¦

¦ imul k L9@2: ¦

¦ mov [BP-4],AL mov AX,j ¦

¦ $L20007: imul k ¦

¦ mov AL,[BP-4] mov SI,i4 ¦

¦ mov ivector2[SI],AL ¦

¦ inc SI mov ivector2[SI],AL¦

¦ cmp SI,2 inc i4 ¦

¦ jle $L20007 L44@2: ¦

¦ mov i4,SI cmp i4,2 ¦

¦ jle L9@2 ¦

+-------------------------------------------------------------+

¦ Вынесение инвариантного кода уменьшает время выполнения ¦

¦ цикла путем вынесения неизменяющихся выражений из тела ¦

¦ цикла. В отличие от Computer Innovations C86Plus 1.10, ¦

¦ компилятор Microsoft C 5.0 успешно выносит выражение j * h ¦

¦ за пределы цикла, так что оно выполняется только один раз, ¦

¦ вместо того, чтобы выполняться на каждой итерации цикла. ¦

L--------------------------------------------------------------

Рис. 3 демонстрирует вынесение инвариантного кода компилятором Microsoft C 5.0.

Дальнейший анализ примера показывает, что значение переменной i, индекса цикла, изменяется непосредственно с каждой итерацией. Отдельное присваивание i, известной как "переменная индукции цикла", может быть удалено:

T1 = j + k;

for(x = 0; x< T1 * v; x += T1);

i = v;

Поскольку использование переменных - индексов цикла во внутренних выражениях цикла общеупотребительно, удаление переменных индукции цикла вместе со связанными с ними "снижениями мощности", может значительно улучшить исполнение программы. Рис. 4 показывает пример удаления переменной индукции цикла.

--------------------------------------------------------------¬

¦РИСУНОК 4: Удаление переменных индукции цикла ¦

+-------------------------------------------------------------+

¦Исходный текст на Си MICROSOFT DATALIGHT ¦

¦ C 5.0 Optimum-C 3.14 ¦

+-------------------------------------------------------------+

¦for(i=0;i<100;i++) mov AX,0 ¦

¦ ivector5[i*2+3]=5; mov i,100 mov i,AX ¦

¦ mov SI,OFFSET ivector5+6 cmp AX,100 ¦

¦ $L20006: jge L134 ¦

¦ mov [SI],5 L11B: ¦

¦ add SI,4 mov BX,i ¦

¦ cmp SI,OFFSET ivector5+406 shl BX,1 ¦

¦ jb $L20006 shl BX,1 ¦

¦ mov ivector+6[BX],5 ¦

¦ inc i ¦

¦ cmp i,100 ¦

¦ jl L11B ¦

¦ L134: ¦

+-------------------------------------------------------------+

¦ Удаление переменных индукции цикла помогает минимизировать ¦

¦ время, проводимое в каждой итерации цикла, путем вынесения ¦

¦ индексирующих цикл переменных (переменных индукции) из ¦

¦ тела цикла. В то время, как компилятор Datalight Optimum-C ¦

¦ использует переменную индукции i для индексации массива ¦

¦ ivector5, компилятор Microsoft C 5.0 удаляет ее благодаря ¦

¦ накоплению смещения для каждого элемента массива и ¦

¦ добавлению результата к базовому адресу массива. ¦

L--------------------------------------------------------------

"Слияние циклов" минимизирует управляющие заголовки циклов путем сращивания кода из циклов, имеющих одинаковые управляющие заголовки, в один цикл. Для того, чтобы удалить управляющий заголовок второго цикла, два простых цикла

for(i = 0; i < 10; i++)

a = b + c;

for(i = 0; i < 10; i++)

d = e + f;

могут быть объединены в один цикл

for(i = 0; i < 10; i++) {

a = b + c;

d = e + f;

}

Поскольку для поддержки слияния циклов требуется процедурная оптимизация, в общем случае это действие не выполняется. Ни один из включенных в обзор компиляторов этот метод не применяет.

Непосредственно связано со слиянием циклов "разворачивание циклов", которое минимизирует количество проходов через цикл путем увеличения числа операций, выполняемых внутри каждой итерации. Цикл инициализации массива

int a[3];

int i;

for(i = 0; i < 3; i++)

a[i] = 0;

странслированный компилятором без оптимизации, может получить следующий эквивалент в языке ассемблера:

mov i,0

LOOP:

mov BX,i

shl BX,1

mov a[BX],0

inc i

cmp i,3

jl LOOP

В том же коде, оптимизированном по методу разворачивания цикла, удаляется цикл путем замещения его тремя инструкциями присваивания:

mov a,0

mov a+2,0

mov a+4,0

Хотя ни один из компиляторов, включенных в обзор, не выполняет буквальное разворачивание циклов, некоторые из них оптимизируют цикл путем использования "специализированных инструкций прцессора". Многие процессоры предоставляют специализированные инструкции для управления перемещением блоков данных, инициализации памяти и других часто встречающихся ситуаций управления данными. К примеру, строковые инструкции с префиксом повторения (в семействе процессоров 80x86), выполняющиеся быстрее, чем посимвольные команды в цикле. Оптимизирующий компилятор использует, когда возможно, инструкции процессора для управления ситуациями в специальных случаях. Применение специализированных инструкций процессора к расширенной версии предыдущего примера разворачивания циклов

int a[10000];

int i;

for(i = 0; i < 10000; i++)

a[i] = 0;

дает приведенный ниже ассемблерный код процессора 80x86. Он гораздо быстрее, чем его аналог, записанный в виде цикла или набора инструкций непосредственной засылки в память, имеющего соответствующую длину:

mov CX,10000

mov i,CX

sub AX,AX

mov DI,offset a

push DS

pop ES

cld

rep stosw

"Минимизация заголовков вызова функций" может существенно уменьшить время выполнения в структурированной программе. При вызове функции параметры передаются вызываемой подпрограмме в стеке, находящемся в оперативной памяти. Набор инструкций некоторых процессоров содержит инструкции, которые поддерживают потребности Си и других структурированных языков высокого уровня в установке адресации фрейма стека перед выполнением кода функции и восстановлении стекового фрейма перед завершением.


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "Генерация высококачественного кода для программ, написанных на СИ"

Книги похожие на "Генерация высококачественного кода для программ, написанных на СИ" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Филипп Хислей

Филипп Хислей - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Отзывы о "Филипп Хислей - Генерация высококачественного кода для программ, написанных на СИ"

Отзывы читателей о книге "Генерация высококачественного кода для программ, написанных на СИ", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.