ืืขืืืขืืึธืคึผืื ื ืึท ืงืึทืืคึผืืืืขืจ ืืื ืึท ืืืืขืจ ืฉืืืขืจ ืึทืจืืขื. ืึธืืขืจ, ืฆืื ืืืืง, ืืื ืืขืจ ืึทื ืืืืืงืืื ื ืคืื ืคึผืจืึทืืืฉืขืงืก ืืื 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's ืืืคึผ ืคืึทืจืืจืขืืื ื ืืึทืฉืืืก int
, ืืืึธืก ืงืขื ืขื ืืืื ืจืขืคึผืจืืืขื ืืื ืืื ืึท 32-ืืืกื ืึธืืขืจ 64-ืืืกื ืืืขืจื, ืืืคึผืขื ืืื ื ืืืืฃ ืื ืงืึทืืคึผืืืืขืจ ืืื ืืขืจ ืฆืื ืคืื ืื ืืึทืืืื ื, ืืื ืื ืืขื ืืืขื ืืืขื LLVM ืืืฉืขื ืขืจืืืฅ ืื ืืจ ืงืึธื. ืืึธืก ืืื ืืืื ืขืจ ืคืื ืื ืคืืืข ืกืืืืช ืึทื LLVM IR ืงืึธื ืืื ื ืืฉื, ืืื ืคืืืข ืืขื ืืฉื ืืจืึทืืื, ืคึผืืึทืืคืึธืจืืข ืคืจืืึท. ืึทืืึท ืงืึธื, ืืืฉืืคื ืคึฟืึทืจ ืืืื ืคึผืืึทืืคืึธืจืืข, ืงืขื ืขื ื ืื ื ืึธืจ ืืืื ืืขื ืืืขื ืืื ืฆืื ืืืคืืขืฉืืขืื ืคึฟืึทืจ ืื ืื ืืขืจ ืคึผืืึทืืคืึธืจืืข (ืกืืึทืื ืืืจ ืืขื ื ืคึผืึทืกืืง ืคึฟืึทืจ ืกืึทืืืืื ื ืืขื ืคึผืจืึธืืืขื
ืื ืื ืืขืจ ืืฉืืงืึทืืืข ืคืื ื ืืืขืจื ืืืืขืจืงื ืืื ืึทื ืืขืจ ืืืคึผ i64
ืืื ื ืืฉื ืึท ืืขืืชืืขื ืืึทื ืฅ ื ืืืขืจ: ืขืก ืืื ื ืืืืจืึทื ืืื ืืขืจืืื ืขื ืคืื ืจืขืคึผืจืืืขื ืืื ื ืื ืฆืืืื ืคืื ืื ื ืืืขืจ. ืืขืคึผืขื ืืื ื ืืืืฃ ืื ืืืืขื, ืขืก ืงืขื ืขื ืคืึธืจืฉืืขืื ืืืืืข ืืขืืชืืขื ืืื ืึทื ืกืืื ื ื ืืืขืจื. ืืื ืืขื ืคืึทื ืคืื ืื ืคืึทืจืืจืขืืื ื ืคืื ืื ืึทืืืฉืึทื ืึธืคึผืขืจืึทืฆืืข, ืืึธืก ืืื ื ืืฉื ืขื ืื, ืึทืืื ืขืก ืืื ืงืืื ืืืืืง ืืื ืืจืืขืื ืืื ืืขืืชืืขื ืึธืืขืจ ืึทื ืกืืื ื ื ืืืขืจื. ืืึธ ืืื ืืืึธืื ืืื ืฆื ืืึธื ืึทื ืืื ืื C ืฉืคึผืจืึทื, ืึธืืืืขืจืคืืึธืืื ื ืึท ืืขืืชืืขื ืื ืืึทืืืฉืขืจ ืืืึทืืขืืืืืง ืคืืจื ืฆื ืึทื ืืืคืืื ื ื ืึทืืืจ, ืึทืืื ืื ืงืืึทื ื ืคืจืึธื ืืขื ื ืืืกืืฃ ืึท ืคืึธื ืฆื ืื ืึธืคึผืขืจืึทืฆืืข nsw
(ืงืืื ืืขืืชืืขื ืืึทื ืืืืงืืขื), ืืืึธืก ืืขืจืฆืืืื LLVM ืึทื ืขืก ืงืขื ืขื ืืืขืจื ืขืืขื ืึทื ืืขืจืฆื ืงืืื ืืึธื ืึธืืืืขืจืคืืึธืื.
ืืึธืก ืงืขื ืืืื ืืืืืืืง ืคึฟืึทืจ ืขืืืขืืข ืึธืคึผืืืืืืึทืืืึธื ืก. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืึทืืื ื ืฆืืืื ืืืึทืืืขืก i16
ืืืืฃ ืึท 32-ืืืกื ืคึผืืึทืืคืึธืจืืข (ืืื 32-ืืืกื ืจืขืืืฉืืกืืขืจื) ืจืืงืืืืืขืจื, ื ืึธื ืึทืืืฉืึทื, ืึท ืฆืืืื ืืงืกืคึผืึทื ืฉืึทื ืึธืคึผืขืจืึทืฆืืข ืฆื ืืืืึทืื ืืื ืงืืื i16
. ืืืืึทื ืคืื ืืขื, ืขืก ืืื ืึธืคื ืืขืจ ืขืคืขืงืืืื ืฆื ืืืจืืคืืจื ืื ืืึทืืืฉืขืจ ืึทืคึผืขืจืืืฉืึทื ื ืืืืืจื ืืืืฃ ืืึทืฉืื ืจืขืืืกืืจืืจื ืกืืืขืก.
ืืืึธืก ืืึทืคึผืึทื ื ืืืืึทืืขืจ ืืื ืืขื ืืจ ืงืึธื ืืื ื ืืฉื ืคืื ืืึทืืื ืืขืจ ืืื ืืขืจืขืก ืฆื ืืื ืื ืืืฆื. ืืขืจ ืงืึธื ืืื ืึธืคึผืืืืืืขื (ืึธืืขืจ ืืื ืืขื ืคืึทื ืคืื ืึท ืคึผืฉืื ืืืึทืฉืคึผืื ืืื ืืื ืืืขืจ, ืืึธืจื ืืฉื ืืื ืึธืคึผืืืืืืขื) ืืื ืืขืืึธืื ืงืึธื ืืืขืจืืขื ืืื ืืึทืฉืื ืงืึธื.
ืฆืืืืืืข ืืืืฉืคืื
ืืขืจ ืืืืึทืืขืจ ืืืึทืฉืคึผืื ืืืจ ืืืขืื ืงืืงื ืืื ืืืขื ืืืื ืึท ืืืกื ืืขืจ ืงืึธืืคึผืืืฆืืจื. ื ืืืืื, ืืืจ ืืขื ืขื ืืขืจืขืื ืืืขืื ืึท ืคึฟืื ืงืฆืืข ืืืึธืก ืกืึทืืขืจื ืึท ืจืขืคืื ืคืื ืื ืืึทืืืฉืขืจื:
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 ืึทืจืืขื. ืคึฟืื ืึท ืืขื ืืฉ ืคึผืขืจืกืคึผืขืงืืืื, ืืึธืก ืึทืืฅ ืืืื ืื ืงืึธื ืฉืืืขืจ ืฆื ืคึฟืึทืจืฉืืืื, ืึธืืขืจ ืืขืจ ืคืึทืงื ืึทื ืืขืืขืจ ืืืขืจื ืืื ืึทืกืืื ื ืืืืื ืึทืืึธื ืืืื ืคืืืข ืึทืคึผืืึทืืึทืืืืฉืึทื ื ืคืื ืืจืื ืืขืจ.
ืืึทืืขืจืงืื ื ืึทื ืืืื ืืืจ ืฉืจืืึทืื ืืืื ืืืืื ืงืึทืืคึผืืืืขืจ, ืืืจ ืืืืฉืึทืืืึทืื ืืืขื ื ืืฉื ืืึธืื ืฆื ืืึทื ืืืขื ืืื ืืขื ืกืึธืจื ืคืื ืฉืืึธืคึผื. ืืคืืื ืงืืึทื ื ืืืฉืขื ืขืจืืืฅ ื ืืฉื ืึทืืข ืื ืื ืกืืจืึทืงืฉืึทื ื 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. ืคืื ืงืืจืก, ืขืก ืืื ืึท ืคึผืืึทืฅ ืืขืจ ืืึธ. ืืื ืืึทืืื ืืขืจ, ืื ืื ืืขืจืืืืืื ืคืึทืจืืจืขืืื ื ืคืื ืื ืงืึธื ืงืขื ืึทื ืืืึทืืื ืคืืืข ืึทื ืึทืืืืฉืึทื ื ืืืึธืก ืืึธืื ืึทืคึผืืึทืืึทืืืืฉืึทื ืคึผืึทืกืื ืฆื ื ืขืืขื ืืื ืืฉืืื ืืืืขืจ ืคึฟืขืึดืงืืืื ืคืื ืื ืงืึธื ืืืงืื ื ืฆื ืื ืงืึทืืคึผืืืืขืจ ืืืึธืก ืงืขื ืขื ื ืื ืึทื ืืขืจืฉ ืืืื ืืืืกืืขืืจืืงื ืืื ืืจ. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืึธืก ืืื ืึท ืคืึธื inbounds
GEP ืื ืกืืจืึทืงืฉืึทื ื, ืึธืืขืจ ืคืืึทืืก nsw
ะธ nuw
, ืืืึธืก ืงืขื ืขื ืืืื ืืืกืืฃ ืฆื ืื ืื ืกืืจืึทืงืฉืึทื ื add
. ืืขืจ ืืขืืืืงืขืจ ืืืื ืคึฟืึทืจ ืื ืงืืืืขืจื private
, ืื ืืึทืงืืืืื ื ืฆื ืื ืึธืคึผืืืืืืขืจ ืึทื ืื ืคึฟืื ืงืฆืืข ืขืก ืืึทืจืงืก ืืืขื ื ืืฉื ืืืื ืจืขืคืขืจืขื ืกืขื ืคึฟืื ืึทืจืืืก ืื ืงืจืึทื ื ืืึทืืืื ื ืึทืคึผืึทืจืึทื. ืืึธืก ืึทืืึทืื ืึท ืคึผืืึทืฅ ืคืื ืืฉืืงืึทืืืข ืื ืืขืจืคึผืจืึทืกืืืืฉืขืจืึทื ืึทืคึผืืึทืืึทืืืืฉืึทื ื ืืื ืืืืืึทื ืืืืื ื ืึทื ืืืื ืึทืจืืืืขื ืื.
ืืืจ ืงืขื ื ืืืืขื ืขื ืืขืจ ืืืขืื LLVM ืืื
ืืื ืืืืขื ืขืจ! ื ืืฆื LLVM?
ืืงืืจ: www.habr.com