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 (Π±Π΅Π· ΠΏΠΎΡ‚ΠΏΠΈΡˆΠ°Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°), ΡˆΡ‚ΠΎ ΠΌΡƒ ΠΊΠ°ΠΆΡƒΠ²Π° Π½Π° 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. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ сС сосСма Π½Π΅Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡ‚Ρ€Π°Π΅ Π½Π΅ΠΊΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚. сС сСќавам Π΄Π΅ΠΊΠ° ББА Π΅ ΠΊΡ€Π°Ρ‚Π΅Π½ΠΊΠ° Π·Π° 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) ΠΊΠ°ΠΊΠΎ структура (структура), Π½ΠΎ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ ΠΏΡ€Π΅Ρ‚ΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΊΠ°ΠΊΠΎ Ρ‚Ρ€ΠΈ посСбни Π΅Π½Ρ‚ΠΈΡ‚Π΅Ρ‚ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π½Π΅ΠΊΠΎΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Π”Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ прСтставуваат ΠΏΠ°Ρ€Ρ‡Π΅Ρ‚ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ, Π²ΠΎ зависност ΠΎΠ΄ ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Ρ†Π΅Π»Π½Π°Ρ‚Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.

Π”Ρ€ΡƒΠ³Π° интСрСсна карактСристика Π½Π° овој ΠΊΠΎΠ΄ Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€