Qemu.js ืขื ืชืžื™ื›ื” ื‘-JIT: ืขื“ื™ื™ืŸ ื ื™ืชืŸ ืœื”ื—ื–ื™ืจ ืืช ื”ืžืœื™ืช

ืœืคื ื™ ื›ืžื” ืฉื ื™ื ืคื‘ืจื™ืก ื‘ืœืืจื“ ื ื›ืชื‘ ืขืœ ื™ื“ื™ jslinux ื”ื•ื ืืžื•ืœื˜ื•ืจ PC ืฉื ื›ืชื‘ ื‘-JavaScript. ืื—ืจื™ ื–ื” ื”ื™ื” ืœืคื—ื•ืช ื™ื•ืชืจ ื•ื™ืจื˜ื•ืืœื™ x86. ืื‘ืœ ื›ื•ืœื, ืขื“ ื›ืžื” ืฉื™ื“ื•ืข ืœื™, ื”ื™ื• ืžืชื•ืจื’ืžื ื™ื, ื‘ืขื•ื“ Qemu, ืฉื ื›ืชื‘ ื”ืจื‘ื” ืงื•ื“ื ืขืœ ื™ื“ื™ ืื•ืชื• Fabrice Bellard, ื•ื›ื ืจืื”, ื›ืœ ืืžื•ืœื˜ื•ืจ ืžื•ื“ืจื ื™ ืฉืžื›ื‘ื“ ืืช ืขืฆืžื•, ืžืฉืชืžืฉ ื‘ื”ื™ื“ื•ืจ JIT ืฉืœ ืงื•ื“ ืื•ืจื— ืœืชื•ืš ืงื•ื“ ืžืขืจื›ืช ืžืืจื—. ื ืจืื” ืœื™ ืฉื”ื’ื™ืข ื”ื–ืžืŸ ืœื™ื™ืฉื ืืช ื”ืžืฉื™ืžื” ื”ื”ืคื•ื›ื” ื‘ื™ื—ืก ืœืžืฉื™ืžื” ืฉื“ืคื“ืคื ื™ื ืคื•ืชืจื™ื: ื”ื™ื“ื•ืจ JIT ืฉืœ ืงื•ื“ ืžื›ื•ื ื” ืœ-JavaScript, ืฉืขื‘ื•ืจื• ื ืจืื” ื”ื›ื™ ื”ื’ื™ื•ื ื™ ืœื”ืขื‘ื™ืจ Qemu. ื ืจืื”, ืœืžื” Qemu, ื™ืฉื ื ืืžื•ืœื˜ื•ืจื™ื ืคืฉื•ื˜ื™ื ื•ื™ื“ื™ื“ื•ืชื™ื™ื ื™ื•ืชืจ - ืื•ืชื• VirtualBox, ืœืžืฉืœ - ืžื•ืชืงื ื™ื ื•ืขื•ื‘ื“ื™ื. ืื‘ืœ ืœ-Qemu ื™ืฉ ื›ืžื” ืชื›ื•ื ื•ืช ืžืขื ื™ื™ื ื•ืช

  • ืงื•ื“ ืคืชื•ื—
  • ื™ื›ื•ืœืช ืœืขื‘ื•ื“ ืœืœื ืžื ื”ืœ ื”ืชืงืŸ ืœื™ื‘ื”
  • ื™ื›ื•ืœืช ืขื‘ื•ื“ื” ื‘ืžืฆื‘ ืžืชื•ืจื’ืžืŸ
  • ืชืžื™ื›ื” ื‘ืžืกืคืจ ืจื‘ ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืžืืจื— ื•ืื•ืจื—

ืœื’ื‘ื™ ื”ื ืงื•ื“ื” ื”ืฉืœื™ืฉื™ืช, ืื ื™ ื™ื›ื•ืœ ืœื”ืกื‘ื™ืจ ื›ืขืช ืฉืœืžืขืฉื”, ื‘ืžืฆื‘ TCI, ืœื ืžืชืคืจืฉื•ืช ื”ื•ืจืื•ืช ืžื›ื•ื ืช ื”ืื•ืจื— ืขืฆืžืŸ, ืืœื ื”-bytecode ื”ืžืชืงื‘ืœ ืžื”ืŸ, ืื‘ืœ ื–ื” ืœื ืžืฉื ื” ืืช ื”ืžื”ื•ืช - ืขืœ ืžื ืช ืœื‘ื ื•ืช ื•ืœื”ืคืขื™ืœ Qemu ืขืœ ืืจื›ื™ื˜ืงื˜ื•ืจื” ื—ื“ืฉื”, ืื ื™ืชืžื–ืœ ืžื–ืœื›ื, ืžืกืคื™ืง ืžื”ื“ืจ C - ื›ืชื™ื‘ืช ืžื—ื•ืœืœ ืงื•ื“ ื™ื›ื•ืœื” ืœื”ื™ื“ื—ื•ืช.

ื•ืขื›ืฉื™ื•, ืื—ืจื™ ืฉื ืชื™ื™ื ืฉืœ ื”ืชืขืกืงื•ืช ื ื™ื ื•ื—ื” ืขื ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ Qemu ื‘ื–ืžื ื™ ื”ืคื ื•ื™, ื”ื•ืคื™ืข ืื‘ ื˜ื™ืคื•ืก ืขื•ื‘ื“, ืฉื‘ื• ื›ื‘ืจ ืืคืฉืจ ืœื”ืจื™ืฅ, ืœืžืฉืœ, ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Kolibri.

ืžื” ื–ื” Emscripten

ื›ื™ื•ื, ื”ื•ืคื™ืขื• ืžื”ื“ืจื™ื ืจื‘ื™ื, ืฉื”ืชื•ืฆืื” ื”ืกื•ืคื™ืช ืฉืœื”ื ื”ื™ื JavaScript. ื—ืœืงื, ื›ืžื• Type Script, ื ื•ืขื“ื• ื‘ืžืงื•ืจ ืœื”ื™ื•ืช ื”ื“ืจืš ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ืœื›ืชื•ื‘ ืขื‘ื•ืจ ื”ืื™ื ื˜ืจื ื˜. ื™ื—ื“ ืขื ื–ืืช, Emscripten ื”ื™ื ื“ืจืš ืœืงื—ืช ืงื•ื“ C ืื• C++ ืงื™ื™ื ื•ืœื”ื“ืจ ืื•ืชื• ืœืฆื•ืจื” ื”ื ื™ืชื ืช ืœืงืจื™ืื” ื‘ื“ืคื“ืคืŸ. ืขึทืœ ื“ืฃ ื–ื” ืืกืคื ื• ื™ืฆื™ืื•ืช ืจื‘ื•ืช ืฉืœ ืชื•ื›ื ื™ื•ืช ื™ื“ื•ืขื•ืช: ื›ืืŸืœื“ื•ื’ืžื”, ืืคืฉืจ ืœื”ืกืชื›ืœ ืขืœ PyPy - ืื’ื‘, ื”ื ื˜ื•ืขื ื™ื ืฉื›ื‘ืจ ื™ืฉ ืœื”ื JIT. ืœืžืขืฉื”, ืœื ื›ืœ ืชื•ื›ื ื” ื ื™ืชื ืช ืœื”ื™ื“ื•ืจ ื•ืœื”ืคืขื™ืœ ื‘ื“ืคื“ืคืŸ ืคืฉื•ื˜ - ื™ืฉ ืžืกืคืจ ืžืืคื™ื™ื ื™ืืขื ื–ืืช, ืืชื” ืฆืจื™ืš ืœื”ืฉืœื™ื ืขื ื”ื›ื™ืชื•ื‘ ื‘ืื•ืชื• ืขืžื•ื“ "ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘-Emscripten ื›ื“ื™ ืœื”ืจื›ื™ื‘ ื›ืžืขื˜ ื›ืœ ื ื™ื™ื“ ืงื•ื“ C/C++ ืœ-JavaScript". ื›ืœื•ืžืจ, ื™ืฉื ืŸ ืžืกืคืจ ืคืขื•ืœื•ืช ืฉื”ืŸ ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช ืœืคื™ ื”ืชืงืŸ, ืืš ืœืจื•ื‘ ืขื•ื‘ื“ื•ืช ืขืœ x86 - ืœืžืฉืœ, ื’ื™ืฉื” ืœื ืžื™ื•ืฉืจืช ืœืžืฉืชื ื™ื, ืฉื‘ื“ืจืš ื›ืœืœ ืืกื•ืจื” ื‘ื—ืœืง ืžื”ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช. ื‘ืื•ืคืŸ ื›ืœืœื™ , Qemu ื”ื™ื ืชื•ื›ื ื™ืช ื—ื•ืฆืช ืคืœื˜ืคื•ืจืžื•ืช ื•-, ืจืฆื™ืชื™ ืœื”ืืžื™ืŸ, ื•ื”ื™ื ืœื ืžื›ื™ืœื” ื›ื‘ืจ ื”ืจื‘ื” ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช - ืงื— ืื•ืชื” ื•ื”ื™ื“ื•ืจ, ื•ืื– ืชืชืขืกืง ืงืฆืช ืขื JIT - ื•ืกื™ื™ืžืช! ืื‘ืœ ื–ื” ืœื ื”ืขื ื™ื™ืŸ ืžืงืจื”...

ื ื™ืกื™ื•ืŸ ืจืืฉื•ืŸ

ื‘ืื•ืคืŸ ื›ืœืœื™, ืื ื™ ืœื ื”ืื“ื ื”ืจืืฉื•ืŸ ืฉื”ืขืœื” ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ื”ืขื‘ืจื” ืฉืœ Qemu ืœ-JavaScript. ื ืฉืืœื” ืฉืืœื” ื‘ืคื•ืจื•ื ReactOS ืื ื–ื” ืืคืฉืจื™ ื‘ืืžืฆืขื•ืช Emscripten. ืขื•ื“ ืงื•ื“ื ืœื›ืŸ, ื”ื™ื• ืฉืžื•ืขื•ืช ืฉืคื‘ืจื™ืก ื‘ืœืืจื“ ืขืฉื” ื–ืืช ื‘ืื•ืคืŸ ืื™ืฉื™, ืื‘ืœ ื“ื™ื‘ืจื ื• ืขืœ jslinux, ืฉื›ื›ืœ ื”ื™ื“ื•ืข ืœื™ ื”ื•ื ืจืง ื ื™ืกื™ื•ืŸ ืœื”ืฉื™ื’ ื‘ื™ืฆื•ืขื™ื ืžืกืคืงื™ื ื‘ืื•ืคืŸ ื™ื“ื ื™ ื‘-JS, ื•ื”ื•ื ื ื›ืชื‘ ืžืืคืก. ืžืื•ื—ืจ ื™ื•ืชืจ, Virtual x86 ื ื›ืชื‘ - ืคื•ืจืกืžื• ืขื‘ื•ืจื• ืžืงื•ืจื•ืช ืœื ืžืขื•ืจืคืœื™ื, ื•ื›ืืžื•ืจ, ื”"ืจื™ืืœื™ื–ื" ื”ื’ื“ื•ืœ ื™ื•ืชืจ ืฉืœ ื”ืืžื•ืœืฆื™ื” ืืคืฉืจื” ืœื”ืฉืชืžืฉ ื‘-SeaBIOS ื‘ืชื•ืจ ืงื•ืฉื—ื”. ื‘ื ื•ืกืฃ, ื”ื™ื” ืœืคื—ื•ืช ื ื™ืกื™ื•ืŸ ืื—ื“ ืœื”ืขื‘ื™ืจ ืืช Qemu ื‘ืืžืฆืขื•ืช Emscripten - ื ื™ืกื™ืชื™ ืœืขืฉื•ืช ื–ืืช ื–ื•ื’ ืฉืงืขื™ื, ืื‘ืœ ื”ื”ืชืคืชื—ื•ืช, ืœืžื™ื˜ื‘ ื”ื‘ื ืชื™, ื”ื•ืงืคืื”.

ืื–, ื›ืš ื ืจืื”, ื”ื ื” ื”ืžืงื•ืจื•ืช, ื”ื ื” Emscripten - ืงื— ืื•ืชื• ื•ื”ื™ื“ื•ืจ. ืื‘ืœ ื™ืฉ ื’ื ืกืคืจื™ื•ืช ืฉ-Qemu ืชืœื•ื™ ื‘ื”ืŸ, ื•ืกืคืจื™ื•ืช ืฉื”ืกืคืจื™ื•ืช ื”ืืœื” ืชืœื•ื™ื•ืช ื‘ื”ืŸ ื•ื›ื•', ื•ืื—ืช ืžื”ืŸ ื”ื™ื ืœื™ื‘ืคื™, ืืฉืจ ื’ืœื™ื‘ ืชืœื•ื™ ื‘ื•. ื”ื™ื• ืฉืžื•ืขื•ืช ื‘ืื™ื ื˜ืจื ื˜ ืฉื™ืฉ ืื—ื“ ื‘ืื•ืกืฃ ื”ื’ื“ื•ืœ ืฉืœ ื™ืฆื™ืื•ืช ืกืคืจื™ื•ืช ืขื‘ื•ืจ Emscripten, ืื‘ืœ ืื™ื›ืฉื”ื• ื”ื™ื” ืงืฉื” ืœื”ืืžื™ืŸ: ืจืืฉื™ืช, ื”ื•ื ืœื ื ื•ืขื“ ืœื”ื™ื•ืช ืžื”ื“ืจ ื—ื“ืฉ, ืฉื ื™ืช, ื”ื•ื ื”ื™ื” ื‘ืจืžื” ื ืžื•ื›ื” ืžื“ื™. ืกืคืจื™ื” ืคืฉื•ื˜ ืœืืกื•ืฃ, ื•ื”ื™ื“ื•ืจ ืœ-JS. ื•ื–ื” ืœื ืจืง ืขื ื™ื™ืŸ ืฉืœ ืชื•ืกืคื•ืช assembly - ื›ื ืจืื”, ืื ืชืกื•ื‘ื‘ ืืช ื–ื”, ืขื‘ื•ืจ ื›ืžื” ืžื•ืกื›ืžื•ืช ืงืจื™ืื” ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืืช ื”ืืจื’ื•ืžื ื˜ื™ื ื”ื“ืจื•ืฉื™ื ืขืœ ื”ืžื—ืกื ื™ืช ื•ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื” ื‘ืœืขื“ื™ื”ื. ืื‘ืœ Emscripten ื”ื•ื ื“ื‘ืจ ืžืกื•ื‘ืš: ืขืœ ืžื ืช ืœื’ืจื•ื ืœืงื•ื“ ืฉื ื•ืฆืจ ืœื”ื™ืจืื•ืช ืžื•ื›ืจ ืœื›ืœื™ ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ืžื ื•ืข JS ืฉืœ ื”ื“ืคื“ืคืŸ, ืžืฉืชืžืฉื™ื ื‘ื›ืžื” ื˜ืจื™ืงื™ื. ื‘ืคืจื˜, ืžื” ืฉื ืงืจื relooping - ืžื—ื•ืœืœ ืงื•ื“ ื”ืžืฉืชืžืฉ ื‘-LLVM IR ืฉื”ืชืงื‘ืœ ืขื ื›ืžื” ื”ื•ืจืื•ืช ืžืขื‘ืจ ืžื•ืคืฉื˜ื•ืช ืžื ืกื” ืœื™ืฆื•ืจ ืžื—ื“ืฉ ืื ืกื‘ื™ืจื™ื, ืœื•ืœืื•ืช ื•ื›ื•'. ื•ื‘ื›ืŸ, ื›ื™ืฆื“ ืžื•ืขื‘ืจื™ื ื”ืืจื’ื•ืžื ื˜ื™ื ืœืคื•ื ืงืฆื™ื”? ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื›ืืจื’ื•ืžื ื˜ื™ื ืœืคื•ื ืงืฆื™ื•ืช JS, ื›ืœื•ืžืจ, ืื ืืคืฉืจ, ืœื ื“ืจืš ื”ืžื—ืกื ื™ืช.

ื‘ื”ืชื—ืœื” ื”ื™ื” ืจืขื™ื•ืŸ ืคืฉื•ื˜ ืœื›ืชื•ื‘ ืชื—ืœื™ืฃ ืœ-libffi ืขื JS ื•ืœื”ืจื™ืฅ ื‘ื“ื™ืงื•ืช ืกื˜ื ื“ืจื˜ื™ื•ืช, ืื‘ืœ ื‘ืกื•ืฃ ื”ืชื‘ืœื‘ืœืชื™ ืื™ืš ืœืขืฉื•ืช ืืช ืงื‘ืฆื™ ื”-header ืฉืœื™ ื›ืš ืฉื”ื ื™ืขื‘ื“ื• ืขื ื”ืงื•ื“ ื”ืงื™ื™ื - ืžื” ืื ื™ ื™ื›ื•ืœ ืœืขืฉื•ืช, ื›ืžื• ืฉืื•ืžืจื™ื, "ื”ืื ื”ืžืฉื™ืžื•ืช ื›ืœ ื›ืš ืžื•ืจื›ื‘ื•ืช "ื”ืื ืื ื—ื ื• ื›ืœ ื›ืš ื˜ื™ืคืฉื™ื?" ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช libffi ืœืืจื›ื™ื˜ืงื˜ื•ืจื” ืื—ืจืช, ื›ื‘ื™ื›ื•ืœ - ืœืžืจื‘ื” ื”ืžื–ืœ, ืœ-Emscripten ื™ืฉ ื’ื ืคืงื•ื“ื•ืช ืžืืงืจื• ืœื”ืจื›ื‘ื” ืžื•ื˜ื‘ืขืช (ื‘-Javascript, ื›ืŸ - ื•ื‘ื›ืŸ, ืœื ืžืฉื ื” ืžื” ื”ืืจื›ื™ื˜ืงื˜ื•ืจื”, ืื– ื”ืืกืžื‘ืœืจ), ื•ื’ื ืืช ื”ื™ื›ื•ืœืช ืœื”ืจื™ืฅ ืงื•ื“ ืฉื ื•ืฆืจ ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”. ื‘ืื•ืคืŸ ื›ืœืœื™, ืœืื—ืจ ื”ืชืขืกืงื•ืช ืขื ืฉื‘ืจื™ libffi ื”ืชืœื•ื™ื™ื ื‘ืคืœื˜ืคื•ืจืžื” ื‘ืžืฉืš ื–ืžืŸ ืžื”, ืงื™ื‘ืœืชื™ ืงื•ื“ ืงื•ืžืคื™ืœืฆื™ื” ื•ื”ืจืฆืชื™ ืื•ืชื• ื‘ื‘ื“ื™ืงื” ื”ืจืืฉื•ื ื” ืฉื ืชืงืœืชื™ ื‘ื”. ืœื”ืคืชืขืชื™, ื”ืžื‘ื—ืŸ ื”ืฆืœื™ื—. ื”ืžื•ื ืžื”ื’ืื•ื ื•ืช ืฉืœื™ - ื‘ืœื™ ื‘ื“ื™ื—ื”, ื–ื” ืขื‘ื“ ืžื”ื”ืฉืงื” ื”ืจืืฉื•ื ื” - ืื ื™, ืขื“ื™ื™ืŸ ืœื ืžืืžื™ืŸ ืœืžืจืื” ืขื™ื ื™ื™, ื”ืœื›ืชื™ ืœื”ืกืชื›ืœ ืฉื•ื‘ ืขืœ ื”ืงื•ื“ ืฉื”ืชืงื‘ืœ, ื›ื“ื™ ืœื”ืขืจื™ืš ื”ื™ื›ืŸ ืœื—ืคื•ืจ ื”ืœืื”. ื›ืืŸ ื”ืฉืชื’ืขืชื™ ื‘ืคืขื ื”ืฉื ื™ื™ื” - ื”ื“ื‘ืจ ื”ื™ื—ื™ื“ ืฉื”ืคื•ื ืงืฆื™ื” ืฉืœื™ ืขืฉืชื” ื”ื™ื” ffi_call - ื–ื” ื“ื™ื•ื•ื— ืขืœ ืฉื™ื—ื” ืžื•ืฆืœื—ืช. ืœื ื”ื™ื™ืชื” ืฉื™ื—ื” ืขืฆืžื”. ืื– ืฉืœื—ืชื™ ืืช ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ื”ืจืืฉื•ื ื” ืฉืœื™, ืฉืชื™ืงื ื” ื˜ืขื•ืช ื‘ืžื‘ื—ืŸ ืฉื‘ืจื•ืจื” ืœื›ืœ ืชืœืžื™ื“ ืื•ืœื™ืžืคื™ืื“ื” - ืื™ืŸ ืœื”ืฉื•ื•ืช ืžืกืคืจื™ื ืืžื™ืชื™ื™ื a == b ื•ืืคื™ืœื• ืื™ืš a - b < EPS - ืฆืจื™ืš ืœื–ื›ื•ืจ ื’ื ืืช ื”ืžื•ื“ื•ืœ, ืื—ืจืช 0 ื™ืชื‘ืจืจ ื›ืฉื•ื•ื” ืžืื•ื“ ืœ-1/3... ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื’ืขืชื™ ืœืคื•ืจื˜ ืžืกื•ื™ื ืฉืœ libffi, ืฉืขื•ื‘ืจ ืืช ื”ืžื‘ื—ื ื™ื ื”ืคืฉื•ื˜ื™ื ื‘ื™ื•ืชืจ, ื•ืื™ืชื• glib ื”ื•ื ื”ื™ื“ื•ืจ - ื”ื—ืœื˜ืชื™ ืฉื–ื” ื ื—ื•ืฅ, ืื•ืกื™ืฃ ืืช ื–ื” ืžืื•ื—ืจ ื™ื•ืชืจ. ื‘ืžื‘ื˜ ืงื“ื™ืžื”, ืื ื™ ืื’ื™ื“ ืฉื›ืคื™ ืฉื”ืชื‘ืจืจ, ื”ืžื”ื“ืจ ืืคื™ืœื• ืœื ื›ืœืœ ืืช ื”ืคื•ื ืงืฆื™ื” libffi ื‘ืงื•ื“ ื”ืกื•ืคื™.

ืื‘ืœ, ื›ืคื™ ืฉื›ื‘ืจ ืืžืจืชื™, ื™ืฉื ืŸ ื›ืžื” ืžื’ื‘ืœื•ืช, ื•ื‘ื™ืŸ ื”ืฉื™ืžื•ืฉ ื”ื—ื•ืคืฉื™ ื‘ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช ืœืžื™ื ื™ื”ืŸ, ื”ื•ืกืชืจื” ืชื›ื•ื ื” ืœื ื ืขื™ืžื” ื™ื•ืชืจ - JavaScript ื‘ืขื™ืฆื•ื‘ื• ืื™ื ื• ืชื•ืžืš ื‘-multithreading ืขื ื–ื™ื›ืจื•ืŸ ืžืฉื•ืชืฃ. ื‘ืื•ืคืŸ ืขืงืจื•ื ื™, ื–ื” ื™ื›ื•ืœ ืœื”ื™ืงืจื ื‘ื“ืจืš ื›ืœืœ ืจืขื™ื•ืŸ ื˜ื•ื‘, ืื‘ืœ ืœื ืขื‘ื•ืจ ื”ืขื‘ืจืช ืงื•ื“ ืฉื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืœื• ืงืฉื•ืจื” ืœ-C threads. ื‘ืื•ืคืŸ ื›ืœืœื™, ืคื™ื™ืจืคื•ืงืก ืžืชื ืกื” ื‘ืชืžื™ื›ื” ื‘ืขื•ื‘ื“ื™ื ืžืฉื•ืชืคื™ื, ื•ืœ-Emscripten ื™ืฉ ื™ื™ืฉื•ื pthread ืขื‘ื•ืจื, ืื‘ืœ ืœื ืจืฆื™ืชื™ ืœืกืžื•ืš ืขืœื™ื•. ื ืืœืฆืชื™ ืœืื˜ ืœืื˜ ืœื”ื•ืฆื™ื ืืช ื”-multithreading ืžืงื•ื“ ื”-Qemu - ื›ืœื•ืžืจ, ืœื‘ืจืจ ื”ื™ื›ืŸ ื”-threads ืจืฆื™ื, ืœื”ืขื‘ื™ืจ ืืช ื’ื•ืฃ ื”ืœื•ืœืื” ื”ืคื•ืขืœืช ื‘ืฉืจืฉื•ืจ ื”ื–ื” ืœืคื•ื ืงืฆื™ื” ื ืคืจื“ืช, ื•ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื•ืช ื›ืืœื• ืื—ืช ืื—ืช ืžื”ืœื•ืœืื” ื”ืจืืฉื™ืช.

ื ื™ืกื™ื•ืŸ ืฉื ื™

ื‘ืฉืœื‘ ืžืกื•ื™ื, ื”ืชื‘ืจืจ ืฉื”ื‘ืขื™ื” ืขื“ื™ื™ืŸ ืงื™ื™ืžืช, ื•ืฉื“ื—ื™ืคื” ืืงืจืื™ืช ืฉืœ ืงื‘ื™ื™ื ืกื‘ื™ื‘ ื”ืงื•ื“ ืœื ืชื•ื‘ื™ืœ ืœืฉื•ื ื˜ื•ื‘. ืžืกืงื ื”: ืขืœื™ื ื• ืœืขืฉื•ืช ืื™ื›ืฉื”ื• ืฉื™ื˜ืชื™ื•ืช ืฉืœ ืชื”ืœื™ืš ื”ื•ืกืคืช ืงื‘ื™ื™ื. ืœื›ืŸ ื ืœืงื—ื” ื’ืจืกื” 2.4.1 ืฉื”ื™ื™ืชื” ื˜ืจื™ื™ื” ืื– (ืœื 2.5.0, ื›ื™ ืžื™ ื™ื•ื“ืข ื™ื”ื™ื• ื‘ืื’ื™ื ื‘ื’ืจืกื” ื”ื—ื“ืฉื” ืฉืขื“ื™ื™ืŸ ืœื ื ืชืคืกื•, ื•ื™ืฉ ืœื™ ืžืกืคื™ืง ื‘ืื’ื™ื ืžืฉืœื™ ), ื•ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ื”ื™ื” ืœืฉื›ืชื‘ ืื•ืชื• ื‘ื‘ื˜ื—ื” thread-posix.c. ื•ื‘ื›ืŸ, ื›ืœื•ืžืจ, ื›ืžื• ื‘ื˜ื•ื—: ืื ืžื™ืฉื”ื• ื ื™ืกื” ืœื‘ืฆืข ืคืขื•ืœื” ื”ืžื•ื‘ื™ืœื” ืœื—ืกื™ืžื”, ื”ืคื•ื ืงืฆื™ื” ื ืงืจืื” ืžื™ื“ abort() - ื›ืžื•ื‘ืŸ, ื–ื” ืœื ืคืชืจ ืืช ื›ืœ ื”ื‘ืขื™ื•ืช ื‘ื‘ืช ืื—ืช, ืื‘ืœ ืœืคื—ื•ืช ื–ื” ื”ื™ื” ืื™ื›ืฉื”ื• ื ืขื™ื ื™ื•ืชืจ ืžืืฉืจ ืœืงื‘ืœ ื‘ืฉืงื˜ ื ืชื•ื ื™ื ืœื ืขืงื‘ื™ื™ื.

ื‘ืื•ืคืŸ ื›ืœืœื™, ืืคืฉืจื•ื™ื•ืช Emscripten ืžื•ืขื™ืœื•ืช ืžืื•ื“ ื‘ื”ืขื‘ืจืช ืงื•ื“ ืœ-JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - ื”ื ืชื•ืคืกื™ื ืกื•ื’ื™ื ืžืกื•ื™ืžื™ื ืฉืœ ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช, ื›ืžื• ืงืจื™ืื•ืช ืœื›ืชื•ื‘ืช ืœื ืžื™ื•ืฉืจืช (ืฉืœื ืขื•ืœื” ื‘ืงื ื” ืื—ื“ ืขื ื”ืงื•ื“ ืฉืœ ืžืขืจื›ื™ื ืžื•ืงืœื“ื™ื ื›ืžื• HEAP32[addr >> 2] = 1) ืื• ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื” ืขื ืžืกืคืจ ืœื ื ื›ื•ืŸ ืฉืœ ืืจื’ื•ืžื ื˜ื™ื.

ืื’ื‘, ืฉื’ื™ืื•ืช ื™ื™ืฉื•ืจ ื”ืŸ ื ื•ืฉื ื ืคืจื“. ื›ืคื™ ืฉื›ื‘ืจ ืืžืจืชื™, ืœ-Qemu ื™ืฉ ืงืฆื” ืคืจืฉื ื™ "ืžื ื•ื•ืŸ" ืœื™ืฆื™ืจืช ืงื•ื“ TCI (ืžืชื•ืจื’ืžืŸ ืงื•ื“ ื–ืขื™ืจ), ื•ื›ื“ื™ ืœื‘ื ื•ืช ื•ืœื”ืคืขื™ืœ ืืช Qemu ืขืœ ืืจื›ื™ื˜ืงื˜ื•ืจื” ื—ื“ืฉื”, ืื ื™ืชืžื–ืœ ืžื–ืœื›ื, ืžืกืคื™ืง ืžื”ื“ืจ C. ืžื™ืœื•ืช ืžืคืชื—. "ืื ืืชื” ื‘ืจ ืžื–ืœ". ื”ื™ื” ืœื™ ืžื–ืœ, ื•ื”ืชื‘ืจืจ ืฉ-TCI ืžืฉืชืžืฉืช ื‘ื’ื™ืฉื” ืœื ืžื™ื•ืฉืจืช ื‘ืขืช ื ื™ืชื•ื— ื”-bytecode ืฉืœื”. ื›ืœื•ืžืจ, ื‘ื›ืœ ืžื™ื ื™ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ARM ื•ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืื—ืจื•ืช ืขื ื’ื™ืฉื” ืžืคื•ืœืกืช ื‘ื”ื›ืจื—, Qemu ืžื‘ืฆืข ืงื•ืžืคื™ืœืฆื™ื” ื›ื™ ื™ืฉ ืœื”ื TCG backend ืจื’ื™ืœ ืฉืžื™ื™ืฆืจ ืงื•ื“ ืžืงื•ืจื™, ืื‘ืœ ื”ืื TCI ื™ืขื‘ื•ื“ ืขืœื™ื”ื ื–ื• ืฉืืœื” ืื—ืจืช. ืขื ื–ืืช, ื›ืคื™ ืฉื”ืชื‘ืจืจ, ืชื™ืขื•ื“ TCI ื”ืฆื‘ื™ืข ื‘ื‘ื™ืจื•ืจ ืขืœ ืžืฉื”ื• ื“ื•ืžื”. ื›ืชื•ืฆืื” ืžื›ืš ื ื•ืกืคื• ืœืงื•ื“ ืงืจื™ืื•ืช ืคื•ื ืงืฆื™ื” ืœืงืจื™ืื” ืœื ืžื™ื•ืฉืจืช, ืฉื ืžืฆืื• ื‘ื—ืœืง ืื—ืจ ืฉืœ Qemu.

ื”ืจืก ืขืจื™ืžื”

ื›ืชื•ืฆืื” ืžื›ืš, ืชื•ืงื ื” ื’ื™ืฉื” ืœื ืžื™ื•ืฉืจืช ืœ-TCI, ื ื•ืฆืจื” ืœื•ืœืื” ืจืืฉื™ืช ืืฉืจ ื‘ืชื•ืจื” ืงืจืื” ืœืžืขื‘ื“, RCU ื•ืขื•ื“ ื›ืžื” ื“ื‘ืจื™ื ืงื˜ื ื™ื. ื•ื›ืš ืื ื™ ืžืฉื™ืง ืืช Qemu ืขื ื”ืืคืฉืจื•ืช -d exec,in_asm,out_asm, ืžื” ืฉืื•ืžืจ ืฉืืชื” ืฆืจื™ืš ืœื•ืžืจ ืื™ืœื• ื‘ืœื•ืงื™ื ืฉืœ ืงื•ื“ ืžื‘ื•ืฆืขื™ื, ื•ื’ื ื‘ื–ืžืŸ ื”ืฉื™ื“ื•ืจ ืœื›ืชื•ื‘ ืžื” ื”ื™ื” ืงื•ื“ ื”ืื•ืจื—, ืžื” ื”ืคืš ืœืงื•ื“ ื”ืžืืจื— (ื‘ืžืงืจื” ื–ื”, bytecode). ื–ื” ืžืชื—ื™ืœ, ืžื‘ืฆืข ืžืกืคืจ ื‘ืœื•ืงื™ื ืฉืœ ืชืจื’ื•ื, ื›ื•ืชื‘ ืืช ื”ื•ื“ืขืช ืื™ืชื•ืจ ื”ื‘ืื’ื™ื ืฉื”ืฉืืจืชื™ ืฉ-RCU ื™ืชื—ื™ืœ ืขื›ืฉื™ื• ื•... ืงื•ืจืก abort() ื‘ืชื•ืš ืคื•ื ืงืฆื™ื” free(). ืขืœ ื™ื“ื™ ื”ืชืขืกืงื•ืช ืขื ื”ืคื•ื ืงืฆื™ื” free() ื”ืฆืœื—ื ื• ืœื’ืœื•ืช ืฉื‘ืจืืฉ ื‘ืœื•ืง ื”ืขืจื™ืžื”, ืฉื ืžืฆื ื‘ืฉืžื•ื ื” ื‘ืชื™ื ืฉืœืคื ื™ ื”ื–ื™ื›ืจื•ืŸ ืฉื”ื•ืงืฆื”, ื‘ืžืงื•ื ื’ื•ื“ืœ ื”ื‘ืœื•ืง ืื• ืžืฉื”ื• ื“ื•ืžื”, ื”ื™ื” ื–ื‘ืœ.

ื”ืจืก ื”ืขืจื™ืžื” - ื›ืžื” ื—ืžื•ื“... ื‘ืžืงืจื” ื›ื–ื”, ื™ืฉ ืชืจื•ืคื” ืฉื™ืžื•ืฉื™ืช - ืžืื•ืชื ืžืงื•ืจื•ืช (ืื ืืคืฉืจ) ื”ืจื›ื™ื‘ื• ื‘ื™ื ืืจื™ ื™ืœื™ื“ ื•ื”ืจื™ืฆื• ืื•ืชื• ืชื—ืช Valgrind. ืœืื—ืจ ื–ืžืŸ ืžื”, ื”ื‘ื™ื ืืจื™ ื”ื™ื” ืžื•ื›ืŸ. ืื ื™ ืžืฉื™ืง ืื•ืชื• ืขื ืื•ืชืŸ ืืคืฉืจื•ื™ื•ืช - ื”ื•ื ืงื•ืจืก ืืคื™ืœื• ื‘ื–ืžืŸ ื”ืืชื—ื•ืœ, ืœืคื ื™ ืฉื”ื•ื ืžื’ื™ืข ืœื‘ื™ืฆื•ืข ื‘ืคื•ืขืœ. ื–ื” ืœื ื ืขื™ื, ื›ืžื•ื‘ืŸ - ื›ื›ืœ ื”ื ืจืื”, ื”ืžืงื•ืจื•ืช ืœื ื”ื™ื• ื‘ื“ื™ื•ืง ื–ื”ื™ื, ื•ื–ื” ืœื ืžืคืชื™ืข, ื›ื™ ื”ืชืฆื•ืจื” ื”ืกืชื›ืœื” ืขืœ ืืคืฉืจื•ื™ื•ืช ืงืฆืช ืฉื•ื ื•ืช, ืื‘ืœ ื™ืฉ ืœื™ Valgrind - ืงื•ื“ื ืื ื™ ืืชืงืŸ ืืช ื”ื‘ืื’ ื”ื–ื”, ื•ืื–, ืื ื™ื”ื™ื” ืœื™ ืžื–ืœ , ื”ืžืงื•ืจื™ ื™ื•ืคื™ืข. ืื ื™ ืžืจื™ืฅ ืืช ืื•ืชื• ื”ื“ื‘ืจ ืชื—ืช Valgrind... Y-y-y, y-y-y, ืื”-ืื”, ื–ื” ื”ืชื—ื™ืœ, ืขื‘ืจ ืืชื—ื•ืœ ื›ืจื’ื™ืœ ื•ืขื‘ืจ ืืช ื”ื‘ืื’ ื”ืžืงื•ืจื™ ืœืœื ืื–ื”ืจื” ืื—ืช ืขืœ ื’ื™ืฉื” ืœื ื ื›ื•ื ื” ืœื–ื™ื›ืจื•ืŸ, ืฉืœื ืœื“ื‘ืจ ืขืœ ื ืคื™ืœื•ืช. ื”ื—ื™ื™ื, ื›ืžื• ืฉืื•ืžืจื™ื, ืœื ื”ื›ื™ื ื• ืื•ืชื™ ืœื–ื” - ืชื•ื›ื ื™ืช ืงื•ืจืกืช ืžืคืกื™ืงื” ืœืงืจื•ืก ื›ืฉื”ื™ื ืžื•ืคืขืœืช ืชื—ืช Walgrind. ืžื” ื–ื” ื”ื™ื” ืชืขืœื•ืžื”. ื”ื”ืฉืขืจื” ืฉืœื™ ื”ื™ื ืฉืคืขื ืื—ืช ื‘ืงืจื‘ืช ื”ื”ื•ืจืื” ื”ื ื•ื›ื—ื™ืช ืœืื—ืจ ื”ืชืจืกืงื•ืช ื‘ืžื”ืœืš ื”ืืชื—ื•ืœ, gdb ื”ืจืื” ืขื‘ื•ื“ื” memset-a ืขื ืžืฆื‘ื™ืข ื—ื•ืงื™ ื‘ืืžืฆืขื•ืช ืื—ื“ ืžื”ื mmx, ืื• xmm ืจื•ืฉืžื™ื, ืื– ืื•ืœื™ ื–ื• ื”ื™ื™ืชื” ืื™ื–ื•ืฉื”ื™ ืฉื’ื™ืืช ื™ื™ืฉื•ืจ, ืื ื›ื™ ืขื“ื™ื™ืŸ ืงืฉื” ืœื”ืืžื™ืŸ.

ื‘ืกื“ืจ, ื ืจืื” ืฉืœื’ืจื™ื ื“ ืœื ืขื•ื–ืจ ื›ืืŸ. ื•ื›ืืŸ ื”ืชื—ื™ืœ ื”ื“ื‘ืจ ื”ื›ื™ ืžื’ืขื™ืœ - ื ืจืื” ืฉื”ื›ืœ ืืคื™ืœื• ืžืชื—ื™ืœ, ืื‘ืœ ืงื•ืจืก ืžืกื™ื‘ื•ืช ืœื ื™ื“ื•ืขื•ืช ืœื—ืœื•ื˜ื™ืŸ ื‘ื’ืœืœ ืื™ืจื•ืข ืฉื™ื›ื•ืœ ื”ื™ื” ืœื”ืชืจื—ืฉ ืœืคื ื™ ืžื™ืœื™ื•ื ื™ ื”ื•ืจืื•ืช. ื”ืจื‘ื” ื–ืžืŸ ืืคื™ืœื• ืœื ื”ื™ื” ื‘ืจื•ืจ ืื™ืš ืœื’ืฉืช. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ืขื“ื™ื™ืŸ ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืฉื‘ืช ื•ืœื‘ืฆืข ื ื™ืคื•ื™ ื‘ืื’ื™ื. ื”ื“ืคืกืช ืžื” ืฉื”ื›ื•ืชืจืช ื ื›ืชื‘ื” ืื™ืชื• ื”ืจืืชื” ืฉื”ื™ื ืœื ื ืจืื™ืช ื›ืžื• ืžืกืคืจ, ืืœื ืกื•ื’ ืฉืœ ื ืชื•ื ื™ื ื‘ื™ื ืืจื™ื™ื. ื•ื”ื ื”, ื”ืžื—ืจื•ื–ืช ื”ื‘ื™ื ืืจื™ืช ื”ื–ื• ื ืžืฆืื” ื‘ืงื•ื‘ืฅ ื”-BIOS โ€“ ื›ืœื•ืžืจ, ืขื›ืฉื™ื• ืืคืฉืจ ื”ื™ื” ืœื•ืžืจ ื‘ื‘ื™ื˜ื—ื•ืŸ ืกื‘ื™ืจ ืฉืžื“ื•ื‘ืจ ื‘-buffer overflow, ื•ืืคื™ืœื• ื‘ืจื•ืจ ืฉื”ื•ื ื ื›ืชื‘ ืœืžืื’ืจ ื”ื–ื”. ื•ื‘ื›ืŸ, ืื– ืžืฉื”ื• ื›ื–ื” - ื‘-Emscripten, ืœืžืจื‘ื” ื”ืžื–ืœ, ืื™ืŸ ืืงืจืื™ ืฉืœ ืžืจื—ื‘ ื”ื›ืชื•ื‘ื•ืช, ื’ื ืื™ืŸ ื‘ื• ื—ื•ืจื™ื, ืื– ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืื™ืคืฉื”ื• ื‘ืืžืฆืข ื”ืงื•ื“ ื›ื“ื™ ืœื”ื•ืฆื™ื ื ืชื•ื ื™ื ืœืคื™ ืžืฆื‘ื™ืข ืžื”ื”ืฉืงื” ื”ืื—ืจื•ื ื”, ื”ืกืชื›ืœื• ืขืœ ื”ื ืชื•ื ื™ื, ื”ืกืชื›ืœื• ืขืœ ื”ืžืฆื‘ื™ืข, ื•ืื ื”ื ืœื ื”ืฉืชื ื•, ืงื‘ืœื• ื—ื•ืžืจ ืœืžื—ืฉื‘ื”. ื ื›ื•ืŸ, ืœื•ืงื— ื›ืžื” ื“ืงื•ืช ืœืงืฉืจ ืื—ืจื™ ื›ืœ ืฉื™ื ื•ื™, ืื‘ืœ ืžื” ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช? ื›ืชื•ืฆืื” ืžื›ืš, ื ืžืฆืื” ืฉื•ืจื” ืกืคืฆื™ืคื™ืช ืฉื”ืขืชื™ืงื” ืืช ื”-BIOS ืžื”ืžืื’ืจ ื”ื–ืžื ื™ ืœื–ื™ื›ืจื•ืŸ ื”ืื•ืจื— - ื•ืื›ืŸ, ืœื ื”ื™ื” ืžืกืคื™ืง ืžืงื•ื ื‘ืžืื’ืจ. ืžืฆื™ืืช ื”ืžืงื•ืจ ืฉืœ ื›ืชื•ื‘ืช ื”ืžืื’ืจ ื”ืžื•ื–ืจื” ื”ื–ื• ื”ื•ื‘ื™ืœื” ืœืคื•ื ืงืฆื™ื” qemu_anon_ram_alloc ื‘ืงื•ื‘ืฅ oslib-posix.c - ื”ื”ื™ื’ื™ื•ืŸ ืฉื ื”ื™ื” ื–ื”: ืœืคืขืžื™ื ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ ืœื™ื™ืฉืจ ืืช ื”ื›ืชื•ื‘ืช ืœืขืžื•ื“ ืขื ืง ื‘ื’ื•ื“ืœ 2 ืžื’ื”-ื‘ื™ื™ื˜, ื‘ืฉื‘ื™ืœ ื–ื” ื ื‘ืงืฉ mmap ืชื—ื™ืœื” ืขื•ื“ ืงืฆืช, ื•ืื– ื ื—ื–ื™ืจ ืืช ื”ืขื•ื“ืฃ ื‘ืขื–ืจืชื• munmap. ื•ืื ืœื ื ื“ืจืฉ ื™ื™ืฉื•ืจ ื›ื–ื”, ื ืฆื™ื™ืŸ ืืช ื”ืชื•ืฆืื” ื‘ืžืงื•ื 2 ืžื’ื”-ื‘ื™ื™ื˜ getpagesize() - mmap ื–ื” ืขื“ื™ื™ืŸ ื™ืžืกื•ืจ ื›ืชื•ื‘ืช ืžื™ื•ืฉืจืช... ืื– ื‘-Emscripten mmap ืจืง ืฉื™ื—ื•ืช malloc, ืื‘ืœ ื›ืžื•ื‘ืŸ ืฉื–ื” ืœื ืžืชื™ื™ืฉืจ ื‘ื“ืฃ. ื‘ืื•ืคืŸ ื›ืœืœื™, ื‘ืื’ ืฉืชืกื›ืœ ืื•ืชื™ ื‘ืžืฉืš ื›ืžื” ื—ื•ื“ืฉื™ื ืชื•ืงืŸ ืขืœ ื™ื“ื™ ืฉื™ื ื•ื™ ื‘ ะดะฒัƒั… ืฉื•ืจื•ืช.

ืชื›ื•ื ื•ืช ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืฉื™ื—ื•ืช

ื•ืขื›ืฉื™ื• ื”ืžืขื‘ื“ ืกื•ืคืจ ืžืฉื”ื•, Qemu ืœื ืงื•ืจืก, ืื‘ืœ ื”ืžืกืš ืœื ื ื“ืœืง, ื•ื”ืžืขื‘ื“ ื ื›ื ืก ื‘ืžื”ื™ืจื•ืช ืœืœื•ืœืื•ืช, ืื ืœืฉืคื•ื˜ ืœืคื™ ื”ืคืœื˜ -d exec,in_asm,out_asm. ืขืœืชื” ื”ืฉืขืจื”: ืคืกื™ืงื•ืช ื˜ื™ื™ืžืจ (ืื•, ื‘ืื•ืคืŸ ื›ืœืœื™, ื›ืœ ื”ื”ืคืกืงื•ืช) ืื™ื ืŸ ืžื’ื™ืขื•ืช. ื•ืื›ืŸ, ืื ื‘ื•ืจื’ื™ื ืืช ื”ื”ืคืจืขื•ืช ืžื”ืืกืคืช ื”ื™ืœื™ื“ื™ื, ืฉืžืฉื•ื ืžื” ืขื‘ื“ื”, ืžืชืงื‘ืœืช ืชืžื•ื ื” ื“ื•ืžื”. ืื‘ืœ ื–ื• ืœื ื”ื™ื™ืชื” ื”ืชืฉื•ื‘ื” ื‘ื›ืœืœ: ื”ืฉื•ื•ืื” ืฉืœ ื”ืขืงื‘ื•ืช ืฉื”ื•ืคืงื• ืขื ื”ืืคืฉืจื•ืช ื”ื "ืœ ื”ืจืืชื” ืฉืžืกืœื•ืœื™ ื”ื‘ื™ืฆื•ืข ื”ืชืคืฆืœื• ืžื•ืงื“ื ืžืื•ื“. ื›ืืŸ ื™ืฉ ืœื•ืžืจ ื”ืฉื•ื•ืื” ืฉืœ ืžื” ืฉื ืจืฉื ื‘ืืžืฆืขื•ืช ื”ืžืฉื’ืจ emrun ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืœื˜ ืขื ื”ืคืœื˜ ืฉืœ ื”ื”ืจื›ื‘ื” ื”ืžืงื•ืžื™ืช ืื™ื ื• ืชื”ืœื™ืš ืžื›ื ื™ ืœื—ืœื•ื˜ื™ืŸ. ืื ื™ ืœื ื™ื•ื“ืข ืื™ืš ื‘ื“ื™ื•ืง ืžืชื—ื‘ืจืช ืชื•ื›ื ื™ืช ื”ืคื•ืขืœืช ื‘ื“ืคื“ืคืŸ emrun, ืื‘ืœ ื›ืžื” ืงื•ื•ื™ื ื‘ืคืœื˜ ืžืกืชื‘ืจ ืฉื”ื ืžืกื•ื“ืจื™ื ืžื—ื“ืฉ, ื›ืš ืฉื”ื”ื‘ื“ืœ ื‘-diff ื”ื•ื ืขื“ื™ื™ืŸ ืœื ืกื™ื‘ื” ืœื”ื ื™ื— ืฉื”ืžืกืœื•ืœื™ื ื”ืชืคืฆืœื•. ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ืชื‘ืจืจ ื›ื™ ืขืœ ืคื™ ื”ื”ื ื—ื™ื•ืช ljmpl ื™ืฉ ืžืขื‘ืจ ืœื›ืชื•ื‘ื•ืช ืฉื•ื ื•ืช, ื•ื”-bytecode ืฉื ื•ืฆืจ ืฉื•ื ื” ืžื”ื•ืชื™ืช: ืื—ื“ ืžื›ื™ืœ ื”ื•ืจืื” ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื™ืช ืขื•ื–ืจ, ื”ืฉื ื™ ืœื. ืœืื—ืจ ืฉื’ื•ื’ืœืชื™ ืืช ื”ื”ื•ืจืื•ืช ื•ืœื™ืžื•ื“ ื”ืงื•ื“ ืฉืžืชืจื’ื ื”ื•ืจืื•ืช ืืœื•, ื”ืชื‘ืจืจ ื›ื™ ืจืืฉื™ืช, ืžื™ื“ ืœืคื ื™ื• ื‘ืคื ืงืก 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+ ื”ืฆืœื™ื—ื” ืœืจื•ืฅ ื‘-Native assembly. ื›ืืŸ ื™ืฉ ืฆื•ืจืš ืœื”ื‘ื”ื™ืจ ืฉืงื•ื“ Qemu block I/O ื›ืชื•ื‘ ื‘ืงื•ืจื•ื˜ื™ื ื•ืช. ืœ-Emscripten ื™ืฉ ื™ื™ืฉื•ื ืžืื•ื“ ืžืกื•ื‘ืš ืžืฉืœื•, ืื‘ืœ ืขื“ื™ื™ืŸ ื”ื™ื” ืฆื•ืจืš ืœืชืžื•ืš ื‘ื• ื‘ืงื•ื“ Qemu, ื•ืืชื” ื™ื›ื•ืœ ืœื‘ืฆืข ื ื™ืคื•ื™ ื‘ืื’ื™ื ื‘ืžืขื‘ื“ ืขื›ืฉื™ื•: Qemu ืชื•ืžืš ื‘ืืคืฉืจื•ื™ื•ืช -kernel, -initrd, -append, ืฉื‘ืืžืฆืขื•ืชื• ืืชื” ื™ื›ื•ืœ ืœืืชื—ืœ ืืช ืœื™ื ื•ืงืก ืื•, ืœืžืฉืœ, memtest86+, ืžื‘ืœื™ ืœื”ืฉืชืžืฉ ื‘ืžื›ืฉื™ืจื™ ื—ืกื™ืžื” ื›ืœืœ. ืื‘ืœ ื”ื ื” ื”ื‘ืขื™ื”: ื‘ื”ืจื›ื‘ื” ื”ืžืงื•ืจื™ืช ืืคืฉืจ ื”ื™ื” ืœืจืื•ืช ืืช ืคืœื˜ ืœื™ื‘ืช ืœื™ื ื•ืงืก ืœืงื•ื ืกื•ืœื” ืขื ื”ืืคืฉืจื•ืช -nographic, ื•ืœืœื ืคืœื˜ ืžื”ื“ืคื“ืคืŸ ืœืžืกื•ืฃ ืฉืžืžื ื• ื”ื•ืฉืง emrun, ืœื ื”ื’ื™ืข. ื›ืœื•ืžืจ, ืœื ื‘ืจื•ืจ: ื”ืžืขื‘ื“ ืœื ืขื•ื‘ื“ ืื• ื”ืคืœื˜ ื”ื’ืจืคื™ ืœื ืขื•ื‘ื“. ื•ืื– ืขืœื” ื‘ื“ืขืชื™ ืœื—ื›ื•ืช ืงืฆืช. ื”ืชื‘ืจืจ ืฉ"ื”ืžืขื‘ื“ ืœื ื™ืฉืŸ, ืืœื ืคืฉื•ื˜ ืžื”ื‘ื”ื‘ ืœืื˜", ื•ืื—ืจื™ ื›ื—ืžืฉ ื“ืงื•ืช ื”ืงืจื ืœ ื–ืจืง ืฆืจื•ืจ ื”ื•ื“ืขื•ืช ืœืงื•ื ืกื•ืœื” ื•ื”ืžืฉื™ืš ืœื”ื™ืชืงืข. ื”ืชื‘ืจืจ ืฉื”ืžืขื‘ื“, ื‘ืื•ืคืŸ ื›ืœืœื™, ืขื•ื‘ื“, ื•ืขืœื™ื ื• ืœื—ืคื•ืจ ื‘ืงื•ื“ ืœืขื‘ื•ื“ื” ืขื SDL2. ืœืฆืขืจื™, ืื ื™ ืœื ื™ื•ื“ืข ืื™ืš ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ื”ื–ื•, ืื– ื‘ืžืงื•ืžื•ืช ืžืกื•ื™ืžื™ื ื ืืœืฆืชื™ ืœืคืขื•ืœ ื‘ืืงืจืื™. ื‘ืฉืœื‘ ืžืกื•ื™ื, ื”ืงื• parallel0 ื”ื‘ื”ื‘ ืขืœ ื”ืžืกืš ืขืœ ืจืงืข ื›ื—ื•ืœ, ืžื” ืฉื”ืฆื™ืข ื›ืžื” ืžื—ืฉื‘ื•ืช. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื”ืชื‘ืจืจ ืฉื”ื‘ืขื™ื” ื”ื™ื ืฉ-Qemu ืคื•ืชื—ืช ืžืกืคืจ ื—ืœื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื™ื ื‘ื—ืœื•ืŸ ืคื™ื–ื™ ืื—ื“, ื‘ื™ื ื™ื”ื ื ื™ืชืŸ ืœืขื‘ื•ืจ ื‘ืืžืฆืขื•ืช Ctrl-Alt-n: ื–ื” ืขื•ื‘ื“ ื‘-Native build, ืื‘ืœ ืœื ื‘-Emscripten. ืœืื—ืจ ืœื”ื™ืคื˜ืจ ืžื—ืœื•ื ื•ืช ืžื™ื•ืชืจื™ื ื‘ืืžืฆืขื•ืช ืืคืฉืจื•ื™ื•ืช -monitor none -parallel none -serial none ื•ื”ื•ืจืื•ืช ืœืฆื™ื™ืจ ืžื—ื“ืฉ ื‘ื›ื•ื— ืืช ื›ืœ ื”ืžืกืš ืขืœ ื›ืœ ืคืจื™ื™ื, ื”ื›ืœ ืคืชืื•ื ืขื‘ื“.

ืงื•ืจื•ื˜ื™ื ื™ื

ืื–, ืืžื•ืœืฆื™ื” ื‘ื“ืคื“ืคืŸ ืขื•ื‘ื“ืช, ืื‘ืœ ืืชื” ืœื ื™ื›ื•ืœ ืœื”ืคืขื™ืœ ื‘ื• ืฉื•ื ืชืงืœื™ื˜ื•ืŸ ืžืขื ื™ื™ืŸ, ืžื›ื™ื•ื•ืŸ ืฉืื™ืŸ ืงืœื˜/ืคืœื˜ ื—ืกื•ื - ืืชื” ืฆืจื™ืš ืœื™ื™ืฉื ืชืžื™ื›ื” ื‘ืงื•ืจื•ื˜ื™ื ื™ื. ืœ-Qemu ื›ื‘ืจ ื™ืฉ ืžืกืคืจ ืงืฆื” ืงืฆื” ืฉืœ Coroutine, ืื‘ืœ ื‘ื’ืœืœ ื”ืื•ืคื™ ืฉืœ JavaScript ื•ืžื—ื•ืœืœ ื”ืงื•ื“ ืฉืœ Emscripten, ืืชื” ืœื ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื”ืชื—ื™ืœ ืœืœื”ื˜ื˜ ื‘ืขืจื™ืžื•ืช. ื ืจืื” ืฉ"ื”ื›ืœ ื ืขืœื, ื”ื˜ื™ื— ืžื•ืกืจ", ืื‘ืœ ืžืคืชื—ื™ Emscripten ื›ื‘ืจ ื“ืื’ื• ืœื”ื›ืœ. ื–ื” ืžื™ื•ืฉื ื“ื™ ืžืฆื—ื™ืง: ื‘ื•ืื• ื ืงืจื ืœืงืจื™ืืช ืคื•ื ืงืฆื™ื” ื›ื–ื• ื›ื—ืฉื•ื“ื” emscripten_sleep ื•ืขื•ื“ ื›ืžื” ืื—ืจื™ื ื”ืžืฉืชืžืฉื™ื ื‘ืžื ื’ื ื•ืŸ Asyncify, ื›ืžื• ื’ื ืงืจื™ืื•ืช ืžืฆื‘ื™ืข ื•ืงืจื™ืื•ืช ืœื›ืœ ืคื•ื ืงืฆื™ื” ืฉื‘ื” ืื—ื“ ืžืฉื ื™ ื”ืžืงืจื™ื ื”ืงื•ื“ืžื™ื ืขืฉื•ื™ ืœื”ืชืจื—ืฉ ื‘ื”ืžืฉืš ื”ืขืจื™ืžื”. ื•ื›ืขืช, ืœืคื ื™ ื›ืœ ืงืจื™ืื” ื—ืฉื•ื“ื”, ื ื‘ื—ืจ ื”ืงืฉืจ ืืกื™ื ื›ืจื•ื ื™, ื•ืžื™ื“ ืœืื—ืจ ื”ืงืจื™ืื” ื ื‘ื“ื•ืง ื”ืื ื”ืชืจื—ืฉื” ืงืจื™ืื” ืืกื™ื ื›ืจื•ื ื™ืช, ื•ืื ื›ืŸ ื ืฉืžื•ืจ ืืช ื›ืœ ื”ืžืฉืชื ื™ื ื”ืžืงื•ืžื™ื™ื ื‘ื”ืงืฉืจ ืืกื™ื ื›ืจื•ื ื™ ื–ื”, ื ืฆื™ื™ืŸ ืื™ื–ื• ืคื•ื ืงืฆื™ื” ืœื”ืขื‘ื™ืจ ืืช ื”ืฉืœื™ื˜ื” ืœืžื•ืขื“ ืฉื‘ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืžืฉื™ืš ื‘ื‘ื™ืฆื•ืข ื•ืœืฆืืช ืžื”ืคื•ื ืงืฆื™ื” ื”ื ื•ื›ื—ื™ืช. ื–ื” ื”ืžืงื•ื ืฉื‘ื• ื™ืฉ ืžืงื•ื ืœื—ืงื•ืจ ืืช ื”ื”ืฉืคืขื” ื‘ึผึดื–ื‘ึผื•ึผื– - ืœืฆื•ืจื›ื™ ื”ืžืฉืš ื‘ื™ืฆื•ืข ืงื•ื“ ืœืื—ืจ ื—ื–ืจื” ืžืงืจื™ืื” ืืกื™ื ื›ืจื•ื ื™ืช, ื”ืžื”ื“ืจ ืžื™ื™ืฆืจ "ืชื•ืœื™ื" ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื”ื—ืœ ืœืื—ืจ ืงืจื™ืื” ื—ืฉื•ื“ื” - ื›ืš: ืื ื™ืฉ n ืงืจื™ืื•ืช ื—ืฉื•ื“ื•ืช, ืื– ื”ืคื•ื ืงืฆื™ื” ืชื•ืจื—ื‘ ืื™ืคืฉื”ื• n/2 ืคืขืžื™ื - ื–ื” ืขื“ื™ื™ืŸ, ืื ืœื ื–ื›ื•ืจ ืฉืื—ืจื™ ื›ืœ ืฉื™ื—ื” ืฉืขืœื•ืœื” ืœื”ื™ื•ืช ืืกื™ื ื›ืจื•ื ื™ืช, ืืชื” ืฆืจื™ืš ืœื”ื•ืกื™ืฃ ืฉืžื™ืจืช ื›ืžื” ืžืฉืชื ื™ื ืžืงื•ืžื™ื™ื ืœืคื•ื ืงืฆื™ื” ื”ืžืงื•ืจื™ืช. ืœืื—ืจ ืžื›ืŸ, ืืคื™ืœื• ื ืืœืฆืชื™ ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืคืฉื•ื˜ ื‘-Python, ืืฉืจ, ื‘ื”ืชื‘ืกืก ืขืœ ืกื˜ ื ืชื•ืŸ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ื‘ืฉื™ืžื•ืฉ ื™ืชืจ ื‘ืžื™ื•ื—ื“, ืฉื›ื‘ื™ื›ื•ืœ "ืœื ืžืืคืฉืจื•ืช ืœื-ืกื™ื ื›ืจื•ืŸ ืœืขื‘ื•ืจ ื“ืจืš ืขืฆืžืŸ" (ื›ืœื•ืžืจ, ืงื™ื“ื•ื ืžื—ืกื ื™ืช ื•ื›ืœ ืžื” ืฉืชื™ืืจืชื™ ื–ื” ืขืชื” ืœื ืขื‘ื•ื“ื” ื‘ื”ื), ืžืฆื™ื™ื ืช ืงืจื™ืื•ืช ื“ืจืš ืžืฆื‘ื™ืขื™ื ืฉื‘ื”ื ื™ืฉ ืœื”ืชืขืœื ืžืคื•ื ืงืฆื™ื•ืช ืขืœ ื™ื“ื™ ื”ืžื”ื“ืจ ื›ืš ืฉืคื•ื ืงืฆื™ื•ืช ืืœื• ืœื ื™ื™ื—ืฉื‘ื• ืืกื™ื ื›ืจื•ื ื™ื•ืช. ื•ืื– ืงื‘ืฆื™ JS ืžืชื—ืช ืœ-60 ืžื’ื”-ื‘ื™ื™ื˜ ื”ื ื‘ืขืœื™ืœ ื™ื•ืชืจ ืžื“ื™ - ื ื ื™ื— ืœืคื—ื•ืช 30. ืื ื›ื™, ืคืขื ืื—ืช ื”ื’ื“ืจืชื™ ืกืงืจื™ืคื˜ assembly, ื•ื‘ื˜ืขื•ืช ื–ืจืงืชื™ ืืช ืืคืฉืจื•ื™ื•ืช ื”ืงื™ืฉื•ืจ, ื‘ื™ื ื™ื”ืŸ -O3. ืื ื™ ืžืจื™ืฅ ืืช ื”ืงื•ื“ ืฉื ื•ืฆืจ, ื•-Chromium ืื•ื›ืœ ืืช ื”ื–ื™ื›ืจื•ืŸ ื•ืžืชืจืกืง. ื•ืื– ื”ืกืชื›ืœืชื™ ื‘ื˜ืขื•ืช ืขืœ ืžื” ืฉื”ื•ื ื ื™ืกื” ืœื”ื•ืจื™ื“... ื•ื‘ื›ืŸ, ืžื” ืื ื™ ื™ื›ื•ืœ ืœื•ืžืจ, ื’ื ืื ื™ ื”ื™ื™ืชื™ ืงื•ืคืืช ืื ื”ื™ื• ืžื‘ืงืฉื™ื ืžืžื ื™ ืœืœืžื•ื“ ื•ืœื‘ืฆืข ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ 500+ MB Javascript.

ืœืจื•ืข ื”ืžื–ืœ, ื”ื‘ื“ื™ืงื•ืช ื‘ืงื•ื“ ืกืคืจื™ื™ืช ื”ืชืžื™ื›ื” ืฉืœ Asyncify ืœื ื”ื™ื• ื™ื“ื™ื“ื•ืชื™ื™ื ืœื—ืœื•ื˜ื™ืŸ longjmp-s ื”ืžืฉืžืฉื™ื ื‘ืงื•ื“ ื”ืžืขื‘ื“ ื”ื•ื™ืจื˜ื•ืืœื™, ืื‘ืœ ืœืื—ืจ ืชื™ืงื•ืŸ ืงื˜ืŸ ืฉืžื‘ื˜ืœ ืืช ื”ื‘ื“ื™ืงื•ืช ื”ืœืœื• ื•ืžืฉื—ื–ืจ ื‘ื›ื•ื— ื”ืงืฉืจื™ื ื›ืื™ืœื• ื”ื›ืœ ื‘ืกื“ืจ, ื”ืงื•ื“ ืขื‘ื“. ื•ืื– ื”ืชื—ื™ืœ ื“ื‘ืจ ืžื•ื–ืจ: ืœืคืขืžื™ื ื”ื•ืคืขืœื• ื‘ื“ื™ืงื•ืช ื‘ืงื•ื“ ื”ืกื ื›ืจื•ืŸ - ืื•ืชืŸ ื‘ื“ื™ืงื•ืช ืฉืžืจืกืงื•ืช ืืช ื”ืงื•ื“ ืื, ืœืคื™ ื”ื™ื’ื™ื•ืŸ ื”ื‘ื™ืฆื•ืข, ืฆืจื™ืš ืœื—ืกื•ื ืื•ืชื• - ืžื™ืฉื”ื• ื ื™ืกื” ืœืชืคื•ืก mutex ืฉื›ื‘ืจ ื ืœื›ื“. ืœืžืจื‘ื” ื”ืžื–ืœ, ื”ืชื‘ืจืจ ืฉื–ื• ืœื ื‘ืขื™ื” ื”ื’ื™ื•ื ื™ืช ื‘ืงื•ื“ ื”ืกื“ืจืชื™ - ืคืฉื•ื˜ ื”ืฉืชืžืฉืชื™ ื‘ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ืœื•ืœืื” ื”ืจืืฉื™ืช ื”ืกื˜ื ื“ืจื˜ื™ืช ืฉืกื™ืคืงื” Emscripten, ืื‘ืœ ืœืคืขืžื™ื ื”ืงืจื™ืื” ื”ืืกื™ื ื›ืจื•ื ื™ืช ื”ื™ื™ืชื” ืžืคืจืงืช ืœื—ืœื•ื˜ื™ืŸ ืืช ื”ืขืจื™ืžื”, ื•ื‘ืื•ืชื• ืจื’ืข ื”ื™ื ืชื™ื›ืฉืœ setTimeout ืžื”ืœื•ืœืื” ื”ืจืืฉื™ืช - ื›ืš, ื”ืงื•ื“ ื ื›ื ืก ืœืื™ื˜ืจืฆื™ื” ืฉืœ ื”ืœื•ืœืื” ื”ืจืืฉื™ืช ืžื‘ืœื™ ืœืฆืืช ืžื”ืื™ื˜ืจืฆื™ื” ื”ืงื•ื“ืžืช. ื ื›ืชื‘ ืžื—ื“ืฉ ืขืœ ืœื•ืœืื” ืื™ื ืกื•ืคื™ืช ื• emscripten_sleep, ื•ื”ื‘ืขื™ื•ืช ืขื mutexes ืคืกืงื•. ื”ืงื•ื“ ืืคื™ืœื• ื”ืคืš ืœื™ื•ืชืจ ื”ื’ื™ื•ื ื™ - ืื—ืจื™ ื”ื›ืœ, ืœืžืขืฉื”, ืื™ืŸ ืœื™ ืื™ื–ื” ืงื•ื“ ืฉืžื›ื™ืŸ ืืช ื”ืžืกื’ืจืช ื”ืื ื™ืžืฆื™ื” ื”ื‘ืื” - ื”ืžืขื‘ื“ ืคืฉื•ื˜ ืžื—ืฉื‘ ืžืฉื”ื• ื•ื”ืžืกืš ืžืชืขื“ื›ืŸ ืžืขืช ืœืขืช. ืขื ื–ืืช, ื”ื‘ืขื™ื•ืช ืœื ื ืขืฆืจื• ืฉื: ืœืคืขืžื™ื ื‘ื™ืฆื•ืข Qemu ืคืฉื•ื˜ ื”ื™ื” ืžืกืชื™ื™ื ื‘ืฉืงื˜ ืœืœื ื—ืจื™ื’ื™ื ืื• ืฉื’ื™ืื•ืช. ื‘ืื•ืชื• ืจื’ืข ื•ื™ืชืจืชื™ ืขืœ ื–ื”, ืื‘ืœ ื‘ื”ืกืชื›ืœื•ืช ืงื“ื™ืžื”, ืื ื™ ืื’ื™ื“ ืฉื”ื‘ืขื™ื” ื”ื™ื™ืชื” ื›ื–ื•: ืœืžืขืฉื”, ืงื•ื“ ื”ืงื•ืจื•ื˜ื™ืŸ ืื™ื ื• ืžืฉืชืžืฉ setTimeout (ืื• ืœืคื—ื•ืช ืœื ื‘ืชื“ื™ืจื•ืช ืฉื‘ื” ืืชื” ืขืฉื•ื™ ืœื—ืฉื•ื‘): ืคื•ื ืงืฆื™ื” emscripten_yield ืคืฉื•ื˜ ืžื’ื“ื™ืจ ืืช ื“ื’ืœ ื”ืฉื™ื—ื” ื”ืืกื™ื ื›ืจื•ื ื™ืช. ื›ืœ ื”ืขื ื™ื™ืŸ ื”ื•ื ื–ื” emscripten_coroutine_next ืื™ื ื” ืคื•ื ืงืฆื™ื” ืืกื™ื ื›ืจื•ื ื™ืช: ืคื ื™ืžื™ืช ื”ื™ื ื‘ื•ื“ืงืช ืืช ื”ื“ื’ืœ, ืžืืคืกืช ืื•ืชื• ื•ืžืขื‘ื™ืจื” ืืช ื”ืฉืœื™ื˜ื” ืœืžืงื•ื ื”ื“ืจื•ืฉ. ื›ืœื•ืžืจ, ืงื™ื“ื•ื ื”ืžื—ืกื ื™ืช ืžืกืชื™ื™ื ืฉื. ื”ื‘ืขื™ื” ื”ื™ื™ืชื” ืฉื‘ื’ืœืœ use-after-free, ืฉื”ื•ืคื™ืข ื›ืืฉืจ ืžืื’ืจ ื”-coroutine ื”ื•ืฉื‘ืช ืขืงื‘ ื”ืขื•ื‘ื“ื” ืฉืœื ื”ืขืชืงืชื™ ืฉื•ืจืช ืงื•ื“ ื—ืฉื•ื‘ื” ืžื”-backend ื”ืงื™ื™ื ืฉืœ coroutine, ื”ืคื•ื ืงืฆื™ื” qemu_in_coroutine ื”ื—ื–ื™ืจ ืืžืช ื›ืฉืœืžืขืฉื” ื–ื” ื”ื™ื” ืฆืจื™ืš ืœื”ื—ื–ื™ืจ ืฉืงืจ. ื–ื” ื”ื•ื‘ื™ืœ ืœืฉื™ื—ื” emscripten_yield, ืฉืžืขืœื™ื• ืœื ื”ื™ื” ืื™ืฉ ืขืœ ื”ืขืจื™ืžื” emscripten_coroutine_next, ื”ืขืจื™ืžื” ื ืคืจืฉื” ืขื“ ืœืžืขืœื”, ืื‘ืœ ืœื setTimeout, ื›ืคื™ ืฉื›ื‘ืจ ืืžืจืชื™, ืœื ื”ื•ืฆื’.

ื™ืฆื™ืจืช ืงื•ื“ JavaScript

ื•ื”ื ื”, ืœืžืขืฉื”, ืžื•ื‘ื˜ื—ืช "ื”ื—ื–ืจืช ื”ื‘ืฉืจ ื”ื˜ื—ื•ืŸ ืœืื—ื•ืจ". ืœื ื‘ืืžืช. ื›ืžื•ื‘ืŸ ืฉืื ื ืจื™ืฅ ืืช Qemu ื‘ื“ืคื“ืคืŸ, ื•-Node.js ื‘ื•, ืื–, ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ืœืื—ืจ ื™ืฆื™ืจืช ืงื•ื“ ื‘-Qemu ื ืงื‘ืœ JavaScript ืฉื’ื•ื™ ืœื—ืœื•ื˜ื™ืŸ. ืื‘ืœ ื‘ื›ืœ ื–ืืช, ืื™ื–ื•ืฉื”ื™ ื˜ืจื ืกืคื•ืจืžืฆื™ื” ื”ืคื•ื›ื”.

ืจืืฉื™ืช, ืงืฆืช ืขืœ ืื™ืš Qemu ืขื•ื‘ื“. ืื ื ืกืœื— ืœื™ ืžื™ื“: ืื ื™ ืœื ืžืคืชื— Qemu ืžืงืฆื•ืขื™ ื•ื”ืžืกืงื ื•ืช ืฉืœื™ ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืฉื’ื•ื™ื•ืช ื‘ืžืงื•ืžื•ืช ืžืกื•ื™ืžื™ื. ื›ืคื™ ืฉืื•ืžืจื™ื, "ื“ืขืชื• ืฉืœ ื”ืชืœืžื™ื“ ืื™ื ื” ื—ื™ื™ื‘ืช ืœื”ื™ื•ืช ืชื•ืืžืช ืืช ื“ืขืชื• ืฉืœ ื”ืžื•ืจื”, ื”ืืงืกื™ื•ืžื˜ื™ืงื” ื•ื”ืฉื›ืœ ื”ื™ืฉืจ ืฉืœ ืคื™ืื ื•". ืœ-Qemu ื™ืฉ ืžืกืคืจ ืžืกื•ื™ื ืฉืœ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืื•ืจื—ื™ื ื ืชืžื›ื•ืช ื•ืœื›ืœ ืื—ืช ื™ืฉ ืกืคืจื™ื™ื” ื›ืžื• target-i386. ื‘ืขืช ื‘ื ื™ื™ื”, ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ ืชืžื™ื›ื” ืขื‘ื•ืจ ื›ืžื” ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืื•ืจื—ื™ื, ืื‘ืœ ื”ืชื•ืฆืื” ืชื”ื™ื” ืจืง โ€‹โ€‹ื›ืžื” ื‘ื™ื ืืจื™ื™ื. ื”ืงื•ื“ ืœืชืžื™ื›ื” ื‘ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืื•ืจื—, ื‘ืชื•ืจื•, ื™ื•ืฆืจ ื›ืžื” ืคืขื•ืœื•ืช Qemu ืคื ื™ืžื™ื•ืช, ืฉื”-TCG (ืžื—ื•ืœืœ ืงื•ื“ ื–ืขื™ืจ) ื›ื‘ืจ ื”ื•ืคืš ืœืงื•ื“ ืžื›ื•ื ื” ืขื‘ื•ืจ ืืจื›ื™ื˜ืงื˜ื•ืจืช ื”ืžืืจื—. ื›ืคื™ ืฉืฆื•ื™ืŸ ื‘ืงื•ื‘ืฅ readme ืฉื ืžืฆื ื‘ืกืคืจื™ื™ืช tcg, ื–ื” ื”ื™ื” ื‘ืžืงื•ืจ ื—ืœืง ืžืžื”ื“ืจ C ืจื’ื™ืœ, ืฉื”ื•ืชืื ืžืื•ื—ืจ ื™ื•ืชืจ ืœ-JIT. ืœื›ืŸ, ืœืžืฉืœ, ืืจื›ื™ื˜ืงื˜ื•ืจืช ื™ืขื“ ืžื‘ื—ื™ื ืช ืžืกืžืš ื–ื” ืื™ื ื” ืขื•ื“ ืืจื›ื™ื˜ืงื˜ื•ืจืช ืื•ืจื—, ืืœื ืืจื›ื™ื˜ืงื˜ื•ืจืช ืžืืจื—. ื‘ืฉืœื‘ ืžืกื•ื™ื ื”ื•ืคื™ืข ืจื›ื™ื‘ ื ื•ืกืฃ - Tiny Code Interpreter (TCI), ืฉืืžื•ืจ ืœื‘ืฆืข ืงื•ื“ (ื›ืžืขื˜ ืื•ืชืŸ ืคืขื•ืœื•ืช ืคื ื™ืžื™ื•ืช) ื‘ื”ื™ืขื“ืจ ืžื—ื•ืœืœ ืงื•ื“ ืœืืจื›ื™ื˜ืงื˜ื•ืจืช ืžืืจื— ืกืคืฆื™ืคื™ืช. ืœืžืขืฉื”, ื›ืคื™ ืฉืฆื•ื™ืŸ ื‘ืชื™ืขื•ื“ ืฉืœื•, ื™ื™ืชื›ืŸ ืฉื”ืžืชื•ืจื’ืžืŸ ื”ื–ื” ืœื ืชืžื™ื“ ืžืชืคืงื“ ื›ืžื• ืžื—ื•ืœืœ ืงื•ื“ JIT, ืœื ืจืง ืžื‘ื—ื™ื ื” ื›ืžื•ืชื™ืช ืžื‘ื—ื™ื ืช ืžื”ื™ืจื•ืช, ืืœื ื’ื ืžื‘ื—ื™ื ื” ืื™ื›ื•ืชื™ืช. ืœืžืจื•ืช ืฉืื ื™ ืœื ื‘ื˜ื•ื— ืฉื”ืชื™ืื•ืจ ืฉืœื• ืจืœื•ื•ื ื˜ื™ ืœื—ืœื•ื˜ื™ืŸ.

ื‘ื”ืชื—ืœื” ื ื™ืกื™ืชื™ ืœื™ืฆื•ืจ TCG backend ืžืœื, ืื‘ืœ ืžื”ืจ ืžืื•ื“ ื”ืชื‘ืœื‘ืœืชื™ ื‘ืงื•ื“ ื”ืžืงื•ืจ ื•ื‘ืชื™ืื•ืจ ืœื ืœื’ืžืจื™ ื‘ืจื•ืจ ืฉืœ ื”ื•ืจืื•ืช ื”-bytecode, ืื– ื”ื—ืœื˜ืชื™ ืœืขื˜ื•ืฃ ืืช ื”ืžืชื•ืจื’ืžืŸ TCI. ื–ื” ื ืชืŸ ืžืกืคืจ ื™ืชืจื•ื ื•ืช:

  • ื‘ืขืช ื™ื™ืฉื•ื ืžื—ื•ืœืœ ืงื•ื“, ืืชื” ื™ื›ื•ืœ ืœื”ืกืชื›ืœ ืœื ืขืœ ืชื™ืื•ืจ ื”ื”ื•ืจืื•ืช, ืืœื ืขืœ ืงื•ื“ ื”ืžืชื•ืจื’ืžืŸ
  • ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืคื•ื ืงืฆื™ื•ืช ืœื ืขื‘ื•ืจ ื›ืœ ื‘ืœื•ืง ืชืจื’ื•ื ืฉื ืชืงืœ ื‘ื•, ืืœื, ืœืžืฉืœ, ืจืง ืœืื—ืจ ื”ื‘ื™ืฆื•ืข ื”ืžืื”
  • ืื ื”ืงื•ื“ ืฉื ื•ืฆืจ ืžืฉืชื ื” (ื•ื ืจืื” ืฉื–ื” ืืคืฉืจื™, ืื ืœืฉืคื•ื˜ ืœืคื™ ื”ืคื•ื ืงืฆื™ื•ืช ืขื ืฉืžื•ืช ื”ืžื›ื™ืœื™ื ืืช ื”ืžื™ืœื” patch), ืืฆื˜ืจืš ืœื‘ื˜ืœ ืืช ืชื•ืงืฃ ืงื•ื“ ื”-JS ืฉื ื•ืฆืจ, ืื‘ืœ ืœืคื—ื•ืช ื™ื”ื™ื” ืœื™ ืžืžื” ืœื™ืฆื•ืจ ืื•ืชื• ืžื—ื“ืฉ.

ืœื’ื‘ื™ ื”ื ืงื•ื“ื” ื”ืฉืœื™ืฉื™ืช, ืื ื™ ืœื ื‘ื˜ื•ื— ืฉืชื™ืงื•ืŸ ืืคืฉืจื™ ืœืื—ืจ ื‘ื™ืฆื•ืข ื”ืงื•ื“ ื‘ืคืขื ื”ืจืืฉื•ื ื”, ืื‘ืœ ืฉืชื™ ื”ื ืงื•ื“ื•ืช ื”ืจืืฉื•ื ื•ืช ืžืกืคื™ืงื•ืช.

ื‘ืชื—ื™ืœื”, ื”ืงื•ื“ ื ื•ืฆืจ ื‘ืฆื•ืจื” ืฉืœ ืžืชื’ ื’ื“ื•ืœ ื‘ื›ืชื•ื‘ืช ืฉืœ ื”ื•ืจืืช ื”-bytecode ื”ืžืงื•ืจื™ืช, ืื‘ืœ ืœืื—ืจ ืžื›ืŸ, ื›ืฉื ื–ื›ืจืชื™ ื‘ืžืืžืจ ืขืœ Emscripten, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ JS ืฉื ื•ืฆืจ ื•-relooping, ื”ื—ืœื˜ืชื™ ืœื™ืฆื•ืจ ืงื•ื“ ืื ื•ืฉื™ ื™ื•ืชืจ, ื‘ืžื™ื•ื—ื“ ืžื›ื™ื•ื•ืŸ ืฉืžื‘ื—ื™ื ื” ืืžืคื™ืจื™ืช ื–ื” ื”ืชื‘ืจืจ ืฉื ืงื•ื“ืช ื”ื›ื ื™ืกื” ื”ื™ื—ื™ื“ื” ืœื‘ืœื•ืง ื”ืชืจื’ื•ื ื”ื™ื ื”ื”ืชื—ืœื” ืฉืœื•. ืœื ืžื•ืงื“ื ื™ื•ืชืจ ืžืืฉืจ ื ืขืฉื”, ืœืื—ืจ ื–ืžืŸ ืžื” ื”ื™ื” ืœื ื• ืžื—ื•ืœืœ ืงื•ื“ ืฉื™ืฆืจ ืงื•ื“ ืขื ifs (ืื ื›ื™ ืœืœื ืœื•ืœืื•ืช). ืื‘ืœ ืžื–ืœ ืจืข, ื–ื” ื”ืชืจืกืง, ื ื•ืชืŸ ื”ื•ื“ืขื” ืฉื”ื”ื•ืจืื•ืช ื”ื™ื• ื‘ืื•ืจืš ืœื ื ื›ื•ืŸ. ื™ืชืจื” ืžื›ืš, ื”ื”ื•ืจืื” ื”ืื—ืจื•ื ื” ื‘ืจืžืช ื”ืจืงื•ืจืกื™ื” ื”ื–ื• ื”ื™ื™ืชื” brcond. ืื•ืงื™ื™, ืื ื™ ืื•ืกื™ืฃ ืฆ'ืง ื–ื”ื” ืœื”ืคืงืช ื”ื”ื•ืจืื” ื”ื–ื• ืœืคื ื™ ื•ืื—ืจื™ ื”ืฉื™ื—ื” ื”ืจืงื•ืจืกื™ื‘ื™ืช ื•... ืืฃ ืื—ืช ืžื”ืŸ ืœื ื‘ื•ืฆืขื”, ืื‘ืœ ืื—ืจื™ ื”-assert switch ื”ื ืขื“ื™ื™ืŸ ื ื›ืฉืœื•. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ืœืื—ืจ ืœื™ืžื•ื“ ื”ืงื•ื“ ืฉื ื•ืฆืจ, ื”ื‘ื ืชื™ ืฉืื—ืจื™ ื”ืžืขื‘ืจ, ื”ืžืฆื‘ื™ืข ืœื”ื•ืจืื” ื”ื ื•ื›ื—ื™ืช ื ื˜ืขืŸ ืžื—ื“ืฉ ืžื”ืžื—ืกื ื™ืช ื•ื›ื›ืœ ื”ื ืจืื” ืžื•ื—ืœืฃ ืขืœ ื™ื“ื™ ืงื•ื“ ื”-JavaScript ืฉื ื•ืฆืจ. ื•ื›ืš ื™ืฆื. ื”ื’ื“ืœืช ื”ืžืื’ืจ ืžืžื’ื”-ื‘ื™ื™ื˜ ืื—ื“ ืœืขืฉืจื” ืœื ื”ื•ื‘ื™ืœื” ืœื›ืœื•ื, ื•ื”ืชื‘ืจืจ ืฉืžื—ื•ืœืœ ื”ืงื•ื“ ืคื•ืขืœ ื‘ืžืขื’ืœื™ื. ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื‘ื“ื•ืง ืฉืœื ื—ืจื’ื ื• ืžื’ื‘ื•ืœื•ืช ื”ืฉื—ืคืช ื”ื ื•ื›ื—ื™ืช, ื•ืื ื›ืŸ ืื– ืชื•ืฆื™ื ืืช ื”ื›ืชื•ื‘ืช ืฉืœ ื”ืฉื—ืคืช ื”ื‘ืื” ืขื ืกื™ืžืŸ ืžื™ื ื•ืก ื›ื“ื™ ืฉื ื•ื›ืœ ืœื”ืžืฉื™ืš ื‘ื‘ื™ืฆื•ืข. ื‘ื ื•ืกืฃ, ื–ื” ืคื•ืชืจ ืืช ื”ื‘ืขื™ื” "ืื™ื–ื” ืคื•ื ืงืฆื™ื•ืช ืฉื ื•ืฆืจื• ืฆืจื™ื›ื•ืช ืœื”ื™ื•ืช ืœื ื—ื•ืงื™ื•ืช ืื ืคื™ืกืช ื”ื‘ืชื™ื ื”ื–ื• ื”ืฉืชื ืชื”?" - ื™ืฉ ืœื‘ื˜ืœ ืจืง ืืช ื”ืคื•ื ืงืฆื™ื” ื”ืชื•ืืžืช ืœื‘ืœื•ืง ื”ืชืจื’ื•ื ื”ื–ื”. ืื’ื‘, ืœืžืจื•ืช ืฉื ื™ืคื™ืชื™ ื‘ืื’ื™ื ื‘-Chromium (ืžืื—ืจ ืฉืื ื™ ืžืฉืชืžืฉ ื‘ืคื™ื™ืจืคื•ืงืก ื•ืงืœ ืœื™ ื™ื•ืชืจ ืœื”ืฉืชืžืฉ ื‘ื“ืคื“ืคืŸ ื ืคืจื“ ืœื ื™ืกื•ื™ื™ื), ืคื™ื™ืจืคื•ืงืก ืขื–ืจ ืœื™ ืœืชืงืŸ ืื™-ืชืื™ืžื•ืช ืขื ืชืงืŸ 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 ืžืงื•ื“ ืžื›ื•ื ื” ื•ืขื“ JavaScript
  • ื™ืฉ ืชื‘ื ื™ืช ืœื”ืจื›ื‘ืช ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืื•ืจื— ืื—ืจื•ืช ืฉืœ 32 ืกื™ื‘ื™ื•ืช: ื›ืจื’ืข ืืชื” ื™ื›ื•ืœ ืœื”ืชืคืขืœ ืž-Linux ืขื‘ื•ืจ ืืจื›ื™ื˜ืงื˜ื•ืจืช MIPS ืฉืงืคืื” ื‘ื“ืคื“ืคืŸ ื‘ืฉืœื‘ ื”ื˜ืขื™ื ื”

ืžื” ืขื•ื“ ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช

  • ื”ืืฆืช ื”ื“ืžื™ื™ื”. ืืคื™ืœื• ื‘ืžืฆื‘ JIT ื ืจืื” ืฉื”ื•ื ืคื•ืขืœ ืœืื˜ ื™ื•ืชืจ ืžืืฉืจ Virtual x86 (ืื‘ืœ ื™ืฉ ืคื•ื˜ื ืฆื™ืืœ Qemu ืฉืœื ืขื ื”ืจื‘ื” ื—ื•ืžืจื” ื•ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืžื—ืงื•ืช)
  • ื›ื“ื™ ืœื™ืฆื•ืจ ืžืžืฉืง ื ื•ืจืžืœื™ - ืœืžืขืŸ ื”ืืžืช, ืื ื™ ืœื ืžืคืชื— ืื™ื ื˜ืจื ื˜ ื˜ื•ื‘, ืื– ืœืขืช ืขืชื” ื™ืฆืจืชื™ ืžื—ื“ืฉ ืืช ืžืขื˜ืคืช Emscripten ื”ืกื˜ื ื“ืจื˜ื™ืช ื›ืžื™ื˜ื‘ ื™ื›ื•ืœืชื™
  • ื ืกื” ืœื”ืคืขื™ืœ ืคื•ื ืงืฆื™ื•ืช ืžื•ืจื›ื‘ื•ืช ื™ื•ืชืจ ืฉืœ Qemu - ืจืฉืชื•ืช, ื”ืขื‘ืจืช VM ื•ื›ื•'.
  • UPD: ืชืฆื˜ืจืš ืœื”ื’ื™ืฉ ืืช ืžืกืคืจ ื”ื”ืชืคืชื—ื•ื™ื•ืช ื•ื“ื™ื•ื•ื—ื™ ื”ื‘ืื’ื™ื ืฉืœืš ืœ-Emscripten ื‘ืžืขืœื” ื”ื–ืจื, ื›ืคื™ ืฉืขืฉื• ืกื‘ืœื™ื ืงื•ื“ืžื™ื ืฉืœ Qemu ื•ืคืจื•ื™ืงื˜ื™ื ืื—ืจื™ื. ืชื•ื“ื” ืœื”ื ืขืœ ื”ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ืื•ืคืŸ ืžืจื•ืžื– ื‘ืชืจื•ืžืชื ืœ-Emscripten ื›ื—ืœืง ืžื”ืžืฉื™ืžื” ืฉืœื™.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”