JIT рд╕рдкреЛрд░реНрдЯрд╕рд╣ Qemu.js: рддреБрдореНрд╣реА рдЕрдЬреВрдирд╣реА рдорд╛рдИрдиреНрд╕ рдорд╛рдЧреЗ рд╡рд│рд╡реВ рд╢рдХрддрд╛

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

  • рдореБрдХреНрдд рд╕реНрд░реЛрдд
  • рдХрд░реНрдирд▓ рдбреНрд░рд╛рдпрд╡реНрд╣рд░рд╢рд┐рд╡рд╛рдп рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
  • рджреБрднрд╛рд╖реА рдореЛрдбрдордзреНрдпреЗ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛
  • рдпрдЬрдорд╛рди рдЖрдгрд┐ рдЕрддрд┐рдереА рджреЛрдиреНрд╣реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╕рдорд░реНрдерди

рддрд┐рд╕рд░реНтАНрдпрд╛ рдореБрджреНрджреНрдпрд╛рдмрджреНрджрд▓, рдореА рдЖрддрд╛ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ рдХреА рдЦрд░рдВ рддрд░, рдЯреАрд╕реАрдЖрдп рдореЛрдбрдордзреНрдпреЗ, рдЕрддрд┐рдереА рдорд╢реАрдирдЪреНрдпрд╛ рд╕реВрдЪрдирд╛рдВрдЪрд╛ рд╕реНрд╡рддрдГ рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреВрди рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗрд▓рд╛ рдмрд╛рдпрдХреЛрдб, рдкрд░рдВрддреБ рд╣реЗ рд╕рд╛рд░ рдмрджрд▓рдд рдирд╛рд╣реА - рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА. рдирд╡реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╡рд░ Qemu, рдЖрдкрдг рднрд╛рдЧреНрдпрд╡рд╛рди рдЕрд╕рд▓реНрдпрд╛рд╕, A C рдХрдВрдкрд╛рдЗрд▓рд░ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ - рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд▓рд┐рд╣рд┐рдгреЗ рдкреБрдвреЗ рдврдХрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

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

Emscripten рдореНрд╣рдгрдЬреЗ рдХрд╛рдп

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

рдкреНрд░рдердо рдкреНрд░рдпрддреНрди

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

рддрд░, рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА, рдпреЗрдереЗ рд╕реНрддреНрд░реЛрдд рдЖрд╣реЗрдд, рдпреЗрдереЗ 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 рдлрдВрдХреНрд╢рди рджреЗрдЦреАрд▓ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдирд╛рд╣реА.

рдкрд░рдВрддреБ, рдореА рдЖрдзреАрдЪ рдореНрд╣рдЯрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдХрд╛рд╣реА рдорд░реНрдпрд╛рджрд╛ рдЖрд╣реЗрдд рдЖрдгрд┐ рд╡рд┐рд╡рд┐рдз рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрддрдирд╛рдЪреНрдпрд╛ рдореБрдХреНрдд рд╡рд╛рдкрд░рд╛рдордзреНрдпреЗ, рдПрдХ рдЕрдзрд┐рдХ рдЕрдкреНрд░рд┐рдп рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд▓рдкрд▓реЗрд▓реЗ рдЖрд╣реЗ - рдбрд┐рдЭрд╛рдЗрдирдиреБрд╕рд╛рд░ JavaScript рд╕рд╛рдорд╛рдпрд┐рдХ рдореЗрдорд░реАрд╕рд╣ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА. рддрддреНрд╡рддрдГ, рдпрд╛рд▓рд╛ рд╕рд╣рд╕рд╛ рдЪрд╛рдВрдЧрд▓реА рдХрд▓реНрдкрдирд╛ рджреЗрдЦреАрд▓ рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛрдбрд╕рд╛рдареА рдирд╛рд╣реА рдЬреНрдпрд╛рдВрдЪреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реА рдереНрд░реЗрдбреНрд╕рд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗ. рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд╛рдордЧрд╛рд░рд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдд рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдПрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯрдирдордзреНрдпреЗ рдПрдХ 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) рдХрд┐рдВрд╡рд╛ рд╡рд┐рддрд░реНрдХрд╛рдВрдЪреНрдпрд╛ рдЪреБрдХреАрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрд╕рд╣ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдгреЗ.

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

рдвреАрдЧ рдирд╛рд╢

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

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

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

рдХреЙрд▓рд┐рдВрдЧ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ

рдЖрдгрд┐ рдЖрддрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛рд╣реАрддрд░реА рдореЛрдЬрдд рдЖрд╣реЗ, рдХреНрдпреВрдореБ рдХреНрд░реЕрд╢ рд╣реЛрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рд╕реНрдХреНрд░реАрди рдЪрд╛рд▓реВ рд╣реЛрдд рдирд╛рд╣реА рдЖрдгрд┐ рдЖрдЙрдЯрдкреБрдЯрдиреБрд╕рд╛рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрдЯрдХрди рд▓реВрдкрдордзреНрдпреЗ рдЬрд╛рддреЛ -d exec,in_asm,out_asm. рдПрдХ рдЧреГрд╣реАрддрдХ рдЙрджрдпрд╛рд╕ рдЖрд▓реЗ рдЖрд╣реЗ: рдЯрд╛рдЗрдорд░ рд╡реНрдпрддреНрдпрдп (рдХрд┐рдВрд╡рд╛, рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╕рд░реНрд╡ рд╡реНрдпрддреНрдпрдп) рдпреЗрдд рдирд╛рд╣реАрдд. рдЖрдгрд┐ рдЦрд░рдВрдЪ, рдЬрд░ рддреБрдореНрд╣реА рдиреЗрдЯрд┐рд╡реНрд╣ рдЕрд╕реЗрдВрдмреНрд▓реАрдордзреВрди рд╡реНрдпрддреНрдпрдп рдХрд╛рдвреВрди рдЯрд╛рдХрд▓рд╛, рдЬреНрдпрд╛рдиреЗ рдХрд╛рд╣реА рдХрд╛рд░рдгрд╛рд╕реНрддрд╡ рдХрд╛рдо рдХреЗрд▓реЗ, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рд╕рдорд╛рди рдЪрд┐рддреНрд░ рдорд┐рд│реЗрд▓. рдкрд░рдВрддреБ рд╣реЗ рдЙрддреНрддрд░ рдЕрдЬрд┐рдмрд╛рдд рдирд╡реНрд╣рддреЗ: рд╡рд░реАрд▓ рдкрд░реНрдпрд╛рдпрд╛рд╕рд╣ рдЬрд╛рд░реА рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЯреНрд░реЗрд╕рдЪреА рддреБрд▓рдирд╛ рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рдорд╛рд░реНрдЧ рдЦреВрдк рд▓рд╡рдХрд░ рд╡рд│рд▓реЗ. рдпреЗрдереЗ рдЕрд╕реЗ рдореНрд╣рдЯрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХреА рд▓рд╛рдБрдЪрд░ рд╡рд╛рдкрд░реВрди рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рддреБрд▓рдирд╛ emrun рдиреЗрдЯрд┐рд╡реНрд╣ рдЕрд╕реЗрдВрдмреНрд▓реАрдЪреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯрд╕рд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдпрд╛рдВрддреНрд░рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рд╣реА. рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЪрд╛рд▓рдгрд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╕рд╛ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЛ рд╣реЗ рдорд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА emrun, рдкрд░рдВрддреБ рдЖрдКрдЯрдкреБрдЯрдордзреАрд▓ рдХрд╛рд╣реА рд░реЗрд╖рд╛ рдкреБрдирд░реНрд░рдЪрдирд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рддреНрдпрд╛рдореБрд│реЗ рдбрд┐рдлрдордзреАрд▓ рдлрд░рдХ рд╣рд╛ рдорд╛рд░реНрдЧ рд╡рд│рд╡рд▓рд╛ рдЖрд╣реЗ рдЕрд╕реЗ рдорд╛рдирдгреНрдпрд╛рдЪреЗ рдЕрджреНрдпрд╛рдк рдХрд╛рд░рдг рдирд╛рд╣реА. рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА рд╕реВрдЪрдирд╛рдВрдиреБрд╕рд╛рд░ ljmpl рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкрддреНрддреНрдпрд╛рдВрд╡рд░ рдПрдХ рд╕рдВрдХреНрд░рдордг рдЖрд╣реЗ рдЖрдгрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓рд╛ рдмрд╛рдпрдХреЛрдб рдореВрд▓рднреВрддрдкрдгреЗ рд╡реЗрдЧрд│рд╛ рдЖрд╣реЗ: рдПрдХрд╛рдордзреНрдпреЗ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рд╕реВрдЪрдирд╛ рдЖрд╣реЗ, рддрд░ рджреБрд╕рд▒реНрдпрд╛рдордзреНрдпреЗ рдирд╛рд╣реА. рд╕реВрдЪрдирд╛ рдЧреБрдЧрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдгрд┐ рдпрд╛ рд╕реВрдЪрдирд╛рдВрдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рдХрд░рдгрд╛рд░реНтАНрдпрд╛ рдХреЛрдбрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реНрдпрд╛рд╡рд░, рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА, рдкреНрд░рдердо, рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА cr0 рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ - рд╣реЗрд▓реНрдкрд░ рд╡рд╛рдкрд░реВрди - рдЬреНрдпрд╛рдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдбрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХреЗрд▓рд╛ рдЖрдгрд┐ рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рдЬреЗрдПрд╕ рдЖрд╡реГрддреНрддреА рдХрдзреАрд╣реА рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдбрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реА рдирд╛рд╣реА. рдкрд░рдВрддреБ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рдПрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдирдЪреЗ рдЖрдгрдЦреА рдПрдХ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рд╕реВрдЪрдирд╛рдВрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рд░рдЦреНрдпрд╛ рдХреЛрдбрд▓рд╛ рд╕рд╣рди рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдирд┐рдЪреНрдЫрд╛. 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> рдкрд░рд┐рдгрд╛рдореА, рдорд▓рд╛ рд╢реЗрд╡рдЯреА рдХрд╛рдорд╛рд╡рд░ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдорд┐рд│рд╛рд▓реА pyparsing, рдЖрдгрд┐ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рд▓реА рдЧреЗрд▓реА рд╣реЛрддреА рдЬреА рдиреЗрдордХреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рд╕рд╛рдареА рддреЗ рд░реЕрдкрд░реНрд╕ рддрдпрд╛рд░ рдХрд░рддреЗ.

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

рдХреЙрд░реЛрдЯреАрдиреНрд╕

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

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

JavaScript рдХреЛрдб рдирд┐рд░реНрдорд┐рддреА

рдЖрдгрд┐ рдЗрдереЗ, рдЦрд░рдВ рддрд░, рд╡рдЪрди рджрд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ "рдХрд┐рдВрдмрд▓реЗрд▓реЗ рдорд╛рдВрд╕ рдкрд░рдд рдХрд░рдгреЗ." рдЦрд░рдВрдЪ рдирд╛рд╣реА. рдЕрд░реНрдерд╛рдд, рдЬрд░ рдЖрдкрдг рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ Qemu рдЖрдгрд┐ рддреНрдпрд╛рдд Node.js рдЪрд╛рд▓рд╡рд▓реЗ рддрд░, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХрдкрдгреЗ, Qemu рдордзреНрдпреЗ рдХреЛрдб рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреВрд░реНрдгрдкрдгреЗ рдЪреБрдХреАрдЪреА JavaScript рдорд┐рд│реЗрд▓. рдкрдг рддрд░реАрд╣реА, рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рдЙрд▓рдЯ рдкрд░рд┐рд╡рд░реНрддрди.

рдкреНрд░рдердо, Qemu рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдмрджреНрджрд▓ рдереЛрдбреЗрд╕реЗ. рдХреГрдкрдпрд╛ рдорд▓рд╛ рд▓рдЧреЗрдЪ рдорд╛рдл рдХрд░рд╛: рдореА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ Qemu рд╡рд┐рдХрд╛рд╕рдХ рдирд╛рд╣реА рдЖрдгрд┐ рдорд╛рдЭреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛рд╣реА рдард┐рдХрд╛рдгреА рдЪреБрдХреАрдЪреЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рддреЗ рдореНрд╣рдгрддрд╛рдд рддреНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, "рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдЪреЗ рдордд рд╢рд┐рдХреНрд╖рдХрд╛рдЪреНрдпрд╛ рдорддрд╛рд╢реА, рдкрд┐рдпрд╛рдиреЛрдЪреНрдпрд╛ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рдирд╛рд╢реА рдПрдХрд░реВрдк рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА." Qemu рдордзреНрдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╕рдорд░реНрдерд┐рдд рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрд╣реЗрдд рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрд╣реЗ target-i386. рдЗрдорд╛рд░рдд рдмрд╛рдВрдзрддрд╛рдирд╛, рддреБрдореНрд╣реА рдЕрдиреЗрдХ рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рд╕рдорд░реНрдерди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛, рдкрд░рдВрддреБ рдкрд░рд┐рдгрд╛рдо рдлрдХреНрдд рдЕрдиреЗрдХ рдмрд╛рдпрдирд░реА рдЕрд╕реЗрд▓. рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд▓рд╛ рд╕рдорд░реНрдерди рджреЗрдгрд╛рд░рд╛ рдХреЛрдб, рдпрд╛рдордзреВрди, рдХрд╛рд╣реА рдЕрдВрддрд░реНрдЧрдд Qemu рдСрдкрд░реЗрд╢рдиреНрд╕ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЛ, рдЬреЗ TCG (рд▓рдШреБ рдХреЛрдб рдЬрдирд░реЗрдЯрд░) рдЖрдзреАрдЪ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдорд╢реАрди рдХреЛрдбрдордзреНрдпреЗ рдмрджрд▓рддреЗ. tcg рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд░реАрдбрдореА рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рд╛рдВрдЧрд┐рддрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд╣рд╛ рдореВрд│рддрдГ рдирд┐рдпрдорд┐рдд C рдХрдВрдкрд╛рдЗрд▓рд░рдЪрд╛ рднрд╛рдЧ рд╣реЛрддрд╛, рдЬреЛ рдирдВрддрд░ JIT рд╕рд╛рдареА рд╕реНрд╡реАрдХрд╛рд░рд▓рд╛ рдЧреЗрд▓рд╛. рдореНрд╣рдгреВрди, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпрд╛ рджрд╕реНрддрдРрд╡рдЬрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдпрд╛рдкреБрдвреЗ рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдирд╛рд╣реА рддрд░ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрд╣реЗ. рдХрд╛рд╣реА рдХреНрд╖рдгреА, рдЖрдгрдЦреА рдПрдХ рдШрдЯрдХ рджрд┐рд╕рд▓рд╛ - рд▓рд╣рд╛рди рдХреЛрдб рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ (TCI), рдЬреНрдпрд╛рдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдЪреНрдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рддреАрдд рдХреЛрдб (рдЬрд╡рд│рдЬрд╡рд│ рд╕рдорд╛рди рдЕрдВрддрд░реНрдЧрдд рдСрдкрд░реЗрд╢рдиреНрд╕) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рдЦрд░рдВ рддрд░, рддреНрдпрд╛рдЪреНрдпрд╛ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдд рд╕рд╛рдВрдЧрд┐рддрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд╣рд╛ рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ рдиреЗрд╣рдореА JIT рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдкреНрд░рдорд╛рдгреЗрдЪ рдХрд╛рдордЧрд┐рд░реА рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдХреЗрд╡рд│ рдЧрддреАрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗрдЪ рдирд╡реНрд╣реЗ рддрд░ рдЧреБрдгрд╛рддреНрдордХ рджреЗрдЦреАрд▓. рдЬрд░реА рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдирд╛рд╣реА рдХреА рддреНрдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдкреВрд░реНрдгрдкрдгреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ.

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдореА рдкреВрд░реНрдг рд╡рд╛рдв рдЭрд╛рд▓реЗрд▓рд╛ рдЯреАрд╕реАрдЬреА рдмреЕрдХрдПрдВрдб рдмрдирд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛, рдкрд░рдВрддреБ рд╕реЛрд░реНрд╕ рдХреЛрдбрдордзреНрдпреЗ рдЖрдгрд┐ рдмрд╛рдпрдХреЛрдб рд╕реВрдЪрдирд╛рдВрдЪреЗ рдкреВрд░реНрдгрдкрдгреЗ рд╕реНрдкрд╖реНрдЯ рд╡рд░реНрдгрди рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ рдореА рдкрдЯрдХрди рдЧреЛрдВрдзрд│рд▓реЛ, рдореНрд╣рдгреВрди рдореА рдЯреАрд╕реАрдЖрдп рдЗрдВрдЯрд░рдкреНрд░рд┐рдЯрд░ рдЧреБрдВрдбрд╛рд│рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛. рд╣реЗ рдЕрдиреЗрдХ рдлрд╛рдпрджреЗ рджрд┐рд▓реЗ:

  • рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛рдирд╛, рдЖрдкрдг рд╕реВрдЪрдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдкрд╛рд╣реВ рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рджреБрднрд╛рд╖реА рдХреЛрдбрдХрдбреЗ рдкрд╛рд╣реВ рд╢рдХрддрд╛
  • рддреБрдореНрд╣реА рд╕рдореЛрд░ рдЖрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛рдВрддрд░ рдмреНрд▓реЙрдХрд╕рд╛рдареА рдлрдВрдХреНрд╢рдиреНрд╕ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╢рдВрднрд░рд╡реНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдирдВрддрд░рдЪ
  • рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓рд╛ рдХреЛрдб рдмрджрд▓рд▓реНрдпрд╛рд╕ (рдЖрдгрд┐ рдкреЕрдЪ рд╢рдмреНрдж рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдирд╛рд╡рд╛рдВрдЪреНрдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдиреБрд╕рд╛рд░ рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ), рдорд▓рд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓рд╛ JS рдХреЛрдб рдЕрд╡реИрдз рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдХрдореАрддрдХрдореА рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рддреЛ рдкреБрдиреНрд╣рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реАрддрд░реА рдЕрд╕реЗрд▓.

рддрд┐рд╕рд▒реНрдпрд╛ рдореБрджреНрджреНрдпрд╛рдмрджреНрджрд▓, рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдирд╛рд╣реА рдХреА рдХреЛрдб рдкреНрд░рдердордЪ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛рдирдВрддрд░ рдкреЕрдЪрд┐рдВрдЧ рд╢рдХреНрдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдкрд╣рд┐рд▓реЗ рджреЛрди рдореБрджреНрджреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗрдд.

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдХреЛрдб рдореВрд│ рдмрд╛рдЗрдЯрдХреЛрдб рдирд┐рд░реНрджреЗрд╢рд╛рдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдореЛрдареНрдпрд╛ рд╕реНрд╡рд┐рдЪрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЛрддрд╛, рдкрд░рдВрддреБ рдирдВрддрд░, рдПрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрди, рдЬрдирд░реЗрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЬреЗрдПрд╕рдЪреЗ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдЖрдгрд┐ рд░реАрд▓реВрдкрд┐рдВрдЧ рдмрджреНрджрд▓рдЪрд╛ рд▓реЗрдЦ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡реВрди, рдореА рдЕрдзрд┐рдХ рдорд╛рдирд╡реА рдХреЛрдб рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛, рд╡рд┐рд╢реЗрд╖рдд: рдЕрдиреБрднрд╡рд╛рдиреБрд╕рд╛рд░ рддреЗ рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рднрд╛рд╖рд╛рдВрддрд░ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдлрдХреНрдд рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд. рдХрд╛рд╣реА рд╡реЗрд│рд╛рдирдВрддрд░ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╣реЛрддрд╛ рдЬреЛ ifs рд╕рд╣ рдХреЛрдб рддрдпрд╛рд░ рдХрд░рддреЛ (рдЬрд░реА рд▓реВрдк рдирд╕рддреЛ). рдкрд░рдВрддреБ рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рддреЗ рдХреНрд░реЕрд╢ рдЭрд╛рд▓реЗ рдЖрдгрд┐ рд╕реВрдЪрдирд╛ рдХрд╛рд╣реА рдЪреБрдХреАрдЪреНрдпрд╛ рд▓рд╛рдВрдмреАрдЪреНрдпрд╛ рд╣реЛрддреНрдпрд╛ рдЕрд╕рд╛ рд╕рдВрджреЗрд╢ рджреЗрдд. рд╢рд┐рд╡рд╛рдп, рдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕реНрддрд░рд╛рд╡рд░реАрд▓ рд╢реЗрд╡рдЯрдЪреА рд╕реВрдЪрдирд╛ рд╣реЛрддреА brcond. рдареАрдХ рдЖрд╣реЗ, рдореА рд░рд┐рдХрд░реНрд╕рд┐рд╡реНрд╣ рдХреЙрд▓рдЪреНрдпрд╛ рдЖрдзреА рдЖрдгрд┐ рдирдВрддрд░ рдпрд╛ рд╕реВрдЪрдирд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рдорд╛рди рдЪреЗрдХ рдЬреЛрдбреЗрди рдЖрдгрд┐... рддреНрдпрд╛рдкреИрдХреА рдПрдХрд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЭрд╛рд▓рд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдЧреНрд░рд╣ рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рддреЗ рдЕрджреНрдпрд╛рдк рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗ. рд╢реЗрд╡рдЯреА, рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реНрдпрд╛рд╡рд░, рдорд▓рд╛ рд╕рдордЬрд▓реЗ рдХреА рд╕реНрд╡рд┐рдЪ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдЯреЕрдХрдордзреВрди рд░реАрд▓реЛрдб рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдмрд╣реБрдзрд╛ рдЬрдирд░реЗрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ JavaScript рдХреЛрдбрджреНрд╡рд╛рд░реЗ рдУрд╡реНрд╣рд░рд░рд╛рдИрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЖрдгрд┐ рдореНрд╣рдгреВрди рддреЗ рдмрд╛рд╣реЗрд░ рд╡рд│рд▓реЗ. рдмрдлрд░ рдПрдХрд╛ рдореЗрдЧрд╛рдмрд╛рдЗрдЯрд╡рд░реВрди рджрд╣рд╛рдкрд░реНрдпрдВрдд рд╡рд╛рдврд╡рдгреНрдпрд╛рдореБрд│реЗ рдХрд╛рд╣реАрд╣реА рдЭрд╛рд▓реЗ рдирд╛рд╣реА рдЖрдгрд┐ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдордВрдбрд│рд╛рдВрдордзреНрдпреЗ рдЪрд╛рд▓реВ рдЖрд╣реЗ. рдЖрдореНтАНрд╣реА рд╕рдзреНтАНрдпрд╛рдЪреНтАНрдпрд╛ рдЯреАрдмреАрдЪреНтАНрдпрд╛ рд╣рджреНрджреАрдЪреНтАНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЬрд╛рдд рдирд╛рд╣реА рдирд╛ рд╣реЗ рддрдкрд╛рд╕реВрди рдкрд╛рд╣рдгреНтАНрдпрд╛рдЪреА рдЖрд╡рд╢реНтАНрдпрдХрддрд╛ рд╣реЛрддреА рдЖрдгрд┐ рдЬрд░ рддрд╕реЗ рдЭрд╛рд▓реНтАНрдпрд╛рд╕, рддрд░ рдкреБрдвреАрд▓ рдЯреАрдмреАрдЪрд╛ рдкрддреНрддрд╛ рд╡рдЬрд╛ рдЪрд┐рдиреНрд╣рд╛рд╕рд╣ рдЬрд╛рд░реА рдХрд░рдгреНтАНрдпрд╛рд╕рд╛рдареА рдЬреЗрдгреЗрдХрд░реБрди рдЖрдордЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЪрд╛рд▓реВ рдареЗрд╡рддрд╛ рдпреЗрдИрд▓. рдпрд╛ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╣реЗ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддреЗ "рдЬрд░ рдмрд╛рдЗрдЯрдХреЛрдбрдЪрд╛ рд╣рд╛ рддреБрдХрдбрд╛ рдмрджрд▓рд▓рд╛ рдЕрд╕реЗрд▓ рддрд░ рдХреЛрдгрддреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЗ рдЕрд╡реИрдз рдХреЗрд▓реА рдЬрд╛рд╡реА?" тАФ рдХреЗрд╡рд│ рдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рдмреНрд▓реЙрдХрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рд▓реЗрд▓реЗ рдХрд╛рд░реНрдп рдЕрд╡реИрдз рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддрд╕реЗ, рдЬрд░реА рдореА рдХреНрд░реЛрдорд┐рдпрдордордзреНрдпреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рдбреАрдмрдЧ рдХреЗрд▓реЗ рдЖрд╣реЗ (рдореА рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдЖрдгрд┐ рдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рд╡реЗрдЧрд│рд╛ рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд╛рдкрд░рдгреЗ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдкреЗ рдЖрд╣реЗ), рдлрд╛рдпрд░рдлреЙрдХреНрд╕рдиреЗ рдорд▓рд╛ 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 рд╡рд░реНрдЪреНрдпреБрдЕрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрд╛рд▓реВ рдЖрд╣реЗ
  • рдорд╢реАрди рдХреЛрдбрдкрд╛рд╕реВрди JavaScript рдкрд░реНрдпрдВрдд JIT рдХреЛрдб рдЬрдирд░реЗрдЯрд░рдЪрд╛ рдХрд╛рд░реНрдпрд░рдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЖрд╣реЗ
  • рдЗрддрд░ 32-рдмрд┐рдЯ рдЕрддрд┐рдереА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрд╣реЗ: рдЖрддреНрддрд╛ рддреБрдореНрд╣реА рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдЯреЗрдЬрд╡рд░ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ MIPS рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдлреНрд░реАрдЭ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд┐рдирдХреНрд╕рдЪреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░реВ рд╢рдХрддрд╛.

рдЖрдкрдг рдЖрдгрдЦреА рдХрд╛рдп рдХрд░реВ рд╢рдХрддрд╛

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛