QEMU.js: เบ”เบฝเบงเบ™เบตเป‰เบฎเป‰เบฒเบเปเบฎเบ‡เปเบฅเบฐเบกเบต WASM

เบกเบตเบ„เบฑเป‰เบ‡เปœเบถเปˆเบ‡เบ‚เป‰เบญเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบกเปˆเบงเบ™ เบžเบดเบชเบนเบ”เบเบฒเบ™เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ เปเบฅเบฐเบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡ JavaScript (เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ, Asm.js) เบˆเบฒเบเบฅเบฐเบซเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ. QEMU เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡, เปเบฅเบฐเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ•เปเปˆเบกเบฒเบšเบปเบ”เบ„เบงเบฒเบกเป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ Habr. เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰ remake เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ WebAssembly, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เป€เบŠเบปเบฒเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡ เป€เบเบทเบญเบšเปเบฅเป‰เบง เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เปƒเบ”โ€‹เบซเบ™เบถเปˆเบ‡ ... เบงเบฝเบโ€‹เป€เบฎเบฑเบ”โ€‹เบ‡เบฒเบ™โ€‹เบ—เปเบฒโ€‹เป„เบ”เป‰โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เป„เบ›โ€‹, เปเบ•เปˆโ€‹เบŠเป‰เบฒโ€‹เบซเบผเบฒเบโ€‹, เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹, เบšเปเปˆโ€‹เบ”เบปเบ™โ€‹เบกเบฒโ€‹เบ™เบตเป‰โ€‹เปƒเบ™โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบฑเป‰เบ™โ€‹เป„เบ”เป‰โ€‹เบ›เบฒโ€‹เบเบปเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹. commentary เปƒเบ™เบซเบปเบงเบ‚เปเป‰ "เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เปเบ™เบงเปƒเบ”?" เปƒเบ™เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบเบฑเบšเบ„เปเบฒเบ•เบญเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ‚เป‰เบญเบเป„เบ”เป‰เบเบดเบ™ "เบ™เบตเป‰เบ„เป‰เบฒเบเบ„เบทเบเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบก." เบ”เบต, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰, เบˆเบฐเบกเบตเบšเบปเบ”เบ„เบงเบฒเบก. เบšเบฒเบ‡เบ—เบตเบ„เบปเบ™เบˆเบฐเบžเบปเบšเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”. เบˆเบฒเบเบกเบฑเบ™, เบœเบนเป‰เบญเปˆเบฒเบ™เบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบšเบฒเบ‡เบ‚เปเป‰เป€เบ—เบฑเบ”เบˆเบดเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบญเบญเบเปเบšเบš backends เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบฅเบฐเบซเบฑเบ” QEMU, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ•เบปเบงเบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒ.

เบงเบฝเบเบ‡เบฒเบ™

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™ "เบšเบฒเบ‡เบญเบฑเบ™" port QEMU เบเบฑเบš JavaScript, เป€เบงเบฅเบฒเบ™เบตเป‰เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบฎเบฑเบ”เบกเบฑเบ™เบขเปˆเบฒเบ‡เบชเบฐเบซเบฅเบฒเบ”เปเบฅเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบเบปเปˆเบฒ.

เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบญเบฑเบ™เบ”เบฑเบšเบซเบ™เบถเปˆเบ‡: เบชเบฒเบ‚เบฒเบˆเบฒเบเบเบฒเบ™เบ›เปˆเบญเบเบˆเบธเบ”

เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™ fork เป€เบงเบตโ€‹เบŠเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฒเบโ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ•เบปเป‰เบ™โ€‹เบชเบฐโ€‹เบšเบฑเบš 2.4.1โ€‹. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบต: เบ–เป‰เบฒเบเบฒเบ™เบ›เปˆเบญเบเบˆเบธเบ”เบกเบตเบขเบนเปˆ, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบซเบผเบฒเบเบเปˆเบงเบฒเบ‡เปˆเบฒเบเบ”เบฒเบ 2.4, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเบผเบฒเบเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเบฒเบ‚เบฒ. master. เปเบฅเบฐเบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ‚เป‰เบญเบเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบˆเปเบฒเบ™เบงเบ™เปเบกเบ‡เป„เบกเป‰เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบปเบ™เบญเบทเปˆเบ™เป€เบฅเบตเบ. เบ™เบฑเป‰เบ™เบญเบฒเบ”เบˆเบฐเปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบกเบฑเบ™เบซเบฑเบ™เบญเบญเบ. เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆ: QEMU เบšเปเปˆเป„เบ”เป‰เบขเบทเบ™เบขเบนเปˆ, เปเบฅเบฐเปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เบžเบงเบเป€เบ‚เบปเบฒเบเปเปˆเบ›เบฐเบเบฒเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบ 10 เป€เบ›เบตเป€เบŠเบฑเบ™. "เปเบกเปˆเบ™เปเบฅเป‰เบง, เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเปเบŠเปˆเปเบ‚เบ‡," เบ‚เป‰เบญเบเบ„เบดเบ”เปเบฅเบฐเปเบ•เบเบซเบฑเบ. เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰ digression: เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฐเบ—เบนเป‰เบ‚เบญเบ‡ QEMU.js เปเบฅเบฐเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ QEMU เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบšเปเปˆเป„เบ”เป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบšเปเปˆเบกเบตเบซเบผเบฒเบ threading (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเป‰เบญเบกเบเบฑเบ™เบซเบผเบฒเบเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡, เปเบฅเบฐ. เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆ "เปƒเบŠเป‰เปเบเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”") เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™, เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฐเบ—เบนเป‰เบ—เบตเปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡ "เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบญเบญเบ" เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบˆเบฒเบเบžเบฒเบเบ™เบญเบ. เบ™เบตเป‰เป„เบ”เป‰เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒเบ—เปเบฒเบกเบฐเบŠเบฒเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบฅเบงเบกเบ•เบปเบง. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบˆเบฒเบเบชเบฒเบ‚เบฒ master, เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบก merge เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ, เบเบฑเบ‡เป„เบ”เป‰เบฎเบฑเบš cherry เปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบเบˆเบธเบ” (เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบชเบฒเบ‚เบฒเบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒ) เบเบฑเบ‡เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป„เบ”เป‰เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบˆเบฐเบ–เบดเป‰เบกเป€เบ„เบทเปˆเบญเบ‡เบ•เบปเป‰เบ™เปเบšเบš, เบ–เบญเบ”เบกเบฑเบ™เบญเบญเบเบชเปเบฒเบฅเบฑเบšเบžเบฒเบเบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†เปเบฅเบฐเบชเป‰เบฒเบ‡เบฎเบธเปˆเบ™เปƒเบซเบกเปˆเบˆเบฒเบเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบปเบ”เบเบงเปˆเบฒเปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบˆเบฒเบ. master.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบญเบฑเบ™เบ”เบฑเบšเบชเบญเบ‡: เบงเบดเบ—เบตเบเบฒเบ™ TLP

เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบง, เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบœเบดเบ”เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡ "เบšเปˆเบญเบ™เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบเป‰เบฒเบเบญเบญเบเป„เบ›?" เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ› "เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ›เบ—เบตเปˆเบ™เบฑเป‰เบ™เบšเป?" เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰ เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก clumsy เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เปเบ•เปˆ, เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ”, เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบเป‚เบ”เบเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™. เป€เบงเบฅเบฒเบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเป€เบฎเบฑเบ”เบกเบฑเบ™เบขเปˆเบฒเบ‡เบชเบฐเบซเบฅเบฒเบ”: commits เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบน, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”เบชเบฐเบ•เบด (เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™ "stringing random เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบฎเปˆเบงเบกเบเบฑเบ™เบˆเบปเบ™เบเปˆเบงเบฒเบกเบฑเบ™เบฅเบงเบšเบฅเบงเบก (เบกเบตเบ„เปเบฒเป€เบ•เบทเบญเบ™)", Linus Torvalds เป€เบ„เบตเบเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเปƒเบœเบœเบนเป‰เบซเบ™เบถเปˆเบ‡, เบญเบตเบ‡เบ•เบฒเบก Wikiquote), เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบชเบฒเบก: เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ™เป‰เปเบฒเป‚เบ”เบเบšเปเปˆเบฎเบนเป‰ ford

เบ‚เป‰เบญเบเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบเปเบฒเบˆเบฑเบ”เบกเบฑเบ™เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เปเบ•เปˆเบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบšเปเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ•เปเปˆเบ•เป‰เบฒเบ™เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ, เปเบฅเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™ "เป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบซเบเปˆ", เบ„เบท, เบ‚เบฝเบ™ TCG backend เบ‚เบญเบ‡เบ‚เป‰เบญเบเบˆเบฒเบเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เป€เบžเบทเปˆเบญเบšเปเปˆเป€เบ›เบฑเบ™. เบ•เป‰เบญเบ‡เป€เบงเบปเป‰เบฒเบ•เปเปˆเบกเบฒ, "เปเบกเปˆเบ™เปเบฅเป‰เบง, เปเบ™เปˆเบ™เบญเบ™, เบŠเป‰เบฒ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบงเบšเบ„เบธเบกเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡ - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆ TCI เบ–เบทเบเบ‚เบฝเบ™ ... " เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบ™เบตเป‰เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆ เบ‚เป‰เบญเบเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ–เบฒเบ™เบชเบญเบ‡. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒ, "Ghent เป„เบ”เป‰เบฅเบงเบšเบฅเบงเบกัƒ, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบญเบฑเบ™เบ™เบฑเป‰เบ™ ": เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™, เปเบ™เปˆเบ™เบญเบ™, เบ„เบนเปˆ, เปเบ•เปˆเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเป‚เบญเบ™เบžเบฝเบ‡เปเบ•เปˆเบเบฑเบšเบกเบฑเบ™ - เบกเบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบŠเบธเบเบเบนเป‰เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบก, เป€เบŠเบดเปˆเบ‡เบเปเปˆเปƒเบซเป‰เป€เบเบตเบ”เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบˆเบฒเบเป‚เบฅเบ JS, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™. เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เป„เบงเป‰โ€‹เบšเบฒเบ‡โ€‹เบšเปˆเบญเบ™โ€‹. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ RISC เบ›เบปเบเบเบฐเบ•เบด, เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆ, เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเบ„เปˆเบฒ cache เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เปƒเบซเบกเปˆเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™ - เบ–เป‰เบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™, เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เปƒเบเป‰เบŠเบดเบ”. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบˆเบฒเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ‚เป‰เบญเบเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบงเปˆเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเบเบฒเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบเบฒเบ™เปเบ›เบžเบฒเบชเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบเปเปˆเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ bytecode เบ—เบตเปˆเบ–เบทเบเบ•เบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบˆเบฒเบเบเบฒเบ™เบŠเบปเบ”เป€เบŠเบตเบเปƒเบ”เป†, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบกเบฑเบ™เบˆเบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™ TB. .

เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบฒเปเบฅเบฐเป€เบ•เบฐ

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™เป€เบ”เบทเบญเบ™เบเปเบฅเบฐเบเบปเบ”, เป€เบซเบ”เบเบฒเบ™ magic เป„เบ”เป‰เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™: เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบˆเบปเบ”เบซเบกเบฒเบเบˆเบฒเบ GitHub เบกเบฒเบฎเบญเบ”เป€เบ›เบฑเบ™เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเบšเบฑเบ™เบซเบฒเปเบฅเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡, เปเบ•เปˆเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เบ—เบฑเบ™เปƒเบ”เบ™เบฑเป‰เบ™ เบเปˆเบฒเบงเปƒเบ™เบเบฐเบ—เบนเป‰ Binaryen เป€เบ›เบฑเบ™ backend qemu เปƒเบ™เบชเบฐเบžเบฒเบšเบเบฒเบ™, "เบฅเบฒเบงเป„เบ”เป‰เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบฑเป‰เบ™, เบšเบฒเบ‡เบ—เบตเบฅเบฒเบงเบญเบฒเบ”เบˆเบฐเป€เบงเบปเป‰เบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡." เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ‚เบญเบ‡ Emscripten Binaryen เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ WASM JIT. เบ”เบต, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบšเบญเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” Apache 2.0 เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เปเบฅเบฐ QEMU เป‚เบ”เบเบฅเบงเบกเปเบกเปˆเบ™เปเบˆเบเบขเบฒเบเบžเบฒเบเปƒเบ•เป‰ GPLv2, เปเบฅเบฐเบžเบงเบเบกเบฑเบ™เบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบซเบผเบฒเบ. เบ—เบฑเบ™เปƒเบ”เบ™เบฑเป‰เบ™เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบงเปˆเบฒเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเบฒเบกเบฒเบ” เปเบเป‰เป„เบ‚เบกเบฑเบ™เบขเปˆเบฒเบ‡เปƒเบ” (เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰: เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบˆเบฐเบ›เปˆเบฝเบ™เบกเบฑเบ™, เบšเบฒเบ‡เบ—เบตเบเบฒเบ™เบญเบญเบเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเบญเบ‡, เบšเบฒเบ‡เบ—เบตเบชเบดเปˆเบ‡เบญเบทเปˆเบ™ ... ). เบ™เบตเป‰, เปเบ™เปˆเบ™เบญเบ™, เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบกเบตเบ„เบงเบฒเบกเบชเบธเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบขเปˆเบฒเบ‡เปƒเบเป‰เบŠเบดเบ” เบฎเบนเบšเปเบšเบšเบ–เบฒเบ™เบชเบญเบ‡ WebAssembly, เปเบฅเบฐเบ‚เป‰เบญเบเบฎเบนเป‰เบชเบถเบเป‚เบชเบเป€เบชเบปเป‰เบฒเปเบฅเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบˆเบฐ devour เบ•เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบกเบตเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™, เบœเบฐเบฅเบดเบ” bytecode, เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เปเบฅเปˆเบ™เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ™เบฒเบเบžเบฒเบชเบฒเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบตเบซเบผเบฒเบ เบˆเบปเบ”เบซเบกเบฒเบ เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบฒเบ‡เป„เบ›เบชเบฐเบ™เบต QEMU, เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฒเบ–เบฒเบก, "เปƒเบœเบ•เป‰เบญเบ‡เบเบฒเบ™เบกเบฑเบ™เปเบ™เบงเปƒเบ”?" เปเบฅเบฐเบกเบฑเบ™เปเบกเปˆเบ™ เบ—เบฑเบ™เปƒเบ”เบ™เบฑเป‰เบ™, เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™. เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบนเบ”เบฎเปˆเบงเบกเบเบฑเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เปเปˆเป„เบ›เบ™เบตเป‰, เบ–เป‰เบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบเป„เบง:

  • เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเบฒเบ™เบชเบถเบเบชเบฒเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ”เป†
  • virtualization เปƒเบ™ iOS, เบšเปˆเบญเบ™เบ—เบตเปˆ, เบ•เบฒเบกเบ‚เปˆเบฒเบงเบฅเบท, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ”เบฝเบงเบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เปƒเบ™เบเบฒเบ™เบšเบดเบ™เปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ JS (เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบšเป?)
  • เบเบฒเบ™เบชเบฒเบ—เบดเบ” mini-OS - single-floppy, built-in, firmware เบ—เบธเบเบŠเบฐเบ™เบดเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป† ...

เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ” Runtime เบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเปเบฅเป‰เบง, QEMU เปเบกเปˆเบ™เบ•เบดเบ”เบเบฑเบš multithreading, เปเบ•เปˆเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบšเปเปˆเบกเบตเบกเบฑเบ™. เปเบฅเป‰เบง, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเปเปˆ ... เบ—เปเบฒเบญเบดเบ”เบกเบฑเบ™เบšเปเปˆเบกเบตเบขเบนเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ WebWorkers เบ›เบฒเบเบปเบ” - เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเป€เบ‚เบปเป‰เบฒเปƒเบˆ, เบ™เบตเป‰เปเบกเปˆเบ™ multithreading เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ–เปˆเบฒเบเบ—เบญเบ”. เป‚เบ”เบเบšเปเปˆเบกเบตเบ•เบปเบงเปเบ›เบ—เบตเปˆเปเบšเปˆเบ‡เบ›เบฑเบ™. เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ”, เบ™เบตเป‰เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ porting เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบงเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบฎเบนเบšเปเบšเบšเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบฒเบเปƒเบ•เป‰เบ„เบงเบฒเบกเบเบปเบ”เบ”เบฑเบ™เบ‚เบญเบ‡เบ›เบฐเบŠเบฒเบŠเบปเบ™, เบกเบฑเบ™เบเบฑเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฒเบเปƒเบ•เป‰เบŠเบทเปˆ SharedArrayBuffers. เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเป€เบ—เบทเปˆเบญเบฅเบฐเบเป‰เบฒเบง, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบผเบตเบกเบชเบฐเบซเบผเบญเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบ•เบปเบ™เปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบผเบตเบกเบชเบฐเบซเบผเบญเบ‡เบ›เบตเปƒเบซเบกเปˆ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ Meltdown ... เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบฒเบชเบฐเบซเบฅเบธเบšเบงเปˆเบฒเบซเบเบฒเบšเบซเบผเบทเบซเบเบฒเบšเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเป€เบงเบฅเบฒ, เปเบ•เปˆเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบฎเปˆเบงเบกเบเบฑเบ™เปเบฅเบฐเป€เบ›เบฑเบ™. thread incrementing counter, เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ„เบทเบเบฑเบ™ เบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบญเบญเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ›เบดเบ” multithreading เบเบฑเบšเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™. เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ•เปเปˆเบกเบฒเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบซเบฑเบ™เบกเบฑเบ™เบ„เบทเบ™เบกเบฒ, เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™เบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เบกเบตเบŠเบตเบงเบดเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบกเบฑเบ™, เปเบฅเบฐเบ–เป‰เบฒเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฎเบฑเบ”เบกเบฑเบ™เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบญเบตเบ‡เปƒเบชเปˆ multithreading.

เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒเบเบฑเบš stack เป„เบ”เป‰: เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆเป€เบญเบปเบฒ, เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบชเบฐเบžเบฒเบšเบเบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเบชเบฐเบซเบผเบฑเบšเบเบฑเบšเปƒเบซเบกเปˆเบ—เบตเปˆเบกเบต stack เปƒเบซเบกเปˆ. เปเบ–เบšเบเบฒเบ™เป‚เบ—เบ–เบทเบเบˆเบฑเบ”เบเบฒเบ™เป‚เบ”เบ JS virtual machine. เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ, เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบซเบเบฑเบ‡, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฐเปเบชเปƒเบ™เบญเบฐเบ”เบตเบ”เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡? เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒ เบ•เบฑเบ™ I/O เปƒเบ™ QEMU เปเบกเปˆเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบœเปˆเบฒเบ™ coroutines, เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰ stack เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒเบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”. เป‚เบŠเบเบ”เบต, Emscipten เบกเบตเบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ asynchronous เปเบฅเป‰เบง, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเบญเบ‡: เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡ ะธ เบ™เบฒเบเบžเบฒเบชเบฒ. เบญเบฑเบ™เบ—เปเบฒเบญเบดเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ bloat เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบฅเบฐเบซเบฑเบ” JavaScript เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบญเบตเบเบ•เปเปˆเป„เบ›. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™ "เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡" เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ” bytecode เบชเปเบฒเบฅเบฑเบšเบ™เบฒเบเบžเบฒเบชเบฒเบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡. เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ™เปˆเบ™เบญเบ™, เบŠเป‰เบฒ, เปเบ•เปˆเบกเบฑเบ™เบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ coroutines เบชเปเบฒเบฅเบฑเบšเบเบปเบ™เป„เบเบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ” (เบกเบต coroutines เบ—เบตเปˆเบ‚เบฝเบ™เปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบš Asyncify เปเบฅเบฐเบกเบตเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบฐเบกเบฒเบ™ API เบ”เบฝเบงเบเบฑเบ™เบชเปเบฒเบฅเบฑเบš Emterpreter, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบงเบเบกเบฑเบ™).

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เปเบเบเบฅเบฐเบซเบฑเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบขเบนเปˆเปƒเบ™ WASM เปเบฅเบฐเบ•เบตเบ„เบงเบฒเบกเบซเบกเบฒเบเป‚เบ”เบเปƒเบŠเป‰ Emterpreter, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบญเบธเบ›เบฐเบเบญเบ™ block เบเบฑเบ‡เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ—เบทเปˆเบญ (เป€เบšเบดเปˆเบ‡เปƒเบ™เบŠเบธเบ”เบ•เปเปˆเป„เบ›, เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒ ... ). เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ—เปˆเบฒเบ™เบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™: เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบŠเบฑเป‰เบ™เบ•เบฐเบซเบฅเบปเบเบ™เบตเป‰:

  • เบเบฒเบ™เบ•เบตเบ„เบงเบฒเบกเปเบฒเบเบ‚เบญเบ‡เบ•เบฑเบ™ I/O. เปเบฅเป‰เบง, เป€เบˆเบปเป‰เบฒเบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบฎเบฑเบ”เบ•เบฒเบก NVMe เบเบฑเบšเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡เบšเป? ๐Ÿ™‚
  • เบฅเบงเบšเบฅเบงเบกเบฅเบฐเบซเบฑเบ” QEMU เบซเบผเบฑเบ (เบ™เบฑเบเปเบ›, เบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบ•เบฒเบกเปเบšเบšเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เป†, เปเบฅเบฐเบญเบทเปˆเบ™เป†)
  • เบฅเบงเบšเบฅเบงเบกเบฅเบฐเบซเบฑเบ”เปเบ‚เบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ WASM เปเบšเบšเป„เบ”เบ™เบฒเบกเบดเบ

เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เปเบซเบผเปˆเบ‡ QEMU

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบ„เบฒเบ”เป€เบ”เบปเบฒเปเบฅเป‰เบง, เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เปเบ‚เบเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบ„เบทเปˆเบญเบ‡เป‚เบฎเบ”เปเบกเปˆเบ™เปเบเบเบญเบญเบเปƒเบ™ QEMU. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ:

  • เบกเบตเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เปเบ‚เบ
  • เบกเบตเปเบกเปˆเบ™ เป€เบ„เบทเปˆเบญเบ‡เป€เบฅเบฑเปˆเบ‡, เบ„เบท, KVM เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ virtualization เบฎเบฒเบ”เปเบงเปƒเบ™ Linux (เบชเปเบฒเบฅเบฑเบšเปเบ‚เบเปเบฅเบฐเบฅเบฐเบšเบปเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™), TCG เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” JIT เบ—เบธเบเบšเปˆเบญเบ™. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ QEMU 2.9, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ virtualization เบฎเบฒเบ”เปเบง HAXM เปƒเบ™ Windows เบ›เบฒเบเบปเบ” (เบฅเบฒเบเบฅเบฐเบญเบฝเบ”)
  • เบ–เป‰เบฒ TCG เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบฎเบฒเบ”เปเบง virtualization, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบฅเบฐเบซเบฑเบ”เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบžเบฒเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบš, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ™เบฒเบเปเบ›เบžเบฒเบชเบฒเบ—เบปเปˆเบงเป„เบ›.
  • ... เปเบฅเบฐเบ›เบฐเบกเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰ - emulated peripherals, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰, เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ, เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบ replay, เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบšเป: QEMU เบชเบฒเบกเบฒเบ” emulate เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบเบฑเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบชเปเบฒเบฅเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบœเบนเป‰เปƒเบŠเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™ kernel เป€เบˆเบปเป‰เบฒเบžเบฒเบš, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบ”เบ AFL fuzzer เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเบญเบ‡. เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบกเบตเปƒเบœเบœเบนเป‰เบซเบ™เบถเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™ port เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ™เบตเป‰เบ‚เบญเบ‡ QEMU เบเบฑเบš JS? ๐Ÿ˜‰

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบŠเบญเบšเปเบงเบŸเบฃเบตเบ—เบตเปˆเบกเบตเป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบ—เบตเปˆเบชเบธเบ”, QEMU เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป‚เบ— configure ะธ make. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡: backend TCG, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฐเบ—เบนเป‰, เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบญเบทเปˆเบ™. เบขเปˆเบฒเบŸเป‰เบฒเบงเบ—เบตเปˆเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบธเบ / เบขเป‰เบฒเบ™ (เบ‚เบตเบ”เบเป‰เบญเบ‡เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก) เปƒเบ™เบ„เบงเบฒเบกเบชเบปเบ”เปƒเบชเบ”เป‰เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบš Autoconf - เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, configure QEMU's เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™เบงเปˆเบฒเบ‚เบฝเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบˆเบฒเบเบชเบดเปˆเบ‡เปƒเบ”.

เบเบฒเบ™เบ›เบฐเบเบญเบšเป€เบงเบฑเบš

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ WebAssembly (aka WASM)? เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบชเปเบฒเบฅเบฑเบš Asm.js, เบšเปเปˆเป„เบ”เป‰เบ—เปเบฒเบ—เปˆเบฒเบงเปˆเบฒเป€เบ›เบฑเบ™เบฅเบฐเบซเบฑเบ” JavaScript เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบญเบตเบเบ•เปเปˆเป„เบ›. เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบกเบฑเบ™เปเบกเปˆเบ™เบชเบญเบ‡เบญเบฑเบ™เบšเปเบฅเบดเบชเบธเบ”เปเบฅเบฐเบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเป‰เบ”เบตเบ—เบตเปˆเบชเบธเบ”, เปเบฅเบฐเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบ‚เบฝเบ™เบˆเปเบฒเบ™เบงเบ™เป€เบ•เบฑเบกเปƒเบ™เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ: เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบซเบ™เบฒเปเบซเบ™เป‰เบ™, เบกเบฑเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบฎเบนเบšเปเบšเบš. LEB128.

เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบเบดเบ™เบเปˆเบฝเบงเบเบฑเบš algorithm relooping เบชเปเบฒเบฅเบฑเบš Asm.js - เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบŸเบทเป‰เบ™เบŸเบนเบ‚เบญเบ‡ "เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡" เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป„เบซเบผเบงเบฝเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, if- then-else, loops, etc.), เบชเปเบฒเบฅเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ JS เป„เบ”เป‰เบ–เบทเบเบญเบญเบเปเบšเบš, เบˆเบฒเบ LLVM IR เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ, เปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเบฅเบฐเบซเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเป‚เบ›เป€เบŠเบ”เป€เบŠเบต. เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ”, เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เบ‚เบญเบ‡ QEMU เปเบกเปˆเบ™เปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเบ—เบตเบชเบญเบ‡. เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™, bytecode, เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ—เปเบฅเบฐเบกเบฒเบ™ ... เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบตเบ•เบฑเบ™, if- then-else เปเบฅเบฐ loops!..

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆ Binaryen เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”: เบกเบฑเบ™เบ—เปเบฒเบกเบฐเบŠเบฒเบ”เบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบšเบ•เบฑเบ™เบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบขเบนเปˆเปƒเบเป‰เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ WASM. เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบœเบฐเบฅเบดเบ”เบฅเบฐเบซเบฑเบ”เบˆเบฒเบเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบ‚เบญเบ‡เบ•เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเบฐเบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเบกเบฑเบ™. เบ”เบต, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเปเบฅเป‰เบงเบงเปˆเบฒเบกเบฑเบ™เป€เบŠเบทเปˆเบญเบ‡เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ WebAssembly เบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบฅเบฑเบ‡ C / C ++ API เบ—เบตเปˆเบชเบฐเบ”เบงเบ.

TCG (เบ•เบปเบงเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ™เป‰เบญเบเป†)

เบšเปเบฅเบดเบชเบฑเบ” TCG เป€เบ”เบตเบก backend เบชเปเบฒเบฅเบฑเบš C compiler เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ—เบปเบ™เบเบฑเบšเบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบเบฑเบš GCC, เปเบ•เปˆเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบกเบฑเบ™เบžเบปเบšเป€เบซเบฑเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเปƒเบ™ QEMU เป€เบ›เบฑเบ™เบเบปเบ™เป„เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเป€เบˆเบปเป‰เบฒเบžเบฒเบš. เบเบฑเบ‡เบกเบต backend TCG เบ—เบตเปˆเบชเป‰เบฒเบ‡เบšเบฒเบ‡ bytecode เบ—เบตเปˆเบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบฑเบ™เบ—เบตเป‚เบ”เบเบ™เบฒเบเบžเบฒเบชเบฒ, เปเบ•เปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เปƒเบŠเป‰เบกเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเปƒเบ™ QEMU เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เป„เบ›เบชเบนเปˆ TB เบ—เบตเปˆเบœเบฐเบฅเบดเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ tcg_qemu_tb_exec, เบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ.

เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบก TCG backend เปƒเบซเบกเปˆเปƒเบชเปˆ QEMU, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡ subdirectory tcg/<ะธะผั ะฐั€ั…ะธั‚ะตะบั‚ัƒั€ั‹> (เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, tcg/binaryen), เปเบฅเบฐโ€‹เบกเบฑเบ™โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹เบชเบญเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹: tcg-target.h ะธ tcg-target.inc.c ะธ เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบเปˆเบฝเบงเบเบฑเบš configure. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบงเบฒเบ‡เป„เบŸเบฅเปŒเบญเบทเปˆเบ™เป†เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เปเบ•เปˆ, เบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ”เบปเบฒเบˆเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบญเบ‡เบญเบฑเบ™เบ™เบตเป‰, เบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบˆเบฐเบ–เบทเบเบฅเบงเบกเบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡: เบซเบ™เบถเปˆเบ‡เป€เบ›เบฑเบ™เป„เบŸเบฅเปŒ header เบ›เบปเบเบเบฐเบ•เบด (เบกเบฑเบ™เบ–เบทเบเบฅเบงเบกเบขเบนเปˆเปƒเบ™. tcg/tcg.h, เปเบฅเบฐเบญเบฑเบ™เบ™เบฑเป‰เบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒเบญเบทเปˆเบ™เบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต tcg, accel เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆ), เบญเบทเปˆเบ™เป† - เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™ snippet เบฅเบฐเบซเบฑเบ”เปƒเบ™ tcg/tcg.c, เปเบ•เปˆเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เบปเบ‡เบ—เบตเปˆเบ‚เบญเบ‡เบกเบฑเบ™.

เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เปƒเบ™เบเบฒเบ™เบชเบทเบšเบชเบงเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบ‚เป‰เบญเบเบžเบฝเบ‡เปเบ•เปˆเบ„เบฑเบ”เบฅเบญเบ "เป‚เบ„เบ‡เบเบฐเบ”เบนเบ" เบ‚เบญเบ‡เบชเบญเบ‡เป„เบŸเบฅเปŒเบ™เบตเป‰เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” backend เบญเบทเปˆเบ™, เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เบงเบฒเบกเบŠเบทเปˆเบชเบฑเบ”เปƒเบ™เบซเบปเบงเบ‚เปเป‰เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”.

เป€เบญเบเบฐเบชเบฒเบ™ tcg-target.h เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™เบฎเบนเบšเปเบšเบš #define-s:

  • เบกเบตเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปเบฅเบฐเบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เป€เบ—เบปเปˆเบฒเปƒเบ”เปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ (เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบˆเปเบฒเบ™เบงเบ™เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™, เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™ - เบ„เปเบฒเบ–เบฒเบกเปเบกเปˆเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เป€เบ›เบฑเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบ‚เบถเป‰เบ™เป‚เบ”เบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ "เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™" ...)
  • เบเบฒเบ™เบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบžเบฒเบš: เปƒเบ™ x86, เปเบฅเบฐเปเบกเป‰เปเบ•เปˆเบขเบนเปˆเปƒเบ™ TCI, เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบกเปˆเบ™เบšเปเปˆเบชเบญเบ”เบ„เปˆเบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเปƒเบชเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ” buffer เบšเปเปˆเปเบกเปˆเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” Binaryen, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒ: 4. เป„เบšเบ•เปŒ
  • เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ”เบ—เบตเปˆ backend เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป„เบ”เป‰ - เบžเบงเบเป€เบฎเบปเบฒเบฅเบงเบกเป€เบญเบปเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™ Binaryen, เปƒเบซเป‰เบ•เบปเบงเป€เบฅเบฑเปˆเบ‡เบเบฒเบ™เบ—เปเบฒเบฅเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบเบงเปˆเบฒ.
  • เบ‚เบฐเบซเบ™เบฒเบ”เบ›เบฐเบกเบฒเบ™เบ‚เบญเบ‡ cache TLB เบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เปเป‚เบ”เบ backend. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™ QEMU เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบฎเป‰เบฒเบเปเบฎเบ‡: เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบœเบนเป‰เบŠเปˆเบงเบเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบซเบผเบ” / เบฎเป‰เบฒเบ™เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡ MMU เปเบ‚เบ (เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบขเบนเปˆเปƒเบชเป‚เบ”เบเบšเปเปˆเบกเบตเบกเบฑเบ™เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™?), เบžเบงเบเป€เบ‚เบปเบฒเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ” cache เบเบฒเบ™เปเบ›เบžเบฒเบชเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบเบฑเบ‡เป‚เบ”เบเบเบปเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบฑเบ™เบญเบญเบเบญเบฒเบเบฒเบ”. เบ„เปเบฒเบ–เบฒเบกเปเบกเปˆเบ™, เบชเบดเปˆเบ‡เบ—เบตเปˆเบŠเบปเบ”เป€เบŠเบตเบเปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ™เบตเป‰เบ–เบทเบเบ›เบธเบ‡เปเบ•เปˆเบ‡เบขเปˆเบฒเบ‡เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เป‚เบ”เบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปเบฅเบฐเป„เบง?
  • เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบชเบญเบ‡เบ—เบฐเบšเบฝเบ™เบชเบฐเบซเบ‡เบงเบ™, เป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เป‚เบ—เบซเบฒ TB เบœเปˆเบฒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบชเบญเบ‡เบชเบฒเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. inline- เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เบ„เป‰เบฒเบโ€‹เบ„เบทโ€‹ flush_icache_range (เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ)

เป€เบญเบเบฐเบชเบฒเบ™ tcg-target.inc.cเปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒ, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบซเบผเบฒเบเปเบฅเบฐเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบšเบฑเบ‡เบ„เบฑเบšเบซเบผเบฒเบ:

  • เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบฅเบงเบกเบ—เบฑเบ‡เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปƒเบ”. เบชเบณเป€เบ™เบปเบฒเป‚เบ”เบเบ‚เป‰เบญเบเบขเปˆเบฒเบ‡เบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”เบˆเบฒเบเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡เบญเบทเปˆเบ™
  • เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เบถเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ bytecode เบžเบฒเบเปƒเบ™
  • เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบŠเปˆเบงเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เปเบฅเบฐเบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ static เบˆเบฒเบ tcg/tcg.c

เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบ‚เป‰เบญเบเป€เบญเบ‡, เบ‚เป‰เบญเบเป€เบฅเบทเบญเบเบเบธเบ”เบ—เบฐเบชเบฒเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เปƒเบ™เบ„เปเบฒเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เปเบ›เบžเบฒเบชเบฒเบ•เปเปˆเป„เบ›, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบชเบตเปˆเบ•เบปเบงเบŠเบตเป‰: เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ (เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เปƒเบ™เบšเปเบฅเบดเป€เบงเบ™เปƒเบเป‰เบ„เบฝเบ‡. 0xFFFFFFFF, เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ”เบชเบฐเบ–เบฒเบ™เบฐเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡ TB), เบšเปเบฅเบดเบšเบปเบ”, เป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™ magic เบชเปเบฒเบฅเบฑเบš debugging. เบ—เปเบฒเบญเบดเบ”เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเบ–เบทเบเบงเบฒเบ‡เป„เบงเป‰เปƒเบ™ 0xFFFFFFFF - nเบšเปˆเบญเบ™เบ—เบตเปˆ n - เบ•เบปเบงเป€เบฅเบเบšเบงเบเป€เบฅเบฑเบเป†เบ™เป‰เบญเบเป†, เปเบฅเบฐเปเบ•เปˆเบฅเบฐเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบœเปˆเบฒเบ™เบ™เบฒเบเบžเบฒเบชเบฒเบกเบฑเบ™เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ 1. เป€เบกเบทเปˆเบญเบกเบฑเบ™เบฎเบญเบ”. 0xFFFFFFFE, เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเป„เบ”เป‰เบˆเบฑเบ”เบ‚เบถเป‰เบ™, เป‚เบกเบ”เบนเบ™เป„เบ”เป‰เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™, เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ "เบ•เบปเบงเป€เบ›เบตเบ”" เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เป€เบŠเบดเปˆเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบกเบฒเบˆเบฒเบ. tcg_qemu_tb_exec, เปเบฅเบฐเป‚เบกเบ”เบนเบ™เป„เบ”เป‰เบ–เบทเบเป‚เบเบเบเป‰เบฒเบเบญเบญเบเบˆเบฒเบเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ QEMU.

เป€เบžเบทเปˆเบญเบ›เบฝเบšเบ—เบฝเบšเบ„เบฅเบฒเบชเบชเบดเบ, "Crutch, เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”เปเบกเปˆเบ™ intertwined เปƒเบ™เบชเบฝเบ‡เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบซเบปเบงเปƒเบˆเบ‚เบญเบ‡ proger ... ". เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเป„เบ”เป‰เบฎเบปเปˆเบงเป„เบซเบฅเบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ„เบธเป‰เบกเบ„เบญเบ‡เป‚เบ”เบ QEMU! เบ‚เป‰เบญเบเบกเบตเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆ, เป€เบกเบทเปˆเบญเบ‚เบฝเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ•เปเปˆเป„เบ› (เบ”เบต, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ•เบปเบงเบŠเบตเป‰), เบฅเบปเบšเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ™เบตเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบŠเปˆเบงเบ. เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”, QEMU เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เป€เบกเบทเปˆเบญ buffer เปเบฅเปˆเบ™เบญเบญเบ, เบฅเบฐเบซเบฑเบ”เบ–เบทเบเบ–เบดเป‰เบกเบญเบญเบเปเบฅเบฐเบ•เบปเบงเบ•เปเปˆเป„เบ›เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เบญเบ‡เบกเบฑเบ™.

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบถเบเบชเบฒเบฅเบฐเบซเบฑเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบงเปˆเบฒ trick เบ—เบตเปˆเบกเบตเป€เบฅเบ magic เป„เบ”เป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบเบฒเบ™เบ—เปเบฒเบฅเบฒเบ heap เป‚เบ”เบเบเบฒเบ™เบ›เบปเบ”เบ›เปˆเบญเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบœเบดเบ”เบžเบฒเบ”เปƒเบ™ buffer uninitialized เปƒเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ” pass. เปเบ•เปˆเปƒเบœเบ‚เบฝเบ™เปƒเบซเบกเปˆ buffer เป€เบžเบทเปˆเบญ bypass เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบ‚เป‰เบญเบเบ•เปเปˆเบกเบฒ? เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Emscripten เปเบ™เบฐเบ™เปเบฒ, เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบžเบปเบšเบšเบฑเบ™เบซเบฒ, เบ‚เป‰เบญเบเป„เบ”เป‰เบชเบปเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡, เบ•เบฑเป‰เบ‡ Mozilla Record-Replay เปƒเบชเปˆเบกเบฑเบ™ ... เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เป‰เบญเบเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ: เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบšเบฅเบฑเบญเบ, เบ struct TranslationBlock เบเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบกเบฑเบ™. เป€เบ”เบปเบฒเบขเบนเปˆเปƒเบช... เบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเป‰เบง, เบเปˆเบญเบ™เบ—เปˆเบญเบ™เป„เบกเป‰เบขเบนเปˆเปƒเบ™ buffer. เป‚เบ”เบเบฎเบนเป‰เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบŠเบปเบฒเปƒเบŠเป‰เป„เบกเป‰เบ„เป‰เบญเบ™ (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบšเบฒเบ‡เบญเบฑเบ™), เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบ–เบดเป‰เบกเบ•เบปเบงเป€เบฅเบ magic, เปเบฅเบฐเป‚เบญเบ™เบ„เปเบฒเบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเป„เบ›. struct TranslationBlock, เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ”เบฝเบงเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบœเปˆเบฒเบ™เป„เบ”เป‰เป„เบงเป€เบกเบทเปˆเบญ cache เบเบฒเบ™เปเบ›เบžเบฒเบชเบฒเบ–เบทเบเบ•เบฑเป‰เบ‡เปƒเบซเบกเปˆ, เปเบฅเบฐเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ.

เป„เบกเป‰เบ„เป‰เบญเบ™เบšเบฒเบ‡เบญเบฑเบ™เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ: เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบเบˆเบธเบ”เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ” buffer - เบšเบฒเบ‡เบญเบฑเบ™เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ BinaryenExpressionRef, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบ‚เบปเบฒเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเบšเบฅเบฑเบญเบเบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ BBs, เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป„เบ›. เบ”เบต, เบกเบตเบ—เปˆเบญเบ™เป„เบกเป‰เบ—เบตเปˆเบเบฝเบกเป„เบงเป‰เปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบš Relooper เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ•เบฒเบกเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚. เป€เบžเบทเปˆเบญเบˆเปเบฒเปเบ™เบเบžเบงเบเบกเบฑเบ™, เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบˆเบฑเบ”เบฎเบฝเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบตเปˆเป„เบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบชเบญเบ‡เบšเบดเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ›เป‰เบฒเบเบŠเบทเปˆเบขเปˆเบฒเบ‡เบ›เบญเบ”เป„เบž, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบˆเบทเปˆเบˆเปเบฒเป€เบญเบปเบฒเบกเบฑเบ™เบญเบญเบเบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบ›เป‰เบฒเบเบŠเบทเปˆเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเป‰เบงเปƒเบ™ QEMU เป€เบžเบทเปˆเบญเบŠเบตเป‰เบšเบญเบเป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบญเบเบˆเบฒเบ loop TCG.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Binaryen

เป‚เบกเบ”เบนเบ™เปƒเบ™ WebAssembly เบกเบตเบŸเบฑเบ‡เบŠเบฑเบ™, เปเบ•เปˆเบฅเบฐเบญเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบฎเปˆเบฒเบ‡เบเบฒเบ, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ. เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเปเบกเปˆเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” unary เปเบฅเบฐ binary, เบ•เบฑเบ™เบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฐเปเบ”เบ‡เบญเบญเบเบญเบทเปˆเบ™เป†, เบเบฒเบ™เป„เบซเบผเบ„เบงเบšเบ„เบธเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเปเบฅเป‰เบง, เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบ–เบทเบเบˆเบฑเบ”เบ‚เบทเป‰เบ™เบขเปˆเบฒเบ‡เปเบ™เปˆเบ™เบญเบ™เป€เบ›เบฑเบ™เบชเบฒเบ‚เบฒเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡, loops, เบเบฒเบ™เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบœเปˆเบฒเบ™เปƒเบ™ stack, เปเบ•เปˆเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™, เบ„เบทเบเบฑเบ™เบเบฑเบšเปƒเบ™ JS. เบเบฑเบ‡เบกเบตเบ•เบปเบงเปเบ›เบ—เบปเปˆเบงเป‚เบฅเบ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบšเบญเบเป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฑเบ‡เบกเบตเบ•เบปเบงเปเบ›เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™, เบ•เบปเบงเป€เบฅเบเบˆเบฒเบเบชเบนเบ™, เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”: int32 / int64 / float / double. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ•เบปเบงเปเบ›เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ—เปเบฒเบญเบดเบ” n เปเบกเปˆเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ. เบเบฐเบฅเบธเบ™เบฒเบฎเบฑเบšเบŠเบฒเบšเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒเบ—เบฑเบ‡เปเบปเบ”เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ„เบงเบšเบ„เบธเบก, เบˆเบณเบ™เบงเบ™เป€เบ•เบฑเบกเบเบฑเบ‡เบšเปเปˆเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” โ€œเป€เบŠเบฑเบ™/เบšเปเปˆเป„เบ”เป‰เป€เบŠเบฑเบ™โ€: เบ•เบปเบงเป€เบฅเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเปƒเบ”เบ‚เบถเป‰เบ™เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, Binaryen เบชเบฐเบซเบ™เบญเบ‡ C-API เบ‡เปˆเบฒเบเบ”เบฒเบ: เบ—เปˆเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เป‚เบกโ€‹เบ”เบนเบ™โ€‹, เปƒเบ™เบžเบฃเบฐเบญเบปเบ‡ เบชเป‰เบฒเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ - unary, binary, blocks เบˆเบฒเบเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบญเบทเปˆเบ™เป†, เบเบฒเบ™เป„เบซเบผเบ„เบงเบšเบ„เบธเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบกเบตเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเป€เบ›เบฑเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบ‚เบญเบ‡เบกเบฑเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™, เป€เบŠเบฑเปˆเบ™เบ‚เป‰เบญเบ, เบกเบตเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ, เบญเบปเบ‡เบ›เบฐเบเบญเบš relooper เบˆเบฐเบŠเปˆเบงเบเป€เบˆเบปเป‰เบฒเป„เบ”เป‰. เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเปƒเบˆ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป„เบซเบผเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบ•เบฑเบ™, เบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเป€เบเบตเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡เบ•เบฑเบ™ - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบง / เบŠเป‰เบฒเบžเบฒเบเปƒเบ™. เบเบฒเบ™เปเบเบเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบžเบฒเบเปƒเบ™เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ cache TLB เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เปเบ•เปˆเบšเปเปˆเปƒเบซเป‰เปเบŠเบเปเบŠเบ‡เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบก "เบžเบฒเบเบ™เบญเบ". เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ›เปˆเบญเบ relooper, เบ•เบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเบ›เบปเบ”เบ›เปˆเบญเบ; เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบ›เปˆเบญเบเป‚เบกเบ”เบนเบ™, เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™, เบซเบ™เป‰เบฒเบ—เบตเปˆ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบˆเบฑเบ”เบชเบฑเบ™เปƒเบซเป‰เบกเบฑเบ™เบซเบฒเบเป„เบ›. เบชเบฐเปœเบฒเบกเบเบดเบฅเบฒ.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบฅเบฐเบซเบฑเบ”เป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบชเป‰เบฒเบ‡เปเบฅเบฐเบฅเบถเบšเบ•เบปเบงเปเบ›เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเป€เบซเบ”เบœเบปเบ™เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒ C ++, เปเบฅเบฐเบˆเบฒเบเบ™เบฑเป‰เบ™เป‚เบ”เบเบเบปเบ‡เบˆเบฑเบ”เบเบฒเบ™ C ++ API เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”, bypassing ready- เป€เบฎเบฑเบ” wrappers.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™

// ะฝะฐัั‚ั€ะพะธั‚ัŒ ะณะปะพะฑะฐะปัŒะฝั‹ะต ะฟะฐั€ะฐะผะตั‚ั€ั‹ (ะผะพะถะฝะพ ะฟะพะผะตะฝัั‚ัŒ ะฟะพั‚ะพะผ)
BinaryenSetAPITracing(0);

BinaryenSetOptimizeLevel(3);
BinaryenSetShrinkLevel(2);

// ัะพะทะดะฐั‚ัŒ ะผะพะดัƒะปัŒ
BinaryenModuleRef MODULE = BinaryenModuleCreate();

// ะพะฟะธัะฐั‚ัŒ ั‚ะธะฟั‹ ั„ัƒะฝะบั†ะธะน (ะบะฐะบ ัะพะทะดะฐะฒะฐะตะผั‹ั…, ั‚ะฐะบ ะธ ะฒั‹ะทั‹ะฒะฐะตะผั‹ั…)
helper_type  BinaryenAddFunctionType(MODULE, "helper-func", BinaryenTypeInt32(), int32_helper_args, ARRAY_SIZE(int32_helper_args));
// (int23_helper_args ะฟั€ะธะพะฑ^WัะพะทะดะฐัŽั‚ัั ะพั‚ะดะตะปัŒะฝะพ)

// ัะบะพะฝัั‚ั€ัƒะธั€ะพะฒะฐั‚ัŒ ััƒะฟะตั€-ะผะตะณะฐ ะฒั‹ั€ะฐะถะตะฝะธะต
// ... ะฝัƒ ั‚ัƒั‚ ัƒะถ ะฒั‹ ะบะฐะบ-ะฝะธะฑัƒะดัŒ ัะฐะผะธ :)

// ะฟะพั‚ะพะผ ัะพะทะดะฐั‚ัŒ ั„ัƒะฝะบั†ะธัŽ
BinaryenAddFunction(MODULE, "tb_fun", tb_func_type, func_locals, FUNC_LOCALS_COUNT, expr);
BinaryenAddFunctionExport(MODULE, "tb_fun", "tb_fun");
...
BinaryenSetMemory(MODULE, (1 << 15) - 1, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
BinaryenAddMemoryImport(MODULE, NULL, "env", "memory", 0);
BinaryenAddTableImport(MODULE, NULL, "env", "tb_funcs");

// ะทะฐะฟั€ะพัะธั‚ัŒ ะฒะฐะปะธะดะฐั†ะธัŽ ะธ ะพะฟั‚ะธะผะธะทะฐั†ะธัŽ ะฟั€ะธ ะถะตะปะฐะฝะธะธ
assert (BinaryenModuleValidate(MODULE));
BinaryenModuleOptimize(MODULE);

... เบ–เป‰เบฒเบฅเบทเบกเบญเบฑเบ™เปƒเบ”เบเบฐเบ‚เปเป‚เบ—เบ”, เบญเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”, เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™.

เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ crack-fex-pex เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

static char buf[1 << 20];
BinaryenModuleOptimize(MODULE);
BinaryenSetMemory(MODULE, 0, -1, NULL, NULL, NULL, NULL, NULL, 0, 0);
int sz = BinaryenModuleWrite(MODULE, buf, sizeof(buf));
BinaryenModuleDispose(MODULE);
EM_ASM({
  var module = new WebAssembly.Module(new Uint8Array(wasmMemory.buffer, $0, $1));
  var fptr = $2;
  var instance = new WebAssembly.Instance(module, {
      'env': {
          'memory': wasmMemory,
          // ...
      }
  );
  // ะธ ะฒะพั‚ ัƒะถะต ัƒ ะฒะฐั ะตัั‚ัŒ instance!
}, buf, sz);

เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบฅเบเบ‚เบญเบ‡ QEMU เปเบฅเบฐ JS เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบฅเบงเบšเบฅเบงเบกเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ, array เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™ (เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ launcher), เปเบฅเบฐเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เป€เบžเบทเปˆเบญเบ„เบดเบ”เป„เบฅเปˆเบ”เบฑเบ”เบŠเบฐเบ™เบตเบขเปˆเบฒเบ‡เป„เบงเบงเบฒ, เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เบชเบนเบ™เบเบฒเบ™เปเบ›เบ„เปเบฒเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบกเบฑเบ™, เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเปƒเบŠเป‰เบชเบนเบ”เบ™เบตเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบซเบกเบฒเบฐเบเบฑเบšเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเปƒเบ™. struct TranslationBlock.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบเบฒเบ™เบชเบฒเบ—เบดเบ” (เบ›เบฐเบˆเบธเบšเบฑเบ™เบกเบตเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบ‚เบตเป‰เบ„เป‰เบฒเบ™) เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบตเปƒเบ™ Firefox. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Chrome เป„เบ”เป‰ somehow เบšเปเปˆเบžเป‰เบญเบก เบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเบผเบฒเบเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบžเบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป‚เบกเบ”เบนเบ™ WebAssembly, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฑเบ”เบชเบฑเบ™ gigabyte เบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ virtual เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ ...

เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™. เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบกเบตเบšเบปเบ”เบ„เบงเบฒเบกเบญเบทเปˆเบ™เบ–เป‰เบฒเปƒเบœเบชเบปเบ™เปƒเบˆ. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฑเบ‡เบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ เป€เบฎเบฑเบ”เปƒเบซเป‰เบญเบธเบ›เบฐเบเบญเบ™เบšเบฅเบฑเบญเบเป€เบฎเบฑเบ”เบงเบฝเบ. เบกเบฑเบ™เบเบฑเบ‡เบญเบฒเบ”เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ‚เบญเบ‡เป‚เบกเบ”เบนเบ™ WebAssembly asynchronous, เบ•เบฒเบกเบ›เบฐเป€เบžเบ™เบตเปƒเบ™เป‚เบฅเบ JS, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบเบฑเบ‡เบกเบตเบ™เบฒเบเบžเบฒเบชเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบˆเบปเบ™เบเปˆเบงเบฒเป‚เบกเบ”เบนเบ™เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡เบžเป‰เบญเบก.

เบชเบธเบ”เบ—เป‰เบฒเบ riddle: เบ—เปˆเบฒเบ™เป„เบ”เป‰เบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™เบ–เบฒเบ™เบชเบญเบ‡เปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ 32-bit, เปเบ•เปˆเบฅเบฐเบซเบฑเบ”, เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, เบ›เบตเบ™เบˆเบฒเบ Binaryen, เบšเบฒเบ‡เบšเปˆเบญเบ™เบขเบนเปˆเปƒเบ™ stack, เบซเบผเบทเบšเปˆเบญเบ™เบญเบทเปˆเบ™เปƒเบ™ 2 GB เป€เบ—เบดเบ‡เบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ 32-bit. เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡ Binaryen เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบเบตเบ™เป„เบ›เป€เบ›เบฑเบ™เบ—เบตเปˆเบขเบนเปˆเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš. เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบ›เบฐเบกเบฒเบ™เบ™เบตเป‰?

เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡ admin

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเป„เบ”เป‰เบชเบดเป‰เบ™เบชเบธเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ™เบตเป‰, เปเบ•เปˆเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™ "เบ–เป‰เบฒเบ‚เป‰เบญเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡ Linux 32-bit?" เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบชเปˆเบงเบ™เป€เบ—เบดเบ‡เบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบˆเบฐเบ–เบทเบเบ„เบญเบšเบ„เบญเบ‡เป‚เบ”เบ kernel. เบ„เปเบฒเบ–เบฒเบกเบ”เบฝเบงเปเบกเปˆเบ™เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”เบˆเบฐเบ–เบทเบเบ„เบญเบšเบ„เบญเบ‡: 1 เบซเบผเบท 2 Gb.

เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก (เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบ›เบฐเบ•เบดเบšเบฑเบ”)

เปƒเบซเป‰เบฅเบฐเป€เบšเบตเบ”เบŸเบญเบ‡เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ. เบ‚เป‰เบญเบเป€เบญเบ‡เบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ - เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ เปเบฅเป‰เบง เบ•เป‰เบญเบ‡เบกเบต stack เป€เบ›เบฑเบ™. เปเบ•เปˆ "เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบฑเบ™เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”: เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, เปเบ•เปˆเบšเปเปˆเบกเบตเปƒเบœเบฎเบนเป‰เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡ ... "

// 2gbubble.c
// Usage: LD_PRELOAD=2gbubble.so <program>

#include <sys/mman.h>
#include <assert.h>

void __attribute__((constructor)) constr(void)
{
  assert(MAP_FAILED != mmap(1u >> 31, (1u >> 31) - (1u >> 20), PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
}

... เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš Valgrind, เปเบ•เปˆ, เป‚เบŠเบเบ”เบต, Valgrind เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เป„เบ”เป‰เบเบฐเบ•เบธเป‰เบ™เปƒเบซเป‰เบ—เบธเบเบ„เบปเบ™เบญเบญเบเบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™ :)

เบšเบฒเบ‡เบ—เบตเบšเบฒเบ‡เบ„เบปเบ™เบˆเบฐเปƒเบซเป‰เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบ ...

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™