рдЧреЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо

рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИред рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЬреЛ рдПрдХ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реАред рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдХрд░реАрдм рд╣реИред рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЫреЛрдЯреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рд▓реИрд╕ рд╣реИред рдЗрд╕ рджреЛрд╖ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЧреЛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╡реЗ TinyGO рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рдЧреЛ SSA рдФрд░ рдлрд┐рд░ LLVM IR рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ ред рдЧреЛ рдПрд╕рдПрд╕рдП рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рдЬреЛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЫрд╡рд┐

рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг


рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдЬреЛ рдореИрдВ рдпрд╣рд╛рдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрдВрддреНрд░ рд╣реИ:

func myAdd(a, b int) int{    return a + b } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдФрд░, рд╢рд╛рдпрдж, рдХреБрдЫ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рдирд╣реАрдВ рдЖрдирд╛ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреЛ рдПрд╕рдПрд╕рдП рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ:

 func myAdd(a int, b int) int: entry:   t0 = a + b                                                    int   return t0 

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд╛рдИрдВ рдУрд░ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЛ рдПрд╕рдПрд╕рдП рдХреЗ рдПрдХ рдкрд╣рд▓реВ рдХрд╛ рд╕рд╛рд░ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдЬрдм рдХреЛрдб рдХреЛ SSA рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдмрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, return a + b рдХрдорд╛рдВрдб, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ - рдЗрдирдкреБрдЯ (рдПрдВрдЯреНрд░реА рдмреНрд▓реЙрдХ)ред рд╣рдо рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЧреЛ рдПрд╕рдПрд╕рдП рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 define i64 @myAdd(i64 %a, i64 %b) { entry: %0 = add i64 %a, %b ret i64 %0 } 

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджреНрдпрдкрд┐ рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдирд┐рд░реНрдорд╛рдг рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓реА рдЧрдИ рд╣реИред LLVM IR рдХреЛрдб, C. SS рдХреЗ рд╕рдорд╛рди, рдЧреЛ SSA рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реИред рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕ рдкрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЖрддрд╛ рд╣реИ, рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рддрд░реНрдХ рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, IR рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдирд╛рдо @ рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ % рд╡рд░реНрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ (рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЗрдХрд╛рдИ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕ рдХреЛрдб рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЧреЛ int рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп, рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ 32-рдмрд┐рдЯ рдпрд╛ 64-рдмрд┐рдЯ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдПрд▓рдПрд▓рд╡реАрдПрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдИрдЖрд░ рдХреЛрдбред рдпрд╣ рдХрдИ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛрдб рд╕реНрд╡рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдРрд╕рд╛ рдХреЛрдб рдмрд╕ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЕрддреНрдпрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдирд╣реАрдВ рдХрд░рддреЗ )

рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк i64 рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рддрдЯрд╕реНрде рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреЛрдбрд╝ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╕реА рдореЗрдВ, рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рдХрд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, nsw рдСрдкрд░реЗрд╢рди рдореЗрдВ nsw (рдХреЛрдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд░реИрдк) рдзреНрд╡рдЬ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ LLVM рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 32-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде) рдкрд░ рджреЛ i16 рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, i16 рд░реЗрдВрдЬ рдореЗрдВ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдСрдкрд░реЗрд╢рдиред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЕрдХреНрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╢реАрди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ IR рдХреЛрдб рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдХреЛрдб рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ (рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЬреИрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ), рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕реЗ рд╣рдо рдЬрд╛рдВрдЪреЗрдВрдЧреЗ, рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ:

 func sum(numbers []int) int {   n := 0   for i := 0; i < len(numbers); i++ {       n += numbers[i]   }   return n } 

рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреЛ рдПрд╕рдПрд╕рдП рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 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 

рдпрд╣рд╛рдВ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд╕рдПрд╕рдП рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдб рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрдорд╛рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдХреЛрдб рдХреА рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдВрд░рдЪрд┐рдд рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдЖрджреЗрд╢ рдирд╣реАрдВ рд╣реИрдВред рдЧрдгрдирд╛ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджрддрд╛ рд╣реИ, рдФрд░, рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд╛рдкрд╕реА рдЖрджреЗрд╢ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ (рдЬреИрд╕реЗ рд╕реА рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд▓реЗрдмрд▓реЛрдВ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ, рдФрд░ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрд╕рдПрд╕рдП рдореЗрдВ, рдмреЗрд╕ рдмреНрд▓реЙрдХ рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд╕рдиреНрдирд┐рд╣рд┐рдд рдЕрдиреБрдХреНрд░рдо рд╣реИрдВ рдФрд░ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, return рдФрд░ jump ред

рдЗрд╕ рдХреЛрдб рдХрд╛ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг phi рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдХрд╛рдлреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрд╕рдПрд╕рдП рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд рдХреЛрдб рдХрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╣рдорд╛рд░реЗ myAdd рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП sum рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓реВрдк рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдЪрд░ i рдФрд░ n рдкрд░рд┐рд╡рд░реНрддрдиред

SSA рддрдерд╛рдХрдерд┐рдд phi рдЕрдиреБрджреЗрд╢ (рдЗрд╕рдХрд╛ рдирд╛рдо рдЧреНрд░реАрдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд░ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ phi рджреЗрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реА рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрд╕рдПрд╕рдП-рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рддрд░рдХреАрдмреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЪрд░ ( i рдпрд╛ n ) рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рд╣реИ, рдФрд░ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдХреА рдПрдХ рд╕реВрдЪреА рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 t0 = phi [entry: 0:int, for.body: t6] #n 

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдПрдХ entry (рдЗрдирдкреБрдЯ) рдмреНрд▓реЙрдХ рдерд╛, рддреЛ t0 рдирд┐рд░рдВрддрд░ 0 , рдФрд░ рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдмреЗрд╕ рдмреНрд▓реЙрдХ for.body рдерд╛, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмреНрд▓реЙрдХ рд╕реЗ рдорд╛рди t6 рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдмрд▓реНрдХрд┐ рд░рд╣рд╕реНрдпрдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдПрд╕рдПрд╕рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирд╡реАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╕рдм рдХреЛрдб рдХреА рд╕рдордЭ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдереНрдп рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдРрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рдЬреВрдЭрдирд╛ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ alloca рдЗрди рд╕рднреА phi рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ alloca рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдлрд┐рд░, рдЬрдм LL2M рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ mem2reg рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ alloca рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ SSA рдлреЙрд░реНрдо рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред TinyGo, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЧреЛ рдПрд╕рдПрд╕рдП рд╕реЗ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд╕рдПрд╕рдП рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдордзреНрдпрд╡рд░реНрддреА рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдПрдХ рдФрд░ рдирд╡рд╛рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЯреБрдХрдбрд╝рд╛ рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪрдХ рдХреЗ рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рдЖрдИрдЖрд░-рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдЬреЛрдбрд╝ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - 1:int )ред myAdd рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 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 (рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рд╢реЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЬреАрдИрдкреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рддрддреНрд╡ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрд╕рдХреА рддреБрд▓рдирд╛ C рдореЗрдВ рд▓рд┐рдЦреЗ рдирд┐рдореНрди рдХреЛрдб рд╕реЗ рдХрд░реЗрдВ:

 int* sliceptr(int *ptr, int index) {   return &ptr[index]; } 

рдпрд╛ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде:

 int* sliceptr(int *ptr, int index) {   return ptr + index; } 

рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ getelementptr рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ getelementptr рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ getelementptr ред рдпрд╣ рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдП рдкреЙрдЗрдВрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ mul рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрддрд░ рдкрд░ add рд╕рдХрддреЗ рд╣реИрдВред GEP рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЗрд╕ рдордзреНрдпрд╡рд░реНрддреА рдХреЛрдб рдХреА рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ icmp рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдгрд╛рдВрдХ рддреБрд▓рдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдкреНрд░рдХрд╛рд░ i1 рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдпред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреАрд╡рд░реНрдб slt (рдЗрд╕рд╕реЗ рдХрдо рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо int рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рджрд░реНрд╢рд╛рдП рдЧрдП рджреЛ рдирдВрдмрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рджреЛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ icmp рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреАрд╡рд░реНрдб рд╕рд╣реА рд╣реЛрдЧрд╛ред рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, fcmp , рдЬреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдмреЗрд╢рдХ, рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреЛрдб рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рдХрдИ рдПрдиреЛрдЯреЗрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЬреНрдЮрд╛рдд рдХреЛрдб рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдИрдЖрд░ рдореЗрдВ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ inbounds рдирд┐рд░реНрджреЗрд╢, рдпрд╛ nsw рдФрд░ nuw , рдЬрд┐рдиреНрд╣реЗрдВ add рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣реА private рдХреАрд╡рд░реНрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рди рдЗрдХрд╛рдИ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд░реБрд░рд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред

рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ рдПрд▓рдПрд▓рд╡реАрдПрдо-рдЖрдзрд╛рд░рд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рдПрдХ рдЧрд╛рдЗрдб рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд░рд▓ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдпреЗ рджреЛрдиреЛрдВ рд╕реНрд░реЛрдд рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рддреЗ рд╕рдордп рдХрд╛рдо рдЖрдПрдВрдЧреЗред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк LLVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?

Source: https://habr.com/ru/post/hi451476/


All Articles