DIY рдмрд╛рдЗрдЯрдХреЛрдб рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░


рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рдЖрднрд╛рд╕реА рдорд╢реАрдиреЗрдВ рд╣рд╛рд▓ рдХреЗ рджрд╢рдХреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реЛ рдЧрдИ рд╣реИрдВред 90 рдХреЗ рджрд╢рдХ рдХреЗ рдЙрддреНрддрд░рд╛рд░реНрдз рдореЗрдВ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдмрд╛рдж рдХрд╛рдлреА рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╣рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ-рдХреЛрдб рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХрд╛ рднрд╡рд┐рд╖реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд╣реИред


рд▓реЗрдХрд┐рди рдпрд╣ рддрдХрдиреАрдХ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рди рдХреЗрд╡рд▓ TIOBE рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рднрд╛рд╖рд╛ рдХреА рд╡рд░реНрд╖" рд╢реАрд░реНрд╖рдХ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдЪреИрд▓реЗрдВрдЬрд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ , рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ ред


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


рднрд╛рдЧ рдПрдХ, рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ (рд╡рд░реНрддрдорд╛рди)
рднрд╛рдЧ рджреЛ, рдЕрдиреБрдХреВрд▓рди
рднрд╛рдЧ рддреАрди, рд▓рд╛рдЧреВ


рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


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


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


рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рдВрдЪ рдЫреЛрдЯреЗ (рд╕рд░рд▓ рд╕реА рдХреЛрдб рдХреА рд╕реИрдХрдбрд╝реЛрдВ рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛) рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ (рдУрдВ) рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд╣рд▓реВ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИред


рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд╛рдЗрдЯ рдХреЛрдб рдХрд╣рд╛рдВ рдЧрдП?


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


рдХреЛрдб рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрднрд╛рд╕реА рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рддреАрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЛрддреА рд╣реИ:


  1. рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирдП рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдмрд╛рдЗрдЯрдХреЛрдб рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░ рдХреЛрдб рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ рдХреЗ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИрдВред
  3. рдЖрдк рдХреБрдЫ рд╣реА рдШрдВрдЯреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рдХреБрдЫ рд╕рд░рд▓ рд╕реА рдЖрднрд╛рд╕реА рдорд╢реАрдиреЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рддрдХрдиреАрдХреА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдкреВрд░реНрдг рдирдореВрдирд╛ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддрд╛рдЬрд╛ рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


gcc interpreter-basic-switch.c -o interpreter ./interpreter 

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


рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдмрд╛рдпреЛрдЯреЗрдХ рджреБрднрд╛рд╖рд┐рдпрд╛


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╕рд░рд▓рддрдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдкреАрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:


 struct { uint8_t *ip; uint64_t accumulator; } vm; typedef enum { /* increment the register */ OP_INC, /* decrement the register */ OP_DEC, /* stop execution */ OP_DONE } opcode; typedef enum interpret_result { SUCCESS, ERROR_UNKNOWN_OPCODE, } interpret_result; void vm_reset(void) { puts("Reset vm state"); vm = (typeof(vm)) { NULL }; } interpret_result vm_interpret(uint8_t *bytecode) { vm_reset(); puts("Start interpreting"); vm.ip = bytecode; for (;;) { uint8_t instruction = *vm.ip++; switch (instruction) { case OP_INC: { vm.accumulator++; break; } case OP_DEC: { vm.accumulator--; break; } case OP_DONE: { return SUCCESS; } default: return ERROR_UNKNOWN_OPCODE; } } return SUCCESS; } 

рд╕реМ рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреА рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╢реАрди рдореЗрдВ рдПрдХ рдПрдХрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ ( vm.accumulator ), рддреАрди рдСрдкрд░реЗрд╢рди (рд░рдЬрд┐рд╕реНрдЯрд░ рд╡реЗрддрди рд╡реГрджреНрдзрд┐, рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ) рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ ( vm.ip ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред


рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди (рд╕рдВрд▓рдЧреНрди рдСрдкрд░реЗрд╢рди рдХреЛрдб , рдпрд╛ рдУрдкрдХреЛрдб ) рдПрдХ рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ, рдФрд░ vm_interpret рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп switch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред switch рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред


рдкрд░рд┐рдЪрд╛рд▓рди рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ vm_interpret рдлрдВрдХреНрд╢рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб (Engред рдмрд╛рдЗрдЯрдХреЛрдб ) - рдФрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ OP_DONE рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди ( OP_DONE ) рдХреЛ OP_DONE рдХрд╛ рдСрдкрд░реЗрд╢рди OP_DONE ред


рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдкрд╣рд▓реВ рд╢рдмреНрджрд╛рд░реНрде рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрд╕ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕реЗрдЯред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рджреЛ рдСрдкрд░реЗрд╢рди рд╣реИрдВ, рдФрд░ рд╡реЗ рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред


рдХреБрдЫ рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ ( рд╡рд░реНрдЪреБрдЕрд▓-рдорд╢реАрди рдПрдмреНрд╕реНрдЯреНрд░реЗрдХреНрд╢рди рдПрдВрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рддрдХрдиреАрдХ , 2009) рдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреА рдирд┐рдХрдЯрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░ рдФрд░ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рднреМрддрд┐рдХ рдорд╢реАрди рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЪрд░рдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рдмрд╛рдпреЛрдЯреЗрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдХрд▓реА рд░реИрдо рдХреЗ рд╕рд╛рде рднреМрддрд┐рдХ рдорд╢реАрди рдХреЗ рдорд╢реАрди рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ, рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреЛрдЪ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди, x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕реЗрдЯ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред


рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд: рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрд╛рд░реАрдХреА рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SQLite, Gawk рдФрд░ Prolog рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВред


рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдкрджреЛрдВ рдкрд░ рдЙрдЪреНрдЪ рдФрд░ рдирд┐рдореНрди рджреЛрдиреЛрдВ рд╕реНрддрд░реЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рд╡рд╛рд▓реЗ рд╕рд╛рдорд╛рдиреНрдп-рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред


рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрджрд┐рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЖрднрд╛рд╕реА рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдпрд╛ рджреЛ рднреМрддрд┐рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рд╡рд░реНрдЪреБрдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ "рдЖрдпрд░рди" рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИред


Bytecode рдЕрдиреБрджреЗрд╢ рддрд░реНрдХ


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


рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ (OP_ADDI, OP_SUBI) рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЛ рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреБрд░рдВрдд opcode рдХреЗ рдмрд╛рдж рд▓реЗрддреЗ рд╣реИрдВ:


 struct { uint8_t *ip; uint64_t accumulator; } vm; typedef enum { /* increment the register */ OP_INC, /* decrement the register */ OP_DEC, /* add the immediate argument to the register */ OP_ADDI, /* subtract the immediate argument from the register */ OP_SUBI, /* stop execution */ OP_DONE } opcode; typedef enum interpret_result { SUCCESS, ERROR_UNKNOWN_OPCODE, } interpret_result; void vm_reset(void) { puts("Reset vm state"); vm = (typeof(vm)) { NULL }; } interpret_result vm_interpret(uint8_t *bytecode) { vm_reset(); puts("Start interpreting"); vm.ip = bytecode; for (;;) { uint8_t instruction = *vm.ip++; switch (instruction) { case OP_INC: { vm.accumulator++; break; } case OP_DEC: { vm.accumulator--; break; } case OP_ADDI: { /* get the argument */ uint8_t arg = *vm.ip++; vm.accumulator += arg; break; } case OP_SUBI: { /* get the argument */ uint8_t arg = *vm.ip++; vm.accumulator -= arg; break; } case OP_DONE: { return SUCCESS; } default: return ERROR_UNKNOWN_OPCODE; } } return SUCCESS; } 

рдирдП рдирд┐рд░реНрджреЗрд╢ ( vm_interpret рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ) рдиреЗ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ / рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдШрдЯрд╛рдпрд╛ред


рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреЛ рдПрдХ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рддрд░реНрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрдзреЗ opcode рд╕рд░рдгреА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореБрдЦреНрдп рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рддрд░реНрдХ рдПрдХ рдПрдХрд▓ рдмрд╛рдЗрдЯ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ 256 рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИред


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


рд╕реНрдЯреИрдХ рдорд╢реАрди


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


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


 #define STACK_MAX 256 struct { uint8_t *ip; /* Fixed-size stack */ uint64_t stack[STACK_MAX]; uint64_t *stack_top; /* A single register containing the result */ uint64_t result; } vm; typedef enum { /* push the immediate argument onto the stack */ OP_PUSHI, /* pop 2 values from the stack, add and push the result onto the stack */ OP_ADD, /* pop 2 values from the stack, subtract and push the result onto the stack */ OP_SUB, /* pop 2 values from the stack, divide and push the result onto the stack */ OP_DIV, /* pop 2 values from the stack, multiply and push the result onto the stack */ OP_MUL, /* pop the top of the stack and set it as execution result */ OP_POP_RES, /* stop execution */ OP_DONE, } opcode; typedef enum interpret_result { SUCCESS, ERROR_DIVISION_BY_ZERO, ERROR_UNKNOWN_OPCODE, } interpret_result; void vm_reset(void) { puts("Reset vm state"); vm = (typeof(vm)) { NULL }; vm.stack_top = vm.stack; } void vm_stack_push(uint64_t value) { *vm.stack_top = value; vm.stack_top++; } uint64_t vm_stack_pop(void) { vm.stack_top--; return *vm.stack_top; } interpret_result vm_interpret(uint8_t *bytecode) { vm_reset(); puts("Start interpreting"); vm.ip = bytecode; for (;;) { uint8_t instruction = *vm.ip++; switch (instruction) { case OP_PUSHI: { /* get the argument, push it onto stack */ uint8_t arg = *vm.ip++; vm_stack_push(arg); break; } case OP_ADD: { /* Pop 2 values, add 'em, push the result back to the stack */ uint64_t arg_right = vm_stack_pop(); uint64_t arg_left = vm_stack_pop(); uint64_t res = arg_left + arg_right; vm_stack_push(res); break; } case OP_SUB: { /* Pop 2 values, subtract 'em, push the result back to the stack */ uint64_t arg_right = vm_stack_pop(); uint64_t arg_left = vm_stack_pop(); uint64_t res = arg_left - arg_right; vm_stack_push(res); break; } case OP_DIV: { /* Pop 2 values, divide 'em, push the result back to the stack */ uint64_t arg_right = vm_stack_pop(); /* Don't forget to handle the div by zero error */ if (arg_right == 0) return ERROR_DIVISION_BY_ZERO; uint64_t arg_left = vm_stack_pop(); uint64_t res = arg_left / arg_right; vm_stack_push(res); break; } case OP_MUL: { /* Pop 2 values, multiply 'em, push the result back to the stack */ uint64_t arg_right = vm_stack_pop(); uint64_t arg_left = vm_stack_pop(); uint64_t res = arg_left * arg_right; vm_stack_push(res); break; } case OP_POP_RES: { /* Pop the top of the stack, set it as a result value */ uint64_t res = vm_stack_pop(); vm.result = res; break; } case OP_DONE: { return SUCCESS; } default: return ERROR_UNKNOWN_OPCODE; } } return SUCCESS; } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред OP_PUSHI рд╕реНрдЯреИрдХ рдкрд░ рдЕрдкрдирд╛ рддрддреНрдХрд╛рд▓ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ OP_ADD, OP_SUB, OP_DIV, OP_MUL рдорд╛рдиреЛрдВ рдХреЗ рдвреЗрд░ рд╕реЗ рдкреЙрдкрдЕрдк рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рддреЗ рд╣реИрдВред OP_POP_RES рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд░рд┐рдгрд╛рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред


рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди (OP_DIV) рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред


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


рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╢реАрди


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


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


рдЗрд╕ рдмреАрдЪ, рдкреНрд░рддреНрдпреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдУрдкрдХреЛрдб рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╢рд░реАрд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ред


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


 #define REGISTER_NUM 16 struct { uint16_t *ip; /* Register array */ uint64_t reg[REGISTER_NUM]; /* A single register containing the result */ uint64_t result; } vm; typedef enum { /* Load an immediate value into r0 */ OP_LOADI, /* Add values in r0,r1 registers and put them into r2 */ OP_ADD, /* Subtract values in r0,r1 registers and put them into r2 */ OP_SUB, /* Divide values in r0,r1 registers and put them into r2 */ OP_DIV, /* Multiply values in r0,r1 registers and put them into r2 */ OP_MUL, /* Move a value from r0 register into the result register */ OP_MOV_RES, /* stop execution */ OP_DONE, } opcode; typedef enum interpret_result { SUCCESS, ERROR_DIVISION_BY_ZERO, ERROR_UNKNOWN_OPCODE, } interpret_result; void vm_reset(void) { puts("Reset vm state"); vm = (typeof(vm)) { NULL }; } void decode(uint16_t instruction, uint8_t *op, uint8_t *reg0, uint8_t *reg1, uint8_t *reg2, uint8_t *imm) { *op = (instruction & 0xF000) >> 12; *reg0 = (instruction & 0x0F00) >> 8; *reg1 = (instruction & 0x00F0) >> 4; *reg2 = (instruction & 0x000F); *imm = (instruction & 0x00FF); } interpret_result vm_interpret(uint16_t *bytecode) { vm_reset(); puts("Start interpreting"); vm.ip = bytecode; uint8_t op, r0, r1, r2, immediate; for (;;) { /* fetch the instruction */ uint16_t instruction = *vm.ip++; /* decode it */ decode(instruction, &op, &r0, &r1, &r2, &immediate); /* dispatch */ switch (op) { case OP_LOADI: { vm.reg[r0] = immediate; break; } case OP_ADD: { vm.reg[r2] = vm.reg[r0] + vm.reg[r1]; break; } case OP_SUB: { vm.reg[r2] = vm.reg[r0] - vm.reg[r1]; break; } case OP_DIV: { /* Don't forget to handle the div by zero error */ if (vm.reg[r1] == 0) return ERROR_DIVISION_BY_ZERO; vm.reg[r2] = vm.reg[r0] / vm.reg[r1]; break; } case OP_MUL: { vm.reg[r2] = vm.reg[r0] * vm.reg[r1]; break; } case OP_MOV_RES: { vm.result = vm.reg[r0]; break; } case OP_DONE: { return SUCCESS; } default: return ERROR_UNKNOWN_OPCODE; } } return SUCCESS; } 

рдЙрджрд╛рд╣рд░рдг 16 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╢реАрди рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ 16 рдмрд┐рдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рддреАрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрдирдХреЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


  1. 4 рдмрд┐рдЯ рдкреНрд░рддрд┐ рдУрдкрдХреЛрдб + 4 рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╛рдо + 8 рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рддрд░реНрдХред
  2. 4 рдмрд┐рдЯ рдкреНрд░рддрд┐ рдУрдкрдХреЛрдб + рддреАрди рдмрд╛рд░ 4 рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╛рдоред
  3. 4 рдмрд┐рдЯ рдкреНрд░рддрд┐ рдУрдкрдХреЛрдб + 4 рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рдПрдХрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╛рдо + 8 рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд┐рдЯреНрд╕ред

рд╣рдорд╛рд░реА рдЫреЛрдЯреА рдЖрднрд╛рд╕реА рдорд╢реАрди рдореЗрдВ рдмрд╣реБрдд рдХрдо рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐ рдУрдкреЗрдХ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ (рдпрд╛ 16 рд╕рдВрднрд╡ рд╕рдВрдЪрд╛рд▓рди) рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдСрдкрд░реЗрд╢рди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╢реЗрд╖ рдЯреБрдХрдбрд╝реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред


OP_LOADI рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдбрд┐рдВрдЧ (4 + 4 + 8) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ (4 + 4 + 4 + 4) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд╣рд╛рдВ рдкрд░ рдПрдХ рджрд▓реАрд▓ рд▓реЗрдиреА рд╣реИ рдФрд░ рдХрд╣рд╛рдВ рдкрд░ рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рд░реВрдк (4 + 4 + 8 рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд┐рдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ OP_MOV_RES рд╣реИред


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


рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ: рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╢реАрдиреЛрдВ рдХреЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдХрдо рдирд┐рд░реНрджреЗрд╢ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрджреЗрд╢ рд╡реНрдпрд╛рдкрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдРрд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рди рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ - рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд▓рдмреНрдз рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реНрдЯреИрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ; рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕реНрдЯреИрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднреМрддрд┐рдХ рдорд╢реАрдиреЛрдВ рдореЗрдВ рд░реИрдо рдХреЗ рд╕рдорд╛рди рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред


рд╕реНрдЯреИрдХ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╢реАрдиреЗрдВ, рддреБрд▓рдирд╛


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


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


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рджрдХреНрд╖рддрд╛ рдХреА рдХрд╛рдлреА рдареЛрд╕ рдХреАрдордд рд╣реИ: рд╕рдВрдХрд▓рдХ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдЙрдиреНрдирдд рдЕрдиреБрдХреВрд▓рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред


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


рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреБрднрд╛рд╖рд┐рдпреЛрдВ рдореЗрдВ


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


 typedef enum { /* match a single char to an immediate argument from the string and advance ip and cp, or * abort*/ OP_CHAR, /* jump to and match either left expression or the right one, abort if nothing matches*/ OP_OR, /* do an absolute jump to an offset in the immediate argument */ OP_JUMP, /* stop execution and report a successful match */ OP_MATCH, } opcode; typedef enum match_result { MATCH_OK, MATCH_FAIL, MATCH_ERROR, } match_result; match_result vm_match_recur(uint8_t *bytecode, uint8_t *ip, char *sp) { for (;;) { uint8_t instruction = *ip++; switch (instruction) { case OP_CHAR:{ char cur_c = *sp; char arg_c = (char)*ip ; /* no match? FAILed to match */ if (arg_c != cur_c) return MATCH_FAIL; /* advance both current instruction and character pointers */ ip++; sp++; continue; } case OP_JUMP:{ /* read the offset and jump to the instruction */ uint8_t offset = *ip; ip = bytecode + offset; continue; } case OP_OR:{ /* get both branch offsets */ uint8_t left_offset = *ip++; uint8_t right_offset = *ip; /* check if following the first offset get a match */ uint8_t *left_ip = bytecode + left_offset; if (vm_match_recur(bytecode, left_ip, sp) == MATCH_OK) return MATCH_OK; /* no match? Check the second branch */ ip = bytecode + right_offset; continue; } case OP_MATCH:{ /* success */ return MATCH_OK; } } return MATCH_ERROR; } } match_result vm_match(uint8_t *bytecode, char *str) { printf("Start matching a string: %s\n", str); return vm_match_recur(bytecode, bytecode, str); } 

рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢ OP_CHAR рд╣реИред рд╡рд╣ рдЕрдкрдирд╛ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ ( char *sp ) рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ рд╕реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИред рд▓рд╛рдЗрди рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдФрд░ рд╡рд░реНрддрдорд╛рди рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рд╣реЛрддрд╛ рд╣реИред


рдорд╢реАрди рдЬрдВрдк рдСрдкрд░реЗрд╢рди (OP_JUMP) рдХреЛ рднреА рд╕рдордЭрддреА рд╣реИ, рдЬреЛ рдПрдХ рдПрдХрд▓ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред рддрд░реНрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдирд┐рд░рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ, рдЬрд╣рд╛рдВ рд╕реЗ рдЧрдгрдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╣реИред


рдЕрдВрддрд┐рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдСрдкрд░реЗрд╢рди OP_OR рд╣реИред рд╡рд╣ рджреЛ рдСрдлрд╕реЗрдЯ рд▓реЗрддреА рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░ рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рд╣реИ, рдлрд┐рд░, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд╕рд░рд╛ред рд╡рд╣ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдирд┐рд░реНрджреЗрд╢ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдХреЗ рдкреЗрдбрд╝ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред


рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдХреЛрдб рдХреЗ рдЪрд╛рд░ opcodes рдФрд░ рд╕рддреНрддрд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ "abc", "a; bc", "(ab | bc) d", "a * bc" рдЬреИрд╕реЗ рдирд┐рдпрдорд┐рдд рднрд╛рд╡реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рднреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рд╣реИ - рдирд┐рд░реНрджреЗрд╢ рд╕реНрдЯреНрд░реАрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд, рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ - рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЬрдиреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ Google RE2 рд╕реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЬрди рдХреЗ рд▓реЗрдЦрдХ, рд░рд╕ рдХреЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


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


рдЖрдЗрдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВред


рд╕рд╛рдорд╛рдиреНрдп-рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рджреЛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реНрдЯреИрдХ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ред


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


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


рджреВрд╕рд░реА рдУрд░, рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдирд┐рд░реНрджреЗрд╢ рд▓реЛрдХрдкреНрд░рд┐рдп рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрди рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред


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


рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ:


  1. рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИрдВ; рдЙрдЪреНрдЪ рд╢рдмреНрджрд╛рд░реНрде рд╕реНрддрд░, рдмреЗрд╣рддрд░ред рдпрд╣ рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред
  2. рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рд╡рд┐рд╖рдо рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдмрд╛рдИрдЯрдХреЛрдб рдореЗрдВ рдЖрдо рднрд╛рдЬрдХ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдирд┐рд░реНрджреЗрд╢ рд╕рд╢рд░реНрдд рдФрд╕рдд рд╕реНрддрд░ рдкрд░ рд╣реЛрдВред
  3. рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рднрд╛рд╡ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЦрдбрд╝реА рдорд╢реАрди рдмрдирд╛рдПрдВ, рдпрд╣ рдмрд╛рдЗрдЯ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рд┐рд░рджрд░реНрдж рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред
  4. рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рддреБрдЪреНрдЫ рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╢реАрди рдмрдирд╛рдПрдВ, рдЬреЛ рд╕реНрдЯреИрдХ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдЦреБрдж рдХреЛ рдирд┐рд░реНрджреЗрд╢ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛ред

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

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


All Articles