Π Π°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΄Π½Π° Π·Π°Π΄Π°ΡΠ°. ΠΠΎ, Π·Π° ΡΠ°ΡΡΠΈΠ΅, Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΠ°ΡΠΎ LLVM, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠΎΡΡΠ΅Π½ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄ΠΎΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ Π½ΠΎΠ² Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ Π΅ Π±Π»ΠΈΠ·ΡΠΊ ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π΄ΠΎ C. Π Π°Π±ΠΎΡΠ°ΡΠ° Ρ 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
. ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ ΡΠ° Π΄ΠΎΡΡΠ° Π½Π΅ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π° Π΄Π° Π³ΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅. Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅, ΡΠ΅ 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, ΠΈΠ·Π²ΠΈΠΊΠ°Π½ 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?
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com