рд╣рдо рдЕрдкрдиреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рднрд╛рдЧ 1: рд╣рдо рдПрдХ рднрд╛рд╖рд╛ VM рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдкрд░рд┐рдЪрдп


рд╕рднреА рд╣рдмреНрдмрд░рдЪрд┐рддреНрддреЗрд▓реА рдХреЛ рд╢реБрдн рджрд┐рди!

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

рдореИрдВ рдпрд╣рд╛рдБ рдкрд╣рд▓реЗ рдмрддрд╛рдИ рдЧрдИ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ред

рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реА рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЧрд░реНрдо рдЪрд░реНрдЪрд╛ рдХреЛ рдЙрдХрд╕рд╛рдпрд╛ред рдЗрд╕рд▓рд┐рдП - рд╡рд┐рд╖рдп рдХрдИ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреБрд░рдВрдд рдЬрд╛рдирдХрд╛рд░реА рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:

рд╕рд╛рдЗрдЯ (рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рднрд░ рдЬрд╛рдПрдЧреА)ред
рдХреЛрд╖

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

рдореИрдВ C / C ++ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдХреЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рддрдм рд╕реЗ FPC рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдЦрд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рднрд╛рд╖рд╛ рдЙрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдмреЗрд╣рддрд░ рд╣реИред рджреВрд╕рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд╛рд░рдХ рдпрд╣ рдерд╛ рдХрд┐ рдПрдлрдкреАрд╕реА рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕реНрдХрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдкрддреНрдерд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ рди рдХрд░реЗрдВред рдпрд╣ рднрд╛рд╖рд╛ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдФрд░ рд╕рд╣рдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрддрдирд╛ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдмрд╕ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рд╢рд╛рдпрдж рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред

рд╣рдордиреЗ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП


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

рдореЗрд░реЗ VM рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

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

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

рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВрдиреЗ VM рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрдкрд╖реНрдЯ рдХрд╣рд╛ - SVM (рд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди)ред

рдЪрд▓реЛ рдЪрд░ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╕ рдПрдХ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд░рд▓ рдФрд░ рддреЗрдЬ рд╣реИред рдпрд╣ рдПрдХ рдмреИрд╕рд╛рдЦреА рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдФрд░ рдореБрдЭреЗ рд╡реАрдПрдо рдФрд░ рднрд╛рд╖рд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдмрд╛рдж рдореЗрдВ рдореИрдВ рдХреЛрдб рдкрд░ рдмреИрда рдЧрдпрд╛ рдФрд░ рдореЗрд░реЗ "рд╕рдВрд╕реНрдХрд░рдг" рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ null/cardinal/int64/double/string/array ред рдХреЛрдИ рдХреЗрд╕ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

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

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

 var s:string[256]; 
рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдо Enum рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 type TSVMType = (svmtNull, svmtWord, svmtInt, svmtReal, svmtStr, svmtArr); 

рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рдЪрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

  TSVMMem = class m_val: pointer; m_type: TSVMType; constructor Create; destructor Destroy; procedure Clear; end; ... constructor TSVMMem.Create; begin m_val := nil; m_type := svmtNull; end; destructor TSVMMem.Destroy; begin Clear; end; procedure TSVMMem.Clear; inline; begin case m_type of svmtNull: { nop }; svmtWord: Dispose(PCardinal(m_val)); svmtInt: Dispose(PInt64(m_val)); svmtReal: Dispose(PDouble(m_val)); svmtStr: Dispose(PString(m_val)); svmtArr: begin SetLength(PMemArray(m_val)^, 0); Dispose(PMemArray(m_val)); end; else Error(reVarInvalidOp); end; end; 

рд╡рд░реНрдЧ рдХреЛ рдХреБрдЫ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрдирд▓рд╛рдЗрди рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рд╣реЗрдбрд░ рдореЗрдВ {$ рдЗрдирд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред VMs рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдиреЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рдХреА (рдХрд╣реАрдВ-рдХрд╣реАрдВ 15-20% рддрдХ рдПрдордмреА!)ред рд╡рд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рдЗрд╕рдХреЗ рдЖрд╣реНрд╡рд╛рди рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдореНрдмреЗрдбреЗрдб рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдЕрдВрдд рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдирд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдордиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреА рдиреАрдВрд╡ рдХреЛ рдзреЛ рджрд┐рдпрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рд╕реЗрдЯрд░реЛрдВ рдФрд░ рдЧреЗрдЯрд░реНрд╕ (рд╕реЗрдЯрд░ рдПрдВрдб рдЧреЗрдЯреНрдЯрд░) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдп рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд░рдЯрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реЗрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП:

 procedure TSVMMem.SetV(const value; t:TSVMType); inline; begin if (m_val <> nil) and (m_type = t) then begin case t of svmtWord: PCardinal(m_val)^ := Cardinal(value); svmtInt: PInt64(m_val)^ := Int64(value); svmtReal: PDouble(m_val)^ := Double(value); svmtStr: PString(m_val)^ := String(value); end; end else begin if m_val <> nil then FreeMem(m_val); m_type := t; case t of svmtWord: begin New(PCardinal(m_val)); PCardinal(m_val)^ := Cardinal(value); end; svmtInt: begin New(PInt64(m_val)); PInt64(m_val)^ := Int64(value); end; svmtReal: begin New(PDouble(m_val)); PDouble(m_val)^ := Double(value); end; svmtStr: begin New(PString(m_val)); PString(m_val)^ := String(value); end; else Error(reVarTypeCast); end; end; end; ... procedure TSVMMem.SetW(value:cardinal); inline; begin if (m_val <> nil) and (m_type = svmtWord) then PCardinal(m_val)^ := value else begin if m_val <> nil then FreeMem(m_val); m_type := svmtWord; New(PCardinal(m_val)); PCardinal(m_val)^ := value; end; end; 

рдЕрдм рдЖрдк рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 function TSVMMem.GetW:cardinal; inline; begin Result := 0; case m_type of svmtWord: Result := PCardinal(m_val)^; svmtInt: Result := PInt64(m_val)^; svmtReal: Result := Trunc(PDouble(m_val)^); svmtStr: Result := StrToQWord(PString(m_val)^); else Error(reVarTypeCast); end; end; 

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

 procedure TSVMMem.OpAdd(m:TSVMMem); inline; begin case m_type of svmtWord: case m.m_type of svmtWord: SetW(GetW + m.GetW); svmtInt: SetI(GetW + m.GetI); svmtReal: SetD(GetW + m.GetD); svmtStr: SetD(GetW + StrToFloat(m.GetS)); else Error(reVarInvalidOp); end; svmtInt: case m.m_type of svmtWord: SetI(GetI + m.GetW); svmtInt: SetI(GetI + m.GetI); svmtReal: SetD(GetI + m.GetD); svmtStr: SetD(GetI + StrToFloat(m.GetS)); else Error(reVarInvalidOp); end; svmtReal: case m.m_type of svmtWord: SetD(GetD + m.GetW); svmtInt: SetD(GetD + m.GetI); svmtReal: SetD(GetD + m.GetD); svmtStr: SetD(GetD + StrToFloat(m.GetS)); else Error(reVarInvalidOp); end; svmtStr: case m.m_type of svmtWord: SetS(GetS + IntToStr(m.GetW)); svmtInt: SetS(GetS + IntToStr(m.GetI)); svmtReal: SetS(GetS + FloatToStr(m.GetD)); svmtStr: SetS(GetS + m.GetS); else Error(reVarInvalidOp); end; else Error(reVarInvalidOp); end; end; 

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

 function TSVMMem.ArrGet(index: cardinal; grabber:PGrabber): pointer; inline; begin Result := nil; case m_type of svmtArr: Result := PMemArray(m_val)^[index]; svmtStr: begin Result := TSVMMem.CreateFW(Ord(PString(m_val)^[index])); grabber^.AddTask(Result); end; else Error(reInvalidOp); end; end; 

рд╕реБрдкрд░ред рдЕрдм рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдХ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ


рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореБрдЭреЗ рдРрд╕реЗ рд╡рд┐рдЪрд╛рд░ рдЖрдПред рд╕реНрдЯреИрдХ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдерд┐рд░ (рдЧрддрд┐ рдХреЗ рд▓рд┐рдП) рдФрд░ рдЧрддрд┐рд╢реАрд▓ (рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП) рджреЛрдиреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдореИрдВ рдкреВрд░реЗ рд╕реНрдЯреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рддрд╛ рд╣реВрдВ:

 type TStack = object public items: array of pointer; size, i_pos: cardinal; parent_vm: pointer; procedure init(vm: pointer); procedure push(p: pointer); function peek: pointer; procedure pop; function popv: pointer; procedure swp; procedure drop; end; PStack = ^TStack; procedure TStack.init(vm: pointer); begin SetLength(items, StackBlockSize); i_pos := 0; size := StackBlockSize; parent_vm := vm; end; procedure TStack.push(p: pointer); inline; begin items[i_pos] := p; inc(i_pos); if i_pos >= size then begin size := size + StackBlockSize; SetLength(items, size) end; end; function TStack.peek: pointer; inline; begin Result := items[i_pos - 1]; end; procedure TStack.pop; inline; begin dec(i_pos); if size - i_pos > StackBlockSize then begin size := size - StackBlockSize; SetLength(items, size); end; end; function TStack.popv: pointer; inline; begin dec(i_pos); Result := items[i_pos]; if size - i_pos > StackBlockSize then begin size := size - StackBlockSize; SetLength(items, size); end; end; procedure TStack.swp; inline; var p: pointer; begin p := items[i_pos - 2]; items[i_pos - 2] := items[i_pos - 1]; items[i_pos - 1] := p; end; procedure TStack.drop; inline; begin SetLength(items, StackBlockSize); size := StackBlockSize; i_pos := 0; end; 

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

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

рдХрдЪрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ


рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд, рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

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

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

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

рддреЛ, рдЕрдм рд╣рдо рдПрдХ рд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ


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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рд╛:

  1. рд╣реЗрдбрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "SVMEXE_CNS"ред
  2. рдПрдХ рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  3. рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдЕрдиреБрднрд╛рдЧ, рд╡реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡рд┐рдзрд┐ рдЖрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред
  4. рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдзрд╛рд░рд╛ред
  5. рдХреЛрдб рдЕрдиреБрднрд╛рдЧ

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

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди


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

рдУрдкрдХреЛрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ - рдПрдХ рдЫреЛрдЯреА рд╕реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдПрдХ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ:

 type TComand = ( {** for stack **} bcPH, // [top] = [var] bcPK, // [var] = [top] bcPP, // pop bcSDP, // stkdrop bcSWP, // [top] <-> [top-1] {** jump's **} bcJP, // jump [top] bcJZ, // [top] == 0 ? jp [top-1] bcJN, // [top] <> 0 ? jp [top-1] bcJC, // jp [top] & push callback point as ip+1 bcJR, // jp to last callback point & rem last callback point {** for untyped's **} bcEQ, // [top] == [top-1] ? [top] = 1 : [top] = 0 bcBG, // [top] > [top-1] ? [top] = 1 : [top] = 0 bcBE, // [top] >= [top-1] ? [top] = 1 : [top] = 0 bcNOT, // [top] = ![top] bcAND, // [top] = [top] and [top-1] bcOR, // [top] = [top] or [top-1] bcXOR, // [top] = [top] xor [top-1] bcSHR, // [top] = [top] shr [top-1] bcSHL, // [top] = [top] shl [top-1] bcNEG, // [top] = -[top] bcINC, // [top]++ bcDEC, // [top]-- bcADD, // [top] = [top] + [top-1] bcSUB, // [top] = [top] - [top-1] bcMUL, // [top] = [top] * [top-1] bcDIV, // [top] = [top] / [top-1] bcMOD, // [top] = [top] % [top-1] bcIDIV, // [top] = [top] \ [top-1] bcMV, // [top]^ = [top-1]^ bcMVBP, // [top]^^ = [top-1]^ bcGVBP, // [top]^ = [top-1]^^ bcMVP, // [top]^ = [top-1] {** memory operation's **} bcMS, // memory map size = [top] bcNW, // [top] = @new bcMC, // copy [top] bcMD, // double [top] bcRM, // rem @[top] bcNA, // [top] = @new array[ [top] ] of pointer bcTF, // [top] = typeof( [top] ) bcSF, // [top] = sizeof( [top] ) {** array's **} bcAL, // length( [top] as array ) bcSL, // setlength( [top] as array, {stack} ) bcPA, // push ([top] as array)[top-1] bcSA, // peek [top-2] -> ([top] as array)[top-1] {** memory grabber **} bcGPM, // add pointer to TMem to grabber task-list bcGC, // run grabber {** constant's **} bcPHC, // push copy of const bcPHCP, // push pointer to original const {** external call's **} bcPHEXMP, // push pointer to external method bcINV, // call external method bcINVBP, // call external method by pointer [top] {** for thread's **} bcPHN, // push null bcCTHR, // [top] = thread(method = [top], arg = [top+1]):id bcSTHR, // suspendthread(id = [top]) bcRTHR, // resumethread(id = [top]) bcTTHR, // terminatethread(id = [top]) {** for try..catch..finally block's **} bcTR, // try @block_catch = [top], @block_end = [top+1] bcTRS, // success exit from try/catch block bcTRR, // raise exception, message = [top] {** for string's **} bcSTRD, // strdel bcCHORD, bcORDCH, {** [!] directly memory operations **} bcALLC, //alloc memory bcRALLC, //realloc memory bcDISP, //dispose memory bcGTB, //get byte bcSTB, //set byte bcCBP, //mem copy bcRWBP, //read word bcWWBP, //write word bcRIBP, //read int bcWIBP, //write int bcRFBP, //read float bcWFBP, //write float bcRSBP, //read string bcWSBP, //write string bcTHREXT,//stop code execution bcDBP //debug method call ); 

рддреЛ, рдЖрдк рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рд╡реАрдПрдо рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

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

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдПрдХ рдмрдбрд╝рд╛ рд╕реНрд╡рд┐рдЪ-рдХреЗрд╕ рд╣реИред

рдмрд╕ VM рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдВ:

 type TSVM = object public ip, end_ip: TInstructionPointer; mainclasspath: string; mem: PMemory; stack: TStack; cbstack: TCallBackStack; bytes: PByteArr; grabber: TGrabber; consts: PConstSection; extern_methods: PImportSection; try_blocks: TTRBlocks; procedure Run; procedure RunThread; procedure LoadByteCodeFromFile(fn: string); procedure LoadByteCodeFromArray(b: TByteArr); end; 

рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


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

рдЪрд▓реЛ рдмрд╛рд╣рд░реА рддрд░реАрдХреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ


рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рдЖрдпрд╛рдд, рдкреБрд╕реНрддрдХрд╛рд▓рдп ... рдЙрдирдХреЗ рдмрд┐рдирд╛, рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд▓рдЪреАрд▓рд╛рдкрди рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реАрдПрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗред

 type TExternalFunction = procedure(PStack: pointer); cdecl; PExternalFunction = ^TExternalFunction; 

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

рдмрд╛рдж рдореЗрдВ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:

 TExternalFunction(self.extern_methods^.GetFunc(TSVMMem(self.stack.popv).GetW))(@self.stack); 

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦреЗрдВ


рдФрд░ рдЙрд╕реЗ рдкрд╣рд▓реА рдиреАрдВрдж рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рджреЗрдВ:

 library bf; {$mode objfpc}{$H+} uses SysUtils, svm_api in '..\svm_api.pas'; procedure DSleep(Stack:PStack); cdecl; begin sleep(TSVMMem(Stack^.popv).GetW); end; exports DSleep name 'SLEEP'; end. 

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


рдЗрд╕ рдкрд░ рдореИрдВ рд╢рд╛рдпрдж рдПрдХ рдЪрдХреНрд░рд┐рдд рдЪрдХреНрд░ рд╕реЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╕рдорд╛рдкреНрдд рдХрд░реВрдВрдЧрд╛ред

рдЖрдЬ рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдкрдиреА рднрд╛рд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдпрд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рд╕рдорд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред

рдкреВрд░рд╛ VM рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ / рд░рдирдЯрд╛рдЗрдо / svm рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ, рддреЛ рдХрд░реНрдо рдореЗрдВ рдкреНрд▓рд╕ рдлреЗрдВрдХрдиреЗ рдФрд░ рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдореЗрдВ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдордд рдмрдиреЛ, рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдордВрдЪ рдкрд░ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╢рд╛рдпрдж рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓ рдФрд░ рдЙрдирдХреЗ рдЬрд╡рд╛рдм рди рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдВрдЧреЗред

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


All Articles