рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░, рдЬреЛ LLVM IR рдЕрд╕реЗрдВрдмрд▓реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ LLVM рд╕рдВрдХрд▓рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЯреАрдПрд▓; рдбреАрдЖрд░ рд╣рдордиреЗ рд╢реБрджреНрдз рдЧреЛ рдкрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрд╛ рдерд╛, рдХреЛрдб рдХреЗ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ред
LLVM IR рдкрд░ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг
(рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЖрдк рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред
LLVM IR, рд▓реЛ-рд▓реЗрд╡рд▓ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬреЛ LLVM рд╕рдВрдХрд▓рди рдврд╛рдВрдЪреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреАрдп рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВред
рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (IR, рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡) рдореЗрдВ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЬреИрд╕реЗ x86) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░рд╕рдВрдХрд▓рдХ рдореЗрдВ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╡реНрдпрд╛рдкрдХ рд╣реИред GCC GIMPLE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, Roslyn CIL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, LLVM LLVM IR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рдХрдИ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХреЗрдВ рдЖрдо рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ, рд╕реНрдерд┐рд░рд╛рдВрдХ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛), рдпреЗ рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ рд╕реАрдзреЗ рдЖрдИрдЖрд░ рд╕реНрддрд░ рдкрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдкреЙрдЗрд▓рд░рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ (IR) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ n рд╕реНрд░реЛрдд рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдореА рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдмреИрдХреЗрдВрдб) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ n * m рд╕реЗ n + m рддрдХ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдлреНрд░рдВрдЯрдПрдВрдб, рдорд┐рдбрд▓реИрдВрдб рдФрд░ рдмреИрдХреЗрдВрдб, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рдЖрдИрдЖрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред
- рд╕реАрдорд╛: рдЖрдИрдЖрд░ рдореЗрдВ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдорд┐рдбрд┐рд▓рд▓реИрдВрдб: рдЖрдИрдЖрд░ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ
- рдмреИрдХрдПрдВрдб: рдЖрдИрдЖрд░ рдХреЛ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ

LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдирдореВрдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо
рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
int f(int a, int b) { return a + 2*b; } int main() { return f(10, 20); }
рд╣рдо Clang рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрд░реЛрдХреНрдд C рдХреЛрдб рдХреЛ LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдмрдЬрдирд╛clang -S -emit-llvm -o foo.ll foo.c.
define i32 @f(i32 %a, i32 %b) { ; <label>:0 %1 = mul i32 2, %b %2 = add i32 %a, %1 ret i32 %2 } define i32 @main() { ; <label>:0 %1 = call i32 @f(i32 10, i32 20) ret i32 %1 }
рдЙрдкрд░реЛрдХреНрдд LLVM IR рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп LLVM IR рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
LLVM IR рд╕реНрдЯреЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ i32 рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ (рдпрд╛рдиреА,
рдореБрдЦреНрдп рд░реВрдк рд╕реЗ% 1 @f рдореЗрдВ% 1 рд╕реЗ рдЕрд▓рдЧ рд╣реИ)ред
(рдЕрд╕реНрдерд╛рдпреА рд░рдЬрд┐рд╕реНрдЯрд░) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,% 1,% 2), рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдПрдХ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ (32 рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЬреИрд╕реЗ @f) рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЬреИрд╕реЗ% a,% 1) рдПрдХ рдЙрдкрд╕рд░реНрдЧ (@ рдФрд░%, рдХреНрд░рдорд╢рдГ) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдорд╛рдВрдб рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрд▓ рдЧреБрдгрд╛, рдЬреЛрдбрд╝, рдЬреЛрдбрд╝ рдЖрджрд┐ рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рдерд╛рдЧрдд рд╣реИ;
LLMV IR рдЕрд╕реЗрдВрдмрд▓рд░ рд╕рдВрд░рдЪрдирд╛
LLVM IR рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдШреЛрд╖рдгрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рдиред
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдореЗрдВ рдмреЗрд╕ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА)ред
LLVM IR рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ @foo рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ @f рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЬрд┐рд╕рдореЗрдВ рддреАрди рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХ (% рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐,% block_1 рдФрд░% block_2) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
; , 32- 21 @foo = global i32 21 ; f 42, cond , 0 define i32 @f(i1 %cond) { ; , ; entry: ; br block_1, %cond ; , block_2 . br i1 %cond, label %block_1, label %block_2 ; , , block_1: %tmp = load i32, i32* @foo %result = mul i32 %tmp, 2 ret i32 %result ; , , block_2: ret i32 0 }
рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ
рдПрдХ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдЙрди рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ рдЬреЛ рд╕рдВрдХреНрд░рдордг рдЖрджреЗрд╢ (рд╕рдорд╛рдкреНрддрд┐ рдЖрджреЗрд╢) рдирд╣реАрдВ рд╣реИрдВред рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмреЗрд╕ рдпреВрдирд┐рдЯ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдЯреАрдо
рдПрдХ рдХрдорд╛рдВрдб рдЬреЛ рдХрд┐ рдЬрдВрдк рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдЧрдгрдирд╛ рдпрд╛ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрдб, рд▓реЛрдб) рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдЯрд░реНрдорд┐рдиреЗрд╢рди рдЯреАрдо
рд╕рдорд╛рдкреНрддрд┐ рдЖрджреЗрд╢ рдкреНрд░рддреНрдпреЗрдХ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдзрд╛рд░ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд╣рд╛рдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд░реНрдорд┐рдиреЗрдЯрд┐рдВрдЧ рд░рд┐рдЯ рдХрдорд╛рдВрдб рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ br рд╕рдВрдХреНрд░рдордг, рд╕рд╢рд░реНрдд рдпрд╛ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдПрд╕рдПрд╕рдП рдлреЙрд░реНрдо
рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрд╕рдПрд╕рдП рдлреЙрд░реНрдо (рд╕реНрдЯреЗрдЯрд┐рдХ рд╕рд┐рдВрдЧрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЧреБрдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдореВрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LLVM IR рдореЗрдВ phi рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Phi рдХрдорд╛рдВрдб рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдПрдХ рдПрдХрд▓ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрдорд╛рдВрдб рдЗрд╕ рдХрдорд╛рдВрдб рддрдХ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдорд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЗрдирдкреБрдЯ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
define i32 @f(i32 %a) { ; <label>:0 switch i32 %a, label %default [ i32 42, label %case1 ] case1: %x.1 = mul i32 %a, 2 br label %ret default: %x.2 = mul i32 %a, 3 br label %ret ret: %x.0 = phi i32 [ %x.2, %default ], [ %x.1, %case1 ] ret i32 %x.0 }
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ phi рдХрдорд╛рдВрдб (рдЬрд┐рд╕реЗ рдХрднреА-рдХрднреА рдлреА рдиреЛрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕рдВрднрд╡ рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрде рдХреЗ рд▓рд┐рдП, рдЪрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрдереЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдм рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ LLVM IR рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕реНрдерд╛рдиреАрдп рд╕реНрд░реЛрдд рдХреЛрдб рдЪрд░ рдХреЛ SSA рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдкрддрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрд▓рдПрд▓рд╡реАрдПрдо рдлреНрд░рдВрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЛ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдореЗрдВ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдЪрд░ (рдПрд▓реЛрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП), рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯреНрд╕ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝реЗ рдЧрдП рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдПрд╕рдП рдХреЗ рд░реВрдк рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рдХрд╛ рд╕реАрдзреЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ nontrivial рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддрдХ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреБрдЫ рдкреИрдЯрд░реНрдиреЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИ, рд╣рдо рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдерд╛рдиреАрдп рдЪрд░реЛрдВ рдХреЛ SSA рдлреЙрд░реНрдо рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LL2M рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдо 2 рдЧреНрд░рд╛рдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдкрд╛рд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╡рд╣рд╛рдВ рдлреА рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
рд╢реБрджреНрдз рдЧреЛ рдкрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рдЧреЛ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ:
https://godoc.org/llvm.org/llvm/bindings/go/llvm : рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧред
github.com/llir/llvm : LLVM IR рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред
рдЧреЛ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдореГрджреНрдз рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдЧреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрд▓рдУрдЖрдИрдЖрд░ / рдПрд▓рдПрд▓рд╡реАрдПрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ llir / llvm рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдирдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?
рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░реЗрд░рдгрд╛ рд▓реЗрдЦрди рд╕рдВрдХрд▓рдХ рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдмрдирд╛рдирд╛ рдерд╛, рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╕рдВрдХрд▓рди рдврд╛рдВрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдПрдХ рдЕрдзрд┐рдХ рдордЬреЗрджрд╛рд░ рдХрд╛рд░реНрдпред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛ рдХрд┐ рдЧреЛ рдХреЗ рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (TinyGo рдХреЗ рд▓реЗрдЦрдХ @aykevl рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдм рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ LLVM 4 рдХреЗ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд)ред
рд╕реНрдкреЙрдЗрд▓рд░Github.com/aykevl/go-llvm рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд LLVM рдХреЗ рд▓рд┐рдП рдЧреЛ рдмрд╛рдЗрдВрдбрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдмрдбрд╝реА рдкреНрд░реЗрд░рдгрд╛ рдЧреЛ рдПрдкреАрдЖрдИ рдХреЛ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдерд╛ред рдЧреЛ рдФрд░ llir / llvm рдХреЗ рд▓рд┐рдП LLVM рдмрд╛рдЗрдВрдбрд┐рдВрдЧ API рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ LLVM рдорд╛рди рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрд╛рдЗрдВрдбрд░реНрд╕ рдореЗрдВ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдареЛрд╕ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рддрд░реАрдХреЛрдВ рдХреА рд╕рдмрд╕реЗрдЯ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдУрдкрдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рдирдСрдкрдХреЛрдб рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╣рдЬ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Opcode рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ opcode рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА: "рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХрд╛" рдХрд╛рд╕реНрдЯ () рддрд░реНрдХ! " (рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг)ред
Llir / llvm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ Go рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрд▓рдПрд▓рд╡реА / рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдЙрдкрд▓рдмреНрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдпрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдк рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЕрдм рдЖрдЗрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ LLVM IR рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЕрдиреНрдп рдЙрдкрдХрд░рдг, рдЬреИрд╕реЗ рдХреНрд▓реИрдВрдЧ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ LLVM рдСрдкреНрдЯ (рдиреАрдЪреЗ рдирдореВрдирд╛ рдЗрдирдкреБрдЯ рджреЗрдЦреЗрдВ) рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди LLVM IR рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░реЗ, рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдЕрдкрдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдкрд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛, рдпрд╛ рдЬреЗрдЖрдИрдЯреА рд╕рдВрдХрд▓рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред
рддреАрд╕рд░рд╛, рд╣рдо рдПрдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдо рдПрдХ рдирдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рдирдореВрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рджреЗрдЦреЗрдВ)ред
рдирдореВрдирд╛ рдЗрдирдкреБрдЯ рдХреЛрдб - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрджрд╛рд╣рд░рдг - рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░
рдирдореВрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЬреЗрдирд░реЗрд╢рди
рдирд┐рд╖реНрдХрд░реНрд╖
Llir / llvm рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рди рдХреЗрд╡рд▓ рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛, рдмрд▓реНрдХрд┐ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХрд┐рдпрд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдбрд┐рдмрдЧ рдХрд┐рдпрд╛, рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрддреНрд╕реБрдХрддрд╛ рджрд┐рдЦрд╛рдИред
Llir / llvm рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ LLVM IR рдХреЗ рд▓рд┐рдП рдПрдХ EBNF рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ LLVM 7.0 рддрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдкреВрд░реНрдг LLVM IR рднрд╛рд╖рд╛ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХрдард┐рдирд╛рдИ рд╕реНрд╡рдпрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдореЗрдВ рдХрд┐ рдкреВрд░реА рднрд╛рд╖рд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╕рдореБрджрд╛рдпреЛрдВ рдиреЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд▓рд┐рдП рдФрдкрдЪрд╛рд░рд┐рдХ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рднрд╛рд╖рд╛ рдХрд╛ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗрдЯ рд╣реИред
рд╡реНрдпрд╛рдХрд░рдг LLVM IR рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреА рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧреЛрд╕реНрдорд┐рде рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рднрд╡рд┐рд╖реНрдп рдЕрджреНрднреБрдд рд╣реИ, рдЦреБрд╢ рд╣реИрдХрд┐рдВрдЧ!
рд╕рдВрджрд░реНрдн
1. рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛
рдЕрдзреНрдпрд╛рдп , рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓реЗрдЦрдХ, "рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдСрдл рдУрдкрди рд╕реЛрд░реНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди" рдкреБрд╕реНрддрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
2.
рдПрд▓рдПрд▓рд╡реАрдПрдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк рднрд╛рд╖рд╛ рдЧрд╛рдЗрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдПрдХ рджреГрд╢реНрдп рдХреЗ рд▓реЗрдЦрди рдХреЗ рд╕рднреА рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рд╢рд╛рдорд┐рд▓ рд╣реИред
3. рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рднрд╛рд╖рд╛ рд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдкреБрд╕реНрддрдХ "
рдореИрдкрд┐рдВрдЧ рд╣рд╛рдИ рд▓реЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯреНрд╕ рдЯреВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ " рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕реНрд▓рд╛рдЗрдб рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реЗрдЯ
рдПрд▓рдПрд▓рд╡реАрдПрдо рд╣реИ, рдЧреНрд░реЗрдЯ рдбрд┐рдЯреЗрд▓ рдореЗрдВ , рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реА ++ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрдиреБрдХреВрд▓рди рдорд╛рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рд╡реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реНрдерд┐рд░ред
рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬреЛрдбрд╝
рдЧреЛ рдореЗрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рд╣реИред