рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ:

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдВ, рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ред
рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╕рдВрдХрд▓рдХреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдореМрдЬреВрджрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИред рдпрд╣ рдПрдХ рд╕реНрд╡рд╛рдпрддреНрдд рд╕реНрд░реЛрдд рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд▓реЗрдЦ рдХреЗ рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХ рд╡реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрддреНрдпрдВрдд рд╕реАрдорд┐рдд рд╣реИ (рдЕрдзрд┐рдХрддрдо рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрдХрд▓рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкрд╛рдардХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдордЭреЗрдВрдЧреЗред
рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХреЗ рд▓рд╛рдЦреЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рдЙрддреНрдкрд╛рджрди рд╕рдВрдХрд▓рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рд╣реИ - рдирд╣реАрдВ, рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдкрд╛рдареНрдпрдХреНрд░рдо "рдбрдореАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ" рд╣реИ рдЬреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдХрд▓рдХ рдХреНрдпрд╛ рд╣реИред
рдкрд░рд┐рдЪрдп
рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░рд╕реНрдЯ рдПрдВрдб рдЧреЛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд
рдХреНрд░реБрдЧ рд╕рд┐рд╕реНрдЯрдо рднрд╛рд╖рд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░реВрдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред
рдХреНрд░реБрдЧ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
https://github.com/krug-lang рдкрд░
рдХреИрд╕реНрдкрд░ рдФрд░
рдХреНрд░рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕рдВрдХрд▓рдХ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ - рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ! рдореЗрд░реЗ рдкрд╛рд╕ рдбреЙрдХреНрдЯрд░реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рд╛ - рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдЕрдкрдиреЗ рджрдо рдкрд░ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдпрд╣ рднреА рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ, рдХреЗрд╡рд▓ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдмрд▓реНрдХрд┐ рдореИрдВ рдЫреЛрдЯреЗ "рдЯреЙрдп" рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рджреГрд╢реНрдпрдкрдЯрд▓
рдЖрдЗрдП рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрд░реЗрдЦ рдкрд░ рдЬрд╛рдПрдВ: рд╕реАрдорд╛рдВрдд рдлрд╝реАрд▓реНрдб рдкрд░ рдмрд╛рдИрдВ рдУрд░ рджрд┐рдП рдЧрдП рддреАрд░ рд╕реАред рдЬреИрд╕реА рдЬрд╛рдиреА-рдкрд╣рдЪрд╛рдиреА рдФрд░ рдкреНрд░рд┐рдп рднрд╛рд╖рд╛ рд╣реИрдВред рдлрд╝реНрд░рдВрдЯреЗрдВрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг -> рдкрд╛рд░реНрд╕рд░ред
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЬрдм рдореИрдВрдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЯреЛрдХрди рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдпрд╛ рдкрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рдкреИрдЯрд░реНрди рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рдЯреЛрдХрди рдореЗрдВ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред
рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЯреЛрдХрди рдХрд░рддрд╛ рд╣реИред
enum TokenType { Identifier, Number, }; struct Token { std::string Lexeme; TokenType type; // ... // It's also handy to store things in here // like the position of the token (start to end row:col) };
рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, рдПрдХ рд╕реА-рдЖрдХрд╛рд░ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреВрд░реНрд╡реЛрдХреНрдд рд▓реЗрдХреНрд╕реЗрдо рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЯреЛрдХрдирдЯреЗрди рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдЯреЛрдХрди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдиреЛрдЯ: рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрдХрд▓рдХ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рдкреВрд░реА рддрд░рд╣ рд╕реЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╛рдХреА рдкрд╣реЗрд▓реА рдЯреБрдХрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдХрд╛рдо рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рд╕реА рдХреЛрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреБрдХрдбрд╝реЗ рд▓реЗрдВ:
int main() { printf("Hello world!\n"); return 0; }
рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ рд▓рд╛рдЗрди рдореЗрдВ рдкрдврд╝рдиреЗ рдФрд░ рдПрдХ рд▓реАрдирд┐рдпрд░ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЯреЛрдХрди рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЯреЛрдХрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрдВрдЯ рдПрдХ "рд╢рдмреНрдж" рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдПрдХ "рдирдВрдмрд░" рд╣реИред рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ - рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
0xdeadbeef тАФ HexNumber ( ) 1231234234 тАФ WholeNumber ( ) 3.1412 тАФ FloatingNumber ( ) 55.5555 тАФ FloatingNumber ( ) 0b0001 тАФ BinaryNumber ( )
рд╢рдмреНрджреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкрддреНрд░ рдпрд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
123foobar := 3 person-age := 5 fmt.Println(123foobar)
Go рдореЗрдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд╣реА рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреЛрдХрди рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
Number(123), Identifier(foobar), Symbol(:=), Number(3) ...
рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
foo_bar __uint8_t fooBar123
рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреЛ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди, рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдФрд░ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рд╕рдВрдЦреНрдпрд╛, рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡рд░реВрдкрдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1_000_000) рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ASCII рдХреЗ рдмрдЬрд╛рдп UTF8 рдХрд╛ рд╕рдорд░реНрдерди)ред
рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ - рддреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВред рдЦрд░реЛрдВрдЪ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ рд░рд╛рдЬрд╛ рдФрд░ рднрдЧрд╡рд╛рди рд░реЙрдм рдкрд╛рдЗрдХ рдХреЗ
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред Regex рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХрдИ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рд▓реЗрдЦрди рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдЬреАрд╡ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЬреЛ рдХрд┐ regex101.com рдкрд░ 5:24 рдмрдЬреЗ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдкрдиреА рдкрд╣рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЯреЛрдХреЗрдирд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП
split(str)
рдлрдВрдХреНрд╢рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ - рдФрд░ рдореИрдВ рдЬреНрдпрд╛рджрд╛ рджреВрд░ рдирд╣реАрдВ рдЧрдпрд╛ред
рдкрджрдЪреНрдЫреЗрдж
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдХрдИ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░-рдЬрдирд░реЗрдЯрд░ рд╣реИрдВ - рдпрд╣рд╛рдВ рдЦреЗрд▓ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдЖрдорддреМрд░ рдкрд░ рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдпрд╛ рдПрдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реАред рдЙрдирдХреЗ рд╕реНрд╡рднрд╛рд╡ рд╕реЗ, рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред
рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
fn lex(string input) []Token {...} fn parse(tokens []Token) AST {...} let input = "int main() { return 0; }"; let tokens = lex(input); let parse_tree = parse(tokens); // ....
рдЖрдорддреМрд░ рдкрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдХрдИ рдЫреЛрдЯреЗ рдШрдЯрдХреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдирдкреБрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдПрдБ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИрдВред рдЕрдиреНрдп рдХрд╛рд░рдг рдЙрддреНрдХреГрд╖реНрдЯ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдФрд░ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВред рдордЬреЗрджрд╛рд░ рддрдереНрдп:
рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди Ocaml рдкрд░ рдерд╛ред
рдореИрдВ рдЖрдкрдХреЛ рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рд╕реНрд╡рд╛рдпрддреНрдд рд░рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ - рдореЙрдбреНрдпреВрд▓рд░рд┐рдЯреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдПрдЧреАред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрдИ рдЕрдиреНрдп рдкрд╣рд▓реБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдпрд╣реА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреЗрдбрд╝
рдкрд╛рд░рд╕ рдХрд╛ рдкреЗрдбрд╝
рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдореЛрдЯрд╛ рдкреЗрдбрд╝ рд╕реНрд░реЛрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╡реЗ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА (рдпрд╛ рдЕрдзрд┐рдХрддрд░) рд░рдЦрддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреА рднрд╛рд╖рд╛ рдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЗ рд╕рдорд╛рдиред рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░реА рдиреЛрдб рдЕрдиреБрдЧрд╛рдореА рдпрд╛ рдЧреИрд░-рдЕрдиреБрдЧрд╛рдореА рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдВрдмрд░рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯред
рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА
рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдПрдПрд╕рдбреА рдПрдХ
рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ рд╣реИред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдореЗрдВ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЕрдХреНрд╕рд░ рдирд┐рд░рд░реНрдердХ) рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдПрдПрд╕рдбреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдПрдПрд╕рдбреА рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрдХрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкреЗрдбрд╝ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ (рдЬреИрд╕реЗ (5 + 5) -3) +2ред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдмреНрд░реИрдХреЗрдЯ, рдСрдкрд░реЗрдЯрд░ рдФрд░ рдорд╛рди 5, 5, 3, рдФрд░ 2ред рд▓реЗрдХрд┐рди рдЖрдк рдмрд╕ рдПрдПрд╕рдбреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ, рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рдЖрджреЗрд╢ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред
рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ + a / b / c рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИред
рдПрдПрд╕рдбреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
interface Expression { ... }; struct UnaryExpression { Expression value; char op; }; struct BinaryExpression { Expression lhand, rhand; string op; // string because the op could be more than 1 char. }; interface Node { ... }; // or for something like a variable struct Variable : Node { Token identifier; Expression value; };
рдпрд╣ рджреГрд╢реНрдп рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдиреЛрдбреНрд╕ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
Node parseNode() { Token current = consume(); switch (current.lexeme) { case "var": return parseVariableNode(); // ... } panic("unrecognized input!"); } Node n = parseNode(); if (n != null) { // append to some list of top level nodes? // or append to a block of nodes! }
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╢реЗрд╖ рдиреЛрдбреНрд╕ рдХреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛, рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЦреБрдж рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡реНрдпрд╛рдХрд░рдг
рдЯреЛрдХрди рдХреЗ рдПрдХ рд╕реЗрдЯ рд╕реЗ рдПрдбреАрдПрд╕ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡реНрдпрд╛рдХрд░рдг рдЖрдкрдХреА рднрд╛рд╖рд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд░реНрдгрди (рдпрд╛ рдкрд╛рд░реНрд╕) рдХрд░ рд╕рдХрддреА рд╣реИрдВред
рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдмреИрдХрд╕-рдиреМрд░ (рдЖрд░рдмреАрдПрдирдПрдл) рдХрд╛ рдПрдХ
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд░реВрдк рд╣реИ ред рдпрд╣ рдХрдо рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде
BNF рдХреА рднрд┐рдиреНрдирддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рд╕реЗ RBNF рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; digit = "0" | digit excluding zero ;
рдЙрддреНрдкрд╛рджрди рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╡реЗ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЯрд░реНрдорд┐рдирд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ "рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓" рд╣реИред рдЯрд░реНрдорд┐рдирд▓ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯреЛрдХрди рдпрд╛ 0 рдФрд░ 1 рд╣реИрдВред рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рдЙрдирдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИрдВ, рд╡реЗ рдЙрддреНрдкрд╛рджрди рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдФрд░ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░ рдпрд╛ "рдирд╛рдорд┐рдд рд╕рдВрдХреЗрдд" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдЧреЛ ,
рд░рд╕реНрдЯ рдФрд░
рдбреАредрдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ
рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдХрдИ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред
рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ - рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд, рдЕрд╡рд░реЛрд╣реАред рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ "рдЦрд┐рд▓реМрдирд╛" рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдпрд╣ рддрдХрдиреАрдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЬреАрд╕реАрд╕реА рдПрдХ рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦреЗ рдЕрд╡рд░реЛрд╣реА рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ YACC рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реА, рдЬрд╣рд╛рдВ
foo * bar
рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ
int foo = 3; int bar = 4; foo * bar; // unused expression
рдпрд╛ рдХреИрд╕реЗ
typedef struct { int b; } foo; foo* bar; bar.b = 3;
рдХреНрд▓реИрдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
рдЪреВрдВрдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд C ++ рдХреЛрдб рд╣реИ, рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╕реНрдЯрдо рдирд┐рдпрдореЛрдВ рдФрд░ рдЕрдиреНрдп рдЕрдЬреАрдм рдЪреАрдЬреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ C / C ++ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рджрд╛рди рдФрд░ рдирд┐рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИредрдпрд╣ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
- рдЕрд╡рд░реЛрд╣реА рдПрд▓рдПрд▓, рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢
- рдЖрд░реЛрд╣реА, рд╢рд┐рдлреНрдЯ, рдЖрд░реЛрд╣реА рд╡рдВрд╢
рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░
рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ - рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдмрдирд╛рддреЗ рд╕рдордп рдмрдирд╛рддреЗ рд╣реИрдВред
рдкрд╛рд░реНрд╕рд░ рдЬреЗрдирд░реЗрдЯрд░ рдмрд╣реБрдд рддреЗрдЬ рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
ANTLR рд╣реИ , рдХрдИ рдЕрдиреНрдп рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдХрд░рдг рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреЛ рдлреНрд░рдВрдЯрдПрдВрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ / рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдордзреНрдп рдФрд░ рдмреИрдХреЗрдВрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рдХреБрдЫ рднреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрдкреНрд▓реАрдХреЗрд╢рди
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЦреБрдж рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреНрд░рдВрдЯреЗрдВрдб (lex / parse) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ
- HTML / CSS рдкреНрд░рддрд┐рдкрд╛рджрди рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ
- рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ
- linkers
- REGEX
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
- URL рдкрд╛рд░реНрд╕рд┐рдВрдЧ
- рдкреНрд░рд╛рд░реВрдкрдг рдЙрдкрдХрд░рдг рдЬреИрд╕реЗ gofmt
- SQL рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред
рдмреАрдЪ
рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рд╢реНрд▓реЗрд╖рдг! рдХрдВрдкрд╛рдЗрд▓рд░ рдмрдирд╛рддреЗ рд╕рдордп рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рдХреНрд░реБрдЧ рднрд╛рд╖рд╛ рдореЗрдВ, рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЕрднреА рддрдХ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ - рдФрд░ рд╣рдо рд╣рдореЗрд╢рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рд░реНрдкрд┐рд▓ рдЕрдВрддрд╣реАрди рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдХрд▓рди рдХреЗ рдЙрдЪрд┐рдд рдЪрд░рдг рдореЗрдВ рд╢рдмреНрджрд╛рд░реНрде рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдЕрд╕рдВрднрд╡ рд╣реИред
рдореИрдВ рдПрдХ рдмрд╛рд░ рдлреНрд░рдВрдЯ-рдПрдВрдб, рдорд┐рдб -рд▓реИрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЖрдпрд╛ рдерд╛ред рдлрд┐рд░ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛
F: 20% M: 20%: B: 60%
рдЖрдЬ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ
F: 5% M: 60% B: 35%
рд╕реАрдорд╛рдВрдд рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдРрд╕реЗ рд╕рдВрджрд░реНрднрд╣реАрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЬрд┐рдирдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рджреНрд╡рдВрджреНрд╡ рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХрд╛рдлреА рдЬрд▓реНрджреА рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдпрд╣рд╛рдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдПрд▓рдПрд▓рд╡реАрдПрдо рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдп рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрдИ рддреИрдпрд╛рд░ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдЪрд░рдг рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИ, рд╕рдВрдХрд▓рди рдЪрд░рдг рдХрд╛ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ рдореЗрдВ, рдЕрдкрдиреЗ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдмрдбрд╝реА, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдорд╢реАрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд░реВрдкреЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИред
рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдФрд░ рддреИрдпрд╛рд░реА рдХреЗ рдХрд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдпрд╛ рдПрдПрд╕рдбреА рдореЗрдВ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛, рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╢рдмреНрджрд╛рд░реНрде рдорд╛рд░реНрдЧ
рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрд╕рдбреАрдП рдпрд╛ рдХреЛрдб рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рдХреЗ рдЕрдиреНрдп рдЕрдореВрд░реНрдд рд░реВрдк рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ "рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдкрд╛рд╕" рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдЖрд▓реЗрдЦ .NET C # рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╡реЗ рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд░реБрдЧ рдореЗрдВ рдиреАрдЪреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХрд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди
рдХрдВрдкрд╛рдЗрд▓рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рднреА "рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп" рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдЧрд╛ред рд╡рд╣ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ - рд╡рд╣ рдмрд╕ рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреМрди рд╕реА рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдХрд╛рд░реНрдп рдЖрджрд┐ред рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдирд╛рдо / рдкреНрд░рддреАрдХ рд╕рдВрдХрд▓реНрдк
рд╕рдВрдХрд▓рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рддреН, рдЙрди рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд╕ рд╣реИ, рдФрд░ рдпрд╣ рдпрд╣рд╛рдБ рд╕реЗ рд╣реИ рдХрд┐
рдиреЛ рдХреЛрдб
рдкреНрд░рддреАрдХ XYZ рддреНрд░реБрдЯрд┐ рдЖрдорддреМрд░ рдкрд░ рдЧреЛ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрддреА рд╣реИред
рдЗрд╕ рдкрд╛рд╕ рдХреЛ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЖрдкрдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдЖрд░реЗрдЦ рдореЗрдВ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднрд╛рд╖рд╛рдПрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рд╕рдВрдХреБрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реВрдк рдмрдирддрд╛ рд╣реИ, рддреЛ рдореЗрд░реА рддреНрд░реБрдЯрд┐ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрд░реА рдХреНрд░реБрдЧ рднрд╛рд╖рд╛ред рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦрд░рд╛рдм рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд░реНрднрд░рддрд╛ рдЖрд░реЗрдЦ рдореЗрдВ рдбреАрдПрдлрдПрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ, рдпрд╛
рдЯрд╛рд░рдЬрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдЬреИрд╕рд╛ рдХрд┐ рдХреНрд░рдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрдИ) рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реВрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░
рд╕рдВрдХрд▓рдХ рд╕рднреА рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреНрд░реБрдЧ рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдлрд╝реЗрдХреНрд╢рди рдмрд╣реБрдд рдХрдордЬреЛрд░ рд╣реИ, рдпрд╣ рдмрд╕ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рдЪрд┐рддреНрд░ рдкреНрд░рдгрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рдЬреИрд╕реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдХрд╛рд░ "рдПрдХреАрдХрд░рдг" рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдпрд╛ "рдкреНрд░рдХрд╛рд░ рдПрдХреАрдХрд░рдг" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрд░реБрдЧ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ:
interface Type {}; struct IntegerType : Type { int width; bool signed; }; struct FloatingType : Type { int width; }; struct ArrayType : Type { Type base_type; uint64 length; };
рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдиреЛрдб рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
IntegerConstantNode
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ IntegerType (64)ред рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ
unify(t1, t2)
рдлрдВрдХреНрд╢рди рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЙрд╕ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░, рдмрд╛рдЗрдирд░реА, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдпрд╣ рджрд╛рдИрдВ рдУрд░ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИред
рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдЧреЛ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рд▓рд┐рдЦрд╛ рдерд╛, рдЬреЛ рдХреНрд░реБрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрди рдЧрдпрд╛ред
рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рджрд░
рдХреНрд░реБрдЧ (рдЬреИрд╕реЗ рдЬрдВрдЧ) рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рднрд╛рд╖рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрдм рддрдХ рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рд╣реЛ, рдЪрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдВ:
let x = 3; x = 4; // BAD! mut y = 5; y = 6; // OK!
рд╕рдВрдХрд▓рдХ рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ "рдЪрд░ рд╕рд╣реА рд╣реИрдВ", рдЕрд░реНрдерд╛рддреН, рд╣рдо рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╕рднреА рдЪрд░ рдирд┐рд░рдВрддрд░ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрд╣ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдорджрдж рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд┐рдЫрд▓реЗ рдкрд╛рд╕реЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдкрд╛рд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХреЗ рдЯреЛрдХрди рдирд╛рдо рдФрд░ рд╕рдВрдХреЗрдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рддреАрдХ рдмрд╛рд╣рд░реА рд╣реИ рдпрд╛ рд╕реНрдерд┐рд░ рд╣реИред
рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛
рдПрдХ рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛, рдпрд╛ "рдЫреБрд░рд╛", рдЙрди рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ рдЙрди рд╕рднреА рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рдкреНрд░рддреАрдХ рдирд╛рдо, рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд, рдмрд╛рд╣рд░реА рд╕рдВрдЪрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рд╕реНрдерд┐рд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕реНрдерд╛рди рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдХреНрд╖реЗрддреНрд░
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдкрдХреА рднрд╛рд╖рд╛ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреЛрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реА-рд▓рд╛рдЗрдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рд╕реНрдХреЛрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рддрд░рд╣ рд╕реНрдХреЛрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рд╣реИ)ред
рдЖрдорддреМрд░ рдкрд░ рд╣рдо рд╕реНрдХреЛрдк рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдирд╛рдореЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рд╣рдореЗрдВ рдЫрд┐рдкрд╛рдиреЗ (рдЫрд╛рдпрд╛ рджреЗрдиреЗ) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
{ // push scope let x = 3; { // push scope let x = 4; // OK! } // pop scope } // pop scope
рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
struct Scope { Scope* outer; SymbolTable symbols; }
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛, рд▓реЗрдХрд┐рди рдореИрдВ
рд╕реНрдкреЗрдЧреЗрдЯреА рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдкрд░реАрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдПрдПрд╕рдбреА рдиреЛрдбреНрд╕ рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд┐рд╕реНрдЯрдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ
рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрдИ рдЦрдВрдбреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢реАрд░реНрд╖рдХ рдЗрд╕ рд╕рдмрд╕реЗ рдпреЛрдЧреНрдп рд╣реИред рдЖрдЬ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕реНрд╡рдпрдВ рд╕рд┐рд╕реНрдЯрдо рдХреА рдХрд┐рд╕реНрдореЗрдВ рднреА рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрдИ рдкреНрд░рддрд┐рдпрд╛рдВ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ
рдЙрддрд░реВрдВрдЧрд╛ , рдмрд╕
рд╕реНрдЯреАрд╡ рдХреНрд▓реЗрдмрдирд┐рдХ рдХреЗ
рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рдХреА рдПрдХ рдХрдбрд╝реА рдЫреЛрдбрд╝
рджреВрдВрдЧрд╛ ред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╡рд╣ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЗрди рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдзрд┐рдХрд╛рд░
рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдФрд░ рдЖрдВрджреЛрд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд
рд░рд╕реНрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдЬрдВрдЧ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрдирдкреБрдЯ рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ: рдХреМрди рд╕реНрдореГрддрд┐ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдХрдм рд╕реНрдореГрддрд┐ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрди рдореВрд▓реНрдпреЛрдВ рдпрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрд┐рддрдиреЗ рд╕рдВрджрд░реНрдн (рдпрд╛ рдЙрдзрд╛рд░) рдореМрдЬреВрдж рд╣реИрдВред
рд░рд╕реНрдЯ рдХреА рд╕реБрдВрджрд░рддрд╛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рд▓рд┐рдВрдХ рдЧрд┐рдирддреА рд╕реЗ рдирд┐рдкрдЯрдирд╛ рди рдкрдбрд╝реЗред рдпреЗ рд╕рднреА рд╢рдмреНрджрд╛рд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рд╕рдм рд╣реБрдб рдХреЗ рддрд╣рдд рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдореЛрдЬрд╝рд┐рд▓рд╛ рдЯреАрдо рдФрд░
рдЪрдХреНрд░рд╡рд╛рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрджреНрднреБрдд рд╢реЛрдз рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд░реЗрдЦрд╛рдВрдХрди
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдлрд╝ (рд╕реАрдПрдлрдЬреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рд╕рднреА рдкрде рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╡рд░реНрдЧреЛрдВ, рдЕрд░реНрдерд╛рдд, рдмреНрд▓реЙрдХ, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХрднреА рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЪрдХреНрд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рджреБрд░реНрдЧрдо рдХреЛрдб рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк "рдШрдмрд░рд╛рд╣рдЯ" рдХрд╣рддреЗ рд╣реИрдВ (рдШрдмрд░рд╛рд╣рдЯ рдХрд╣рддреЗ рд╣реИрдВ), рдпрд╛ рд▓реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рд▓реВрдк рдХреЗ рдмрд╛рд╣рд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди
рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреИрдХрдПрдВрдб
рд╣рдорд╛рд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧредрд╣рдордиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдХрд┐рдП рд╣реИрдВред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
- , . , , ┬л┬╗.
, . , , . , , , . , .
, . , ++ тАФ Cfront тАФ C.
JavaScript. TypeScript , , , , .
┬л┬╗ , , , , ┬л ┬╗ . тАФ , , .
LLVM
LLVM: Rust, Swift, C/C++ (clang), D, Haskell.
┬л ┬╗, , . , LLVM . , . , , , , 1, 4, 8 16-. , , - .
-
тАФ , тАФ , .
Go тАФ , LLVM ( ). Go , Windows, Linux MacOS. , Krug -.
. , LLVM, , , LLVM , .
, , , LLVM, IR, , , , ( ).
. , , , . IR ( ) ┬л┬╗ fprintf .
8cc .
. тАФ Java: ,
JVM , , Kotlin.
, Java . , . , .
, JVM JIT , JIT-, .
, ! , , . - , , .
Godbolt тАФ , , . , , .
, , (strip the debug symbols), , GCC. , - .
. . , . production-.
rwmj , 8 , 80% . 1971-!
, Rust.
IR
(intermediate representation, IR) , . , , .
IR . , , , .
IR, ┬л┬╗, IR . , SSA тАФ Static Single Assignment, , .
Go IR SSA. IR LLVM SSA, .
SSA , , (constant propagation), ( ) .
, . , , , , . ( 16 32), , (spill to the stack).
тАФ ( ). , , .
:
- (graph colouring) тАФ (NP- ). , (liveness ranges) .
- тАФ .
. , . , , .
-, , . , .
fn main() int { let x = 0; { let x = 0; { let x = 0; } } return 0; }
, ( - :) ) , . , .
LLDB
DWARF . LLVM , DWARF GNU-. , , , .
(Foreign Function Interface, FFI )
libc , , . , ?
тАФ . , ( .s/.asm)? ? ,
Jai . , .
(CaaS)
API-. , Krug-, . , , .
, , , . , API-.
production- CaaS. Microsofts Roslyn, , . , , , , API-, , , Rust
RLS .
Krug тАФ тАФ Caasper CaaS-.
Caasper (, , ), , krug, . , , (bootstrap) , .
Krug JavaScript, Go*, , , Krug. JavaScript , yarn/npm.
* Go () , JS.Caasper
.
Github Krug, D LLVM. YouTube-
.
Krug ()
.
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ