Π Π°Π·Π²ΠΈΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅Ρ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ΅ΡΠΊΠ° Π·Π°Π΄Π°ΡΠ°. ΠΠΎ, Π·Π° ΡΡΠ΅ΡΠ°, ΡΠΎ ΡΠ°Π·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΠ°ΠΊΠΎ 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
(Π±Π΅Π· ΠΏΠΎΡΠΏΠΈΡΠ°Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°), ΡΡΠΎ ΠΌΡ ΠΊΠ°ΠΆΡΠ²Π° Π½Π° 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
) ΠΊΠ°ΠΊΠΎ ΡΡΡΡΠΊΡΡΡΠ° (ΡΡΡΡΠΊΡΡΡΠ°), Π½ΠΎ Π½ΠΈΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΈ ΠΏΠΎΡΠ΅Π±Π½ΠΈ Π΅Π½ΡΠΈΡΠ΅ΡΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π΅ΠΊΠΎΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΏΠ°ΡΡΠ΅ΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠΈΠ½ΠΈ, Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΊΠΎΠ½Π²Π΅Π½ΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° ΡΠ΅Π»Π½Π°ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°.
ΠΡΡΠ³Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΎΠ²ΠΎΡ ΠΊΠΎΠ΄ Π΅ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ°ΡΠ° 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