НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° C++

ЦСль Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

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

ВсС дСйствия Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° Ubuntu вСрсии 16.04.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ компилятор g++ вСрсии:

Бостав компилятора g++

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с C++ ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ² всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ основному ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ компилятора β€” g++.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходныС Ρ„Π°ΠΉΠ»Ρ‹?

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ C++ Ρ„Π°ΠΉΠ» β€” это всСго лишь ΠΊΠΎΠ΄, Π½ΠΎ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исходный Ρ„Π°ΠΉΠ» трСбуСтся ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² исполняСмый Ρ„Π°ΠΉΠ», Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ»ΠΈ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π΄Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π­Ρ‚Π°ΠΏΡ‹ компиляции:

driver.cpp:

1) ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΠ½Π³

Бамая пСрвая стадия компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ β€” это ΠΌΠ°ΠΊΡ€ΠΎ процСссор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для дальнСйшСго компилирования. На Π΄Π°Π½Π½ΠΎΠΉ стадии происходит происходит Ρ€Π°Π±ΠΎΡ‚Π° с прСпроцСссорными Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ. НапримСр, прСпроцСссор добавляСт хэдСры Π² ΠΊΠΎΠ΄ (#include), ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ коммСнтирования, замСняСт макросы (#define) ΠΈΡ… значСниями, Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ куски ΠΊΠΎΠ΄Π° Π² соотвСтствии с условиями #if, #ifdef ΠΈ #ifndef.

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

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ прСпроцСссированный ΠΊΠΎΠ΄ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» driver.ii (ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΡΡ‚Π°Π΄ΠΈΡŽ прСпроцСссинга C++ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .ii), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π»Π°Π³ -E, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт компилятору, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΎΠ± этом Π΄Π°Π»Π΅Π΅) Ρ„Π°ΠΉΠ» Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ провСсти Π΅Π³ΠΎ прСпроцСссинг:

Взглянув Π½Π° Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π² Π½ΠΎΠ²ΠΎΠΌ сгСнСрированном Ρ„Π°ΠΉΠ»Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ макрос RETURN Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½:

Π’ Π½ΠΎΠ²ΠΎΠΌ сгСнСрированном Ρ„Π°ΠΉΠ»Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Π½ΠΎΠ²Ρ‹Ρ… строк, это Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ хэдСр iostream.

2) ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ

На Π΄Π°Π½Π½ΠΎΠΌ шагС g++ выполняСт свою Π³Π»Π°Π²Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ β€” ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ шагС ΠΊΠΎΠ΄ Π±Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² Π² ассСмблСрный ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ шаг ΠΌΠ΅ΠΆΠ΄Ρƒ высокоуровнСвым языком ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ) ΠΊΠΎΠ΄ΠΎΠΌ.

АссСмблСрный ΠΊΠΎΠ΄ β€” это доступноС для понимания Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ прСдставлСниС машинного ΠΊΠΎΠ΄Π°.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π»Π°Π³ -S, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт компилятору ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ послС стадии компиляции, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ассСмблСрный ΠΊΠΎΠ΄ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ driver.s:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ всС Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Но для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ машина поняла наш ΠΊΠΎΠ΄, трСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС.

3) АссСмблированиС

Π’Π°ΠΊ ΠΊΠ°ΠΊ x86 процСссоры ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСвСсти ассСмблСрный ΠΊΠΎΠ΄ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассСмблСра.

АссСмблСр ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ассСмблСрный ΠΊΠΎΠ΄ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, сохраняя Π΅Π³ΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» β€” это созданный ассСмблСром ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», хранящий кусок машинного ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ кусок машинного ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» связан вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ кусками машинного ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, называСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

Π”Π°Π»Π΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ сохранСниС Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ снова.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассСмблСра (as) Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» driver.o:

Но Π½Π° Π΄Π°Π½Π½ΠΎΠΌ шагС Π΅Ρ‰Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ, вСдь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… всСх ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° (Π»ΠΈΠ½ΠΊΠ΅Ρ€Π°). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ стадии.

4) Компоновка

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

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

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ исполняСмый Ρ„Π°ΠΉΠ» driver:

5) Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

ПослСдний этап, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдстоит ΠΏΡ€ΠΎΠΉΡ‚ΠΈ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. На Π΄Π°Π½Π½ΠΎΠΉ стадии Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠ° динамичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Запустим Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΈ Π±ΠΎΠ΄Ρ€Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компиляторов

НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π€ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ компиляторов ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ:

НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π€ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΏΠ°Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, элСмСнт Π·Π° элСмСнтом.
МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ β€” Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΌΡƒ количСству ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… рСсурсов Π½Π° Ρ‚Π΅ΠΌΡƒ компиляторов. Она являСтся Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΌ источником, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² основах Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языков программирования.

ЦСлСвая аудитория ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” люди, Ρ‡ΡŒΠ΅ прСдставлСниС ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ компиляторов ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ (максимум β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ). Однако я ΠΆΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ разбираСтся Π² структурах ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΌ случаС Π½Π΅ посвящСна соврСмСнным производствСнным компиляторам с ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ строк ΠΊΠΎΠ΄Π° β€” Π½Π΅Ρ‚, это ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ курс «компиляторы для Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ²Β», ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ компилятор.

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

БСйчас я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π½Π°Π΄ систСмным языком Krug, Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Rust ΠΈ Go. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π±ΡƒΠ΄Ρƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Krug Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ своих мыслСй. Krug находится Π² стадии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½ΠΎ ΡƒΠΆΠ΅ доступСн Π½Π° https://github.com/krug-lang Π² рСпозиториях caasper ΠΈ krug. Π―Π·Ρ‹ΠΊ Π½Π΅ совсСм Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ компиляторов, Ρ‡Ρ‚ΠΎ отчасти ΠΈ Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»ΠΎ мСня Π½Π° написаниС ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” Π½ΠΎ ΠΎΠ± этом ΠΏΠΎΠ·ΠΆΠ΅.

Π‘ΠΏΠ΅ΡˆΡƒ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΉ стСпСни Π½Π΅ являюсь спСциалистом ΠΏΠΎ компиляторам! Π£ мСня Π½Π΅Ρ‚ докторской стСпСни, ΠΈ я Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ» Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ обучСния β€” всС описанноС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΈΠ·ΡƒΡ‡ΠΈΠ» ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² свободноС врСмя. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽ фактичСский, СдинствСнно Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ созданию компилятора, Π°, скорСС, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹Π΅ для создания нСбольшого Β«ΠΈΠ³Ρ€ΡƒΡˆΠ΅Ρ‡Π½ΠΎΠ³ΠΎΒ» компилятора.

Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·

Когда я Π½Π°Ρ‡ΠΈΠ½Π°Π» ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ компиляторы ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½ языков, ΠΌΠ½Π΅ сказали, Ρ‡Ρ‚ΠΎ лСксичСский Π°Π½Π°Π»ΠΈΠ· β€” Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ токСнизация. Π­Ρ‚ΠΈΠΌ описаниСм ΠΌΡ‹ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ. Анализатор Π±Π΅Ρ€Π΅Ρ‚ Π²Π²ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ΅ строк ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° символов ΠΈ распознаСт Π² Π½ΠΈΡ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π½Π°Ρ€Π΅Π·Π°Π΅Ρ‚ Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹.

Π’ случаС компилятора Π½Π° Π²Ρ…ΠΎΠ΄ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Она считываСтся Π² строку ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅ исходный ΠΊΠΎΠ΄.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅, написанном Π½Π° C-ΠΎΠ±Ρ€Π°Π·Π½ΠΎΠΌ языкС, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ структуру, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡƒΡŽ lexeme, Π° Ρ‚Π°ΠΊΠΆΠ΅ TokenType, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТит для распознавания Π΄Π°Π½Π½ΠΎΠΉ лСксСмы.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ являСтся инструкциСй для создания языка с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ β€” Π½ΠΎ для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания я Π±ΡƒΠ΄Ρƒ врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ компилятора. Π’Π΅ΡΡŒ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄, ΠΏΠΎ сути, довольно прост ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ кусочками ΠΏΠ°Π·Π·Π»Π°. Π₯отя это Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ зависит ΠΎΡ‚ вашСй Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ кусочСк ΠΊΠΎΠ΄Π° Π½Π° C:

Π‘Ρ‡ΠΈΡ‚Π°Π² Π΅Π³ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π² строку ΠΈ провСдя Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ сканированиС, Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, смоТСтС Π½Π°Ρ€Π΅Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. ΠœΡ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ β€” видя, Ρ‡Ρ‚ΠΎ int β€” это «слово», Π° 0 Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° β€” «число». ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΌΡ‹ β€” ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ разбСрСмся Π² этом процСссС Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅. НапримСр, ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ числа:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ слов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ языков ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ слово ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠΊΠ² ΠΈ Ρ†ΠΈΡ„Ρ€, Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ подчСркивания. НапримСр:

Π’ Go этот ΠΊΠΎΠ΄ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹:

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² выглядят Ρ‚Π°ΠΊ:

Анализаторам придСтся Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ, многострочными ΠΈ однострочными коммСнтариями, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, числами, систСмами счислСния ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ чисСл (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1_000_000) ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ UTF8 вмСсто ASCII).

И Ссли Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ рСгулярным выраТСниям β€” Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ стоит. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с нуля, Π½ΠΎ я ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎΡ‚ нашСго царя ΠΈ Π±ΠΎΠ³Π° Π ΠΎΠ±Π° Пайка. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Regex, описаны Π²ΠΎ мноТСствС Π΄Ρ€ΡƒΠ³ΠΈΡ… статСй, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ я ΠΎΠΏΡƒΡ‰Ρƒ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π³ΠΎΡ€Π°Π·Π΄ΠΎ интСрСснСС, Ρ‡Π΅ΠΌ ΠΌΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π°Π΄ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ многословными выраТСниями, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° regex101.com Π² 5:24 ΡƒΡ‚Ρ€Π°. Π’ своСм ΠΏΠ΅Ρ€Π²ΠΎΠΌ языкС я использовал для Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ split(str) β€” ΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ продвинулся.

ΠŸΠ°Ρ€ΡΠΈΠ½Π³

ΠŸΠ°Ρ€ΡΠΈΠ½Π³ нСсколько слоТнСС, Ρ‡Π΅ΠΌ лСксичСский Π°Π½Π°Π»ΠΈΠ·. БущСствуСт мноТСство парсСров ΠΈ парсСров-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² β€” здСсь начинаСтся ΠΈΠ³Ρ€Π° ΠΏΠΎ-ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΡƒ.

ΠŸΠ°Ρ€ΡΠ΅Ρ€Ρ‹ Π² компиляторах ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ строят ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ β€” абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ парсинга. По своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅ ΠΎΠ½ΠΈ сходны, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ различия.

Π­Ρ‚ΠΈ этапы ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ компиляторы строятся ΠΈΠ· мноТСства ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π΅Ρ€ΡƒΡ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ… ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΈΡ… Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для создания компиляторов. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ β€” прСкрасноС сопоставлСниС с эталоном ΠΈ довольно ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹Π΅ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΡ€ΠΈΠΊΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚: пСрвая рСализация компилятора Rust Π±Ρ‹Π»Π° Π½Π° Ocaml.

Π‘ΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ эти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ простыми ΠΈ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΌΠΈ β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ сильно ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ процСсс. По-ΠΌΠΎΠ΅ΠΌΡƒ, Ρ‚ΠΎ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… аспСктах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ПО.

Π”Π΅Ρ€Π΅Π²ΡŒΡ

Π”Π΅Ρ€Π΅Π²ΠΎ парсинга

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

АбстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Как ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ· названия, АБД β€” абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π”Π΅Ρ€Π΅Π²ΠΎ парсинга содСрТит мноТСство (часто излишнСй) ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π° Π² случаС АБД ΠΎΠ½Π° Π½Π΅ трСбуСтся. АБД Π½Π΅ нуТдаСтся Π² бСсполСзной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ структурС ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅, которая Π½Π΅ влияСт Π½Π° сСмантику ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π² вашСм Π΄Π΅Ρ€Π΅Π²Π΅ Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ((5+5)-3)+2. Π’ Π΄Π΅Ρ€Π΅Π²Π΅ парсинга Π²Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈ Π±Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, вмСстС со скобками, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ значСниями 5, 5, 3 ΠΈ 2. Но с АБД ΠΌΠΎΠΆΠ½ΠΎ просто провСсти ассоциации β€” Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΈΡ… порядок.

На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ для выраТСния a+b/c.

НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π€ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора

АБД ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π­Ρ‚ΠΎ прСдставлСниС достаточно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ, Π½ΠΎ, надСюсь, Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ структурированы ваши ΡƒΠ·Π»Ρ‹. Для парсинга ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅:

НадСюсь, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ»ΠΎΠ²ΠΈΠ»ΠΈ ΡΡƒΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ парсинг ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ², начиная с высокоуровнСвых языковых конструкций. Как ΠΈΠΌΠ΅Π½Π½ΠΎ рСализуСтся синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с рСкурсивным спуском, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°

ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ парсинга Π² АБД ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСпростым. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Π°ΠΌ слСдуСт Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ вашСго языка. По сути, Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° опрСдСляСт структуру вашСго языка. БущСствуСт нСсколько языков для опрСдСлСния языков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ (ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ) сами сСбя.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ языка для опрСдСлСния языков β€” Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° Бэкуса-Наура (РБНЀ). Она прСдставляСт собой Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ БНЀ с мСньшим количСством ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобок. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ РБНЀ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ:

ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹: ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊΠΎΠΉ шаблон Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² составляСт Β«Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Β». Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ β€” Ρ‡Π°ΡΡ‚ΡŒ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠΊΠ΅Π½ if ΠΈΠ»ΠΈ 0 ΠΈ 1 Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ β€” Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹. НСтСрминалы β€” ΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΎΠ½ΠΈ находятся Π² Π»Π΅Π²ΠΎΠΉ части ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ», ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Β«ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ указатСлями» Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ².

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ спСцификации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ. НапримСр, для Go, Rust ΠΈ D.

Анализаторы с рСкурсивным спуском

РСкурсивный спуск β€” самый простой ΠΈΠ· многочислСнных ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΊ парсингу.

Анализаторы с рСкурсивным спуском β€” нисходящиС, основанныС Π½Π° рСкурсивных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ парсСр, вСдь Π² вашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π½Π΅Ρ‚ Π»Π΅Π²ΠΎΠΉ рСкурсии. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Β«ΠΈΠ³Ρ€ΡƒΡˆΠ΅Ρ‡Π½Ρ‹Ρ…Β» языков этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ достаточна для парсинга. Π’ GCC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ написанный Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ нисходящий парсСр, хотя Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ использовался YACC.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, с парсингом этих языков ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π’ особСнности C, Π³Π΄Π΅

ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Clang Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с рСкурсивным спуском:

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для C++, рСкурсивный спуск позволяСт Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ Π»Π΅Π³ΠΊΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданныС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ странныС ΡˆΡ‚ΡƒΠΊΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ C/C++ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ диагностику ΠΈ исправлСниС ошибок.

Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹:

ΠŸΠ°Ρ€ΡΠ΅Ρ€-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ минусы β€” Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°ΡŽΡ‚ программисты ΠΏΡ€ΠΈ создании ПО.

ΠŸΠ°Ρ€ΡΠ΅Ρ€-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π·Π²ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнный Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ качСствСнный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” хотя ΠΎΠ½ΠΈ ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π΄Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±Π½Ρ‹ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ Π½Π΅ всСгда выводят сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π²Π°ΠΌ придСтся ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ парсСр-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π° ΠΏΡ€ΠΈ раскруткС компилятора, вСроятно, придСтся Ρ€Π°ΡΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ парсСр-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° парсСров β€” ANTLR, Π΅ΡΡ‚ΡŒ ΠΈ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ….

Π”ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ этот инструмСнт ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ Π½Π΅ хочСтся Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° написаниС Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°, ΠΈ ΠΊΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сСрСдину ΠΈ бэкСнд компилятора/ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ парсинга

Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ поняли сами. Π”Π°ΠΆΠ΅ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ компилятора (lex/parse) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

Π‘Π΅Ρ€Π΅Π΄ΠΈΠ½Π°

БСмантичСский Π°Π½Π°Π»ΠΈΠ·! Анализ сСмантики языка β€” ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ»ΠΎΠΆΠ½Π΅ΠΉΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ создании компилятора.

НуТно ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’ ΠΌΠΎΠΉ язык Krug ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ аспСкты, связанныС с сСмантичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ, Π° Π±Π΅Π· Π½Π΅Π³ΠΎ программист Π±ΡƒΠ΄Π΅Ρ‚ обязан всСгда ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” ΠΈ ΠΌΡ‹ всС врСмя пишСм, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° запускаСм, исправляСм ошибки. Π­Ρ‚Π° ΡΠΏΠΈΡ€Π°Π»ΡŒ бСсконСчна.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, компиляция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π±Π΅Π· Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ сСмантики Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ этапС компиляции.

Когда-Ρ‚ΠΎ ΠΌΠ½Π΅ попадалась Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°, посвящСнная ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π½ΠΎΠΌΡƒ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°, ΠΌΠΈΠ΄Π΄Π»Π΅Π½Π΄Π° ΠΈ бэкСнда. Π’ΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ выглядСло ΠΊΠ°ΠΊ

БСгодня ΠΎΠ½ΠΎ прСдставляСт собой Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅

Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ занимаСтся, Π² основном, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π° Π² бСсконтСкстных языках, Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… Π΄Π²ΠΎΠΉΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ довольно быстро β€” здСсь ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ рСкурсивный спуск.

Π‘ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ LLVM большая Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° Π²ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдставлСн Ρ†Π΅Π»Ρ‹ΠΉ ряд Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” сСмантичСский Π°Π½Π°Π»ΠΈΠ·, ваТнСйшая Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°Π·Ρ‹ компиляции.

НапримСр, Π² Rust с Π΅Π³ΠΎ модСлью управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ компилятор выступаСт ΠΊΠ°ΠΊ большая мощная машина, которая ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ статичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ…. ΠžΡ‚Ρ‡Π°ΡΡ‚ΠΈ эта Π·Π°Π΄Π°Ρ‡Π° состоит Π² ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ для Π°Π½Π°Π»ΠΈΠ·Π° Ρ„ΠΎΡ€ΠΌΡƒ.

По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ сСмантичСский Π°Π½Π°Π»ΠΈΠ· ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ компилятора, Π° ΠΈΠ·Π½ΡƒΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сгСнСрированной сборки ΠΈΠ»ΠΈ считывания Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² АБД выполняСтся Π·Π° вас.

БСмантичСскиС ΠΏΡ€ΠΎΡ…ΠΎΠ΄Ρ‹

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ разнятся Π² зависимости ΠΎΡ‚ языка, Π½ΠΎ Π½ΠΈΠΆΠ΅ описано нСсколько шагов Π² Krug.

ОбъявлСниС Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ уровня

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ пройдСтся ΠΏΠΎ всСм объявлСниям Β«Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ уровня» Π² модулях ΠΈ осознаСт ΠΈΡ… сущСствованиС. Π“Π»ΡƒΠ±ΠΆΠ΅ Π² Π±Π»ΠΎΠΊΠΈ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ β€” ΠΎΠ½ просто ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚, ΠΊΠ°ΠΊΠΈΠ΅ структуры, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π΄. ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ/символа

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм Π±Π»ΠΎΠΊΠ°ΠΌ ΠΊΠΎΠ΄Π° Π² функциях ΠΈ Ρ‚.ΠΏ. ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΡ… β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ символы, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π­Ρ‚ΠΎ распространСнный ΠΏΡ€ΠΎΡ…ΠΎΠ΄, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΡΡŽΠ΄Π°, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ошибка No such symbol XYZ ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° Go.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ нСпросто, особСнно Ссли Π² вашСй Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ зависимостСй Π΅ΡΡ‚ΡŒ цикличСскиС зависимости. НСкоторыС языки ΠΈΡ… Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Go выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ· Π²Π°ΡˆΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ», ΠΊΠ°ΠΊ ΠΈ ΠΌΠΎΠΉ язык Krug. ЦикличСскиС зависимости ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

Π¦ΠΈΠΊΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, модифицируя DFS Π² Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ зависимостСй, ΠΈΠ»ΠΈ воспользовавшись Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π’Π°Ρ€ΡŒΡΠ½Π° (ΠΊΠ°ΠΊ это сдСлано Π² Krug) для опрСдСлСния (мноТСствСнных) Ρ†ΠΈΠΊΠ»ΠΎΠ².

Π’Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² (Type Inference)

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΡ… Ρ‚ΠΈΠΏΡ‹. Π’Ρ‹Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² Krug ΠΎΡ‡Π΅Π½ΡŒ слабоС, ΠΎΠ½ΠΎ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π° основС ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ причудливая систСма, Π²Ρ€ΠΎΠ΄Π΅ Ρ‚Π΅Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языках Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Haskell.

Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ процСсса Β«ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈΒ», ΠΈΠ»ΠΈ Β«ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ²Β». Для Π±ΠΎΠ»Π΅Π΅ простых систСм Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

Π’ΠΈΠΏΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Krug Ρ‚Π°ΠΊ:

Когда-Ρ‚ΠΎ я написал простоС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Go, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ стало ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для Krug.

ΠŸΡ€ΠΎΡ…ΠΎΠ΄ Π½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Mutability Pass)

Krug (ΠΊΠ°ΠΊ ΠΈ Rust) ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся нСизмСняСмым языком, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ссли Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ ΠΈΠ½ΠΎΠ΅:

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм Π±Π»ΠΎΠΊΠ°ΠΌ ΠΈ функциям ΠΈ провСряСт, Ρ‡Ρ‚ΠΎ ΠΈΡ… Β«ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Β», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π½Π΅ мСняСм Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ слСдуСт, ΠΈ Ρ‡Ρ‚ΠΎ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ функциям, ΡΠ²Π»ΡΡŽΡ‚ΡΡ постоянными ΠΈΠ»ΠΈ измСняСмым Ρ‚Π°ΠΌ, Π³Π΄Π΅ трСбуСтся.

Π­Ρ‚ΠΎ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символьной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая собрана Π·Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Ρ‹. Бимвольная Ρ‚Π°Π±Π»ΠΈΡ†Π°, построСнная ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ сСмантичСского ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°, содСрТит ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ измСняСмости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Π‘++ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ информация ΠΎ Ρ‚ΠΎΠΌ, являСтся символ внСшним ΠΈΠ»ΠΈ статичным.

Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

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

К этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ относятся Ρ‚Π°ΠΊΠΈΠ΅ свойства, ΠΊΠ°ΠΊ имя символа, Ρ‚ΠΈΠΏ, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ измСняСмости, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ внСшнСй связи, располоТСниС Π² статичной памяти ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости

Π­Ρ‚ΠΎ ваТная концСпция Π² языках программирования. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ваш язык Π½Π΅ обязан Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ области видимости, всё ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ пространство ΠΈΠΌΡ‘Π½!

Π₯отя прСдставлСниС области видимости являСтся интСрСсной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компилятора, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π‘-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… языков ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π²Π΅Π΄Ρ‘Ρ‚ сСбя (ΠΈΠ»ΠΈ являСтся) ΠΊΠ°ΠΊ стСковая структура Π΄Π°Π½Π½Ρ‹Ρ… (stack data structure).

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ создаём ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅ΠΌ области видимости, ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ (shadowing) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅:

НСбольшой ΠΎΡ„Ρ„Ρ‚ΠΎΠΏ, Π½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ спагСтти-стСк. Π­Ρ‚ΠΎ структура Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния областСй видимости Π² АБД-ΡƒΠ·Π»Π°Ρ… ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ².

БистСмы Ρ‚ΠΈΠΏΠΎΠ²

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

БистСма Ρ‚ΠΈΠΏΠΎΠ² β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ обСспСчиваСтся ΠΈ сСмантичСски опрСдСляСтся Π² компиляторС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСдставлСний компилятора ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° этих прСдставлСний.

Π’Π»Π°Π΄Π΅Π½ΠΈΠ΅

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

ΠšΡ€Π°ΡΠΎΡ‚Π° Rust Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всё это выполняСтся Π² Ρ…ΠΎΠ΄Π΅ компиляции, Π²Π½ΡƒΡ‚Ρ€ΠΈ компилятора, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ программисту Π½Π΅ приходится Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ сборкой мусора ΠΈΠ»ΠΈ подсчётом ссылок. ВсС эти сСмантики отнСсСны ΠΊ систСмС Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Ρ‘ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна Π² Π²ΠΈΠ΄Π΅ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π― Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ всё это устроСно ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ, Π½ΠΎ всё это являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исслСдования ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Mozilla ΠΈ участников ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Cyclone.

Π“Ρ€Π°Ρ„Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² управлСния (Control Flow Graphs)

Для прСдставлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π³Ρ€Π°Ρ„Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² управлСния (CFG), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат всС ΠΏΡƒΡ‚ΠΈ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ исполнСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ сСмантичСском Π°Π½Π°Π»ΠΈΠ·Π΅ для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… участков ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ², Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ достигнуты Π² Ρ…ΠΎΠ΄Π΅ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π°ΠΊΠΆΠ΅ Π³Ρ€Π°Ρ„Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для выявлСния Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒΡΡ. Или для поиска нСдоступного ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Β«ΠΏΠ°Π½ΠΈΠΊΡƒΒ» (call a panic), ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅, Π° ΠΊΠΎΠ΄ снаруТи Ρ†ΠΈΠΊΠ»Π° Π½Π΅ исполняСтся. Анализ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² Ρ…ΠΎΠ΄Π΅ сСмантичСской Ρ„Π°Π·Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ Ρ‚Π΅Ρ… Π²ΠΈΠ΄Π°Ρ… Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ.

БэкСнд

НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора. Π€ΠΎΡ‚ΠΎ НСвСрно Ρ‡Ρ‚ΠΎ программная модСль построСнная Π½Π° основС компилятора
Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ нашСй схСмы Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

ΠœΡ‹ сдСлали Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ исполняСмых Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ². Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсудим Π½ΠΈΠΆΠ΅.

НС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сильно ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„Π°Π·Ρƒ сСмантичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ·-Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, содСрТащСйся Π² Π΄Π΅Ρ€Π΅Π²Π΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π΅Ρ‘ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ возникновСния «спагСтти».

НСсколько слов ΠΎ транспиляторах

Π­Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ компиляторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС Π² исходный ΠΊΠΎΠ΄ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилируСтся Π² исходники Π½Π° Π‘. На ΠΌΠΎΠΉ взгляд, Π²Π΅Ρ‰ΡŒ довольно бСссмыслСнная, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ваш язык Π½Π΅ уступаСт сильно Ρ‚ΠΎΠΌΡƒ языку, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ компилируСтся. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ траспиляция ΠΈΠΌΠ΅Π΅Ρ‚ смысл для ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ высокоуровнСвых языков, ΠΈΠ»ΠΈ для языков с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² истории компиляторов ΠΎΡ‡Π΅Π½ΡŒ часто встрСчаСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄ Π½Π° Π‘. По сути, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ компилятор Π‘++ β€” Cfront β€” транспилировал Π² ΠΊΠΎΠ΄ Π½Π° C.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся JavaScript. Π’ Π΅Π³ΠΎ ΠΊΠΎΠ΄ транспилируСт TypeScript ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ привнСсти большС возмоТностСй ΠΈ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Ρ‘ Π²Π°ΠΆΠ½Π΅Π΅, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ систСму Ρ‚ΠΈΠΏΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌ количСством Π²ΠΈΠ΄ΠΎΠ² статичСского Π°Π½Π°Π»ΠΈΠ·Π° для Π»ΠΎΠ²Π»ΠΈ Π±Π°Π³ΠΎΠ² ΠΈ ошибок, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ столкнёмся с Π½ΠΈΠΌΠΈ Π² Ρ…ΠΎΠ΄Π΅ исполнСния.

Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Β«Ρ†Π΅Π»Π΅ΠΉΒ» компилятора, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Ρ‡Π°Ρ‰Π΅ всСго самая простая, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΎ присвоСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, вСдь Π²Ρ‹ просто Β«ΠΏΠ°Π΄Π°Π΅Ρ‚Π΅ Π½Π° хвост» Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ языку. Однако Ρƒ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ нСдостаток β€” большиС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ возмоТностями языка, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ транспилируСтС свой ΠΊΠΎΠ΄.

МногиС соврСмСнныС компиляторы ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² качСствС своСго бэкСнда LLVM: Rust, Swift, C/C++ (clang), D, Haskell.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ «простым ΠΏΡƒΡ‚Ρ‘ΠΌΒ», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π° вас ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π»ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ спСктра Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, ΠΈ Π²Π°ΠΌ доступны ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹ΡΠΎΡ‡Π°ΠΉΡˆΠ΅Π³ΠΎ уровня. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠΉ транспиляциСй, LLVM прСдоставляСт ΠΈ большиС возмоТности ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ. Π£ΠΆ Ρ‚ΠΎΡ‡Π½ΠΎ большС, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π² Π‘. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, насколько большими Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹, скаТСм, 1, 4, 8 ΠΈΠ»ΠΈ 16-Π±ΠΈΡ‚Π½Ρ‹Π΅. Π’ Π‘ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ просто, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π° для ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Π΄Π°ΠΆΠ΅ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ассСмблСр-ΠΊΠΎΠ΄Π°

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ машинного ΠΊΠΎΠ΄Π°, β€” это тСхничСски самый популярный ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСтся Π²ΠΎ мноТСствС языков программирования.

Go β€” это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ соврСмСнного языка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прСимущСствами Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° LLVM (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этой ΡΡ‚Π°Ρ‚ΡŒΠΈ). Go Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ, Π² Ρ‚ΠΎΠΌ числС Windows, Linux ΠΈ MacOS. Π—Π°Π±Π°Π²Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ΅ Krug Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‚ΠΎΠΆΠ΅ гСнСрировался ассСмблСр-ΠΊΠΎΠ΄.

Π£ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ достоинств ΠΈ нСдостатков. Однако сСгодня, ΠΊΠΎΠ³Π΄Π° доступны Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π²Ρ€ΠΎΠ΄Π΅ LLVM, ΡƒΠΆΠ΅ Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ассСмблСр, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ маловСроятно, Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€ΡƒΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ компилятор с собствСнным бэкСндом ΠΏΡ€Π΅Π²Π·ΠΎΠΉΠ΄Ρ‘Ρ‚ LLVM ΠΏΠΎ ΡƒΡ€ΠΎΠ²Π½ΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½Π΅ говоря ΡƒΠΆΠ΅ ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ….

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

Но ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ всё Ρ€Π°Π²Π½ΠΎ приятно. И ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсно, Ссли Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° ассСмблСрС, ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ языки программирования Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° Π½ΠΈΠΆΠ½ΠΈΡ… уровнях. ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ АБД ΠΈΠ»ΠΈ сгСнСрированный IR (Ссли Ρƒ вас ΠΎΠ½ Π΅ΡΡ‚ΡŒ) ΠΈ Β«Π²Ρ‹Π΄Π°Ρ‚ΡŒΒ» инструкции ассСмблСра Π² Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fprintf ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 8cc.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°

Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°. Π―Ρ€ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Java: ΠΏΠΎ сути, JVM ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»Π° Ρ†Π΅Π»ΠΎΠ΅ сСмСйство Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… для Π½Π΅Ρ‘ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ языков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Kotlin.

Π£ гСнСрирования Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° ΠΌΠ½ΠΎΠ³ΠΎ прСимущСств, ΠΈ для Java Π³Π»Π°Π²Π½Ρ‹ΠΌ Π±Ρ‹Π»Π° ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ. Если Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ свою Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Ρ‚ΠΎ любой выполняСмый Π½Π° Π½Π΅ΠΉ ΠΊΠΎΠ΄ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… абстрактный Π½Π°Π±ΠΎΡ€ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… инструкций, Ρ‡Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΠΎ стопицот ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€.
Насколько я знаю, JVM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JIT ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ примСняСт Π΄Ρ€ΡƒΠ³ΠΈΠ΅ JIT-ухищрСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΆΠ°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ большС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

Они ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ компилятора, Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄! ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ бэкСнда, ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ усилий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ скомпилируСтС ΠΊΠΎΠ΄ Π½Π° Π‘ ΠΈ запуститС Π΅Π³ΠΎ со всСми оптимизациями, Ρ‚Ρ‹ Π²Ρ‹ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅ΡΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ Π±Π΅Π·ΡƒΠΌΠΈΠ΅ получится. Godbolt β€” прСкрасный инструмСнт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ соврСмСнныС компиляторы Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠ΄ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ инструкции ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ исходному ΠΊΠΎΠ΄Ρƒ относятся. Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ смоТСтС Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ, Ρ†Π΅Π»ΠΈ, вСрсии компиляторов ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π° Π»ΠΈΠ±ΠΎ писали компилятор, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ с создания простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘, Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ символы ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ (strip the debug symbols), ΠΈ посмотритС, Ρ‡Ρ‚ΠΎ сгСнСрируСт GCC. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ памятку, Ссли ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ затруднСния.

ΠŸΡ€ΠΈ настройкС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Однако Π½Π°Ρ‰ΡƒΠΏΠ°Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹ΠΉ баланс Π½Π΅ Ρ‚Π°ΠΊ просто. НСкоторыС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ спСцифичны, ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ. По ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΈΡ… Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² production-компиляторы.

Π’ коммСнтариях ΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ рСсурсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ rwmj Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ достаточно всСго 8 ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 80% ΠΎΡ‚ максимальной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ вашСго компилятора. И всС эти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ описаны Π² 1971-ΠΌ! Π Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π“Ρ€Π΅ΠΉΠ΄ΠΎΠ½Π° Π₯ΠΎΠ°Ρ€Π°, вдохновитСля Rust.

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС (intermediate representation, IR) Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· АБД, хотя это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ слоТно Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

МоТно ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ IR Π±ΠΎΠ»Π΅Π΅ высокоуровнСвым прСдставлСниСм Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Оно Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ прСдставляСт, ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для гСнСрирования ΠΊΠΎΠ΄Π°.

Π•ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ IR, ΠΈΠ»ΠΈ Β«Ρ„ΠΎΡ€ΠΌΡ‹Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ IR для упрощСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ. НапримСр, SSA β€” Static Single Assignment, СдинствСнноС статичСскоС присваиваниС, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ каТдая пСрСмСнная присваиваСтся лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Π’ Go ΠΏΠ΅Ρ€Π΅Π΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° строится IR Π½Π° основС SSA. IR Π² LLVM основан Π½Π° SSA, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ SSA прСдоставляСт нСсколько ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, подстановка констант (constant propagation), ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ (ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅) распрСдСлСниС рСгистров.

РаспрСдСлСниС рСгистров

Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ для гСнСрирования ΠΊΠΎΠ΄Π°, Π° оптимизация. Одна абстракция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ считаСм Π΄Π°Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, сколько Π½ΡƒΠΆΠ½ΠΎ нашим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ. Однако Π² ассСмблСрС Π½Π°ΠΌ доступно ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ количСство рСгистров (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ 16 Π΄ΠΎ 32), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅, ΠΈΠ»ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стСком (spill to the stack).

РаспрСдСлСниС рСгистров β€” это ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ рСгистр Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π±Π΅Π· пСрСзаписывания Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). Π­Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ эффСктивнСС использования стСка, хотя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»Π΅Ρ‡ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ расходы, Π΄Π° ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΡƒΡŽ схСму распрСдСлСния.

Π•ΡΡ‚ΡŒ нСсколько Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² распрСдСлСния рСгистров:

О Ρ‡Ρ‘ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

О компиляторах написано ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ. Π‘Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ помСстится Π½ΠΈ Π² ΠΎΠ΄Π½Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π― Ρ…ΠΎΡ‡Ρƒ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΈΠ»ΠΈ хотя Π±Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π² Ρ…ΠΎΠ΄Π΅ Π²Π°ΡˆΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

ИскаТСниС ΠΈΠΌΡ‘Π½ (Name Mangling)

Если Π²Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ассСмблСр-ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… областСй видимости ΠΈΠ»ΠΈ пространств ΠΈΠΌΡ‘Π½, Ρ‚ΠΎ Ρƒ вас часто Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ символов. ОсобСнно Ссли ваш язык ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ классов, ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

НапримСр, Π² этом ΠΊΠΎΠ΄Π΅ (Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ πŸ™‚ ) Π²Π°ΠΌ придётся ΠΈΡΠΊΠ°ΠΆΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° этих символов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ассСмблСрС ΠΎΠ½ΠΈ Π½Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Π»ΠΈ. Π’Π°ΠΊΠΆΠ΅ искаТСниС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обозначСния Ρ‚ΠΈΠΏΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈΠ»ΠΈ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ пространствС ΠΈΠΌΡ‘Π½.

ΠžΡ‚Π»Π°Π΄ΠΎΡ‡Π½Π°Ρ информация

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

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Foreign Function Interface, FFI)

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚ libc Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ Π΄Π΅Ρ‚ΡŒΡΡ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ± этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Ρ‘ Π² свой язык. Как Π²Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΊΠΎΠ΄Ρƒ Π½Π° Π‘, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ свой ΠΊΠΎΠ΄ для Π‘?

Π›ΠΈΠ½ΠΊΠ΅Ρ€

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΊΠ°ΠΊ сСрвис (CaaS)

Π—Π΄Π΅ΡΡŒ всС рассмотрСнныС Π²Ρ‹ΡˆΠ΅ Ρ„Π°Π·Ρ‹ компилятора распрСдСлСны ΠΏΠΎ API-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Krug-сСрвСру, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‚ Ρ‚ΠΎΠΊΠ΅Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Ρ„Π°ΠΉΠ» ΠΈ Π²Π΅Ρ€Π½ΡƒΠ» Π² ΠΎΡ‚Π²Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, всС ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ инструмСнтарий становится ΠΏΡ€ΠΎΡ‰Π΅.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ нСдостатки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ². К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ аспСкты Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компилятора Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΡΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² контСкстС API-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ².

Мало ΠΊΠ°ΠΊΠΈΠ΅ production-компиляторы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ CaaS. На ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Microsofts Roslyn, хотя я ΠΌΠ°Π»ΠΎ знаю ΠΎΠ± этом компиляторС, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. И я ΠΌΠΎΠ³Ρƒ ΠΎΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ, Π½ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… компиляторах Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½ΠΎ ΠΈΡ… Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΈΡˆΡƒΡ‚ API-ΠΌΠ°ΡˆΡ€ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ компиляторам, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Rust Π΅ΡΡ‚ΡŒ RLS.

Π’ ΠΌΠΎΡ‘ΠΌ языкС Krug β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Ρ‘ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ разрабатываСтся ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСустойчиво β€” Π² компиляторС Caasper ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ CaaS-Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°.

Caasper выполняСтся локально Π½Π° вашСй машинС (ΠΈΠ»ΠΈ, Ссли Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Π½Π° сСрвСрС), Π° Π·Π°Ρ‚Π΅ΠΌ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Ρ‹ ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, krug, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с этим сСрвисом. Плюс Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°, Π° СдинствСнный Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ (bootstrap) Π² самом языкС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ вСсь компилятор.

Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ для Krug Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° JavaScript, хотя Π±ΡƒΠ΄ΡƒΡ‚ ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Go*, Π° Ρ‚Π°ΠΊΠΆΠ΅, надСюсь, Π½Π° самом Krug. JavaScript Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Π·Π° Π΅Π³ΠΎ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с ΠΎΡ‡Π΅Π½ΡŒ популярными ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² yarn/npm.

* Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Π±Ρ‹Π» написан Π½Π° Go ΠΈ оказался (ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ) Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° JS.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ компилятора Caasper Π»Π΅ΠΆΠΈΡ‚ здСсь. Π’ ΠΌΠΎΡ‘ΠΌ Π»ΠΈΡ‡Π½ΠΎΠΌ Github Π»Π΅ΠΆΠΈΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Krug, ΠΎΠ½ написан Π½Π° D ΠΈ компилируСтся Π² LLVM. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Π΅ΠΌΠΎ Π½Π° ΠΌΠΎΡ‘ΠΌ YouTube-ΠΊΠ°Π½Π°Π»Π΅.

Руководство ΠΏΠΎ Krug (ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅) Π»Π΅ΠΆΠΈΡ‚ здСсь.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *