Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ГСнСрация высококачСствСнного ΠΊΠΎΠ΄Π° для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, написанных Π½Π° БИ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор Π€ΠΈΠ»ΠΈΠΏΠΏ Π₯ислСй

ΠœΠ΅Ρ‚ΠΎΠ΄ "свСртки констант" (константная Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ°) сводит выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат константныС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π»ΠΈΠ±ΠΎ нСпосрСдствСнно (ΠΊΠ°ΠΊ Π² случаС чисСл ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€), Π»ΠΈΠ±ΠΎ косвСнно (ΠΊΠ°ΠΊ Π² случаС ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… манифСстных констант). Π‘Π²Π΅Ρ€Ρ‚ΠΊΠ° констант сводит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€:

#define TWO 2

a = 1 + TWO;

ΠΊ Π΅Π³ΠΎ эквивалСнтной Ρ„ΠΎΡ€ΠΌΠ΅,

a = 3;

Π²ΠΎ врСмя компиляции, благодаря Ρ‡Π΅ΠΌΡƒ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· стадии выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ Π‘ΠΈ сворачиваниС констант ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΊΠ°ΠΊ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ константам, Ρ‚Π°ΠΊ ΠΈ ΠΊ константам с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

"АлгСбраичСскиС упрощСния" Π΅ΡΡ‚ΡŒ Π²ΠΈΠ΄ свСртки констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удаляСт арифмСтичСскиС тоТдСства. Код, сгСнСрированный для Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠ°ΠΊ

x = y + 0;

x = y * 0;

x = y / 1.0;

x = y / 0;

Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ простым константным присваиваниСм ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ для выполнСния арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π‘Π΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ послСдний ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠ°ΠΊ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ ΠΈ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для Π½Π΅Π³ΠΎ.

"Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ" - это процСсс удалСния Π»ΠΈΡˆΠ½ΠΈΡ… вычислСний. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ для вычислСния значСния ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор пытаСтся Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹. Π’Π°ΠΌ, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ссылки Π½Π° Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π½Π΅Π΅ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ВыраТСния y * 3 ΠΈ a[y*3] ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ подвыраТСниями Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ тСкстС:

if( a[y*3] < 0 || b[y*3] > 10)

a[y*3] = 0;

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этих Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ логичСски эквивалСнтному тСксту:

T1 = y*3;

A1 = &a[T1];

A2 = &b[T1];

if( *A1 < 0 || *A2 > 10)

*A1 = 0;

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ°. "Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ" являСтся Π±ΠΎΠ»Π΅Π΅ слоТным ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ подвыраТСния, y*3, Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅

if(a == 0)

a = y * 3;

else

b = y * 3;

ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ логичСскому эквивалСнту:

T1 = y * 3;

if(a == 0)

a = T1;

else

b = T1;

Рисунок 1 дСмонстрируСт практичСский Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΎΡ‚ выдСлСния ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.

--------------------------------------------------------------Β¬

¦РИБУНОК 1: Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Β¦

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

Β¦Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст Π½Π° Π‘ΠΈ BORLAND LATTICE Β¦

Β¦ Turbo C 1.5 MS-DOS C 3.2 Β¦

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

Β¦if((h3 + k3) < 0 || mov AX,h3 mov AX,h3 Β¦

Β¦ (h3 + k3) > 5) add AX,k3 add AX,k3 Β¦

Β¦ printf("Common\ jl @18 js L0187 Β¦

Β¦ subexpression\ mov AX,h3 cmp AX,5 Β¦

Β¦ elimination"); add AX,k3 jle L0193 Β¦

Β¦ cmp AX,5 L0187: Β¦

Β¦ jle @17 mov AX,01.0000 Β¦

Β¦ @18: push AX Β¦

Β¦ mov AX,offset [email protected] call printf Β¦

Β¦ push AX add SP,2 Β¦

Β¦ call printf L0193: Β¦

Β¦ mov SP,BP Β¦

Β¦ @17: Β¦

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

Β¦ΠœΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Π΅ вхоТдСния вычислСний Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Β¦

Β¦ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ СдинствСнного вхоТдСния Β¦

¦вычислСния. Borland Turbo C вычисляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Β¦

¦выраТСния h3+k3 Π΄Π²Π°ΠΆΠ΄Ρ‹, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ LATTICE MS-DOS C ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Β¦

Β¦ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ Β¦

Β¦Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Β¦

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

"Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ мощности" ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ большСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π±ΠΎΠ»Π΅Π΅ быстрыми. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ сниТСниС мощности нСсколькими способами. НапримСр, примСняя сниТСниС мощности ΠΊ сгСнСрированному ΠΊΠΎΠ΄Ρƒ, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ ΠΈΠ»ΠΈ дСлят Ρ†Π΅Π»Ρ‹Π΅ числа Π½Π° стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ, опСрациями сдвига.

"Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ нСдостиТимого ΠΊΠΎΠ΄Π°" - Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. НСдостиТимый ΠΊΠΎΠ΄ – это нСкоторая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ инструкций ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая нСдостиТима Π½ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ слСдствиС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠ΄Π° условной ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΈΠ»ΠΈ частых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ программистами. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - это Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠ΄Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ компилятора Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

#define DEBUG 0

if(DEBUG)

printf("Debug Function\n");

ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚Π½Ρ‹Π΅ константы часто ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ сущСствованиС нСдостиТимого ΠΊΠΎΠ΄Π°, особСнно Ссли Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ опрСдСляСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.

"Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π»ΠΈΡˆΠ½ΠΈΡ… присваиваний" Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ присваиваний этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ссли эти присваивания Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ освобоТдаСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ рСсурсы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ пространство стСка ΠΈΠ»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ рСгистры. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄:

a = 5;

b = 0;

a = b;

ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΅ΡΡ‚ΡŒ лишнСС присваиваниС, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ бСзопасно. Π›ΠΈΡˆΠ½ΠΈΠ΅ присваивания ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π΅Π»ΠΈΠΊ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ вхоТдСниями ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ имССтся Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π›ΠΈΡˆΠ½ΠΈΠ΅ присваивания ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

ЦСль "распрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ рСгистрам" состоит Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистров ΠΏΡƒΡ‚Π΅ΠΌ сохранСния часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² рСгистрах Ρ‚Π°ΠΊ Π΄ΠΎΠ»Π³ΠΎ, ΠΊΠ°ΠΊ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ доступ ΠΊ памяти. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ рСгистров, доступных для использования, зависит ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ процСссора. БСмСйство микропроцСссоров Intel 80x86 Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ рСгистров для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… рСгистров. Π’ ΠΏΠΎΠΌΠΎΡ‰ΡŒ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ рСгистрам язык Π‘ΠΈ прСдоставляСт спСцификатор класса рСгистровой памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ программисту ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² рСгистрах.

ΠŸΡ€ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рСгистрам компилятор ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ рСгистры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ. Π’Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… зависит ΠΎΡ‚ частоты ΠΈΡ… использования, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΎΠ² ΠΆΠΈΠ·Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… рСгистровых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…) ΠΈ количСства доступных рСгистров. Π’ зависимости ΠΎΡ‚ стСпСни выполняСмой компилятором ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ СдинствСнного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ сохраняСтся Π² рСгистрС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Если Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² дальнСйшСм Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ссылок, Ρ‚ΠΎ ΠΎΠ½Π° сохраняСтся Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, освобоТдая рСгистр для Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ компилятору извСстСн ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ "лишниС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сохранСния ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ" (рСгистров). Π›ΠΈΡˆΠ½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сохранСния ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ посрСдством удалСния ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… присваиваний; лишниС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ распрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ рСгистрам. ИмСя тСкст:

a = i + 2;

b = a + 3;

компилятор Π±Π΅Π· возмоТностСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

mov AX,i

add AX,2

mov a,AX

mov AX,a

add AX,3

mov b,AX

Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ размСщСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² рСгистрах для удалСния лишнСй Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ инструкции (mov AX,a).

ВрСмя, ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π² Ρ†ΠΈΠΊΠ»Π°Ρ…, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ основной Ρ‡Π°ΡΡ‚ΡŒΡŽ всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² являСтся минимизация Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² микропроцСссора, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π°. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ инструкций, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… для Ρ†ΠΈΠΊΠ»Π°, Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ количСство Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ трСбуСтся для выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ инструкции. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ†ΠΈΠΊΠ» ΠΈ ΠΊΠΎΠ΄, сгСнСрированный для Π½Π΅Π³ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ компиляторами, дСмонстрируСт большоС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΈ качСствС ΠΊΠΎΠ΄Π° (см. рис. 2).

--------------------------------------------------------------Β¬

¦РИБУНОК 2: ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Ρ†ΠΈΠΊΠ» Β¦

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

Β¦Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст Π½Π° Π‘ΠΈ BORLAND METAWARE Β¦

Β¦ Turbo C 1.5 High C 1.4 Β¦

Β¦(x) - Π²Ρ€Π΅ΠΌ. Ρ†ΠΈΠΊΠ»Ρ‹ (125) (87) Β¦

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

Β¦k5 = 10000; mov j5,0 mov j5,0 Β¦

Β¦j5 = 0; mov k5,10000 mov k5,10000 Β¦

Β¦do { @10: L00e3: Β¦

Β¦ k5 = k5 - 1; mov AX,k5 dec k5 Β¦

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

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

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