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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим компилятор!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 7

Автор Π”ΠΆΠ΅ΠΊ ΠšΡ€Π΅Π½ΡˆΠΎΡƒ

procedure Ident;

var Name: string[8];

begin

Name:= GetName;

if Look = '(' then begin

Match('(');

Match(')');

EmitLn('BSR ' + Name);

end

else

EmitLn('MOVE ' + Name + '(PC),D0');

end;

{–}

{ Parse and Translate a Math Factor }

procedure Expression; Forward;

procedure Factor;

begin

if Look = '(' then begin

Match('(');

Expression;

Match(')');

end

else if IsAlpha(Look) then

Ident

else

EmitLn('MOVE #' + GetNum + ',D0');

end;

{–}

{ Recognize and Translate a Multiply }

procedure Multiply;

begin

Match('*');

Factor;

EmitLn('MULS (SP)+,D0');

end;

{–}

{ Recognize and Translate a Divide }

procedure Divide;

begin

Match('/');

Factor;

EmitLn('MOVE (SP)+,D1');

EmitLn('EXS.L D0');

EmitLn('DIVS D1,D0');

end;

{–}

{ Parse and Translate a Math Term }

procedure Term;

begin

Factor;

while Look in ['*', '/'] do begin

EmitLn('MOVE D0,-(SP)');

case Look of

'*': Multiply;

'/': Divide;

end;

end;

end;

{–}

{ Recognize and Translate an Add }

procedure Add;

begin

Match('+');

Term;

EmitLn('ADD (SP)+,D0');

end;

{–}

{ Recognize and Translate a Subtract }

procedure Subtract;

begin

Match('-');

Term;

EmitLn('SUB (SP)+,D0');

EmitLn('NEG D0');

end;

{–}

{ Parse and Translate an Expression }

procedure Expression;

begin

if IsAddop(Look) then

EmitLn('CLR D0')

else

Term;

while IsAddop(Look) do begin

EmitLn('MOVE D0,-(SP)');

case Look of

'+': Add;

'-': Subtract;

end;

end;

end;

{–}

{ Parse and Translate an Assignment Statement }

procedure Assignment;

var Name: string[8];

begin

Name := GetName;

Match('=');

Expression;

EmitLn('LEA ' + Name + '(PC),A0');

EmitLn('MOVE D0,(A0)')

end;

{–}

{ Initialize }

procedure Init;

begin

GetChar;

SkipWhite;

end;

{–}

{ Main Program }

begin

Init;

Assignment;

If Look <> CR then Expected('NewLine');

end.

{–}

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

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ Ρ‚Ρ€Π΅Ρ… ΠΏΠ΅Ρ€Π²Ρ‹Ρ… частях этой сСрии ΠΌΡ‹ рассмотрСли синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, постСпСнно ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡Π½ΠΎ пройдя ΠΎΡ‚ ΠΎΡ‡Π΅Π½ΡŒ простых ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Β«Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉΒ», состоящих ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠ°, Ρ‡Π΅Ρ€Π΅Π· выраТСния Π² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ² достаточно ΠΏΠΎΠ»Π½Ρ‹ΠΌ синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, способным Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присваивания с ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. БСйчас я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ провСсти вас сквозь этот процСсс Π΅Ρ‰Π΅ Ρ€Π°Π·, Π½ΠΎ ΡƒΠΆΠ΅ с Ρ†Π΅Π»ΡŒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ Π° Π½Π΅ компиляции ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Если эта сСрия ΠΎ компиляторах, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ…? ΠŸΡ€ΠΎΡΡ‚ΠΎ я Ρ…ΠΎΡ‡Ρƒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΊΠ°ΠΊ измСняСтся Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ†Π΅Π»Π΅ΠΉ. Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Ρƒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ понятия этих Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ² трансляторов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ различия Π½ΠΎ ΠΈ сходства.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ присваиваниС:

x = 2 * y + 3

Π’ компиляторС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ это присваиваниС Π²ΠΎ врСмя выполнСния. Π‘Π°ΠΌ транслятор Π½Π΅ выполняСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… арифмСтичСских опСраций… ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставит процСссор ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ выполнится. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ компилятор Π²Ρ‹Π΄Π°Π» Π±Ρ‹ ΠΊΠΎΠ΄ для вычислСния значСния выраТСния ΠΈ сохранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x.

Для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π΅ гСнСрируСтся. ВмСсто этого арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ происходит синтаксичСский Π°Π½Π°Π»ΠΈΠ·. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠΎΠ³Π΄Π° синтаксичСский Π°Π½Π°Π»ΠΈΠ· присваивания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½, x Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ примСняСм Π²ΠΎ всСй этой сСрии, называСтся «синтаксичСски-управляСмым ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌΒ». Как Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊ настоящСму Π²Ρ€Π΅ΠΌΠ΅Π½, структура синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΎΡ‡Π΅Π½ΡŒ Π±Π»ΠΈΠ·ΠΊΠΎ привязана ΠΊ синтаксису Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π½Π°ΠΌΠΈ конструкций. ΠœΡ‹ создали ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π° Pascal, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ языка. КаТдая ΠΈΠ· этих конструкций (ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€) связана с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ «дСйствиСм», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполняСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ конструкция распознана. Π’ нашСм компиляторС ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ дСйствиС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‡Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° для выполнСния ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π²ΠΎ врСмя исполнСния. Π’ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ дСйствиС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ для Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ выполнСния.

Π§Ρ‚ΠΎ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ план… структура… синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π΅ мСняСтся. Π˜Π·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСйствия. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ языка, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ компилятор, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Однако, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ отличия, ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ дСйствия Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ распознаваниС, ΠΏΠΈΡˆΡƒΡ‚ΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ распознавания написаны ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΉ ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Ни ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π°Π½Π°Π»ΠΈΠ·Π° нашСго компилятора Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ этого.

Наш компилятор, фактичСски, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ «чистым» компилятором. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ конструкция распознана, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ выдаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. (Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ эффСктивный.) Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, являСтся чистым ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ трансляции Ρ‚ΠΈΠΏΠ° Β«Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ†ΠΈΠΈΒ», выполняСмой Π½Π°Π΄ исходным тСкстом. Π­Ρ‚ΠΎ Π΄Π²Π΅ крайности трансляции. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ трансляторы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌΠΈ чистыми, Π½ΠΎ стрСмятся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ.

Π― ΠΌΠΎΠ³Ρƒ привСсти нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π― ΡƒΠΆΠ΅ упомянул ΠΎΠ΄ΠΈΠ½: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚ΠΈΠΏΠ° Microsoft BASIC, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‚ исходный тСкст (Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Π΅Π³ΠΎ) Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – ассСмблСр. ЦСлью ассСмблСра, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, являСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ½ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСт это ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ: ΠΎΠ΄Π½Π° инструкция Π½Π° строку исходного ΠΊΠΎΠ΄Π°. Но ΠΏΠΎΡ‡Ρ‚ΠΈ всС ассСмблСры Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ выраТСния ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’ этом случаС выраТСния всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами, ΠΈ ассСмблСр Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ для Π½ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π‘ΠΊΠΎΡ€Π΅Π΅ ΠΎΠ½ Β«ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Β» Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ вычисляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фактичСски ΠΈ выдаСтся с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

ЀактичСски, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ этого сами. Вранслятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создали Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠΎΡ€Π½ΠΎ Π²Ρ‹ΠΏΠ»Π΅Π²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для слоТных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Ссли ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ константой. Π’ этом случаС Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ транслятор Π²Π΅Π» сСбя Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈ просто вычислял ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы.

Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ компиляции сущСствуСт понятиС, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Β«Π»Π΅Π½ΠΈΠ²ΠΎΠΉΒ» трансляциСй. ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ просто Π²Ρ‹Π΄Π°Π΅Ρ‚Π΅ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ дСйствии. ЀактичСски, Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС Π²Ρ‹ Π½Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Для выполнСния этого, дСйствия, связанныС с ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ просто Π²Ρ‹Π΄Π°ΡŽΡ‚ ΠΊΠΎΠ΄. Иногда ΠΎΠ½ΠΈ это Π΄Π΅Π»Π°ΡŽΡ‚, Π½ΠΎ часто ΠΎΠ½ΠΈ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΡˆΠΈΡΡŒ этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, для Π΄Π°Π½Π½ΠΎΠ³ΠΎ выраТСния

x = x + 3 – 2 – (5 – 4)

наш компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠΎΡ€Π½ΠΎ Π²Ρ‹ΠΏΠ»Π΅Π²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· 18 инструкций для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² рСгистры, выполнСния арифмСтичСских дСйствий ΠΈ сохранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. ЛСнивая ΠΎΡ†Π΅Π½ΠΊΠ° распознала Π±Ρ‹, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащСС константы, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ рассчитано Π²ΠΎ врСмя компиляции ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»Π° Π±Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ

x = x + 0

Π”Π°ΠΆΠ΅ лСнивая ΠΎΡ†Π΅Π½ΠΊΠ° Π±Ρ‹Π»Π° Π±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ достаточно ΡƒΠΌΠ½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это эквивалСнтно

x = x,

Ρ‡Ρ‚ΠΎ совсСм Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий. ΠœΡ‹ смогли ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ 18 инструкций Π΄ΠΎ нуля!

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ способом наш компилятор, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ дСйствиС выполняСтся Π² Π½Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

ЛСнивая ΠΎΡ†Π΅Π½ΠΊΠ° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ произвСсти Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ произвСсти. Π―, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽ вас: это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ услоТняСт ΠΊΠΎΠ΄ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ каТдая ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ЛСнивая ΠΎΡ†Π΅Π½ΠΊΠ° ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π½Π°Π·Π²Π°Π½Π° Ρ‚Π°ΠΊ Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΡ‰Π΅ для создатСлСй компиляторов!

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ дСйствуСм Π² основном ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ KISS, я Π½Π΅ Π±ΡƒΠ΄Ρƒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² эту Ρ‚Π΅ΠΌΡƒ. Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π°, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ компиляции ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ. Π’ частности Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π² Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ трансляторС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΉ ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° сами ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ этого. Π­Ρ‚Π° главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° обсуТдСния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² этой Π³Π»Π°Π²Π΅.