LLVM ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Go

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°. Но, Π·Π° щастиС, с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ LLVM, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ опростСно, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π΄ΠΎΡ€ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ програмист Π΄Π° създадС Π½ΠΎΠ² Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ близък ΠΏΠΎ производитСлност Π΄ΠΎ C. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с LLVM сС услоТнява ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° систСмата Π΅ прСдставСна ΠΎΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎ количСство ΠΊΠΎΠ΄, ΠΎΠ±ΠΎΡ€ΡƒΠ΄Π²Π°Π½ с ΠΌΠ°Π»ΠΊΠΎ докумСнтация. Π—Π° Π΄Π° сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° Ρ‚ΠΎΠ·ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ, Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°, Ρ‡ΠΈΠΉΡ‚ΠΎ ΠΏΡ€Π΅Π²ΠΎΠ΄ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ днСс, Ρ‰Π΅ дСмонстрира ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠ΄, написан Π½Π° Go, ΠΈ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ Ρ‚Π΅ ΠΏΡŠΡ€Π²ΠΎ сС ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π°Ρ‚ Π½Π° ΠžΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° SSA, ΠΈ слСд Ρ‚ΠΎΠ²Π° Π² LLVM IR с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° tinyGO. Go SSA ΠΈ LLVM IR ΠΊΠΎΠ΄ΡŠΡ‚ Π΅ Π»Π΅ΠΊΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½, Π·Π° Π΄Π° сС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ Π½Π΅Ρ‰Π°, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Ρ‚ΡƒΠΊ обяснСния, Π·Π° Π΄Π° направят обяснСнията ΠΏΠΎ-Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΈ.

LLVM ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Go

ΠŸΡŠΡ€Π²ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠŸΡŠΡ€Π²Π°Ρ‚Π° функция, която Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ Ρ‚ΡƒΠΊ, Π΅ прост ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° добавянС Π½Π° числа:

func myAdd(a, b int) int{
    return a + b
}

Π’Π°Π·ΠΈ функция Π΅ ΠΌΠ½ΠΎΠ³ΠΎ проста ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½ΠΈΡ‰ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎ-просто. ΠŸΡ€Π΅Π²Π΅ΠΆΠ΄Π° сС Π² слСдния ΠΊΠΎΠ΄ Π½Π° Go SSA:

func myAdd(a int, b int) int:
entry:
    t0 = a + b                                                    int
    return t0

ΠŸΡ€ΠΈ Ρ‚ΠΎΠ²Π° прСдставянС подсказкитС Π·Π° Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ Π½Π° функцията сС поставят отдясно ΠΈ Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Π½ΠΈ.

Π’ΠΎΠ·ΠΈ малък ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π΅Ρ‡Π΅ Π²ΠΈ позволява Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Π΅Π΄ΠΈΠ½ аспСкт Π½Π° SSA. А ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π² SSA Ρ„ΠΎΡ€ΠΌΠ°, всСки ΠΈΠ·Ρ€Π°Π· сС Ρ€Π°Π·Π±ΠΈΠ²Π° Π½Π° Π½Π°ΠΉ-Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½ΠΈΡ‚Π΅ части, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС ΡΡŠΡΡ‚ΠΎΠΈ. Π’ нашия случай ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° return a + b, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ прСдставлява Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄Π²Π΅ числа ΠΈ Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°.

ОсвСн Ρ‚ΠΎΠ²Π° Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ основнитС Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°; Π² Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΠΈΠΌΠ° само Π΅Π΄ΠΈΠ½ Π±Π»ΠΎΠΊ - входният Π±Π»ΠΎΠΊ. По-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅.

ΠšΠΎΠ΄ΡŠΡ‚ Go SSA лСсно сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² LLVM IR:

define i64 @myAdd(i64 %a, i64 %b) {
entry:
  %0 = add i64 %a, %b
  ret i64 %0
}

Π’ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅ Π΅, Ρ‡Π΅ Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Ρ‚ΡƒΠΊ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ синтактични структури, структурата Π½Π° функцията Π΅ основно Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½Π°. ΠšΠΎΠ΄ΡŠΡ‚ LLVM IR Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-силСн ΠΎΡ‚ ΠΊΠΎΠ΄Π° Go SSA, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° C. Π’ΡƒΠΊ, Π² дСкларацията Π½Π° функцията, ΠΏΡŠΡ€Π²ΠΎ ΠΈΠΌΠ° описаниС Π½Π° Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ Π²Ρ€ΡŠΡ‰Π°, Ρ‚ΠΈΠΏΡŠΡ‚ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΅ посочСн ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ОсвСн Ρ‚ΠΎΠ²Π°, Π·Π° Π΄Π° сС опрости Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° IR, ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡ‚Π΅ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ сС ΠΏΡ€Π΅Π΄Ρ…ΠΎΠΆΠ΄Π°Ρ‚ ΠΎΡ‚ символа @, Π° ΠΏΡ€Π΅Π΄ мСстнитС ΠΈΠΌΠ΅Π½Π° ΠΈΠΌΠ° симв % (Π΅Π΄Π½Π° функция ΡΡŠΡ‰ΠΎ сС счита Π·Π° Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚).

Π•Π΄Π½ΠΎ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅, Ρ‡Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° прСдставянС Π½Π° Ρ‚ΠΈΠΏΠ° Π½Π° Go int, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС прСдставСн ΠΊΠ°Ρ‚ΠΎ 32-Π±ΠΈΡ‚ΠΎΠ²Π° ΠΈΠ»ΠΈ 64-Π±ΠΈΡ‚ΠΎΠ²Π° стойност, Π² зависимост ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° ΠΈ Ρ†Π΅Π»Ρ‚Π° Π½Π° компилацията, сС ΠΏΡ€ΠΈΠ΅ΠΌΠ°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° LLVM IR ΠΊΠΎΠ΄ΡŠΡ‚. Π’ΠΎΠ²Π° Π΅ Π΅Π΄Π½Π° ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ LLVM IR ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π΅ Π΅ нСзависим ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π° си мислят. Вакъв ΠΊΠΎΠ΄, създадСн Π·Π° Π΅Π΄Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, Π½Π΅ ΠΌΠΎΠΆΠ΅ просто Π΄Π° бъдС Π²Π·Π΅Ρ‚ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ Π·Π° Π΄Ρ€ΡƒΠ³Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° (освСн Π°ΠΊΠΎ Π½Π΅ стС подходящи Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½Π° прСдпазливост).

Π”Ρ€ΡƒΠ³ интСрСсСн ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠΉΡ‚ΠΎ си струва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Π΅, Ρ‡Π΅ Ρ‚ΠΈΠΏΡŠΡ‚ i64 Π½Π΅ Π΅ цяло число със Π·Π½Π°ΠΊ: Ρ‚ΠΎ Π΅ Π½Π΅ΡƒΡ‚Ρ€Π°Π»Π½ΠΎ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° прСдставянСто Π½Π° Π·Π½Π°ΠΊΠ° Π½Π° числото. Π’ зависимост ΠΎΡ‚ инструкцията ΠΌΠΎΠΆΠ΅ Π΄Π° прСдставлява ΠΊΠ°ΠΊΡ‚ΠΎ числа със Π·Π½Π°ΠΊ, Ρ‚Π°ΠΊΠ° ΠΈ числа Π±Π΅Π· Π·Π½Π°ΠΊ. Π’ случай Π½Π° прСдставянС Π½Π° опСрацията Π·Π° ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Ρ‚ΠΎΠ²Π° няма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ няма Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с числа със Π·Π½Π°ΠΊ ΠΈΠ»ΠΈ Π±Π΅Π· Π·Π½Π°ΠΊ. Π’ΡƒΠΊ Π±ΠΈΡ… искал Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠ°, Ρ‡Π΅ Π² Π΅Π·ΠΈΠΊΠ° C ΠΏΡ€Π΅ΠΏΡŠΠ»Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° цСлочислСна ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° със Π·Π½Π°ΠΊ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡŠΡ‚ Π½Π° Clang добавя Ρ„Π»Π°Π³ към опСрацията nsw (no signed wrap), ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠ°Π·Π²Π° Π½Π° LLVM, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅, Ρ‡Π΅ добавянСто Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΏΡ€Π΅ΠΏΡŠΠ»Π²Π°.

Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π° някои ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. НапримСр добавянС Π½Π° Π΄Π²Π΅ стойности i16 Π½Π° 32-Π±ΠΈΡ‚ΠΎΠ²Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° (с 32-Π±ΠΈΡ‚ΠΎΠ²ΠΈ рСгистри) изисква слСд добавянС опСрация Π·Π° Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° Π·Π½Π°ΠΊΠ°, Π·Π° Π΄Π° останС Π² ΠΎΠ±Ρ…Π²Π°Ρ‚Π° i16. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° чСсто Π΅ ΠΏΠΎ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ Ρ†Π΅Π»ΠΈ числа въз основа Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π½ΠΈΡ‚Π΅ рСгистри.

Какво Ρ‰Π΅ сС случи слСд Ρ‚ΠΎΠ²Π° с Ρ‚ΠΎΠ·ΠΈ IR ΠΊΠΎΠ΄ сСга Π½Π΅ Π½ΠΈ интСрСсува особСно. ΠšΠΎΠ΄ΡŠΡ‚ сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° (Π½ΠΎ Π² случай Π½Π° прост ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Ρ‚ΠΎ нашия, Π½ΠΈΡ‰ΠΎ Π½Π΅ сС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°) ΠΈ слСд Ρ‚ΠΎΠ²Π° сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² машинСн ΠΊΠΎΠ΄.

Π’Ρ‚ΠΎΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

БлСдващият ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅, Ρ‰Π΅ бъдС ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТСн. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° функция, която сумира част ΠΎΡ‚ Ρ†Π΅Π»ΠΈ числа:

func sum(numbers []int) int {
    n := 0
    for i := 0; i < len(numbers); i++ {
        n += numbers[i]
    }
    return n
}

Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² слСдния Go SSA ΠΊΠΎΠ΄:

func sum(numbers []int) int:
entry:
    jump for.loop
for.loop:
    t0 = phi [entry: 0:int, for.body: t6] #n                       int
    t1 = phi [entry: 0:int, for.body: t7] #i                       int
    t2 = len(numbers)                                              int
    t3 = t1 < t2                                                  bool
    if t3 goto for.body else for.done
for.body:
    t4 = &numbers[t1]                                             *int
    t5 = *t4                                                       int
    t6 = t0 + t5                                                   int
    t7 = t1 + 1:int                                                int
    jump for.loop
for.done:
    return t0

Π’ΡƒΠΊ Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ‰Π΅ конструкции, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΈ Π·Π° прСдставянС Π½Π° ΠΊΠΎΠ΄ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° SSA. МоТС Π±ΠΈ Π½Π°ΠΉ-ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°Ρ‚Π° характСристика Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅ Ρ„Π°ΠΊΡ‚ΡŠΡ‚, Ρ‡Π΅ няма структурирани ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π—Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° изчислСнията ΠΈΠΌΠ° само условни ΠΈ бСзусловни скоковС ΠΈ, Π°ΠΊΠΎ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅.

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π½Π΅ Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΈ скоби (ΠΊΠ°ΠΊΡ‚ΠΎ Π² сСмСйството Π½Π° Π΅Π·ΠΈΡ†ΠΈΡ‚Π΅ C). Π’ΠΎΠΉ Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ с Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ, напомнящи асСмблСрни Π΅Π·ΠΈΡ†ΠΈ, ΠΈ прСдставСн ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° основни Π±Π»ΠΎΠΊΠΎΠ²Π΅. Π’ SSA основнитС Π±Π»ΠΎΠΊΠΎΠ²Π΅ сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚ ΠΊΠ°Ρ‚ΠΎ съсСдни послСдоватСлности ΠΎΡ‚ ΠΊΠΎΠ΄, Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‰ΠΈ с Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ ΠΈ Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Ρ‰ΠΈ с основни инструкции Π·Π° Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ βˆ’ return ΠΈ jump.

Π”Ρ€ΡƒΠ³ интСрСсСн Π΄Π΅Ρ‚Π°ΠΉΠ» ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅ прСдставСн ΠΎΡ‚ инструкцията phi. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ са доста Π½Π΅ΠΎΠ±ΠΈΡ‡Π°ΠΉΠ½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ‚Π½Π΅ΠΌΠ΅ извСстно Π²Ρ€Π΅ΠΌΠ΅, Π·Π° Π΄Π° Π³ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅. Π½Π΅ забравяйтС, Ρ‡Π΅ SSA Π΅ ΡΡŠΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Static Single Assignment. Π’ΠΎΠ²Π° Π΅ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎ прСдставянС Π½Π° ΠΊΠΎΠ΄Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π½Π° всяка ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° сС присвоява стойност само вСднъТ. Π’ΠΎΠ²Π° Π΅ чудСсно Π·Π° изразяванС Π½Π° прости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° функция myAddΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π³ΠΎΡ€Π΅, Π½ΠΎ Π½Π΅ Π΅ подходящо Π·Π° ΠΏΠΎ-слоТни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ функцията, обсъТдана Π² Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π» sum. По-спСциално, ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ сС промСнят ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π° i ΠΈ n.

SSA заобикаля ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° присвояванС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ стойности вСднъТ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π°Ρ‚Π° инструкция phi (ΠΈΠΌΠ΅Ρ‚ΠΎ ΠΌΡƒ Π΅ Π²Π·Π΅Ρ‚ΠΎ ΠΎΡ‚ Π³Ρ€ΡŠΡ†ΠΊΠ°Ρ‚Π° Π°Π·Π±ΡƒΠΊΠ°). Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ SSA прСдставянСто Π½Π° ΠΊΠΎΠ΄Π° Π΄Π° бъдС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΎ Π·Π° Π΅Π·ΠΈΡ†ΠΈ ΠΊΠ°Ρ‚ΠΎ C, трябва Π΄Π° ΠΏΡ€ΠΈΠ±Π΅Π³Π½Π΅Ρ‚Π΅ Π΄ΠΎ някои Ρ‚Ρ€ΠΈΠΊΠΎΠ²Π΅. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ инструкция Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° стойност Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° (i ΠΈΠ»ΠΈ n), Π° ΠΊΠ°Ρ‚ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° списък ΠΎΡ‚ основни Π±Π»ΠΎΠΊΠΎΠ²Π΅. НапримСр, Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π·ΠΈ инструкция:

t0 = phi [entry: 0:int, for.body: t6] #n

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ Π΅ слСдното: Π°ΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡΡ‚ основСн Π±Π»ΠΎΠΊ Π΅ Π±ΠΈΠ» Π±Π»ΠΎΠΊ entry (Π²Ρ…ΠΎΠ΄), Ρ‚ΠΎΠ³Π°Π²Π° t0 Π΅ константа 0, ΠΈ Π°ΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡΡ‚ основСн Π±Π»ΠΎΠΊ бСшС for.body, Ρ‚ΠΎΠ³Π°Π²Π° трябва Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ стойността t6 ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ. Всичко Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° доста мистСриозно, Π½ΠΎ Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ ΠΊΠ°Ρ€Π° SSA Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. ΠžΡ‚ Ρ‡ΠΎΠ²Π΅ΡˆΠΊΠ° Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° всичко Ρ‚ΠΎΠ²Π° ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΠ΄Π° Ρ‚Ρ€ΡƒΠ΄Π΅Π½ Π·Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π½ΠΎ Ρ„Π°ΠΊΡ‚ΡŠΡ‚, Ρ‡Π΅ всяка стойност сС присвоява само вСднъТ, ΠΏΡ€Π°Π²ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-лСсни.

ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π°ΠΊΠΎ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свой собствСн ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ няма Π΄Π° Π²ΠΈ сС Π½Π°Π»Π°Π³Π° Π΄Π° сС справятС с Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄ Π½Π΅Ρ‰Π°. Π”ΠΎΡ€ΠΈ Clang Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° всички Ρ‚Π΅Π·ΠΈ инструкции phi, Ρ‚ΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ alloca (Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ). Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ стартиратС пас Π·Π° оптимизация Π½Π° LLVM, ΠΈΠ·Π²ΠΈΠΊΠ°Π½ mem2reg, инструкции alloca ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½ във Ρ„ΠΎΡ€ΠΌΠ° Π½Π° SSA. TinyGo ΠΎΠ±Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° информация ΠΎΡ‚ Go SSA, която Π·Π° удобство Π²Π΅Ρ‡Π΅ Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π° Π² SSA Ρ„ΠΎΡ€ΠΌΠ°.

Π”Ρ€ΡƒΠ³ΠΎ нововъвСдСниС Π½Π° разглСТдания Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ мСТдинния ΠΊΠΎΠ΄ Π΅, Ρ‡Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΄ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° срСза ΠΏΠΎ индСкс Π΅ прСдставСн ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° опСрация Π·Π° изчисляванС Π½Π° адрСса ΠΈ опСрация Π·Π° Π΄Π΅Ρ€Π΅Ρ„Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° получСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π». Π’ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ добавянС Π½Π° константи към IR ΠΊΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - 1:int). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с функцията myAdd Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ. Π‘Π΅Π³Π°, слСд ΠΊΠ°Ρ‚ΠΎ отстранихмС Ρ‚Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ΠΊΠ° Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π² ΠΊΠ°ΠΊΠ²ΠΎ сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² LLVM IR Ρ„ΠΎΡ€ΠΌΠ°:

define i64 @sum(i64* %ptr, i64 %len, i64 %cap) {
entry:
  br label %for.loop

for.loop:                                         ; preds = %for.body, %entry
  %0 = phi i64 [ 0, %entry ], [ %5, %deref.next ]
  %1 = phi i64 [ 0, %entry ], [ %6, %deref.next ]
  %2 = icmp slt i64 %1, %len
  br i1 %2, label %for.body, label %for.done

for.body:                                         ; preds = %for.loop
  %3 = getelementptr i64, i64* %ptr, i64 %1
  %4 = load i64, i64* %3
  %5 = add i64 %0, %4
  %6 = add i64 %1, 1
  br label %for.loop

for.done:                                         ; preds = %for.loop
  ret i64 %0
}

Π’ΡƒΠΊ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΡŠΡ‰Π°Ρ‚Π° структура, която Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π΄Ρ€ΡƒΠ³ΠΈ синтактични структури. НапримСр Π² Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ΠΈ phi стойноститС ΠΈ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ са Ρ€Π°Π·ΠΌΠ΅Π½Π΅Π½ΠΈ. Π’ΡƒΠΊ ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠΌΠ° Π½Π΅Ρ‰ΠΎ, Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ си заслуТава Π΄Π° сС ΠΎΠ±ΡŠΡ€Π½Π΅ спСциално Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

ΠšΠ°Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ напълно Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ подпис. LLVM Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° срСзовС ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ оптимизация, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ TinyGo, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄, Ρ€Π°Π·Π΄Π΅Π»ΠΈ описаниСто Π½Π° Ρ‚Π°Π·ΠΈ структура ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ Π½Π° части. МоТС Π΄Π° прСдставлява Ρ‚Ρ€ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° Π½Π° срСз (ptr, len ΠΈ cap) ΠΊΠ°Ρ‚ΠΎ структура (struct), Π½ΠΎ прСдставянСто ΠΈΠΌ ΠΊΠ°Ρ‚ΠΎ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚Π° позволява някои ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π”Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° прСдставят срСза ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ, Π² зависимост ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.

Π”Ρ€ΡƒΠ³Π° интСрСсна характСристика Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° инструкцията getelementptr (чСсто ΡΡŠΠΊΡ€Π°Ρ‚Π΅Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ GEP).

Π’Π°Π·ΠΈ инструкция Ρ€Π°Π±ΠΎΡ‚ΠΈ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π° срСз. НапримСр, Π½Π΅ΠΊΠ° Π³ΠΎ сравним със слСдния ΠΊΠΎΠ΄, написан Π½Π° C:

int* sliceptr(int *ptr, int index) {
    return &ptr[index];
}

Или със слСдния Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π°:

int* sliceptr(int *ptr, int index) {
    return ptr + index;
}

Най-Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ Ρ‚ΡƒΠΊ Π΅, Ρ‡Π΅ инструкциитС getelementptr Π½Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π΄Π΅Ρ€Π΅Ρ„Π΅Ρ€ΠΈΡ€Π°Ρ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎΠΉ просто изчислява Π½ΠΎΠ² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» въз основа Π½Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ. МоТС Π΄Π° сС ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ ΠΊΠ°Ρ‚ΠΎ инструкция mul ΠΈ add Π½Π° Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€Π½ΠΎ Π½ΠΈΠ²ΠΎ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° инструкциитС Π½Π° GEP Ρ‚ΡƒΠΊ.

Π”Ρ€ΡƒΠ³Π° интСрСсна характСристика Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° инструкцията icmp. Π’ΠΎΠ²Π° Π΅ инструкция с ΠΎΠ±Ρ‰ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° цСлочислСни сравнСния. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ Ρ‚Π°Π·ΠΈ инструкция Π²ΠΈΠ½Π°Π³ΠΈ Π΅ стойност ΠΎΡ‚ Ρ‚ΠΈΠΏ i1 β€” логичСска стойност. Π’ Ρ‚ΠΎΠ·ΠΈ случай сравнСниСто сС ΠΏΡ€Π°Π²ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° slt (подписано ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚), Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ сравнявамС Π΄Π²Π΅ числа, прСдставСни ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° int. Ако сравнявахмС Π΄Π²Π΅ Ρ†Π΅Π»ΠΈ числа Π±Π΅Π· Π·Π½Π°ΠΊ, Ρ‚ΠΎΠ³Π°Π²Π° Π±ΠΈΡ…ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π»ΠΈ icmp, Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΏΡ€ΠΈ сравнСниСто, Ρ‰Π΅ бъдС ult. Π—Π° сравняванС Π½Π° числа с ΠΏΠ»Π°Π²Π°Ρ‰Π° запСтая сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Ρ€ΡƒΠ³Π° инструкция, fcmp, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚

Вярвам, Ρ‡Π΅ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ… Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ характСристики Π½Π° LLVM IR. Π Π°Π·Π±ΠΈΡ€Π° сС, Ρ‚ΡƒΠΊ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅. По-спСциално, ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΎΡ‚ΠΎ прСдставянС Π½Π° ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π°Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ позволяват ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° оптимизация Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ някои характСристики Π½Π° ΠΊΠΎΠ΄Π°, извСстни Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ€Π°Π·Π΅Π½ΠΈ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π² IR. НапримСр, Ρ‚ΠΎΠ²Π° Π΅ Ρ„Π»Π°Π³ inbounds GEP инструкции ΠΈΠ»ΠΈ Ρ„Π»Π°Π³ΠΎΠ²Π΅ nsw ΠΈ nuw, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ към инструкциитС add. Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ Π²Π°ΠΆΠΈ ΠΈ Π·Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° private, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‡Π΅ функцията, която ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°, няма Π΄Π° бъдС Ρ€Π΅Ρ„Π΅Ρ€ΠΈΡ€Π°Π½Π° извън Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅. Π’ΠΎΠ²Π° позволява ΠΌΠ½ΠΎΠ³ΠΎ интСрСсни ΠΌΠ΅ΠΆΠ΄ΡƒΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°Ρ‚ΠΎ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° LLVM Π² докумСнтация, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ чСсто, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚Π΅ свой собствСн ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€, Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° LLVM. Π’ΡƒΠΊ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ прост Π΅Π·ΠΈΠΊ. И Π΄Π²Π°Ρ‚Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° информация Ρ‰Π΅ Π²ΠΈ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ свой собствСн ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π»ΠΈ LLVM?

LLVM ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Go

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€