LLVM เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐ Go

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ compiler เป€เบ›เบฑเบ™เบงเบฝเบเบ—เบตเปˆเบเบฒเบเบซเบผเบฒเบ. เปเบ•เปˆ, เป‚เบŠเบเบ”เบต, เบ”เป‰เบงเบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™เป€เบŠเบฑเปˆเบ™ LLVM, เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ, เป€เบŠเบดเปˆเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ”เบฝเบงเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบžเบฒเบชเบฒเปƒเบซเบกเปˆเบ—เบตเปˆเปƒเบเป‰เบŠเบดเบ”เบเบฑเบš C. เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš LLVM เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เป‚เบ”เบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ™เบตเป‰. เบฅเบฐโ€‹เบšเบปเบšโ€‹เปเบกเปˆเบ™โ€‹เบ•เบปเบงโ€‹เปเบ—เบ™โ€‹เป‚เบ”เบโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เปƒเบซเบเปˆโ€‹เบ‚เบญเบ‡โ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹, เป‚เบ”เบโ€‹เบกเบตโ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹เบžเบฝเบ‡โ€‹เป€เบฅเบฑเบโ€‹เบ™เป‰เบญเบโ€‹. เป€เบžเบทเปˆเบญเบžเบฐเบเบฒเบเบฒเบกเปเบเป‰เป„เบ‚เบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ™เบตเป‰, เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™, เบเบฒเบ™เปเบ›เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบœเบตเบเปเบœเปˆเปƒเบ™เบกเบทเป‰เบ™เบตเป‰, เบˆเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ Go เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเปเบ›เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบ™เบงเปƒเบ”. เป„เบ› SSA, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™ LLVM IR เป‚เบ”เบเปƒเบŠเป‰ compiler 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
}

เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ syntactic เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบกเปˆเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡. เบฅเบฐเบซเบฑเบ” LLVM IR เปเบกเปˆเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบ—เบตเปˆเป€เบ‚เบฑเป‰เบกเปเบ‚เบ‡เบเบงเปˆเบฒเบฅเบฐเบซเบฑเบ” Go SSA, เบ„เป‰เบฒเบเบ„เบทเบเบฑเบš C. เบ—เบตเปˆเบ™เบตเป‰, เปƒเบ™เบเบฒเบ™เบ›เบฐเบเบฒเบ”เบŸเบฑเบ‡เบŠเบฑเบ™, เบ—เปเบฒเบญเบดเบ”เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒ, เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบเปˆเบญเบ™เบŠเบทเปˆเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ IR เบ‡เปˆเบฒเบเบ”เบฒเบ, เบŠเบทเปˆเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบปเปˆเบงเป‚เบฅเบเปเบกเปˆเบ™เบ™เปเบฒเบซเบ™เป‰เบฒเบ”เป‰เบงเบเบชเบฑเบ™เบเบฒเบฅเบฑเบ. @, เปเบฅเบฐเบเปˆเบญเบ™เบŠเบทเปˆเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบกเบตเบชเบฑเบ™เบเบฒเบฅเบฑเบ % (เบŸเบฑเบ‡เบŠเบฑเบ™เปœเบถเปˆเบ‡เบเบฑเบ‡เบ–เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เปœเปˆเบงเบเป‚เบฅเบ).

เบชเบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” Go int, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เป€เบ›เบฑเบ™เบ„เปˆเบฒ 32-bit เบซเบผเบท 64-bit, เบ‚เบถเป‰เบ™เบเบฑเบš compiler เปเบฅเบฐเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก, เบ–เบทเบเบเบญเบกเบฎเบฑเบšเป€เบกเบทเปˆเบญ LLVM เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” IR. เบ™เบตเป‰เปเบกเปˆเบ™ เปœเบถเปˆเบ‡ เปƒเบ™เบซเบผเบฒเบเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบงเปˆเบฒเบฅเบฐเบซเบฑเบ” LLVM IR เบšเปเปˆเปเบกเปˆเบ™, เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบซเบผเบฒเบเบ„เบปเบ™เบ„เบดเบ”, เป€เบงเบ—เบตเป€เบญเบเบฐเบฅเบฒเบ”. เบฅเบฐเบซเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบชเป‰เบฒเบ‡เบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเบ”เบฝเบง, เบšเปเปˆเบชเบฒเบกเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบฅเบงเบšเบฅเบงเบกเบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเบญเบทเปˆเบ™ (เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆเบงเปˆเบฒเบ—เปˆเบฒเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰. เบ”เป‰เบงเบเบเบฒเบ™เบ”เบนเปเบฅเบ—เบตเปˆเบชเบธเบ”).

เบˆเบธเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ„เบงเบ™เบชเบฑเบ‡เป€เบเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบ›เบฐเป€เบžเบ” i64 เบšเปเปˆเปเบกเปˆเบ™เบˆเบณเบ™เบงเบ™เป€เบ•เบฑเบกเบ—เบตเปˆเบฅเบปเบ‡เบฅเบฒเบเป€เบŠเบฑเบ™: เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ‡เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ•เบปเบงเป€เบฅเบ. เบญเบตเบ‡เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ—เบฑเบ‡เบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเป€เบŠเบฑเบ™เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เป€เบŠเบฑเบ™. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ™เบตเป‰เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเป€เบŠเบฑเบ™เบซเบผเบทเบšเปเปˆเป„เบ”เป‰เป€เบŠเบฑเบ™. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเปƒเบ™เบžเบฒเบชเบฒ C, เบเบฒเบ™ overflowing เบ•เบปเบงเปเบ› integer เบ—เบตเปˆเบฅเบปเบ‡เบ™เบฒเบกเบ™เปเบฒเป„เบ›เบชเบนเปˆเบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ Clang frontend เป€เบžเบตเปˆเบกเบ—เบธเบ‡เปƒเบชเปˆเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™. nsw (เบšเปเปˆเบกเบตเป€เบŠเบฑเบ™เบšเบปเบ”เบšเบฑเบ™เบ—เบถเบ), เป€เบŠเบดเปˆเบ‡เบšเบญเบ LLVM เบงเปˆเบฒเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเป€เบ„เบตเบ overflows.

เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบตเปˆเบกเบชเบญเบ‡เบ„เปˆเบฒ i16 เปƒเบ™เป€เบงเบ—เบต 32-bit (เบกเบตเบ—เบฐเบšเบฝเบ™ 32-bit) เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบชเบฑเบ™เบเบฒเบ™เป€เบžเบทเปˆเบญเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเปƒเบ™เบ‚เบญเบšเป€เบ‚เบ”. i16. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ™เบตเป‰, เบกเบฑเบ™เบกเบฑเบเบˆเบฐเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบเบงเปˆเบฒเป€เบเบปเปˆเบฒเป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ‚เบฐเบซเบ™เบฒเบ”เป€เบ„เบทเปˆเบญเบ‡เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™.

เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ•เปเปˆเป„เบ›เบเบฑเบšเบฅเบฐเบซเบฑเบ” IR เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™. เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™ optimized (เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเป€เบŠเบฑเปˆเบ™เบžเบงเบเป€เบฎเบปเบฒ, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เปเบกเปˆเบ™ optimized) เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบฅเบฐเบซเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเบชเบญเบ‡

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ•เปเปˆเป„เบ›เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบ. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบฅเบงเบกเป€เบญเบปเบฒเบชเปˆเบงเบ™เบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบก:

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. เบšเบฒเบ‡เบ—เบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบšเปเปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผเบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡. เป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ, เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบเบฐเป‚เบ”เบ”เบ—เบตเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปเบฅเบฐเบšเปเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚, เปเบฅเบฐเบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เป€เบ›เบฑเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผ, เบ„เปเบฒเบชเบฑเปˆเบ‡เบเบฑเบšเบ„เบทเบ™.

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบšเปเปˆเป„เบ”เป‰เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบ—เปˆเบญเบ™เป„เบกเป‰เป‚เบ”เบเปƒเบŠเป‰เบงเบปเบ‡เป€เบฅเบฑเบš curly (เปƒเบ™เบ„เบญเบšเบ„เบปเบง C เบ‚เบญเบ‡เบžเบฒเบชเบฒ). เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบšเปˆเบ‡เบญเบญเบเป‚เบ”เบเบ›เป‰เบฒเบเบŠเบทเปˆ, reminiscent เบ‚เบญเบ‡เบžเบฒเบชเบฒเบ›เบฐเบเบญเบš, เปเบฅเบฐเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ•เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™. เปƒเบ™ SSA, เบ•เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเบ•เบดเบ”เบเบฑเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ›เป‰เบฒเบเบŠเบทเปˆเปเบฅเบฐเบฅเบปเบ‡เบ—เป‰เบฒเบเบ”เป‰เบงเบเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบšเบผเบญเบเบžเบทเป‰เบ™เบ–เบฒเบ™, เป€เบŠเบฑเปˆเบ™: โˆ’ return ะธ jump.

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เป‚เบ”เบเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ phi. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบœเบดเบ”เบ›เบปเบเบเบฐเบ•เบดเปเบฅเบฐเบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบšเบฒเบ‡เป€เบงเบฅเบฒเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆ. เบˆเบทเปˆ, เบงเปˆเบฒ เบช เบซเบเปเป‰เบกเบฒเบˆเบฒเบ Static Single Assignment. เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ•เบปเบงเบเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบœเบนเป‰เบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เปเบ•เปˆเบฅเบฐเบ•เบปเบงเปเบ›เบˆเบฐเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบ„เปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบ„เบฑเป‰เบ‡เบ”เบฝเบง. เบ™เบตเป‰เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเป€เบŠเบฑเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ myAddเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปเบ•เปˆเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบซเบผเบฒเบเป€เบŠเบฑเปˆเบ™: เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบปเบ™เบ—เบฐเบ™เบฒเปƒเบ™เบžเบฒเบเบ™เบตเป‰ sum. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบ•เบปเบงเปเบ›เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡ loop i ะธ n.

SSA เบ‚เป‰เบฒเบกเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เปƒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเบ•เบปเบงเปเบ›เบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ. phi (เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบกเบฑเบ™โ€‹เบ–เบทเบโ€‹เป€เบญเบปเบฒโ€‹เบกเบฒโ€‹เบˆเบฒเบโ€‹เบ•เบปเบงโ€‹เบญเบฑเบโ€‹เบชเบญเบ™โ€‹เบโ€‹เป€เบฃเบฑเบโ€‹)โ€‹. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡ SSA เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเป€เบŠเบฑเปˆเบ™ C, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบšเบฒเบ‡ tricks. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบกเบนเบ™เบ„เปˆเบฒเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบ•เบปเบงเปเบ› (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 เปเบฅเป‰เบง.

เบเบฒเบ™เบ›เบฐเบ”เบดเบ”เบชเป‰เบฒเบ‡เบญเบตเบเบ›เบฐเบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบฅเบฐเบ”เบฑเบšเบเบฒเบ‡เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบš slice เป‚เบ”เบเบ”เบฑเบ”เบŠเบฐเบ™เบตเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบขเบนเปˆเปเบฅเบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡ deferencing เบ•เบปเบงเบŠเบตเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบฅเบฐเบซเบฑเบ” 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
}

เบ—เบตเปˆเบ™เบตเป‰, เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ syntactic เบญเบทเปˆเบ™เป†. เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบเบฒเบ™เป‚เบ— phi เบกเบนเบ™เบ„เปˆเบฒเปเบฅเบฐเบ›เป‰เบฒเบเบŠเบทเปˆ swapped. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบตเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบ—เบตเปˆเบกเบตเบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเป€เบ›เบฑเบ™เบžเบดเป€เบชเบ”.

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบฅเบฒเบเป€เบŠเบฑเบ™เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”. LLVM เบšเปเปˆเบฎเบญเบ‡เบฎเบฑเบšเบŠเบดเป‰เบ™เบชเปˆเบงเบ™, เปเบฅเบฐเบ”เป‰เบงเบเป€เบซเบ”เบ™เบตเป‰, เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบ•เบปเบงเบชเบฑเบ‡เบฅเบงเบก TinyGo เบ—เบตเปˆเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เบ™เบตเป‰เปเบšเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบญเบญเบเป€เบ›เบฑเบ™เบžเบฒเบเบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบชเบฒเบกเบญเบปเบ‡เบ›เบฐเบเบญเบš (ptr, len ะธ cap) เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ (เป‚เบ„เบ‡เบชเป‰เบฒเบ‡), เปเบ•เปˆเบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเป€เบ›เบฑเบ™เบชเบฒเบกเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบ„เบญเบกเบžเบตเบงเป€เบ•เบตเบญเบทเปˆเบ™เป†เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡ slice เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†, เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบปเบ™เบ—เบดเบชเบฑเบ™เบเบฒเบเบฒเบ™เป‚เบ—เบซเบฒเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เป€เบงเบ—เบตเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ 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. เปเบ™เปˆเบ™เบญเบ™, เบกเบตเบซเบผเบฒเบเบซเบผเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบญเบฒเบ”เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบซเบผเบฒเบเบ„เปเบฒเบšเบฑเบ™เบเบฒเบเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเปˆเบฒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบžเบทเปˆเบญเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฅเบฑเบเบชเบฐเบ™เบฐเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบเบฑเบš compiler เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบญเบญเบเปƒเบ™ IR. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เบ—เบธเบ‡ inbounds เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ GEP, เบซเบผเบทเบ—เบธเบ‡ nsw ะธ nuw, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเปƒเบชเปˆเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ add. เบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™ private, เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡ optimizer เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบกเบฑเบ™เบซเบกเบฒเบเบˆเบฐเบšเปเปˆเบ–เบทเบเบญเป‰เบฒเบ‡เบญเบตเบ‡เบˆเบฒเบเบžเบฒเบเบ™เบญเบเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ›เบฐเบˆเบธเบšเบฑเบ™. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš interprocedural เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเป€เบŠเบฑเปˆเบ™เบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš LLVM เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™, เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡เป€เบฅเบทเป‰เบญเบเป†เปƒเบ™เป€เบงเบฅเบฒเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ•เบปเบงเบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™ LLVM เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡. เบ—เบตเปˆเบ™เบตเป‰ เบ„เบนเปˆเบกเบท, เป€เบŠเบดเปˆเบ‡เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ compiler เบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ. เบ—เบฑเบ‡เบชเบญเบ‡เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡ compiler เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡.

เบ—เปˆเบฒเบ™เบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบตเปˆเบฎเบฑเบเปเบžเบ‡! เป€เบˆเบปเป‰เบฒเปƒเบŠเป‰ LLVM เบšเป?

LLVM เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐ Go

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™