JIT рд╕рдорд░реНрдердирдХреЛ рд╕рд╛рде Qemu.js: рддрдкрд╛рдИрдВ рдЕрдЭреИ рдкрдирд┐ рдорд╛рдЗрдиреНрд╕рд▓рд╛рдИ рдкрдЫрд╛рдбрд┐ рдлрд░реНрдХрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ

рдХреЗрд╣реА рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ Fabrice Bellard jslinux рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдкреАрд╕реА рдЗрдореБрд▓реЗрдЯрд░ рд╣реЛред рддреНрдпрд╕ рдкрдЫрд┐ рдХрдореНрддрд┐рдорд╛ рдзреЗрд░реИ рдерд┐рдпреЛ рднрд░реНрдЪреБрдЕрд▓ x86ред рддрд░ рддреА рд╕рдмреИ, рдЬрд╣рд╛рдБрд╕рдореНрдо рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ, рдЕрдиреБрд╡рд╛рджрдХрд╣рд░реВ рдерд┐рдП, рдЬрдмрдХрд┐ Qemu, рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдЙрд╣реА Fabrice Bellard рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ, рд░, рд╕рдореНрднрд╡рддрдГ, рдХреБрдиреИ рдкрдирд┐ рдЖрддреНрдо-рд╕рдореНрдорд╛рдирд┐рдд рдЖрдзреБрдирд┐рдХ рдЗрдореБрд▓реЗрдЯрд░, рд╣реЛрд╕реНрдЯ рдкреНрд░рдгрд╛рд▓реА рдХреЛрдбрдорд╛ рдЕрддрд┐рдерд┐ рдХреЛрдбрдХреЛ JIT рд╕рдВрдХрд▓рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдпреЛ рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛ рдХрд┐ рдпреЛ рдмреНрд░рд╛рдЙрдЬрд░рд╣рд░реВрд▓реЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдПрдХрдХреЛ рд╕рдореНрдмрдиреНрдзрдорд╛ рд╡рд┐рдкрд░рд┐рдд рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛ: рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ рдореЗрд╢рд┐рди рдХреЛрдбрдХреЛ JIT рд╕рдВрдХрд▓рди, рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ Qemu рдкреЛрд░реНрдЯ рдЧрд░реНрди рд╕рдмреИрднрдиреНрджрд╛ рддрд╛рд░реНрдХрд┐рдХ рд▓рд╛рдЧреНрдереНрдпреЛред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ, рдХрд┐рди Qemu, рддреНрдпрд╣рд╛рдБ рд╕рд░рд▓ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдиреБрдХреВрд▓ рдЗрдореБрд▓реЗрдЯрд░рд╣рд░реВ рдЫрдиреН - рдЙрд╣реА VirtualBox, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ - рд╕реНрдерд╛рдкрд┐рдд рд░ рдХрд╛рдо рдЧрд░реНрджрдЫред рддрд░ рдХреЗрдореБрд╕рдБрдЧ рдзреЗрд░реИ рд░реЛрдЪрдХ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдЫрдиреН

  • рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд
  • рдХрд░реНрдиреЗрд▓ рдЪрд╛рд▓рдХ рдмрд┐рдирд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛
  • рдЕрдиреБрд╡рд╛рджрдХ рдореЛрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛
  • рджреБрдмреИ рд╣реЛрд╕реНрдЯ рд░ рдЕрддрд┐рдерд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди

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

рд░ рдЕрдм, рдореЗрд░реЛ рдлреБрд░реНрд╕рджрдХреЛ рд╕рдордпрдорд╛ Qemu рд╕реНрд░реЛрдд рдХреЛрдбрд╕рдБрдЧ рдлреБрд░реНрд╕рджрдХрд╛ рд╕рд╛рде рдЯрд┐рдВрдХрд░рд┐рдЩ рдЧрд░реЗрдХреЛ рджреБрдИ рд╡рд░реНрд╖ рдкрдЫрд┐, рдПрдХ рдХрд╛рдо рдЧрд░реНрдиреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ, рдЬрд╕рдорд╛ рддрдкрд╛рдИрдВ рдкрд╣рд┐рд▓реЗ рдиреИ рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреЛрд▓рд┐рдмреНрд░реА рдУрдПрд╕ред

Emscripten рднрдиреЗрдХреЛ рдХреЗ рд╣реЛ

рдЖрдЬрдХрд▓, рдзреЗрд░реИ рдХрдореНрдкрд╛рдЗрд▓рд░рд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реЗрдХрд╛ рдЫрдиреН, рдЬрд╕рдХреЛ рдЕрдиреНрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛред рдХреЗрд╣рд┐, рдЯрд╛рдЗрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╕реНрддреИ, рдореВрд▓ рд░реВрдкрдорд╛ рд╡реЗрдм рдХреЛ рд▓рд╛рдЧреА рд▓реЗрдЦреНрди рдХреЛ рд▓рд╛рдЧреА рд╕рдмреИ рднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рддрд░рд┐рдХрд╛ рдХреЛ рд▓рд╛рдЧреА рдЕрднрд┐рдкреНрд░реЗрдд рдерд┐рдпреЛред рдПрдХреИ рд╕рдордпрдорд╛, Emscripten рдЕрд╡рд╕реНрдерд┐рдд C рд╡рд╛ C++ рдХреЛрдб рд▓рд┐рдиреЗ рд░ рдпрд╕рд▓рд╛рдИ рдмреНрд░рд╛рдЙрдЬрд░-рдкрдвреНрди рд╕рдХрд┐рдиреЗ рдлрд╛рд░рдордорд╛ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рд╣реЛред рдЕрди рдпреЛ рдкреГрд╖реНрда рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдЦреНрдпрд╛рдд рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВрдХреЛ рдзреЗрд░реИ рдкреЛрд░реНрдЯрд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реЗрдХрд╛ рдЫреМрдВ: рдпрд╣рд╛рдБрдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБ PyPy рдорд╛ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ - рд╡реИрд╕реЗ, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ JIT рднрдПрдХреЛ рджрд╛рдмреА рдЧрд░реНрдЫрдиреНред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдЬрд┐рд▓реИ рд╕рдВрдЧ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рд░ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЪрд▓рд╛рдЙрди рд╕рдХрд┐рдБрджреИрди - рддреНрдпрд╣рд╛рдБ рд╕рдВрдЦреНрдпрд╛рд╣рд░реВ рдЫрдиреН рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реБ, рдЬрд╕рд▓рд╛рдИ рддрдкрд╛рдИрд▓реЗ рд░рд╛рдЦреНрдиреБрдкрд░реНрдЫ, рддрдерд╛рдкрд┐, рдЙрд╣реА рдкреГрд╖реНрдардорд╛ рд░рд╣реЗрдХреЛ рд╢рд┐рд▓рд╛рд▓реЗрдЦрд▓реЗ рднрдиреНрдЫ "Emscripten рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдкреЛрд░реНрдЯреЗрдмрд▓ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ C/C++ рдХреЛрдбред рддреНрдпреЛ рд╣реЛ, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдЕрдкрд░реЗрд╢рдирд╣рд░реВ рдЫрдиреН рдЬреБрди рдорд╛рдирдХ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ, рддрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ x86 рдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ - рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЪрд░рд╣рд░реВрдорд╛ рдЕрд╕рдВрдмрджреНрдз рдкрд╣реБрдБрдЪ, рдЬреБрди рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХреЗрд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд╣рд░реВрдорд╛ рдирд┐рд╖реЗрдз рдЧрд░рд┐рдПрдХреЛ рдЫред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ред , Qemu рдПрдХ рдХреНрд░рд╕-рдкреНрд▓реЗрдЯрдлрд░реНрдо рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЛ рд░, рдо рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рд░ рдпрд╕рд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджреИрди - рдпрд╕рд▓рд╛рдИ рд▓рд┐рдиреБрд╣реЛрд╕реН рд░ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рддреНрдпрд╕рдкрдЫрд┐ JIT рд╕рдБрдЧ рдЕрд▓рд┐рдХрддрд┐ рдЯрд┐рдВрдХрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рд░ рддрдкрд╛рдЗрдБ рд╕рдХрд┐рдпреЛ! рддрд░ рддреНрдпреЛ рд╣реЛрдЗрдиред рдХреЗрд╕...

рдкрд╣рд┐рд▓реЛ рдкреНрд░рдпрд╛рд╕

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдо Qemu рд▓рд╛рдИ JavaScript рдорд╛ рдкреЛрд░реНрдЯ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░рдХреЛ рд╕рд╛рде рдЖрдЙрдиреЗ рдкрд╣рд┐рд▓реЛ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдЗрдиред рддреНрдпрд╣рд╛рдБ рдПрдХ рдкреНрд░рд╢реНрди рд╕реЛрдзрд┐рдПрдХреЛ рдерд┐рдпреЛ ReactOS рдлреЛрд░рдордорд╛ рдпрджрд┐ рдпреЛ Emscripten рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдореНрднрд╡ рдерд┐рдпреЛред рдкрд╣рд┐рд▓реЗ рдкрдирд┐, рддреНрдпрд╣рд╛рдБ рдЕрдлрд╡рд╛рд╣рд╣рд░реВ рдерд┐рдП рдХрд┐ рдлреЗрдмреНрд░рд┐рд╕ рдмреЗрд▓рд╛рд░реНрдбрд▓реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдкрдорд╛ рдпреЛ рдЧрд░реЗ, рддрд░ рд╣рд╛рдореА jslinux рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░рд┐рд░рд╣реЗрдХрд╛ рдерд┐рдпреМрдВ, рдЬреБрди, рдЬрд╣рд╛рдБрд╕рдореНрдо рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ, JS рдорд╛ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдорд╛рддреНрд░ рд╣реЛ, рд░ рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛред рдкрдЫрд┐, рднрд░реНрдЪреБрдЕрд▓ x86 рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ - рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╕реНрд░реЛрддрд╣рд░реВ рдкреЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рд░ рднрдирд┐рдПрдХреЛ рдЫ, рдЗрдореБрд▓реЗрд╢рдирдХреЛ рдареВрд▓реЛ "рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛" рд▓реЗ рдпрд╕рд▓рд╛рдИ рдлрд░реНрдорд╡реЗрдпрд░рдХреЛ рд░реВрдкрдорд╛ SeaBIOS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдореНрднрд╡ рдмрдирд╛рдпреЛред рдердк рд░реВрдкрдорд╛, Emscripten рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Qemu рдкреЛрд░реНрдЯ рдЧрд░реНрдиреЗ рдХрдореНрддрд┐рдорд╛ рдПрдЙрдЯрд╛ рдкреНрд░рдпрд╛рд╕ рдерд┐рдпреЛ - рдореИрд▓реЗ рдпреЛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ рд╕рдХреЗрдЯ рдЬреЛрдбреАрддрд░, рдЬрд╣рд╛рдБрд╕рдореНрдо рдореИрд▓реЗ рдмреБрдЭреЗрдХреЛ рдЫреБ, рд╡рд┐рдХрд╛рд╕ рдЬрдореЗрдХреЛ рдерд┐рдпреЛ ред

рддреНрдпрд╕реЛрднрдП, рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ, рдпрд╣рд╛рдБ рд╕реНрд░реЛрддрд╣рд░реВ рдЫрдиреН, рдпрд╣рд╛рдБ Emscripten рдЫ - рдпрд╕рд▓рд╛рдИ рд▓рд┐рдиреБрд╣реЛрд╕реН рд░ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рддрд░ рддреНрдпрд╣рд╛рдБ рдкрдирд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЫрдиреН рдЬрд╕рдорд╛ Qemu рдирд┐рд░реНрднрд░ рдЫ, рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЬрд╕рдорд╛ рддреА рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдирд┐рд░реНрднрд░ рдЫрдиреН, рдЖрджрд┐, рд░ рддреА рдордзреНрдпреЗ рдПрдХ рд╣реЛред libffi, рдХреБрди glib рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдЕрдлрд╡рд╛рд╣рд╣рд░реВ рдерд┐рдП рдХрд┐ рддреНрдпрд╣рд╛рдБ рдПрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдирдХрд╛ рд▓рд╛рдЧрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рдкреЛрд░реНрдЯрд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЧреНрд░рд╣рдорд╛ рдПрдЙрдЯрд╛ рдерд┐рдпреЛ, рддрд░ рдпреЛ рдкрддреНрдпрд╛рдЙрди рдЧрд╛рд╣реНрд░реЛ рдерд┐рдпреЛ: рдкрд╣рд┐рд▓реЛ, рдпреЛ рдирдпрд╛рдБ рдХрдореНрдкрд╛рдЗрд▓рд░ рдмрдиреНрдиреЗ рдЙрджреНрджреЗрд╢реНрдп рдерд┐рдПрди, рджреЛрд╕реНрд░реЛ, рдпреЛ рдзреЗрд░реИ рдХрдо рд╕реНрддрд░рдХреЛ рдерд┐рдпреЛред рдкреБрд╕реНрддрдХрд╛рд▓рдп рднрд░реНрдЦрд░ рдЙрдард╛рдЙрди, рд░ JS рдорд╛ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд░ рдпреЛ рдХреЗрд╡рд▓ рдПрд╕реЗрдореНрдмрд▓реА рдЗрдиреНрд╕рд░реНрдЯрдХреЛ рдХреБрд░рд╛ рд╣реЛрдЗрди - рд╕рд╛рдпрдж, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдЯреНрд╡рд┐рд╕реНрдЯ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдХреЗрд╣рд┐ рдХрд▓рд┐рдЩ рдХрдиреНрднреЗрдиреНрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдЗрдБ рд╕реНрдЯреНрдпрд╛рдХрдорд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВ рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░реНрдп рдХрд▓ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рддрд░ Emscripten рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХреБрд░рд╛ рд╣реЛ: рдЙрддреНрдкрдиреНрди рдХреЛрдб рдмреНрд░рд╛рдЙрдЬрд░ JS рдЗрдиреНрдЬрд┐рди рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬрд░рд▓рд╛рдИ рдкрд░рд┐рдЪрд┐рдд рджреЗрдЦрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, рдХреЗрд╣рд┐ рдЪрд╛рд▓рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рддрдерд╛рдХрдерд┐рдд рд░рд┐рд▓реВрдкрд┐рдЩ - рдкреНрд░рд╛рдкреНрдд рднрдПрдХреЛ LLVM IR рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреЗрд╣реА рдЕрдореВрд░реНрдд рдЯреНрд░рд╛рдиреНрдЬрд┐рд╕рди рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╕рд╛рде рдХреЛрдб рдЬрдирд░реЗрдЯрд░рд▓реЗ рдкреНрд░рд╢рдВрд╕рдиреАрдп ifs, loops, рдЖрджрд┐ рдкреБрди: рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫред рдард┐рдХ рдЫ, рд╕рдорд╛рд░реЛрд╣рдорд╛ рддрд░реНрдХрд╣рд░реВ рдХрд╕рд░реА рдкрд╛рд╕ рд╣реБрдиреНрдЫрдиреН? рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛, JS рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рддрд░реНрдХрдХреЛ рд░реВрдкрдорд╛, рддреНрдпреЛ рд╣реЛ, рдпрджрд┐ рд╕рдореНрднрд╡ рдЫ, рд╕реНрдЯреНрдпрд╛рдХ рдорд╛рд░реНрдлрдд рд╣реЛрдЗрдиред

рд╕реБрд░реБрдорд╛ рддреНрдпрд╣рд╛рдБ JS рдХреЛ рд╕рд╛рде libffi рдХреЛ рд▓рд╛рдЧреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд▓реЗрдЦреНрдиреЗ рд░ рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗ рд╡рд┐рдЪрд╛рд░ рдерд┐рдпреЛ, рддрд░ рдЕрдиреНрддрдорд╛ рдо рдореЗрд░реЛ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рдХрд╕рд░реА рдмрдирд╛рдЙрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдЕрд▓рдорд▓рдорд╛ рдкрд░реЗрдВ рддрд╛рдХрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЕрд╡рд╕реНрдерд┐рдд рдХреЛрдбрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫрдиреН - рдо рдХреЗ рдЧрд░реНрди рд╕рдХреНрдЫреБ, рддрд┐рдиреАрд╣рд░реВ рднрдиреНрдЫрдиреН, "рдХреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдпрддрд┐ рдЬрдЯрд┐рд▓ рдЫрдиреН "рдХреЗ рд╣рд╛рдореА рдпрддрд┐ рдореВрд░реНрдЦ рдЫреМрдВ?" рдореИрд▓реЗ libffi рд▓рд╛рдИ рдЕрд░реНрдХреЛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдорд╛ рдкреЛрд░реНрдЯ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдмреЛрд▓реНрдирдХреЛ рд▓рд╛рдЧрд┐ - рд╕реМрднрд╛рдЧреНрдп рджреЗрдЦрд┐, Emscripten рд╕рдБрдЧ рдЗрдирд▓рд╛рдЗрди рдЕрд╕реЗрдореНрдмреНрд▓реАрдХрд╛ рд▓рд╛рдЧрд┐ рджреБрдмреИ рдореНрдпрд╛рдХреНрд░реЛрд╣рд░реВ рдЫрдиреН (рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛, рд╣реЛ - рд░рд╛рдореНрд░реЛ, рдЬреЗ рднрдП рдкрдирд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рддреНрдпрд╕реИрд▓реЗ рдПрд╕реЗрдореНрдмрд▓рд░), рд░ рдлреНрд▓рд╛рдИрдорд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЪрд▓рд╛рдЙрдиреЗ рдХреНрд╖рдорддрд╛ред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдкреНрд▓реЗрдЯрдлрд░реНрдо-рдЖрд╢реНрд░рд┐рдд libffi рдЯреБрдХреНрд░рд╛рд╣рд░реВрд╕рдБрдЧ рдХреЗрд╣реА рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдЯрд┐рдВрдХрд░ рдЧрд░реЗрдкрдЫрд┐, рдореИрд▓реЗ рдХреЗрд╣реА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрди рдорд┐рд▓реНрдиреЗ рдХреЛрдб рдкрд╛рдПрдБ рд░ рдореИрд▓реЗ рднреЗрдЯреЗрдХреЛ рдкрд╣рд┐рд▓реЛ рдкрд░реАрдХреНрд╖рдгрдорд╛ рдпрд╕рд▓рд╛рдИ рдЪрд▓рд╛рдПрдБред рдореЗрд░реЛ рдЖрд╢реНрдЪрд░реНрдпрдорд╛, рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рднрдпреЛред рдореЗрд░реЛ рдкреНрд░рддрд┐рднрд╛ рджреЗрдЦреЗрд░ рдЫрдХреНрдХ рдкрд░реЗрдВ - рдХреБрдиреИ рдордЬрд╛рдХ рдЫреИрди, рдпрд╕рд▓реЗ рдкрд╣рд┐рд▓реЛ рдкреНрд░рдХреНрд╖реЗрдкрдгрдмрд╛рдЯ рдХрд╛рдо рдЧрд░реНрдпреЛ - рдо, рдЕрдЭреИ рдкрдирд┐ рдореЗрд░реЛ рдЖрдБрдЦрд╛рдорд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирдЧрд░реНрджреИ, рдкрд░рд┐рдгрд╛рдо рдХреЛрдбрд▓рд╛рдИ рдлреЗрд░рд┐ рд╣реЗрд░реНрди рдЧрдПрдБ, рдЕрд░реНрдХреЛ рдХрд╣рд╛рдБ рдЦрдиреНрдиреЗ рднрдиреЗрд░ рдореВрд▓реНрдпрд╛рдЩреНрдХрди рдЧрд░реНрдиред рдпрд╣рд╛рдБ рдо рджреЛрд╕реНрд░реЛ рдкрдЯрдХ рдкрд╛рдЧрд▓ рднрдПрдБ - рдореЗрд░реЛ рдХрд╛рд░реНрдпрд▓реЗ рдорд╛рддреНрд░ рдЧрд░реЗрдХреЛ рдерд┐рдпреЛ ffi_call - рдпреЛ рдПрдХ рд╕рдлрд▓ рдХрд▓ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░рд┐рдпреЛред рдЖрдлреИрдВрдорд╛ рдлреЛрди рдерд┐рдПрди ред рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрдард╛рдПрдБ, рдЬрд╕рд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдУрд▓рдореНрдкрд┐рдпрд╛рдб рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд▓рд╛рдИ рд╕реНрдкрд╖реНрдЯ рд╣реБрдиреЗ рдкрд░реАрдХреНрд╖рд╛рдорд╛ рднрдПрдХреЛ рддреНрд░реБрдЯрд┐рд▓рд╛рдИ рд╕рдЪреНрдпрд╛рдпреЛ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рд╣рд░реВ рдпрд╕рд░реА рддреБрд▓рдирд╛ рдЧрд░рд┐рдиреБ рд╣реБрдБрджреИрдиред a == b рд░ рдХрд╕рд░реА рдкрдирд┐ a - b < EPS - рддрдкрд╛рдИрд▓реЗ рдореЛрдбреНрдпреБрд▓рд▓рд╛рдИ рдкрдирд┐ рд╕рдореНрдЭрдиреБ рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЕрдиреНрдпрдерд╛ 0 1/3 рдХреЛ рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫ ... рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдо libffi рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреЛрд░реНрдЯ рд▓рд┐рдПрд░ рдЖрдПрдХреЛ рдЫреБ, рдЬрд╕рд▓реЗ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдкрд╛рд╕ рдЧрд░реНрджрдЫ, рд░ рдЬрд╕рдХреЛ рд╕рд╛рде glib рдЫред рд╕рдВрдХрд▓рд┐рдд - рдореИрд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ рдХрд┐ рдпреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ, рдо рдпрд╕рд▓рд╛рдИ рдкрдЫрд┐ рдердкреНрдиреЗрдЫреБред рдЕрдЧрд╛рдбрд┐ рд╣реЗрд░реНрджреИ, рдо рднрдиреНрдиреЗрдЫреБ рдХрд┐, рдпреЛ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрд┐рдпреЛ, рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рдЕрдиреНрддрд┐рдо рдХреЛрдбрдорд╛ libffi рдкреНрд░рдХрд╛рд░реНрдп рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реЗрдиред

рддрд░, рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рднрдиреЗрдЭреИрдВ, рддреНрдпрд╣рд╛рдБ рдХреЗрд╣реА рд╕реАрдорд┐рддрддрд╛рд╣рд░реВ рдЫрдиреН, рд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░рдХреЛ рдирд┐: рд╢реБрд▓реНрдХ рдкреНрд░рдпреЛрдЧрдХреЛ рдмреАрдЪрдорд╛, рдПрдХ рдЕрдзрд┐рдХ рдЕрдкреНрд░рд┐рдп рд╕реБрд╡рд┐рдзрд╛ рд▓реБрдХреЗрдХреЛ рдЫ - рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реАрдХреЛ рд╕рд╛рде рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩ рд╕рдорд░реНрдерди рдЧрд░реНрджреИрдиред рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛, рдпрд╕рд▓рд╛рдИ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдкрдирд┐ рднрдиреНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдкреЛрд░реНрдЯрд┐рдЩ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛрдЗрди рдЬрд╕рдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ C рдереНрд░реЗрдбрд╣рд░реВрдорд╛ рдмрд╛рдБрдзрд┐рдПрдХреЛ рдЫред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдлрд╛рдпрд░рдлрдХреНрд╕рд▓реЗ рд╕рд╛рдЭрд╛ рдХрд╛рдорджрд╛рд░рд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрдиреЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫ, рд░ Emscripten рд╕рдБрдЧ рддрд┐рдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ pthread рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЫ, рддрд░ рдо рдпрд╕рдорд╛ рдирд┐рд░реНрднрд░ рд╣реБрди рдЪрд╛рд╣рдиреНрдиред рдореИрд▓реЗ Qemu рдХреЛрдбрдмрд╛рдЯ рдорд▓реНрдЯрд┐рдереНрд░реЗрдбрд┐рдЩрд▓рд╛рдИ рдмрд┐рд╕реНрддрд╛рд░реИ рд░реВрдЯ рдЖрдЙрдЯ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ - рдЕрд░реНрдерд╛рддреН, рдереНрд░реЗрдбрд╣рд░реВ рдХрд╣рд╛рдБ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ рднрдиреА рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН, рдпрд╕ рдереНрд░реЗрдбрдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд▓реВрдкрдХреЛ рд╢рд░реАрд░рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рд╕рд╛рд░реНрдиреБрд╣реЛрд╕реН, рд░ рдореБрдЦреНрдп рд▓реБрдкрдмрд╛рдЯ рддреНрдпрд╕реНрддрд╛ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдПрдХ-рдПрдХ рдЧрд░реА рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рджреЛрд╕реНрд░реЛ рдкреНрд░рдпрд╛рд╕

рдХреЗрд╣рд┐ рдмрд┐рдиреНрджреБрдорд╛, рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрдЭреИ рдкрдирд┐ рддреНрдпрд╣рд╛рдБ рдЫ, рд░ рдХреЛрдбрдХреЛ рд╡рд░рд┐рдкрд░рд┐ рдмреЗрд╕рд╛рдЦреА рд╣рд▓реНрд▓рд╛рдЙрдБрджреИ рдХреБрдиреИ рдкрдирд┐ рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗ рдЫреИрдиред рдирд┐рд╖реНрдХрд░реНрд╖: рд╣рд╛рдореАрд▓реЗ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдмреИрд╕рд╛рдЦреА рдердкреНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рд╕рдВрд╕реНрдХрд░рдг 2.4.1, рдЬреБрди рддреНрдпрд╕ рд╕рдордпрдорд╛ рддрд╛рдЬрд╛ рдерд┐рдпреЛ, рд▓рд┐рдЗрдпреЛ (2.5.0 рд╣реЛрдЗрди, рдХрд┐рдирднрдиреЗ, рдХрд╕рд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ, рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдмрдЧрд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН рдЬреБрди рдЕрдЭреИ рд╕рдорд╛рддрд┐рдПрдХреЛ рдЫреИрди, рд░ рдорд╕рдБрдЧ рдореЗрд░реЛ рдЖрдлреНрдиреИ рдмрдЧрд╣рд░реВ рдЫрдиреНред ), рд░ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рдпрд╕рд▓рд╛рдИ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рдкреБрди: рд▓реЗрдЦреНрди рдерд┐рдпреЛ thread-posix.cред рдареАрдХ рдЫ, рддреНрдпреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рдЫ: рдпрджрд┐ рдХрд╕реИрд▓реЗ рдмреНрд▓рдХ рдЧрд░реНрдиреЗ рдЕрдкрд░реЗрд╕рди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдпреЛ рднрдиреЗ, рдкреНрд░рдХрд╛рд░реНрдп рддреБрд░реБрдиреНрддреИ рдмреЛрд▓рд╛рдЗрдпреЛ abort() - рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдпрд╕рд▓реЗ рдПрдХреИрдЪреЛрдЯрд┐ рд╕рдмреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реЗрди, рддрд░ рдХрдореНрддрд┐рдорд╛ рдпреЛ рдЪреБрдкрдЪрд╛рдк рдЕрд╕рдВрдЧрдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБ рднрдиреНрджрд╛ рдмрдвреА рд╕реБрдЦрдж рдерд┐рдпреЛред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, JS рдорд╛ рдХреЛрдб рдкреЛрд░реНрдЯ рдЧрд░реНрдирдорд╛ Emscripten рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдзреЗрд░реИ рдЙрдкрдпреЛрдЧреА рд╣реБрдиреНрдЫрдиреН -s ASSERTIONS=1 -s SAFE_HEAP=1 - рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░рдХрд╛ рдХреЗрд╣реА рдкреНрд░рдХрд╛рд░рд╣рд░реВ рд╕рдорд╛рддреНрдЫрдиреН, рдЬрд╕реНрддреИ рдПрдХ рдЕрд╕рдВрд░реЗрдЦрд┐рдд рдареЗрдЧрд╛рдирд╛рдорд╛ рдХрд▓рд╣рд░реВ (рдЬреБрди рдЯрд╛рдЗрдк рдЧрд░рд┐рдПрдХрд╛ рдПрд░реЗрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдбрд╕рдБрдЧ рдорд┐рд▓реНрджреИрдиред HEAP32[addr >> 2] = 1) рд╡рд╛ рддрд░реНрдХ рдХреЛ рдЧрд▓рдд рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░реНрдп рдХрд▓ред

рд╡реИрд╕реЗ, рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рддреНрд░реБрдЯрд┐рд╣рд░реВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реЛред рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рднрдиреЗрдЭреИрдВ, Qemu рд╕рдБрдЧ рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди TCI (рд╕рд╛рдиреЛ рдХреЛрдб рджреЛрднрд╛рд╖реЗ) рдХреЛ рд▓рд╛рдЧрд┐ "рдбрд┐рдЬреЗрдиреЗрд░реЗрдЯ" рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдмреНрдпрд╛рдХрдЗрдиреНрдб рдЫ, рд░ рдирдпрд╛рдБ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдорд╛ Qemu рдирд┐рд░реНрдорд╛рдг рд░ рдЪрд▓рд╛рдЙрди, рдпрджрд┐ рддрдкрд╛рдИрдВ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдПрдХ C рдХрдореНрдкрд╛рдЗрд▓рд░ рдкрд░реНрдпрд╛рдкреНрдд рдЫред рдХреАрд╡рд░реНрдбрд╣рд░реВ "рдпрджрд┐ рддрд┐рдореА рднрд╛рдЧреНрдпрдорд╛рдиреА рдЫреМ"ред рдо рдЕрд╢реБрдн рдерд┐рдПрдБ, рд░ рдпреЛ рдмрд╛рд╣рд┐рд░рд┐рдпреЛ рдХрд┐ TCI рд▓реЗ рдпрд╕рдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рдкрд╛рд░реНрд╕ рдЧрд░реНрджрд╛ рдЕрд▓рд╛рдЗрди рдкрд╣реБрдБрдЪ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рддреНрдпреЛ рд╣реЛ, рд╕рдмреИ рдкреНрд░рдХрд╛рд░рдХрд╛ рдПрдЖрд░рдПрдо рд░ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╣рд░реВрдорд╛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдкрдорд╛ рд╕реНрддрд░реАрдХреГрдд рдкрд╣реБрдБрдЪрдХреЛ рд╕рд╛рде, Qemu рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░реНрджрдЫ рдХрд┐рдирднрдиреЗ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рд╕рд╛рдорд╛рдиреНрдп TCG рдмреНрдпрд╛рдХрдЗрдиреНрдб рдЫ рдЬрд╕рд▓реЗ рдиреЗрдЯрд┐рдн рдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рддрд░ TCI рд▓реЗ рддрд┐рдиреАрд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ рдХрд┐ рдЧрд░реНрджреИрди рднрдиреНрдиреЗ рдЕрд░реНрдХреЛ рдкреНрд░рд╢реНрди рд╣реЛред рдпрджреНрдпрдкрд┐, рдпреЛ рдмрд╛рд╣рд┐рд░ рдЖрдПрдХреЛ рд░реВрдкрдорд╛, TCI рдХрд╛рдЧрдЬрд╛рддрд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдХреЗрд╣рд┐ рд╕рдорд╛рди рд╕рдВрдХреЗрдд рдЧрд░реЗрдХреЛ рдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдЕрд▓рд╛рдЗрди рд░рд┐рдбрд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐ рдкреНрд░рдХрд╛рд░реНрдп рдХрд▓рд╣рд░реВ рдХреЛрдбрдорд╛ рдердкрд┐рдпреЛ, рдЬреБрди Qemu рдХреЛ рдЕрд░реНрдХреЛ рднрд╛рдЧрдорд╛ рдлреЗрд▓рд╛ рдкрд░реЗрдХреЛ рдерд┐рдпреЛред

рдвреЗрд░ рд╡рд┐рдирд╛рд╢

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, TCI рдорд╛ рдЕрд╕рдВрдмрджреНрдз рдкрд╣реБрдБрдЪ рд╕рдЪреНрдпрд╛рдЗрдпреЛ, рдПрдХ рдореБрдЦреНрдп рд▓реВрдк рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдпреЛ рдЬрд╕рд▓рд╛рдИ рдкреНрд░реЛрд╕реЗрд╕рд░, RCU рд░ рдХреЗрд╣реА рдЕрдиреНрдп рд╕рд╛рдирд╛ рдЪреАрдЬрд╣рд░реВ рднрдирд┐рдиреНрдЫред рд░ рддреНрдпрд╕реИрд▓реЗ рдо рд╡рд┐рдХрд▓реНрдкрдХреЛ рд╕рд╛рде Qemu рд╕реБрд░реБ рдЧрд░реНрдЫреБ -d exec,in_asm,out_asm, рдЬрд╕рдХреЛ рдорддрд▓рдм рддрдкрд╛рдИрд▓реЗ рднрдиреНрдиреБ рдкрд░реНрдЫ рдХрд┐ рдХреБрди рдмреНрд▓рдХрд╣рд░реВ рдХреЛрдбрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдЗрд░рд╣реЗрдХрд╛ рдЫрдиреН, рд░ рдкреНрд░рд╕рд╛рд░рдгрдХреЛ рд╕рдордпрдорд╛ рдЕрддрд┐рдерд┐ рдХреЛрдб рдХреЗ рдерд┐рдпреЛ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐, рдХреБрди рд╣реЛрд╕реНрдЯ рдХреЛрдб рднрдпреЛ (рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдмрд╛рдЗрдЯрдХреЛрдб)ред рдпреЛ рд╕реБрд░реБ рд╣реБрдиреНрдЫ, рдзреЗрд░реИ рдЕрдиреБрд╡рд╛рдж рдмреНрд▓рдХрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫ, рдореИрд▓реЗ рдЫреЛрдбреЗрдХреЛ рдбрд┐рдмрдЧрд┐рдЩ рд╕рдиреНрджреЗрд╢ рд▓реЗрдЦреНрдЫ рдХрд┐ RCU рдЕрдм рд╕реБрд░реБ рд╣реБрдиреНрдЫ рд░... рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдиреНрдЫ abort() рдПрдХ рд╕рдорд╛рд░реЛрд╣ рднрд┐рддреНрд░ free()ред рд╕рдорд╛рд░реЛрд╣ рд╕рдВрдЧ рдЯрд┐рдВрдХрд░ рдЧрд░реЗрд░ free() рд╣рд╛рдореАрд▓реЗ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдпреМрдВ рдХрд┐ рд╣рд┐рдк рдмреНрд▓рдХрдХреЛ рд╣реЗрдбрд░рдорд╛, рдЬреЛ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реАрдХреЛ рдЕрдШрд┐рд▓реНрд▓реЛ рдЖрда рдмрд╛рдЗрдЯрд╣рд░реВрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫ, рдмреНрд▓рдХ рд╕рд╛рдЗрдЬ рд╡рд╛ рддреНрдпрд╕реНрддреИ рдХреЗрд╣рд┐рдХреЛ рд╕рдЯреНрдЯрд╛, рддреНрдпрд╣рд╛рдБ рдлреЛрд╣реЛрд░ рдерд┐рдпреЛред

рд╣рд┐рдкрдХреЛ рд╡рд┐рдирд╛рд╢ - рдХрддрд┐ рдкреНрдпрд╛рд░реЛ ... рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддреНрдпрд╣рд╛рдБ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрд╛рдп рдЫ - (рдпрджрд┐ рд╕рдореНрднрд╡ рднрдПрдорд╛) рдЙрд╣реА рд╕реНрд░реЛрддрд╣рд░реВрдмрд╛рдЯ, рдиреЗрдЯрд┐рдн рдмрд╛рдЗрдирд░реА рдЬрдореНрдорд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдпрд╕рд▓рд╛рдИ Valgrind рдЕрдиреНрддрд░реНрдЧрдд рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐, рдмрд╛рдЗрдирд░реА рддрдпрд╛рд░ рдерд┐рдпреЛред рдо рдпрд╕рд▓рд╛рдИ рдЙрд╣реА рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрд╕рдБрдЧ рд╕реБрд░реВ рдЧрд░реНрдЫреБ - рдпреЛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕рдордпрдорд╛ рдкрдирд┐ рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдиреНрдЫ, рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдкреБрдЧреНрдиреБ рдЕрдШрд┐ред рдпреЛ рдЕрдкреНрд░рд┐рдп рдЫ, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣ - рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рд╕реНрд░реЛрддрд╣рд░реВ рдареНрдпрд╛рдХреНрдХреИ рдЙрд╕реНрддреИ рдерд┐рдПрдирдиреН, рдЬреБрди рдЕрдЪрдореНрдордХреЛ рдХреБрд░рд╛ рд╣реЛрдЗрди, рдХрд┐рдирдХрд┐ рдХрдиреНрдлрд┐рдЧрд░рд▓реЗ рдереЛрд░реИ рдлрд░рдХ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдЦреЛрдЬреЗрдХреЛ рдЫ, рддрд░ рдорд╕рдБрдЧ Valgrind рдЫ - рдкрд╣рд┐рд▓реЗ рдо рдпреЛ рдмрдЧ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗрдЫреБ, рд░ рддреНрдпрд╕рдкрдЫрд┐, рдпрджрд┐ рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдЫреБред , рдореВрд▓ рджреЗрдЦрд╛ рдкрд░реНрдиреЗрдЫред рдо Valgrind рдЕрдиреНрддрд░реНрдЧрдд рдЙрд╣реА рдХреБрд░рд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫреБ... Y-y-y, y-y-y, рдЙрд╣-рдЙрд╣, рдпреЛ рд╕реБрд░реБ рднрдпреЛ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХрд░рдгрдорд╛ рдЧрдпреЛ рд░ рдЧрд▓рдд рдореЗрдореЛрд░реА рдкрд╣реБрдБрдЪрдХреЛ рдмрд╛рд░реЗрдорд╛ рдПрдХрд▓ рдЪреЗрддрд╛рд╡рдиреА рдмрд┐рдирд╛ рдиреИ рдореВрд▓ рдмрдЧрд▓рд╛рдИ рдЕрдШрд┐ рдмрдвреНрдпреЛ, рдкрддрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдЙрд▓реНрд▓реЗрдЦ рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред рдЬреАрд╡рди, рддрд┐рдиреАрд╣рд░реВрд▓реЗ рднрдиреЗрдЭреИрдВ, рдорд▓рд╛рдИ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рдЧрд░реЗрди - рдПрдХ рдХреНрд░реНрдпрд╛рд╕рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рд▓рдЧреНрд░рд┐рдиреНрдб рдЕрдиреНрддрд░реНрдЧрдд рд╕реБрд░реВ рдЧрд░реНрджрд╛ рдХреНрд░реНрдпрд╛рд╕ рдмрдиреНрдж рд╣реБрдиреНрдЫред рдХреЗ рдерд┐рдпреЛ рддреНрдпреЛ рд░рд╣рд╕реНрдп рдиреИ рд╣реЛ ред рдореЗрд░реЛ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдпреЛ рд╣реЛ рдХрд┐ рдПрдХ рдкрдЯрдХ рд╣рд╛рд▓рдХреЛ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рд╡рд░рдкрд░рдорд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╕рдордпрдорд╛ рдХреНрд░реНрдпрд╛рд╕ рдкрдЫрд┐, gdb рд▓реЗ рдХрд╛рдо рджреЗрдЦрд╛рдпреЛред memset- рдПрдХ рдорд╛рдиреНрдп рд╕реВрдЪрдХрдХреЛ рд╕рд╛рде рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ mmx, рд╡рд╛ xmm рджрд░реНрддрд╛, рддреНрдпрд╕рдкрдЫрд┐ рд╕рд╛рдпрдж рдпреЛ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рддреНрд░реБрдЯрд┐ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдерд┐рдпреЛ, рдпрджреНрдпрдкрд┐ рдпреЛ рдЕрдЭреИ рдкрддреНрдпрд╛рдЙрди рдЧрд╛рд╣реНрд░реЛ рдЫред

рдареАрдХ рдЫ, Valgrind рд▓реЗ рдпрд╣рд╛рдБ рдорджреНрджрдд рдЧрд░реЗрдХреЛ рджреЗрдЦрд┐рдБрджреИрдиред рд░ рдпрд╣рд╛рдБ рд╕рдмреИрднрдиреНрджрд╛ рдШрд┐рдирд▓рд╛рдЧреНрджреЛ рдХреБрд░рд╛ рд╕реБрд░реБ рднрдпреЛ - рд╕рдмреИ рдХреБрд░рд╛ рд╕реБрд░реБ рд╣реБрдиреЗ рджреЗрдЦрд┐рдиреНрдЫ, рддрд░ рд▓рд╛рдЦреМрдВ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЕрдШрд┐ рднрдПрдХреЛ рдШрдЯрдирд╛рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдиреНрдЫред рд▓рд╛рдореЛ рд╕рдордпрд╕рдореНрдо рдХрд╕рд░реА рдкреБрдЧреНрдиреЗ рднрдиреНрдиреЗ рдкрдирд┐ рдерд╛рд╣рд╛ рдерд┐рдПрдиред рдЕрдиреНрддрдорд╛, рдореИрд▓реЗ рдЕрдЭреИ рдкрдирд┐ рдмрд╕реЗрд░ рдбрд┐рдмрдЧ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛред рд╣реЗрдбрд░рд▓рд╛рдИ рдкреБрди: рд▓реЗрдЦрд┐рдПрдХреЛ рдХреБрд░рд╛ рдкреНрд░рд┐рдиреНрдЯ рдЧрд░реНрджрд╛ рдпреЛ рд╕рдВрдЦреНрдпрд╛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рджреИрди, рдмрд░реБ рдХреБрдиреИ рдкреНрд░рдХрд╛рд░рдХреЛ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рд╣реЛред рд░, рд╣реЗрд░ рд░ рд╣реЗрд░, рдпреЛ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреНрд░рд┐рдЩ BIOS рдлрд╛рдЗрд▓рдорд╛ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ - рддреНрдпреЛ рд╣реЛ, рдЕрдм рдпреЛ рдПрдХ рдмрдлрд░ рдУрднрд░рдлреНрд▓реЛ рдерд┐рдпреЛ рднрдиреЗрд░ рдЙрдЪрд┐рдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕рдВрдЧ рднрдиреНрди рд╕рдореНрднрд╡ рдерд┐рдпреЛ, рд░ рдпреЛ рдкрдирд┐ рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рдпреЛ рдпреЛ рдмрдлрд░ рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛред рдЦреИрд░, рддреНрдпрд╕реЛрднрдП рдпрд╕реНрддреЛ рдХреЗрд╣рд┐ - Emscripten рдорд╛, рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, рддреНрдпрд╣рд╛рдБ рдареЗрдЧрд╛рдирд╛ рд╕реНрдкреЗрд╕рдХреЛ рдХреБрдиреИ рдЕрдирд┐рдпрдорд┐рддрддрд╛ рдЫреИрди, рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкреНрд╡рд╛рд▓рд╣рд░реВ рдкрдирд┐ рдЫреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрд▓реЗ рдЕрдиреНрддрд┐рдо рдкреНрд░рдХреНрд╖реЗрдкрдгрдмрд╛рдЯ рд╕реВрдЪрдХрджреНрд╡рд╛рд░рд╛ рдбрд╛рдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрди рдХреЛрдбрдХреЛ рдмреАрдЪрдорд╛ рдХрддреИ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдбрд╛рдЯрд╛ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН, рд╕реВрдЪрдХ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН, рд░, рдпрджрд┐ рдпреЛ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫреИрди рднрдиреЗ, рд╡рд┐рдЪрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рдЦрд╛рдирд╛ рдкрд╛рдЙрдиреБрд╣реЛрд╕реНред рд╕рд╛рдБрдЪреЛ, рдХреБрдиреИ рдкрдирд┐ рдкрд░рд┐рд╡рд░реНрддрди рдкрдЫрд┐ рд▓рд┐рдЩреНрдХ рдЧрд░реНрди рдХреЗрд╣реА рдорд┐рдиреЗрдЯ рд▓рд╛рдЧреНрдЫ, рддрд░ рддрдкрд╛рдИрдВ рдХреЗ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ? рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдПрдЙрдЯрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЗрдЦрд╛ рдлреЗрд▓рд╛ рдкрд░реНтАНрдпреЛ рдЬрд╕рд▓реЗ BIOS рд▓рд╛рдИ рдЕрд╕реНрдерд╛рдпреА рдмрдлрд░рдмрд╛рдЯ рдЕрддрд┐рдерд┐ рдореЗрдореЛрд░реАрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдпреЛ - рд░, рд╡рд╛рд╕реНрддрд╡рдорд╛, рддреНрдпрд╣рд╛рдБ рдмрдлрд░рдорд╛ рдкрд░реНрдпрд╛рдкреНрдд рдард╛рдЙрдБ рдерд┐рдПрдиред рддреНрдпреЛ рдЕрдиреМрдареЛ рдмрдлрд░ рдареЗрдЧрд╛рдирд╛рдХреЛ рд╕реНрд░реЛрдд рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреЗ рдХрд╛рд░реНрдпрдХреЛ рдкрд░рд┐рдгрд╛рдо рднрдпреЛ qemu_anon_ram_alloc рдлрд╛рдЗрд▓рдорд╛ oslib-posix.c - рддреНрдпрд╣рд╛рдБ рддрд░реНрдХ рдпреЛ рдерд┐рдпреЛ: рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдпреЛ 2 рдПрдордмреА рдЖрдХрд╛рд░рдХреЛ рдареВрд▓реЛ рдкреГрд╖реНрдардорд╛ рдареЗрдЧрд╛рдирд╛ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рдЧрд░реНрди рдЙрдкрдпреЛрдЧреА рд╣реБрди рд╕рдХреНрдЫ, рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рд╕реЛрдзреНрдиреЗрдЫреМрдВред mmap рдкрд╣рд┐рд▓реЗ рдЕрд▓рд┐ рдмрдвреА, рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдорджреНрджрддрдХреЛ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫреМрдВ munmapред рд░ рдпрджрд┐ рдпрд╕реНрддреЛ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдзрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЫреИрди рднрдиреЗ, рд╣рд╛рдореА 2 MB рдХреЛ рд╕рдЯреНрдЯрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдХреЗрдд рдЧрд░реНрдиреЗрдЫреМрдВ getpagesize() - mmap рдпрд╕рд▓реЗ рдЕрдЭреИ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рдареЗрдЧрд╛рдирд╛ рджрд┐рдиреЗрдЫ... рддреНрдпрд╕реИрд▓реЗ Emscripten рдорд╛ mmap рдорд╛рддреНрд░ рдХрд▓ рдЧрд░реНрджрдЫ malloc, рддрд░ рдкрдХреНрдХреИ рдкрдирд┐ рдпреЛ рдкреГрд╖реНрдардорд╛ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рдЫреИрдиред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдПрдХ рдмрдЧ рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рдХреЗрд╣рд┐ рдорд╣рд┐рдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░рд╛рд╢ рдмрдирд╛рдпреЛ рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рд╕рдЪреНрдпрд╛рдЗрдПрдХреЛ рдерд┐рдпреЛ ╨┤╨▓╤Г╤Е рд░реЗрдЦрд╛рд╣рд░реВред

рдХрд▓рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ

рд░ рдЕрдм рдкреНрд░реЛрд╕реЗрд╕рд░рд▓реЗ рдХреЗрд╣рд┐ рдЧрдгрдирд╛ рдЧрд░реНрджреИрдЫ, Qemu рдХреНрд░реНрдпрд╛рд╕ рдЧрд░реНрджреИрди, рддрд░ рд╕реНрдХреНрд░рд┐рди рдЕрди рдЧрд░реНрджреИрди, рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЫрд┐рдЯреЛ рд▓реВрдкрдорд╛ рдЬрд╛рдиреНрдЫ, рдЖрдЙрдЯрдкреБрдЯ рджреНрд╡рд╛рд░рд╛ рдиреНрдпрд╛рдп рдЧрд░реНрджреИред -d exec,in_asm,out_asmред рдПрдЙрдЯрд╛ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рджреЗрдЦрд╛ рдкрд░реЗрдХреЛ рдЫ: рдЯрд╛рдЗрдорд░ рдЕрд╡рд░реЛрдзрд╣рд░реВ (рд╡рд╛, рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╕рдмреИ рдЕрд╡рд░реЛрдзрд╣рд░реВ) рдЖрдЗрдкреБрдЧреНрджреИрдирдиреНред рд░ рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдиреЗрдЯрд┐рдн рдЕрд╕реЗрдВрдмрд▓реАрдмрд╛рдЯ рдЕрд╡рд░реЛрдзрд╣рд░реВ рдЦреЛрд▓реНрдиреБ рднрдпреЛ, рдЬреБрди рдХреБрдиреИ рдХрд╛рд░рдгрд▓реЗ рдХрд╛рдо рдЧрд░реНтАНрдпреЛ, рддрдкрд╛рдИрдВрд▓реЗ рд╕рдорд╛рди рддрд╕реНрд╡реАрд░ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред рддрд░ рдпреЛ рдХреБрдиреИ рдкрдирд┐ рдЬрд╡рд╛рдл рдерд┐рдПрди: рдорд╛рдерд┐рдХреЛ рд╡рд┐рдХрд▓реНрдкрдХреЛ рд╕рд╛рде рдЬрд╛рд░реА рдЧрд░рд┐рдПрдХреЛ рдЯреНрд░реЗрд╕рд╣рд░реВрдХреЛ рддреБрд▓рдирд╛рд▓реЗ рджреЗрдЦрд╛рдПрдХреЛ рдЫ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЯреНрд░рд╛рдЬреЗрдХреНрдЯреЛрд░реАрд╣рд░реВ рдзреЗрд░реИ рдЪрд╛рдБрдбреЛ рдлрд░рдХ рднрдпреЛред рдпрд╣рд╛рдБ рдпреЛ рд▓рдиреНрдЪрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рдХрд┐ рддреБрд▓рдирд╛ рднрдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ emrun рдиреЗрдЯрд┐рдн рдЕрд╕реЗрдВрдмрд▓реАрдХреЛ рдЖрдЙрдЯрдкреБрдЯрд╕рдБрдЧ рдбрд┐рдмрдЧрд┐рдЩ рдЖрдЙрдЯрдкреБрдЯ рдкреВрд░реНрдгрддрдпрд╛ рдореЗрдХрд╛рдирд┐рдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЗрдиред рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╕рд░реА рдЬрдбрд╛рди рд╣реБрдиреНрдЫ emrun, рддрд░ рдЖрдЙрдЯрдкреБрдЯрдорд╛ рдХреЗрд╣реА рд░реЗрдЦрд╛рд╣рд░реВ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рднрд┐рдиреНрдирддрд╛рдорд╛ рднрд┐рдиреНрдирддрд╛ рдЕрдЭреИ рдкрдирд┐ рдЯреНрд░реНрдпрд╛рдЬреЗрдХреНрдЯреЛрд░реАрд╣рд░реВ рднрд┐рдиреНрди рднрдПрдХреЛ рдорд╛рдиреНрдирдХреЛ рдХрд╛рд░рдг рд╣реЛрдЗрдиред рд╕рд╛рдорд╛рдиреНрдп рдорд╛, рдпреЛ рдирд┐рд░реНрджреЗрд╢рди рдЕрдиреБрд╕рд╛рд░ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ ljmpl рддреНрдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдареЗрдЧрд╛рдирд╛рд╣рд░реВрдорд╛ рдПрдХ рд╕рдВрдХреНрд░рдордг рдЫ, рд░ рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдмрд╛рдЗрдЯрдХреЛрдб рдореМрд▓рд┐рдХ рд░реВрдкрдорд╛ рдлрд░рдХ рдЫ: рдПрдЙрдЯрд╛рд▓реЗ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗ рдирд┐рд░реНрджреЗрд╢рди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЕрд░реНрдХреЛрд▓реЗ рдЧрд░реНрджреИрдиред рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЧреБрдЧрд▓ рдЧрд░реЗрдкрдЫрд┐ рд░ рдпреА рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЕрдиреБрд╡рд╛рдж рдЧрд░реНрдиреЗ рдХреЛрдб рдЕрдзреНрдпрдпрди рдЧрд░реЗрдкрдЫрд┐, рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐, рдкрд╣рд┐рд▓реЗ, рдпреЛ рджрд░реНрддрд╛рдорд╛ рддреБрд░реБрдиреНрддреИ рдЕрдШрд┐ред cr0 рдПрдЙрдЯрд╛ рд░реЗрдХрд░реНрдбрд┐рдЩ рдмрдирд╛рдЗрдПрдХреЛ рдерд┐рдпреЛ - рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ - рдЬрд╕рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░рд▓рд╛рдИ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЛрдбрдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрдпреЛ, рд░ рджреЛрд╕реНрд░реЛ, рдХрд┐ js рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд┐рд▓реНрдпреИ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЛрдбрдорд╛ рд╕реНрд╡рд┐рдЪ рдЧрд░реЗрдиред рддрд░ рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ Emscripten рдХреЛ рдЕрд░реНрдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рднрдиреЗрдХреЛ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╕реНрддреИ рдХреЛрдб рд╕рд╣рди рдЧрд░реНрди рдЕрдирд┐рдЪреНрдЫреБрдХ рдЫред call TCI рдорд╛, рдЬреБрди рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХрд╛рд░реНрдп рд╕реВрдЪрдХрд▓реЗ рдкреНрд░рдХрд╛рд░рдорд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдиреНрдЫ long long f(int arg0, .. int arg9) - рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рддрд░реНрдХрд╣рд░реВрдХреЛ рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛рдХреЛ рд╕рд╛рде рдХрд▓ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпрджрд┐ рдпреЛ рдирд┐рдпрдо рдЙрд▓реНрд▓рдЩреНрдШрди рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рдбрд┐рдмрдЧрд┐рдЩ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджреИ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдпрд╛ рдд рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдиреЗрдЫ (рдЬреБрди рд░рд╛рдореНрд░реЛ рдЫ) рд╡рд╛ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗрдЫ (рдЬреБрди рдбрд┐рдмрдЧ рдЧрд░реНрди рджреБрдЦреА рд╣реБрдиреЗрдЫ)ред рддреНрдпрд╣рд╛рдБ рддреЗрд╕реНрд░реЛ рд╡рд┐рдХрд▓реНрдк рдкрдирд┐ рдЫ - рддрд░реНрдХрд╣рд░реВ рдердкреНрдиреЗ/рд╣рдЯрд╛рдЙрдиреЗ рд░реНрдпрд╛рдкрд░рд╣рд░реВрдХреЛ рдкреБрд╕реНрддрд╛рд▓рд╛рдИ рд╕рдХреНрд╖рдо рдкрд╛рд░реНрдиреБрд╣реЛрд╕реН, рддрд░ рдХреБрд▓рдорд╛ рдпреА рд░реНрдпрд╛рдкрд░рд╣рд░реВрд▓реЗ рдзреЗрд░реИ рдард╛рдЙрдБ рд▓рд┐рдиреНрдЫрдиреН, рдпреЛ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж рдХрд┐ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдорд▓рд╛рдИ рдПрдХ рд╕рдп рднрдиреНрджрд╛ рдмрдвреА рд░реНрдпрд╛рдкрд░рд╣рд░реВ рдорд╛рддреНрд░ рдЪрд╛рд╣рд┐рдиреНрдЫред рдпреЛ рдПрдХреНрд▓реИ рдзреЗрд░реИ рджреБ: рдЦреА рдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рдердк рдЧрдореНрднреАрд░ рд╕рдорд╕реНрдпрд╛ рднрдпреЛ: рд░реНрдпрд╛рдкрд░ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдЙрддреНрдкрдиреНрди рдХреЛрдбрдорд╛, рддрд░реНрдХрд╣рд░реВ рд░реВрдкрд╛рдиреНрддрд░рдг рд░ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░рд┐рдпреЛ, рддрд░ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдЙрддреНрдкрдиреНрди рддрд░реНрдХрд╣рд░реВрдХреЛ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдмреЛрд▓рд╛рдЗрдПрди - рдареАрдХ рдЫ, рдЬрд╕реНрддреИред рдореЗрд░реЛ libffi рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рддреНрдпреЛ рд╣реЛ, рдХреЗрд╣реА рд╕рд╣рдпреЛрдЧреАрд╣рд░реВ рдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдПрдирдиреНред

рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, Qemu рд╕рдБрдЧ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рдХреЛ рд░реВрдкрдорд╛ рдорджреНрджрддрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдореЗрд╕рд┐рди-рдкрдвреНрди рдпреЛрдЧреНрдп рд╕реВрдЪреАрд╣рд░реВ рдЫрдиреН

DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)

рддрд┐рдиреАрд╣рд░реВ рдПрдХрджрдо рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ: рдкрд╣рд┐рд▓реЗ, рдореНрдпрд╛рдХреНрд░реЛрд╣рд░реВ рд╕рдмреИрднрдиреНрджрд╛ рд╡рд┐рдЪрд┐рддреНрд░ рддрд░рд┐рдХрд╛рдорд╛ рдкреБрди: рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ DEF_HELPER_n, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдЦреЛрд▓реНрдЫ helper.hред рдореНрдпрд╛рдХреНрд░реЛрд▓рд╛рдИ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдордорд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рд╣рджрд╕рдореНрдо, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдПрд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рддрддреНрд╡рд╣рд░реВрдХреЛ рд╕рдЯреНрдЯрд╛ - #include <helper.h> рдлрд▓рд╕реНрд╡рд░реВрдк, рдореИрд▓реЗ рдЕрдиреНрддрддрдГ рдХрд╛рдордорд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдореМрдХрд╛ рдкрд╛рдПрдБ рдкрд╛рдЗрдкрд╛рд░реНрд╕рд┐рдЩ, рд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ рдЬрд╕рд▓реЗ рдареНрдпрд╛рдХреНрдХреИ рддреА рд░реНрдпрд╛рдкрд░рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ рдЬреБрди рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рддрд┐рдиреАрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреНред

рд░ рддреНрдпрд╕реЛрднрдП, рддреНрдпрд╕ рдкрдЫрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░рд▓реЗ рдХрд╛рдо рдЧрд░реЗрдХреЛ рджреЗрдЦрд┐рдиреНрдЫред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐рдирднрдиреЗ рд╕реНрдХреНрд░рд┐рди рдХрд╣рд┐рд▓реНрдпреИ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░рд┐рдПрдХреЛ рдерд┐рдПрди, рдпрджреНрдпрдкрд┐ memtest86+ рдиреЗрдЯрд┐рдн рдЕрд╕реЗрдВрдмрд▓реАрдорд╛ рдЪрд▓рд╛рдЙрди рд╕рдХреНрд╖рдо рдерд┐рдпреЛред рдпрд╣рд╛рдБ рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ Qemu рдмреНрд▓рдХ I/O рдХреЛрдб coroutines рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред Emscripten рдХреЛ рдЖрдлреНрдиреИ рдзреЗрд░реИ рдХрдард┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЫ, рддрд░ рдпреЛ рдЕрдЭреИ рдкрдирд┐ Qemu рдХреЛрдб рдорд╛ рд╕рдорд░реНрдерди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рддрдкрд╛рдЗрдБ рдЕрдм рдкреНрд░реЛрд╕реЗрд╕рд░ рдбрд┐рдмрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: Qemu рд╡рд┐рдХрд▓реНрдк рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред -kernel, -initrd, -append, рдЬрд╕рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрд▓реЗ рд▓рд┐рдирдХреНрд╕ рдмреБрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд╛, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, memtest86+, рдХреБрдиреИ рдкрдирд┐ рдмреНрд▓рдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реАред рддрд░ рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдЫ: рдиреЗрдЯрд┐рдн рдЕрд╕реЗрдВрдмрд▓реАрдорд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдкрдХреЛ рд╕рд╛рде рдХрдиреНрд╕реЛрд▓рдорд╛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреНрди рд╕рдХреНрдЫред -nographic, рд░ рдмреНрд░рд╛рдЙрдЬрд░рдмрд╛рдЯ рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдХреБрдиреИ рдЖрдЙрдЯрдкреБрдЯ рдЫреИрди рдЬрд╣рд╛рдБрдмрд╛рдЯ рдпреЛ рд╕реБрд░реБ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ emrun, рдЖрдПрдХреЛ рдЫреИрди ред рддреНрдпреЛ рд╣реЛ, рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫреИрди: рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреИрди рд╡рд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреИрдиред рдЕрдирд┐ рдЕрд▓рд┐рдХрддрд┐ рдкрд░реНрдЦрд┐рдиреБ рдкрд░реНрдпреЛ ред рдпреЛ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдпреЛ рдХрд┐ "рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реБрддрд┐рд░рд╣реЗрдХреЛ рдЫреИрди, рддрд░ рдмрд┐рд╕реНрддрд╛рд░реИ рдЭрд┐рдореНрдХрд┐рд░рд╣реЗрдХреЛ рдЫ," рд░ рд▓рдЧрднрдЧ рдкрд╛рдБрдЪ рдорд┐рдиреЗрдЯ рдкрдЫрд┐ рдХрд░реНрдиреЗрд▓рд▓реЗ рдХрдиреНрд╕реЛрд▓рдорд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛ рдлреНрдпрд╛рдБрдХреНрдпреЛ рд░ рд╣реНрдпрд╛рдЩреНрдЧ рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдпреЛред рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░, рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХрд╛рдо рдЧрд░реНрджрдЫ, рд░ рд╣рд╛рдореАрд▓реЗ SDL2 рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдбрдорд╛ рдЦрдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдорд▓рд╛рдИ рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдерд╛рд╣рд╛ рдЫреИрди, рддреНрдпрд╕реИрд▓реЗ рдХреЗрд╣реА рдард╛рдЙрдБрд╣рд░реВрдорд╛ рдореИрд▓реЗ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛред рдХреЗрд╣реА рдмрд┐рдиреНрджреБрдорд╛, рд░реЗрдЦрд╛ parallel0 рдиреАрд▓реЛ рдкреГрд╖реНрдарднреВрдорд┐рдорд╛ рд╕реНрдХреНрд░рд┐рдирдорд╛ рдлреНрд▓реНрдпрд╛рд╕ рднрдпреЛ, рдЬрд╕рд▓реЗ рдХреЗрд╣реА рд╡рд┐рдЪрд╛рд░рд╣рд░реВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпреЛред рдЕрдиреНрддрдорд╛, рдпреЛ рд╕рдорд╕реНрдпрд╛ рднрдпреЛ рдХрд┐ Qemu рд▓реЗ рдПрдЙрдЯрд╛ рднреМрддрд┐рдХ рд╡рд┐рдиреНрдбреЛрдорд╛ рдзреЗрд░реИ рднрд░реНрдЪреБрдЕрд▓ рд╡рд┐рдиреНрдбреЛрд╣рд░реВ рдЦреЛрд▓реНрдЫ, рдЬрд╕рдХреЛ рдмреАрдЪрдорд╛ рддрдкрд╛рдЗрдБ Ctrl-Alt-n рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: рдпрд╕рд▓реЗ рдиреЗрдЯрд┐рдн рдмрд┐рд▓реНрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ Emscripten рдорд╛ рд╣реЛрдЗрдиред рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдиреНрдбреЛрдЬрд╣рд░реВрдмрд╛рдЯ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдЙрдБрджрд╛ -monitor none -parallel none -serial none рд░ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдордорд╛ рдкреВрд░реИ рд╕реНрдХреНрд░рд┐рди рдмрд▓рдкреВрд░реНрд╡рдХ рдкреБрди: рдХреЛрд░реНрдиреЗ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ, рд╕рдмреИ рдХреБрд░рд╛ рдЕрдЪрд╛рдирдХ рдХрд╛рдо рднрдпреЛред

рдХреЛрд░реБрдЯрд┐рдирд╣рд░реВ

рддреНрдпрд╕реЛрднрдП, рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЗрдореБрд▓реЗрд╢рдирд▓реЗ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ рддрдкрд╛рдИрд▓реЗ рдпрд╕рдорд╛ рдХреБрдиреИ рдкрдирд┐ рд░реЛрдЪрдХ рдПрдХрд▓-рдлреНрд▓рдкреА рдЪрд▓рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрди, рдХрд┐рдирдХрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдмреНрд▓рдХ I/O рдЫреИрди - рддрдкрд╛рдИрд▓реЗ рдХреЛрд░реБрдЯрд┐рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред Qemu рд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рдХреЛрд░реБрдЯрд┐рди рдмреНрдпрд╛рдХрдПрдиреНрдбрд╣рд░реВ рдЫрдиреН, рддрд░ JavaScript рд░ Emscripten рдХреЛрдб рдЬреЗрдиреЗрд░реЗрдЯрд░рдХреЛ рдкреНрд░рдХреГрддрд┐рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рд╕реНрдЯреНрдпрд╛рдХрд╣рд░реВ рдЬрдЧреНрдЧ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдиред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ "рд╕рдмреИ рдХреБрд░рд╛ рдЧрдпреЛ, рдкреНрд▓рд╛рд╕реНрдЯрд░ рд╣рдЯрд╛рдЗрдПрдХреЛ рдЫ," рддрд░ Emscripten рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдмреИ рдХреБрд░рд╛рдХреЛ рдЦреНрдпрд╛рд▓ рд░рд╛рдЦреЗрдХрд╛ рдЫрдиреНред рдпреЛ рдПрдХрджрдо рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ: рдпреЛ рд╕рдВрджрд┐рдЧреНрдз рдЬрд╕реНрддреИ рдкреНрд░рдХрд╛рд░реНрдп рдХрд▓ рдХрд▓ рдЧрд░реМрдВ emscripten_sleep рд░ рдЕрдиреНрдп рдзреЗрд░реИрд▓реЗ Asyncify рдореЗрдХрд╛рдирд┐рдЬрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рд╕рд╛рдереИ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдкреЛрдЗрдиреНрдЯрд░ рдХрд▓рд╣рд░реВ рд░ рдХрд▓рд╣рд░реВ рдЬрд╣рд╛рдБ рдЕрдШрд┐рд▓реНрд▓реЛ рджреБрдИ рдХреЗрд╕рд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рддрд▓ рд╣реБрди рд╕рдХреНрдЫред рд░ рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд┐рдЧреНрдз рдХрд▓ рдЕрдШрд┐, рд╣рд╛рдореА рдПрдХ async рд╕рдиреНрджрд░реНрдн рдЪрдпрди рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рдХрд▓ рдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ, рд╣рд╛рдореА рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗрдЫреМрдВ рдХрд┐ рдПрдХ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХрд▓ рднрдПрдХреЛ рдЫ, рд░ рдпрджрд┐ рдпреЛ рдЫ рднрдиреЗ, рд╣рд╛рдореА рдпрд╕ async рд╕рдиреНрджрд░реНрднрдорд╛ рд╕рдмреИ рд╕реНрдерд╛рдиреАрдп рдЪрд░рд╣рд░реВ рдмрдЪрдд рдЧрд░реНрдиреЗрдЫреМрдВ, рдХреБрди рдкреНрд░рдХрд╛рд░реНрдп рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫред рдЬрдм рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд░рд╛рдЦреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫ рдирд┐рдпрдиреНрддреНрд░рдг рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рдЧрд░реНрди, рд░ рд╣рд╛рд▓рдХреЛ рдкреНрд░рдХрд╛рд░реНрдпрдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреБрд╣реЛрд╕реНред рдпрд╣рд╛рдБ рдкреНрд░рднрд╛рд╡ рдЕрдзреНрдпрдпрди рдЧрд░реНрдиреЗ рдЕрд╡рд╕рд░ рдЫ рдмрд░реНрдмрд╛рдж рдЧрд░реНрджреИ - рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХрд▓рдмрд╛рдЯ рдлрд░реНрдХрд┐рдПрдкрдЫрд┐ рдЬрд╛рд░реА рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рд╢рдВрдХрд╛рд╕реНрдкрдж рдХрд▓ рдкрдЫрд┐ рд╕реБрд░реБ рд╣реБрдиреЗ рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ "рд╕реНрдЯрдмрд╣рд░реВ" рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ тАФ рдЬрд╕реНрддреИ: рдпрджрд┐ рддреНрдпрд╣рд╛рдБ n рд╕рдВрджрд┐рдЧреНрдз рдХрд▓рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рддреНрдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрддреИ n/2 рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░рд┐рдиреЗрдЫред рд╕рдордп - рдпреЛ рдЕрдЭреИ рдкрдирд┐ рдЫ, рдпрджрд┐ рдЫреИрди рднрдиреЗ рдпреЛ рдордирдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореНрднрд╛рд╡рд┐рдд рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХрд▓ рдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдореВрд▓ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдХреЗрд╣реА рд╕реНрдерд╛рдиреАрдп рдЪрд░рд╣рд░реВ рдмрдЪрдд рдЧрд░реНрди рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдкрдЫрд┐, рдореИрд▓реЗ рдкрд╛рдЗрдердирдорд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрдирд┐ рд▓реЗрдЦреНрдиреБрдкрд░реНтАНрдпреЛ, рдЬреБрди рд╡рд┐рд╢реЗрд╖ рд░реВрдкрдорд╛ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реЗрдЯрдорд╛ рдЖрдзрд╛рд░рд┐рдд рд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ "рдЕрд╕рд┐рдВрдХреНрд░реЛрдиреАрд▓рд╛рдИ рдЖрдлреИрдВрдорд╛ рдкрд╛рд░ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрди" (рдЕрд░реНрдерд╛рдд, рд╕реНрдЯреНрдпрд╛рдХ рдкреНрд░рдореЛрд╢рди рд░ рдореИрд▓реЗ рднрд░реНрдЦрд░реИ рд╡рд░реНрдгрди рдЧрд░реЗрдХреЛ рд╕рдмреИ рдХреБрд░рд╛рд╣рд░реВ рдЫреИрдирдиреНред рддрд┐рдиреАрд╣рд░реВрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН), рдкреЛрдЗрдиреНрдЯрд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рдХрд▓рд╣рд░реВрд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдЬрд╕рдорд╛ рдХрдореНрдкрд╛рдЗрд▓рд░рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╣рд░реВрд▓рд╛рдИ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫ рддрд╛рдХрд┐ рдпреА рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрд▓рд╛рдИ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдорд╛рдирд┐рдиреЗ рдЫреИрдиред рд░ рддреНрдпрд╕рдкрдЫрд┐ 60 MB рднрдиреНрджрд╛ рдХрдо JS рдлрд╛рдЗрд▓рд╣рд░реВ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдзреЗрд░реИ рдЫрдиреН - рдХрдореНрддрд┐рдорд╛ 30 рднрдиреМрдВред рдпрджреНрдпрдкрд┐, рдПрдХ рдкрдЯрдХ рдореИрд▓реЗ рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдерд┐рдПрдБ, рд░ рд╕рдВрдпреЛрдЧрд╡рд╢ рд▓рд┐рдЩреНрдХрд░ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдлреНрдпрд╛рдБрдХрд┐рджрд┐рдП, рдЬрд╕рдордзреНрдпреЗ -O3ред рдореИрд▓реЗ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЪрд▓рд╛рдЙрдБрдЫреБ, рд░ рдХреНрд░реЛрдорд┐рдпрдорд▓реЗ рдореЗрдореЛрд░реА рдЦрд╛рдиреНрдЫ рд░ рдХреНрд░реНрдпрд╛рд╕ рдЧрд░реНрдЫред рдореИрд▓реЗ рд╕рдВрдпреЛрдЧрд╡рд╢ рдЙрд╕рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдЦреЛрдЬреЗрдХреЛ рдХреБрд░рд╛ рд╣реЗрд░реЗ... рдард┐рдХ рдЫ, рдо рдХреЗ рднрдиреНрди рд╕рдХреНрдЫреБ, рдпрджрд┐ рдорд▓рд╛рдИ 500+ MB рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░рдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдЧрд░реНрди рд░ рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬ рдЧрд░реНрди рднрдирд┐рдПрдХреЛ рднрдП рдо рдкрдирд┐ рд╕реНрдерд┐рд░ рд╣реБрдиреЗ рдерд┐рдПрдБред

рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, Asyncify рд╕рдорд░реНрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдбрдорд╛ рдЬрд╛рдБрдЪрд╣рд░реВ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЕрдиреБрдХреВрд▓ рдерд┐рдПрдирдиреН longjmp-s рдЬреБрди рднрд░реНрдЪреБрдЕрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрдбрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рддрд░ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдкреНрдпрд╛рдЪ рдкрдЫрд┐ рдЬрд╕рд▓реЗ рдпреА рдЬрд╛рдБрдЪрд╣рд░реВрд▓рд╛рдИ рдЕрд╕рдХреНрд╖рдо рдкрд╛рд░реНрдЫ рд░ рдкреНрд░рд╕рдЩреНрдЧрд╣рд░реВрд▓рд╛рдИ рдмрд▓рдкреВрд░реНрд╡рдХ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджрдЫ рдЬрд╕реНрддреЛ рдХрд┐ рд╕рдмреИ рдареАрдХ рдЫ, рдХреЛрдбрд▓реЗ рдХрд╛рдо рдЧрд░реНрдпреЛред рд░ рддреНрдпрд╕рдкрдЫрд┐ рдПрдЙрдЯрд╛ рдЕрдиреМрдареЛ рдХреБрд░рд╛ рд╕реБрд░реБ рднрдпреЛ: рдХрд╣рд┐рд▓реЗрдХрд╛рдБрд╣реА рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рдХреЛрдбрдорд╛ рдЬрд╛рдБрдЪрд╣рд░реВ рдЯреНрд░рд┐рдЧрд░ рдЧрд░рд┐рдпреЛ - рдЙрд╣реА рдЬрд╕рд▓реЗ рдХреЛрдб рдХреНрд░реНрдпрд╛рд╕ рдЧрд░реНрдпреЛ рднрдиреЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрд░реНрдХ рдЕрдиреБрд╕рд╛рд░, рдпреЛ рдЕрд╡рд░реБрджреНрдз рд╣реБрдиреБрдкрд░реНрдЫ - рдХрд╕реИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреНрдпрд╛рдкреНрдЪрд░ рдЧрд░рд┐рдПрдХреЛ рдореНрдпреБрдЯреЗрдХреНрд╕ рд╕рдорд╛рддреНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдпреЛред рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, рдпреЛ рдХреНрд░рдордмрджреНрдз рдХреЛрдбрдорд╛ рддрд╛рд░реНрдХрд┐рдХ рд╕рдорд╕реНрдпрд╛ рднрдПрди - рдо рдХреЗрд╡рд▓ Emscripten рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдорд╛рдирдХ рдореБрдЦреНрдп рд▓реБрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдерд┐рдПрдБ, рддрд░ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХрд▓рд▓реЗ рд╕реНрдЯреНрдпрд╛рдХрд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЦреЛрд▓реНрдЫ, рд░ рддреНрдпреЛ рдХреНрд╖рдгрдорд╛ рдпреЛ рдЕрд╕рдлрд▓ рд╣реБрдиреЗрдЫред setTimeout рдореБрдЦреНрдп рд▓реВрдкрдмрд╛рдЯ - рдпрд╕рд░реА, рдХреЛрдбрд▓реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирдЫреЛрдбреА рдореБрдЦреНрдп рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдорд╛ рдкреНрд░рд╡реЗрд╢ рдЧрд░реНрдпреЛред рдЕрдирдиреНрдд рд▓реВрдкрдорд╛ рдкреБрди: рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рд░ emscripten_sleep, рд░ mutexes рд╕рдВрдЧ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд░реЛрдХрд┐рдпреЛред рдХреЛрдб рдЕрдЭ рддрд╛рд░реНрдХрд┐рдХ рднрдПрдХреЛ рдЫ - рдЖрдЦрд┐рд░, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдорд╕рдБрдЧ рдЕрд░реНрдХреЛ рдПрдирд┐рдореЗрд╕рди рдлреНрд░реЗрдо рддрдпрд╛рд░ рдЧрд░реНрдиреЗ рдХреЗрд╣рд┐ рдХреЛрдб рдЫреИрди - рдкреНрд░реЛрд╕реЗрд╕рд░рд▓реЗ рдХреЗрд╣рд┐ рдЧрдгрдирд╛ рдЧрд░реНрджрдЫ рд░ рд╕реНрдХреНрд░рд┐рди рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд╣реБрдиреНрдЫред рдпрджреНрдпрдкрд┐, рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рддреНрдпрд╣рд╛рдБ рд░реЛрдХрд┐рдПрди: рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ Qemu рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдиреИ рдЕрдкрд╡рд╛рдж рд╡рд╛ рддреНрд░реБрдЯрд┐ рдмрд┐рдирд╛ рдЪреБрдкрдЪрд╛рдк рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред рддреНрдпрд╕ рдХреНрд╖рдгрдорд╛ рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рддреНрдпрд╛рдЧреЗрдВ, рддрд░, рдЕрдЧрд╛рдбрд┐ рд╣реЗрд░реНрджреИ, рдо рднрдиреНрдЫреБ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпреЛ рдерд┐рдпреЛ: рдХреЛрд░реБрдЯрд┐рди рдХреЛрдб, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдиред setTimeout (рд╡рд╛ рдХрдореНрддрд┐рдорд╛ рддрдкрд╛рдИрд▓реЗ рд╕реЛрдЪреЗ рдЬрд╕реНрддреЛ рдкрдЯрдХ рдкрдЯрдХ рд╣реЛрдЗрди): рдкреНрд░рдХрд╛рд░реНрдп emscripten_yield рдХреЗрд╡рд▓ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХрд▓ рдЭрдгреНрдбрд╛ рд╕реЗрдЯ рдЧрд░реНрджрдЫред рдкреБрд░реИ рдХреБрд░реЛ рдпрд╣реА рд╣реЛ emscripten_coroutine_next рдПрдХ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛрдЗрди: рдЖрдиреНрддрд░рд┐рдХ рд░реВрдкрдорд╛ рдпрд╕рд▓реЗ рдЭрдгреНрдбрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ, рдпрд╕рд▓рд╛рдИ рд░рд┐рд╕реЗрдЯ рдЧрд░реНрджрдЫ рд░ рдпрд╕рд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рднрдПрдХреЛ рдард╛рдЙрдБрдорд╛ рдирд┐рдпрдиреНрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджрдЫред рдЕрд░реНрдерд╛рддреН, рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рдкрджреЛрдиреНрдирддрд┐ рддреНрдпрд╣рд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред рд╕рдорд╕реНрдпрд╛ рдпреЛ рдерд┐рдпреЛ рдХрд┐ рдкреНрд░рдпреЛрдЧ рдкрдЫрд┐-рдирд┐: рд╢реБрд▓реНрдХ, рдЬреБрди рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ рдЬрдм рдХреЛрд░реБрдЯрд┐рди рдкреВрд▓ рдЕрд╕рдХреНрд╖рдо рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреНрдиреЗ рддрдереНрдпрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рдореИрд▓реЗ рдЕрд╡рд╕реНрдерд┐рдд рдХреЛрд░реБрдЯрд┐рди рдмреНрдпрд╛рдХрдПрдиреНрдбрдмрд╛рдЯ рдХреЛрдбрдХреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЗрди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реЗрди, рдкреНрд░рдХрд╛рд░реНрдпред qemu_in_coroutine рд╕рд╛рдБрдЪреЛ рдлрд░реНрдХрд┐рдпреЛ рдЬрдм рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпреЛ рдЧрд▓рдд рдлрд░реНрдХрд╛рдЙрдиреБ рдкрд░реНрдЫред рдпрд╕рд▓реЗ рдХрд▓рдХреЛ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрдпреЛ emscripten_yield, рдЬрд╕рдХреЛ рдорд╛рдерд┐ рд╕реНрдЯреНрдпрд╛рдХрдорд╛ рдХреЛрд╣реА рдерд┐рдПрди emscripten_coroutine_next, рд╕реНрдЯреНрдпрд╛рдХ рдПрдХрджрдо рдорд╛рдерд┐ рдЦреБрд▓реНрдпреЛ, рддрд░ рдЫреИрди setTimeout, рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рднрдиреЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдПрдиред

рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЙрддреНрдкрд╛рджрди

рд░ рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ "рдХреАрдорд╛ рднрдПрдХреЛ рдорд╛рд╕реБ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗред" рд╕рд╛рдБрдЪреНрдЪреИ рд╣реЛрдЗрдиред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ Qemu рд░ рдпрд╕рдорд╛ Node.js рдЪрд▓рд╛рдпреМрдВ рднрдиреЗ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдкрдорд╛, Qemu рдорд╛ рдХреЛрдб рдЬреЗрдиреЗрд░реЗрд╕рди рдкрдЫрд┐ рд╣рд╛рдореАрд▓реЗ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЧрд▓рдд JavaScript рдкрд╛рдЙрдиреЗрдЫреМрдВред рддрд░ рдЕрдЭреИ, рдХреЗрд╣рд┐ рдкреНрд░рдХрд╛рд░рдХреЛ рдЙрд▓реНрдЯреЛ рд░реВрдкрд╛рдиреНрддрд░рдгред

рдкрд╣рд┐рд▓реЗ, рдХреЗрдореБрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдереЛрд░реИред рдХреГрдкрдпрд╛ рдорд▓рд╛рдИ рддреБрд░реБрдиреНрддреИ рдорд╛рдл рдЧрд░реНрдиреБрд╣реЛрд╕реН: рдо рдПрдХ рдкреЗрд╢реЗрд╡рд░ Qemu рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд╣реЛрдЗрди рд░ рдореЗрд░реЛ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗрд╣реА рдард╛рдЙрдБрдорд╛ рдЧрд▓рдд рд╣реБрди рд╕рдХреНрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рднрдиреЗрдЭреИрдВ, "рд╡рд┐рджреНрдпрд╛рд░реНрдереАрдХреЛ рд╡рд┐рдЪрд╛рд░ рд╢рд┐рдХреНрд╖рдХрдХреЛ рд░рд╛рдп, Peano рдХреЛ axiomatics рд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рдирд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдБрджреИрдиред" Qemu рд╕рдБрдЧ рд╕рдорд░реНрдерд┐рдд рдЕрддрд┐рдерд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╣рд░реВрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдЫ рд░ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рд▓рд╛рдЧрд┐ рддреНрдпрд╣рд╛рдБ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдЬрд╕реНрддреИ рдЫ target-i386ред рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдзреЗрд░реИ рдЕрддрд┐рдерд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рдзреЗрд░реИ рдмрд╛рдЗрдирд░реАрд╣рд░реВ рд╣реБрдиреЗрдЫред рдЕрддрд┐рдерд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрдиреЗ рдХреЛрдбрд▓реЗ, рдмрджрд▓рд╛рдорд╛, рдХреЗрд╣реА рдЖрдиреНрддрд░рд┐рдХ Qemu рд╕рдЮреНрдЪрд╛рд▓рдирд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ, рдЬреБрди TCG (Tiny Code Generator) рд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдХреЛ рд▓рд╛рдЧрд┐ рдореЗрд╕рд┐рди рдХреЛрдбрдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫред tcg рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рд░реАрдбрдореА рдлрд╛рдЗрд▓рдорд╛ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдП рдЕрдиреБрд╕рд╛рд░, рдпреЛ рдореВрд▓ рд░реВрдкрдорд╛ рдирд┐рдпрдорд┐рдд рд╕реА рдХрдореНрдкрд╛рдЗрд▓рд░рдХреЛ рдЕрдВрд╢ рдерд┐рдпреЛ, рдЬреБрди рдкрдЫрд┐ JIT рдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдиреБрдХреВрд▓рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рддреНрдпрд╕рдХрд╛рд░рдг, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕ рдХрд╛рдЧрдЬрд╛рддрдХреЛ рд╕рд░реНрддрдорд╛ рд▓рдХреНрд╖рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЕрдм рдЕрддрд┐рдерд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реЛрдЗрди, рддрд░ рд╣реЛрд╕реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реЛред рдХреЗрд╣рд┐ рдмрд┐рдиреНрджреБрдорд╛, рдЕрд░реНрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛ - рдЯрд┐рдиреА рдХреЛрдб рдЗрдиреНрдЯрд░рдкреНрд░рд┐рдЯрд░ (TCI), рдЬрд╕рд▓реЗ рд╡рд┐рд╢реЗрд╖ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдХреЛ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐рдорд╛ рдХреЛрдб (рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЖрдиреНрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╣рд░реВ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБрдкрд░реНрдЫред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпрд╕рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд▓реЗ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░, рдпреЛ рджреЛрднрд╛рд╖реЗрд▓реЗ рдЧрддрд┐рдХреЛ рд╕рд░реНрддрдорд╛ рдорд╛рддреНрд░рд╛рддреНрдордХ рд░реВрдкрдорд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдЧреБрдгрд╛рддреНрдордХ рд░реВрдкрдорд╛ рдкрдирд┐ JIT рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдХреЛ рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрджреИрдиред рдпрджреНрдпрдкрд┐ рдо рдирд┐рд╢реНрдЪрд┐рдд рдЫреИрди рдХрд┐ рдЙрдирдХреЛ рд╡рд┐рд╡рд░рдг рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рдЫред

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

  • рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдЧрд░реНрджрд╛, рддрдкрд╛рдЗрдБ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╡рд┐рд╡рд░рдгрдорд╛ рд╣реЛрдЗрди, рддрд░ рджреЛрднрд╛рд╖реЗ рдХреЛрдбрдорд╛ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
  • рддрдкрд╛рдИрдВрд▓реЗ рд╕рд╛рдордирд╛ рдЧрд░реЗрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд╡рд╛рдж рдмреНрд▓рдХрдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдпрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╕рдпреМрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрдЫрд┐ рдорд╛рддреНрд░
  • рдпрджрд┐ рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ (рд░ рдпреЛ рд╕рдореНрднрд╡ рджреЗрдЦрд┐рдиреНрдЫ, рд╢рдмреНрдж рдкреНрдпрд╛рдЪ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗ рдирд╛рдорд╣рд░реВрд╕рдБрдЧ рдХрд╛рд░реНрдпрд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдиреНрдпрд╛рдп рдЧрд░реНрджреИ), рдореИрд▓реЗ рдЙрддреНрдкрдиреНрди JS рдХреЛрдбрд▓рд╛рдИ рдЕрдорд╛рдиреНрдп рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ, рддрд░ рдХрдореНрддрд┐рдорд╛ рдорд╕рдБрдЧ рдпрд╕рд▓рд╛рдИ рдкреБрди: рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдХреЗрд╣рд┐ рд╣реБрдиреЗрдЫред

рддреЗрд╕реНрд░реЛ рдмрд┐рдиреНрджреБрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдо рдкрдХреНрдХрд╛ рдЫреИрди рдХрд┐ рдХреЛрдб рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдПрдкрдЫрд┐ рдкреНрдпрд╛рдЪрд┐рдЩ рд╕рдореНрднрд╡ рдЫ, рддрд░ рдкрд╣рд┐рд▓реЛ рджреБрдИ рдЕрдВрдХ рдкрд░реНрдпрд╛рдкреНрдд рдЫрдиреНред

рд╕реБрд░реБрдорд╛, рдХреЛрдб рдореВрд▓ рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рдареЗрдЧрд╛рдирд╛рдорд╛ рдареВрд▓реЛ рд╕реНрд╡рд┐рдЪрдХреЛ рд░реВрдкрдорд╛ рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рддрд░ рддреНрдпрд╕рдкрдЫрд┐, Emscripten рдмрд╛рд░реЗ рд▓реЗрдЦ рд╕рдореНрдЭрдирд╛, рдЙрддреНрдкрдиреНрди JS рдХреЛ рдЕрдиреБрдХреВрд▓рди рд░ рд░рд┐рд▓реВрдкрд┐рдЩ, рдореИрд▓реЗ рдердк рдорд╛рдирд╡ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдпреЛ рдЕрдиреБрднрд╡рд┐рдХ рд░реВрдкрдорд╛ред рдЕрдиреБрд╡рд╛рдж рдмреНрд▓рдХ рдорд╛ рдПрдХ рдорд╛рддреНрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдиреНрджреБ рдпрд╕рдХреЛ рд╕реБрд░реБ рд╣реЛ рднрдиреЗрд░ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрд┐рдпреЛред рдЪрд╛рдБрдбреЛ рднрдиреНрджрд╛ рдЪрд╛рдБрдбреЛ рднрдирд┐рдпреЛ, рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдерд┐рдпреЛ рдЬрд╕рд▓реЗ ifs рдХреЛ рд╕рд╛рде рдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНтАНрдпреЛ (рд▓реВрдк рдмрд┐рдирд╛ рдиреИ)ред рддрд░ рджреБрд░реНрднрд╛рдЧреНрдп, рдпреЛ рдХреНрд░реНрдпрд╛рд╕ рднрдпреЛ, рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдХреЗрд╣реА рдЧрд▓рдд рд▓рдореНрдмрд╛рдЗрдХрд╛ рдерд┐рдП рднрдиреНрдиреЗ рд╕рдиреНрджреЗрд╢ рджрд┐рдБрджреИред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрддрд░рдорд╛ рдЕрдиреНрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рди рдерд┐рдпреЛ brcondред рдареАрдХ рдЫ, рдо рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд▓ рдЕрдШрд┐ рд░ рдкрдЫрд┐ рдпрд╕ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рдкреБрд╕реНрддрд╛рдорд╛ рдПрдХ рд╕рдорд╛рди рдЬрд╛рдБрдЪ рдердкреНрдиреЗрдЫреБ рд░... рддреА рдордзреНрдпреЗ рдХреБрдиреИ рдкрдирд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдПрди, рддрд░ рдПрд╕рд░реНрдЯ рд╕реНрд╡рд┐рдЪ рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВ рдЕрдЭреИ рдЕрд╕рдлрд▓ рднрдПред рдЕрдиреНрддрдорд╛, рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рдЕрдзреНрдпрдпрди рдЧрд░реЗрдкрдЫрд┐, рдореИрд▓реЗ рдорд╣рд╕реБрд╕ рдЧрд░реЗрдВ рдХрд┐ рд╕реНрд╡рд┐рдЪ рдкрдЫрд┐, рд╣рд╛рд▓рдХреЛ рдирд┐рд░реНрджреЗрд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд╕реВрдЪрдХ рд╕реНрдЯреНрдпрд╛рдХрдмрд╛рдЯ рдкреБрди: рд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рд╕рдореНрднрд╡рддрдГ рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдбрджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рд▓реЗрдЦрди рдЧрд░рд┐рдПрдХреЛ рдЫред рд░ рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдмрд╛рд╣рд┐рд░ рднрдпреЛред рдмрдлрд░рд▓рд╛рдИ рдПрдХ рдореЗрдЧрд╛рдмрд╛рдЗрдЯрдмрд╛рдЯ рджрд╕рдорд╛ рдмрдврд╛рдЙрдиреБрд▓реЗ рдХреЗрд╣рд┐ рдкрдирд┐ рдиреЗрддреГрддреНрд╡ рдЧрд░реЗрди, рд░ рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╕рд░реНрдХрд▓рд╣рд░реВрдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛред рд╣рд╛рдореАрд▓реЗ рд╣рд╛рд▓рдХреЛ рдХреНрд╖рдпрд░реЛрдЧрдХреЛ рд╕рд┐рдорд╛рдирд╛рднрдиреНрджрд╛ рдмрд╛рд╣рд┐рд░ рдЧрдПрдХрд╛ рдЫреИрдиреМрдВ рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрдкрд░реЗрдХреЛ рдерд┐рдпреЛ рд░ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рддреНрдпрд╕реЛ рдЧрд░реНтАНрдпреМрдВ рднрдиреЗ, рдЕрд░реНрдХреЛ рдХреНрд╖рдпрд░реЛрдЧрдХреЛ рдареЗрдЧрд╛рдирд╛ рдорд╛рдЗрдирд╕ рдЪрд┐рдиреНрд╣рдХреЛ рд╕рд╛рде рдЬрд╛рд░реА рдЧрд░реНрдиреБрд╣реЛрд╕реН рддрд╛рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд░реА рд░рд╛рдЦреНрди рд╕рдХреМрдВред рдердк рд░реВрдкрдорд╛, рдпрд╕рд▓реЗ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫ "рдпрджрд┐ рдмрд╛рдЗрдЯрдХреЛрдбрдХреЛ рдпреЛ рдЯреБрдХреНрд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫ рднрдиреЗ рдХреБрди рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпрд╣рд░реВ рдЕрд╡реИрдз рд╣реБрдиреБрдкрд░реНрджрдЫ?" тАФ рдпреЛ рдЕрдиреБрд╡рд╛рдж рдмреНрд▓рдХрд╕рдБрдЧ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдХрд╛рд░реНрдп рдорд╛рддреНрд░ рдЕрдорд╛рдиреНрдп рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╡реИрд╕реЗ, рдореИрд▓реЗ рдХреНрд░реЛрдорд┐рдпрдордорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдбрд┐рдмрдЧ рдЧрд░реЗ рддрд╛рдкрдирд┐ (рдо рдлрд╛рдпрд░рдлрдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБ рд░ рдорд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдмреНрд░рд╛рдЙрдЬрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ), рдлрд╛рдпрд░рдлрдХреНрд╕рд▓реЗ рдорд▓рд╛рдИ asm.js рдорд╛рдирдХрд╕рдБрдЧ рдЕрд╕рдВрдЧрддрддрд╛рд╣рд░реВ рд╕реБрдзрд╛рд░реНрди рдорджреНрджрдд рдЧрд░реНтАНрдпреЛ, рдЬрд╕ рдкрдЫрд┐ рдХреЛрдбрд▓реЗ рдЫрд┐рдЯреЛ рдХрд╛рдо рдЧрд░реНрди рдерд╛рд▓реНрдпреЛред рдХреНрд░реЛрдорд┐рдпрдоред

рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреЛ рдЙрджрд╛рд╣рд░рдг

Compiling 0x15b46d0:
CompiledTB[0x015b46d0] = function(stdlib, ffi, heap) {
"use asm";
var HEAP8 = new stdlib.Int8Array(heap);
var HEAP16 = new stdlib.Int16Array(heap);
var HEAP32 = new stdlib.Int32Array(heap);
var HEAPU8 = new stdlib.Uint8Array(heap);
var HEAPU16 = new stdlib.Uint16Array(heap);
var HEAPU32 = new stdlib.Uint32Array(heap);

var dynCall_iiiiiiiiiii = ffi.dynCall_iiiiiiiiiii;
var getTempRet0 = ffi.getTempRet0;
var badAlignment = ffi.badAlignment;
var _i64Add = ffi._i64Add;
var _i64Subtract = ffi._i64Subtract;
var Math_imul = ffi.Math_imul;
var _mul_unsigned_long_long = ffi._mul_unsigned_long_long;
var execute_if_compiled = ffi.execute_if_compiled;
var getThrew = ffi.getThrew;
var abort = ffi.abort;
var qemu_ld_ub = ffi.qemu_ld_ub;
var qemu_ld_leuw = ffi.qemu_ld_leuw;
var qemu_ld_leul = ffi.qemu_ld_leul;
var qemu_ld_beuw = ffi.qemu_ld_beuw;
var qemu_ld_beul = ffi.qemu_ld_beul;
var qemu_ld_beq = ffi.qemu_ld_beq;
var qemu_ld_leq = ffi.qemu_ld_leq;
var qemu_st_b = ffi.qemu_st_b;
var qemu_st_lew = ffi.qemu_st_lew;
var qemu_st_lel = ffi.qemu_st_lel;
var qemu_st_bew = ffi.qemu_st_bew;
var qemu_st_bel = ffi.qemu_st_bel;
var qemu_st_leq = ffi.qemu_st_leq;
var qemu_st_beq = ffi.qemu_st_beq;

function tb_fun(tb_ptr, env, sp_value, depth) {
  tb_ptr = tb_ptr|0;
  env = env|0;
  sp_value = sp_value|0;
  depth = depth|0;
  var u0 = 0, u1 = 0, u2 = 0, u3 = 0, result = 0;
  var r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0;
  var r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0, r16 = 0, r17 = 0, r18 = 0, r19 = 0;
  var r20 = 0, r21 = 0, r22 = 0, r23 = 0, r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0;
  var r30 = 0, r31 = 0, r41 = 0, r42 = 0, r43 = 0, r44 = 0;
    r14 = env|0;
    r15 = sp_value|0;
  START: do {
    r0 = HEAPU32[((r14 + (-4))|0) >> 2] | 0;
    r42 = 0;
    result = ((r0|0) != (r42|0))|0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445321] = r14;
    if(result|0) {
    HEAPU32[1445322] = r15;
    return 0x0345bf93|0;
    }
    r0 = HEAPU32[((r14 + (16))|0) >> 2] | 0;
    r42 = 8;
    r0 = ((r0|0) - (r42|0))|0;
    HEAPU32[(r14 + (16)) >> 2] = r0;
    r1 = 8;
    HEAPU32[(r14 + (44)) >> 2] = r1;
    r1 = r0|0;
    HEAPU32[(r14 + (40)) >> 2] = r1;
    r42 = 4;
    r0 = ((r0|0) + (r42|0))|0;
    r2 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    HEAPU32[1445321] = r14;
    HEAPU32[1445322] = r15;
    qemu_st_lel(env|0, r0|0, r2|0, 34, 22759218);
if(getThrew() | 0) abort();
    r0 = 3241038392;
    HEAPU32[1445307] = r0;
    r0 = qemu_ld_leul(env|0, r0|0, 34, 22759233)|0;
if(getThrew() | 0) abort();
    HEAPU32[(r14 + (24)) >> 2] = r0;
    r1 = HEAPU32[((r14 + (12))|0) >> 2] | 0;
    r2 = HEAPU32[((r14 + (40))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    qemu_st_lel(env|0, r2|0, r1|0, 34, 22759265);
if(getThrew() | 0) abort();
    r0 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[(r14 + (40)) >> 2] = r0;
    r1 = 24;
    HEAPU32[(r14 + (52)) >> 2] = r1;
    r42 = 0;
    result = ((r0|0) == (r42|0))|0;
    if(result|0) {
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    }
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    return execute_if_compiled(22759392|0, env|0, sp_value|0, depth|0) | 0;
    return execute_if_compiled(23164080|0, env|0, sp_value|0, depth|0) | 0;
    break;
  } while(1); abort(); return 0|0;
}
return {tb_fun: tb_fun};
}(window, CompilerFFI, Module.buffer)["tb_fun"]

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

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

рддрдкрд╛рдИрдВ рдпреЛ рд╕рдмреИ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрд╣рд╛рдБ (рдЯреНрд░рд╛рдлрд┐рдХрдмрд╛рдЯ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреБрд╣реЛрд╕реН)ред

рдХреЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ:

  • x86 рднрд░реНрдЪреБрдЕрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ
  • рдореЗрд╕рд┐рди рдХреЛрдбрдмрд╛рдЯ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдорд╛ JIT рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдХреЛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЫ
  • рддреНрдпрд╣рд╛рдБ рдЕрдиреНрдп 32-рдмрд┐рдЯ рдЕрддрд┐рдерд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╣рд░реВ рдЬрдореНрдорд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЫ: рдЕрд╣рд┐рд▓реЗ рддрдкрд╛рдИрд▓реЗ рд▓реЛрдбрд┐рдЩ рдЪрд░рдгрдорд╛ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ MIPS рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдлреНрд░рд┐рдЬрдХреЛ рд▓рд╛рдЧрд┐ рд▓рд┐рдирдХреНрд╕рдХреЛ рдкреНрд░рд╢рдВрд╕рд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдЕрд░реБ рдХреЗ рдЧрд░реНрди рд╕рдХреНрдЫреМ

  • рдЗрдореБрд▓реЗрд╢рдирдХреЛ рдЧрддрд┐ рдмрдврд╛рдЙрдиреБрд╣реЛрд╕реНред JIT рдореЛрдбрдорд╛ рдкрдирд┐ рдпреЛ рднрд░реНрдЪреБрдЕрд▓ x86 рднрдиреНрджрд╛ рдврд┐рд▓реЛ рдЪрд▓реНрдиреЗ рджреЗрдЦрд┐рдиреНрдЫ (рддрд░ рддреНрдпрд╣рд╛рдБ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдзреЗрд░реИ рдЗрдореБрд▓реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдХреЛ рд╕рд╛рде рд╕рдореНрдкреВрд░реНрдг Qemu рдЫ)
  • рд╕рд╛рдорд╛рдиреНрдп рдЗрдиреНрдЯрд░рдлреЗрд╕ рдмрдирд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ - рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдо рд░рд╛рдореНрд░реЛ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд╣реЛрдЗрди, рддреНрдпрд╕реИрд▓реЗ рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐ рдореИрд▓реЗ рд╕рдХреЗрд╕рдореНрдо рдорд╛рдирдХ рдПрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрди рд╢реЗрд▓рд▓рд╛рдИ рдкреБрди: рдмрдирд╛рдПрдХреЛ рдЫреБред
  • рдердк рдЬрдЯрд┐рд▓ Qemu рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН - рдиреЗрдЯрд╡рд░реНрдХрд┐рдЩ, VM рдорд╛рдЗрдЧреНрд░реЗрд╕рди, рдЖрджрд┐ред
  • UPS: рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдирд╛ рдХреЗрд╣реА рд╡рд┐рдХрд╛рд╕рд╣рд░реВ рд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ Emscripten upstream рдорд╛ рдкреЗрд╢ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ, рдЬрд╕реНрддреИ Qemu рд░ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХрд╛ рдЕрдШрд┐рд▓реНрд▓рд╛ рдкреЛрд░реНрдЯрд░рд╣рд░реВрд▓реЗ рдЧрд░реЗред рдореЗрд░реЛ рдХрд╛рд░реНрдпрдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ Emscripten рдорд╛ рдЖрдлреНрдиреЛ рдпреЛрдЧрджрд╛рдирд▓рд╛рдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдХреЛрдорд╛ рдЙрд╣рд╛рдБрд╣рд░реВрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рджред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди