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. ื–ื• ืื—ืช ื”ืกื™ื‘ื•ืช ื”ืจื‘ื•ืช ืœื›ืš ืฉืงื•ื“ IR ืฉืœ LLVM ืื™ื ื•, ื›ืคื™ ืฉืื ืฉื™ื ืจื‘ื™ื ื—ื•ืฉื‘ื™ื, ื‘ืœืชื™ ืชืœื•ื™ ื‘ืคืœื˜ืคื•ืจืžื”. ืงื•ื“ ื›ื–ื”, ืฉื ื•ืฆืจ ืขื‘ื•ืจ ืคืœื˜ืคื•ืจืžื” ืื—ืช, ืœื ื ื™ืชืŸ ืคืฉื•ื˜ ืœืงื—ืช ื•ืœื”ืจื›ื™ื‘ ืขื‘ื•ืจ ืคืœื˜ืคื•ืจืžื” ืื—ืจืช (ืืœื ืื ื›ืŸ ืืชื” ืžืชืื™ื ืœืคืชืจื•ืŸ ื‘ืขื™ื” ื–ื• ื‘ื–ื”ื™ืจื•ืช ื™ืชืจื”).

ื ืงื•ื“ื” ืžืขื ื™ื™ื ืช ื ื•ืกืคืช ืฉื›ื“ืื™ ืœืฆื™ื™ืŸ ื”ื™ื ืฉื”ืกื•ื’ i64 ืื™ื ื• ืžืกืคืจ ืฉืœื ื‘ืกื™ืžืŸ: ื”ื•ื ื ื™ื˜ืจืœื™ ืžื‘ื—ื™ื ืช ื™ื™ืฆื•ื’ ื”ืกื™ืžืŸ ืฉืœ ื”ืžืกืคืจ. ื‘ื”ืชืื ืœื”ื•ืจืื”, ื–ื” ื™ื›ื•ืœ ืœื™ื™ืฆื’ ื’ื ืžืกืคืจื™ื ื—ืชื•ืžื™ื ื•ื’ื ืœื ื—ืชื•ืžื™ื. ื‘ืžืงืจื” ืฉืœ ื™ื™ืฆื•ื’ ืคืขื•ืœืช ื”ื—ื™ื‘ื•ืจ, ื–ื” ืœื ืžืฉื ื”, ื•ืœื›ืŸ ืื™ืŸ ื”ื‘ื“ืœ ื‘ืขื‘ื•ื“ื” ืขื ืžืกืคืจื™ื ื—ืชื•ืžื™ื ืื• ืœื ื—ืชื•ืžื™ื. ื›ืืŸ ืื ื™ ืจื•ืฆื” ืœืฆื™ื™ืŸ ืฉื‘ืฉืคืช C, ื”ืฆืคืช ืžืฉืชื ื” ืฉืœ ืžืกืคืจ ืฉืœื ื‘ืกื™ืžืŸ ืžื•ื‘ื™ืœื” ืœื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช, ื•ืœื›ืŸ ื”-frontend 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. ื”ื”ื•ืจืื•ืช ื“ื™ ื—ืจื™ื’ื•ืช ื•ืขืฉื•ื™ื•ืช ืœืงื—ืช ืงืฆืช ื–ืžืŸ ืœื”ื‘ื™ืŸ. ื–ื›ื•ืจ ืืช ื–ื” SSA ื”ื•ื ืงื™ืฆื•ืจ ืฉืœ 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 ืœืขื‘ื•ื“. ืžื ืงื•ื“ืช ืžื‘ื˜ ืื ื•ืฉื™ืช, ื›ืœ ื–ื” ืžืงืฉื” ืขืœ ื”ื‘ื ืช ื”ืงื•ื“, ืืš ื”ืขื•ื‘ื“ื” ืฉื›ืœ ืขืจืš ืžื•ืงืฆื” ืจืง ืคืขื ืื—ืช ืžืงืœื” ื‘ื”ืจื‘ื” ืขืœ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืจื‘ื•ืช.

ืฉื™ื ืœื‘ ืฉืื ืืชื” ื›ื•ืชื‘ ืžื”ื“ืจ ืžืฉืœืš, ื‘ื“ืจืš ื›ืœืœ ืœื ืชืฆื˜ืจืš ืœื”ืชืžื•ื“ื“ ืขื ื“ื‘ืจื™ื ืžื”ืกื•ื’ ื”ื–ื”. ืืคื™ืœื• ืงืœืื ื’ ืœื ืžื™ื™ืฆืจ ืืช ื›ืœ ื”ื”ื•ืจืื•ืช ื”ืืœื” 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) ื›ืžื‘ื ื” (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. ื›ืืŸ ืžึทื ื”ึดื™ื’ื•ึผืช, ืฉืžืกืชื›ืœ ืขืœ ืคื™ืชื•ื— ืžื”ื“ืจ ืœืฉืคื” ืคืฉื•ื˜ื” ืžืื•ื“. ืฉื ื™ ืžืงื•ืจื•ืช ื”ืžื™ื“ืข ื”ืœืœื• ื™ื”ื™ื• ืฉื™ืžื•ืฉื™ื™ื ืขื‘ื•ืจืš ื‘ืขืช ื™ืฆื™ืจืช ืžื”ื“ืจ ืžืฉืœืš.

ืงื•ืจืื™ื ื™ืงืจื™ื! ื”ืื ืืชื” ืžืฉืชืžืฉ ื‘-LLVM?

LLVM ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ Go

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”