Qemu.js с ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° JIT: ΠΏΡŠΠ»Π½Π΅ΠΆΡŠΡ‚ всС ΠΎΡ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΡŠΡ€Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ

ΠŸΡ€Π΅Π΄ΠΈ няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ Ѐабрис Π‘Π΅Π»Π°Ρ€Π΄ написано ΠΎΡ‚ jslinux Π΅ ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π΅Π½ Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€, написан Π½Π° JavaScript. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° имашС ΠΏΠΎΠ½Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½ x86. Но всички Ρ‚Π΅, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π·Π½Π°ΠΌ, бяха ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΈ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Qemu, написан ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Ρ€Π°Π½ΠΎ ΠΎΡ‚ ΡΡŠΡ‰ΠΈΡ Ѐабрис Π‘Π΅Π»Π°Ρ€Π΄, ΠΈ вСроятно всСки ΡƒΠ²Π°ΠΆΠ°Π²Π°Ρ‰ сСбС си ΠΌΠΎΠ΄Π΅Ρ€Π΅Π½ Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° JIT компилация Π½Π° гост ΠΊΠΎΠ΄ Π² ΠΊΠΎΠ΄ Π½Π° хост систСма. Π‘Ρ‚Ρ€ΡƒΠ²Π°ΡˆΠ΅ ΠΌΠΈ сС, Ρ‡Π΅ Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° внСдря ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Π°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Ρ‚Π°Π·ΠΈ, която Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚: JIT компилация Π½Π° машинСн ΠΊΠΎΠ΄ Π² JavaScript, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ изглСТдашС Π½Π°ΠΉ-Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π΄Π° сС прСнСсС Qemu. ИзглСТда, Π·Π°Ρ‰ΠΎ Qemu, ΠΈΠΌΠ° ΠΏΠΎ-прости ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΈ Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ΠΈ - ΡΡŠΡ‰ΠΈΡΡ‚ VirtualBox, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - инсталиран ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ. Но Qemu ΠΈΠΌΠ° няколко интСрСсни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

  • ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄
  • Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π±Π΅Π· Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π° ядрото
  • Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡
  • ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° голям Π±Ρ€ΠΎΠΉ ΠΊΠ°ΠΊΡ‚ΠΎ хост, Ρ‚Π°ΠΊΠ° ΠΈ гост Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ

ΠžΡ‚Π½ΠΎΡΠ½ΠΎ Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ°, сСга ΠΌΠΎΠ³Π° Π΄Π° обясня, Ρ‡Π΅ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ TCI Π½Π΅ сС ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚ самитС инструкции Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π·Π° гости, Π° Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄ΡŠΡ‚, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΡ‚ тях, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ промСня ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° - Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ стартиранС Qemu Π½Π° Π½ΠΎΠ²Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ ΠΊΡŠΡΠΌΠ΅Ρ‚, C ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½ - писанСто Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΡ‚Π»ΠΎΠΆΠΈ.

И сСга, слСд Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ спокойно Π±ΡŠΡ€Π½ΠΈΠΊΠ°Π½Π΅ с изходния ΠΊΠΎΠ΄ Π½Π° Qemu Π² свободното ΠΌΠΈ Π²Ρ€Π΅ΠΌΠ΅, сС появи Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Kolibri OS.

Какво С 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, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ зависят Ρ‚Π΅Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ‚.Π½., ΠΈ Π΅Π΄Π½Π° ΠΎΡ‚ тях Π΅ libffi, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ glib зависи. ИмашС слуховС Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Ρ‡Π΅ ΠΈΠΌΠ° Ρ‚Π°ΠΊΡŠΠ² Π² голямата колСкция ΠΎΡ‚ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Emscripten, Π½ΠΎ някак си бСшС Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС повярва: ΠΏΡŠΡ€Π²ΠΎ, Π½Π΅ бСшС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Π° бъдС Π½ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€, Π²Ρ‚ΠΎΡ€ΠΎ, бСшС Ρ‚Π²ΡŠΡ€Π΄Π΅ ниско Π½ΠΈΠ²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π·Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚Π΅ Π² JS. И Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ само Π²ΡŠΠΏΡ€ΠΎΡ Π½Π° вмъквания Π½Π° асСмблиранС - вСроятно, Π°ΠΊΠΎ Π³ΠΎ Π·Π°Π²ΡŠΡ€Ρ‚ΠΈΡ‚Π΅, Π·Π° някои ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΈ Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π² стСка ΠΈ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°Ρ‚Π΅ функцията Π±Π΅Π· тях. Но Emscripten Π΅ слоТно Π½Π΅Ρ‰ΠΎ: Π·Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° гСнСрираният ΠΊΠΎΠ΄ ΠΏΠΎΠ·Π½Π°Ρ‚ Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° JS двигатСля Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ някои Ρ‚Ρ€ΠΈΠΊΠΎΠ²Π΅. По-спСциално, Ρ‚Π°ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ зациклянС - Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ получСния LLVM IR с някои абстрактни инструкции Π·Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄, сС ΠΎΠΏΠΈΡ‚Π²Π° Π΄Π° ΠΏΡ€Π΅ΡΡŠΠ·Π΄Π°Π΄Π΅ ΠΏΡ€Π°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ifs, Ρ†ΠΈΠΊΠ»ΠΈ ΠΈ Ρ‚.Π½. Π•, ΠΊΠ°ΠΊ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° функцията? ЕстСствСно, ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ към JS Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, тоСст, Π°ΠΊΠΎ Π΅ възмоТно, Π½Π΅ ΠΏΡ€Π΅Π· стСка.

Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ имашС идСя просто Π΄Π° напиша замСститСл Π½Π° libffi с JS ΠΈ Π΄Π° пусна стандартни тСстовС, Π½ΠΎ накрая сС ΠΎΠ±ΡŠΡ€ΠΊΠ°Ρ… ΠΊΠ°ΠΊ Π΄Π° направя Π·Π°Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ си Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Ρ‚Π°ΠΊΠ°, Ρ‡Π΅ Π΄Π° работят със ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ ΠΊΠΎΠ΄ - ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠ³Π° Π΄Π° направя, ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΊΠ°Π·Π²Π°, β€žΠ’ΠΎΠ»ΠΊΠΎΠ²Π° Π»ΠΈ са слоТни Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅ β€žΠ’ΠΎΠ»ΠΊΠΎΠ²Π° Π»ΠΈ смС Π³Π»ΡƒΠΏΠ°Π²ΠΈ?β€œ Π’Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° прСнСса libffi към Π΄Ρ€ΡƒΠ³Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, Ρ‚Π°ΠΊΠ° Π΄Π° сС ΠΊΠ°ΠΆΠ΅ - Π·Π° щастиС, Emscripten ΠΈΠΌΠ° ΠΊΠ°ΠΊΡ‚ΠΎ макроси Π·Π° Π²Π³Ρ€Π°Π΄Π΅Π½ΠΎ асСмблиранС (Π² Javascript, Π΄Π° - Π΄ΠΎΠ±Ρ€Π΅, ΠΊΠ°ΠΊΠ²Π°Ρ‚ΠΎ ΠΈ Π΄Π° Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π°, Ρ‚Π°ΠΊΠ° ΠΈ Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ€ΡŠΡ‚), ΠΈ способността Π΄Π° изпълнява ΠΊΠΎΠ΄, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. ΠšΠ°Ρ‚ΠΎ цяло, слСд ΠΊΠ°Ρ‚ΠΎ сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ… извСстно Π²Ρ€Π΅ΠΌΠ΅ със зависСщи ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° libffi Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ… някакъв ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄ ΠΈ Π³ΠΎ пуснах Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ тСст, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ…. Π—Π° моя ΠΈΠ·Π½Π΅Π½Π°Π΄Π° Ρ‚Π΅ΡΡ‚ΡŠΡ‚ бСшС ΡƒΡΠΏΠ΅ΡˆΠ΅Π½. Π—Π°ΡˆΠ΅ΠΌΠ΅Ρ‚Π΅Π½ ΠΎΡ‚ моята гСниалност - няма шСга, Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ стартиранС - Π°Π·, всС ΠΎΡ‰Π΅ Π½Π΅ вярвайки Π½Π° ΠΎΡ‡ΠΈΡ‚Π΅ си, ΠΎΡ‚ΠΈΠ΄ΠΎΡ… Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ получСния ΠΊΠΎΠ΄, Π·Π° Π΄Π° прСцСня къдС Π΄Π° ровя ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. Π’ΡƒΠΊ полудях Π·Π° Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΡŠΡ‚ - СдинствСното, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ функцията ΠΌΠΈ бСшС ffi_call - Ρ‚ΠΎΠ²Π° ΡΡŠΠΎΠ±Ρ‰ΠΈ Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅. Π‘Π°ΠΌΠΎΡ‚ΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ нямашС. Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ… ΠΏΡŠΡ€Π²Π°Ρ‚Π° си заявка Π·Π° изтСглянС, която ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π² тСста, която Π΅ ясна Π·Π° всСки ΡƒΡ‡Π΅Π½ΠΈΠΊ Π½Π° ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π° - Ρ€Π΅Π°Π»Π½ΠΈΡ‚Π΅ числа Π½Π΅ трябва Π΄Π° сС сравняват ΠΊΠ°Ρ‚ΠΎ a == b ΠΈ Π΄ΠΎΡ€ΠΈ ΠΊΠ°ΠΊ a - b < EPS - ΡΡŠΡ‰ΠΎ трябва Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π°, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай 0 Ρ‰Π΅ сС ΠΎΠΊΠ°ΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ Π½Π° 1/3... ΠšΠ°Ρ‚ΠΎ цяло измислих ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΏΠΎΡ€Ρ‚ Π½Π° libffi, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° Π½Π°ΠΉ-проститС тСстовС ΠΈ с ΠΊΠΎΠΉΡ‚ΠΎ glib Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ - Ρ€Π΅ΡˆΠΈΡ…, Ρ‡Π΅ Ρ‰Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‰Π΅ Π³ΠΎ добавя ΠΏΠΎ-късно. Π“Π»Π΅Π΄Π°ΠΉΠΊΠΈ Π½Π°ΠΏΡ€Π΅Π΄, Ρ‰Π΅ ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΄ΠΎΡ€ΠΈ Π½Π΅ Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» функцията libffi Π² крайния ΠΊΠΎΠ΄.

Но, ΠΊΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…, ΠΈΠΌΠ° някои ограничСния ΠΈ срСд свободното ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ повСдСния Π΅ скрита ΠΏΠΎ-нСприятна функция - JavaScript ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° многопоточност със сподСлСна ΠΏΠ°ΠΌΠ΅Ρ‚. По ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ‚ΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΄ΠΎΡ€ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ Π΄ΠΎΠ±Ρ€Π° идСя, Π½ΠΎ Π½Π΅ ΠΈ Π·Π° прСнасянС Π½Π° ΠΊΠΎΠ΄, чиято Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π΅ ΠΎΠ±Π²ΡŠΡ€Π·Π°Π½Π° с C нишки. Най-ΠΎΠ±Ρ‰ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Firefox СкспСримСнтира с ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅Ρ‚ΠΎ Π½Π° сподСлСни Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ†ΠΈ ΠΈ Emscripten ΠΈΠΌΠ° внСдряванС Π½Π° pthread Π·Π° тях, Π½ΠΎ Π½Π΅ исках Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°ΠΌ Π½Π° Π½Π΅Π³ΠΎ. Π’Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π±Π°Π²Π½ΠΎ Π΄Π° изкорСня ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡˆΠΊΠΎΠ²ΠΎΡΡ‚Ρ‚Π° ΠΎΡ‚ ΠΊΠΎΠ΄Π° Π½Π° Qemu - тоСст Π΄Π° открия къдС сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π½ΠΈΡˆΠΊΠΈΡ‚Π΅, Π΄Π° прСмСстя тялото Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π°, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ Π² Ρ‚Π°Π·ΠΈ нишка, Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° функция ΠΈ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌ Ρ‚Π°ΠΊΠΈΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Π΄Π½Π° ΠΏΠΎ Π΅Π΄Π½Π° ΠΎΡ‚ основния Ρ†ΠΈΠΊΡŠΠ».

Π’Ρ‚ΠΎΡ€ΠΈ ΠΎΠΏΠΈΡ‚

Π’ Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ стана ясно, Ρ‡Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ всС ΠΎΡ‰Π΅ Π΅ Π½Π°Π»ΠΈΡ†Π΅ ΠΈ Ρ‡Π΅ Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½ΠΎΡ‚ΠΎ натисканС Π½Π° ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ ΠΎΠΊΠΎΠ»ΠΎ ΠΊΠΎΠ΄Π° няма Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½ΠΈΡ‰ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: трябва ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΄Π° систСматизирамС процСса Π½Π° добавянС Π½Π° ΠΏΠ°Ρ‚Π΅Ρ€ΠΈΡ†ΠΈ. Π—Π°Ρ‚ΠΎΠ²Π° бСшС Π²Π·Π΅Ρ‚Π° вСрсия 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 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π΅ΠΏΠΎΠ΄Ρ€Π°Π²Π½Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° своя Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄. ВоСст, Π½Π° всички Π²ΠΈΠ΄ΠΎΠ²Π΅ ARM ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ с Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·Ρ€Π°Π²Π½Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ, Qemu ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ TCG Π±Π΅ΠΊΠ΅Π½Π΄, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° собствСн ΠΊΠΎΠ΄, Π½ΠΎ Π΄Π°Π»ΠΈ TCI Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΡŠΡ€Ρ…Ρƒ тях Π΅ Π΄Ρ€ΡƒΠ³ Π²ΡŠΠΏΡ€ΠΎΡ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, докумСнтацията Π½Π° TCI ясно ΠΏΠΎΠΊΠ°Π·Π²Π° Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° към ΠΊΠΎΠ΄Π° бяха Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ извиквания Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° Π½Π΅ΠΏΠΎΠ΄Ρ€Π°Π²Π½Π΅Π½ΠΎ Ρ‡Π΅Ρ‚Π΅Π½Π΅, ΠΊΠΎΠΈΡ‚ΠΎ бяха ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³Π° част Π½Π° Qemu.

Π£Π½ΠΈΡ‰ΠΎΠΆΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΡƒΠΏΡ‡ΠΈΠ½Π°

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° нСподравнСният Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ TCI бСшС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½, бСшС създадСн основСн Ρ†ΠΈΠΊΡŠΠ», ΠΊΠΎΠΉΡ‚ΠΎ Π½Π° свой Ρ€Π΅Π΄ ΠΈΠ·Π²ΠΈΠΊΠ° процСсора, RCU ΠΈ някои Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ°Π»ΠΊΠΈ Π½Π΅Ρ‰Π°. И Ρ‚Π°ΠΊΠ° стартирам Qemu с опцията -d exec,in_asm,out_asm, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ трябва Π΄Π° ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ‚ ΠΊΠΎΠ΄ сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚, Π° ΡΡŠΡ‰ΠΎ ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π»ΡŠΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ какъв Π΅ Π±ΠΈΠ» ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° госта, какъв Π΅ станал ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° хоста (Π² Ρ‚ΠΎΠ·ΠΈ случай Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄). Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°, изпълнява няколко Π±Π»ΠΎΠΊΠ° Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄, пишС ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ оставих, Ρ‡Π΅ RCU сСга Ρ‰Π΅ стартира ΠΈ... сС срива abort() Π²ΡŠΡ‚Ρ€Π΅ във функция free(). Π‘ Ρ‡ΠΎΠ²ΡŠΡ€ΠΊΠ°Π½Π΅ Π½Π° функцията free() УспяхмС Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, Ρ‡Π΅ Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π° Π½Π° heap Π±Π»ΠΎΠΊΠ°, ΠΊΠΎΠΉΡ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π² осСмтС Π±Π°ΠΉΡ‚Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π°Ρ‰ΠΈ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚, вмСсто Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ, имашС Π±ΠΎΠΊΠ»ΡƒΠΊ.

Π£Π½ΠΈΡ‰ΠΎΠΆΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΡƒΠΏΡ‡ΠΈΠ½Π°Ρ‚Π° - ΠΊΠΎΠ»ΠΊΠΎ сладко... Π’ Ρ‚Π°ΠΊΡŠΠ² случай ΠΈΠΌΠ° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ лСкарство - ΠΎΡ‚ (Π°ΠΊΠΎ Π΅ възмоТно) ΡΡŠΡ‰ΠΈΡ‚Π΅ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ, сглобСтС ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅Π½ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„Π°ΠΉΠ» ΠΈ Π³ΠΎ стартирайтС ΠΏΠΎΠ΄ Valgrind. Π‘Π»Π΅Π΄ извСстно Π²Ρ€Π΅ΠΌΠ΅ двоичният Ρ„Π°ΠΉΠ» бСшС Π³ΠΎΡ‚ΠΎΠ². Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌ Π³ΠΎ със ΡΡŠΡ‰ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΠΈ - Π·Π°Π±ΠΈΠ²Π° Π΄ΠΎΡ€ΠΈ ΠΏΡ€ΠΈ инициализация, ΠΏΡ€Π΅Π΄ΠΈ Ρ€Π΅Π°Π»Π½ΠΎ Π΄Π° стигнС Π΄ΠΎ изпълнСниС. НСприятно Π΅, Ρ€Π°Π·Π±ΠΈΡ€Π° сС - ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π΅ са Π±ΠΈΠ»ΠΈ съвсСм ΡΡŠΡ‰ΠΈΡ‚Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ ΠΈΠ·Π½Π΅Π½Π°Π΄Π²Π°Ρ‰ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ configure ΠΏΡ€ΠΎΡƒΡ‡Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΎΠΏΡ†ΠΈΠΈ, Π½ΠΎ ΠΈΠΌΠ°ΠΌ Valgrind - ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ поправя Ρ‚Π°Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ слСд Ρ‚ΠΎΠ²Π°, Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌ ΠΊΡŠΡΠΌΠ΅Ρ‚ , Ρ‰Π΅ сС появи оригиналният. ΠŸΡƒΡΠΊΠ°ΠΌ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ Valgrind... Y-y-y, y-y-y, ъъъъ, Π·Π°ΠΏΠΎΡ‡Π½Π°, ΠΏΡ€Π΅ΠΌΠΈΠ½Π° Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ ΠΏΡ€Π΅Π· инициализацията ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ ΠΏΠΎΠΊΡ€Π°ΠΉ оригиналния бъг Π±Π΅Π· Π½ΠΈΡ‚ΠΎ Π΅Π΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° падания. Π–ΠΈΠ²ΠΎΡ‚ΡŠΡ‚, ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΊΠ°Π·Π²Π°, Π½Π΅ ΠΌΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° - сриваща сС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° спира Π΄Π° сС срива, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС стартира ΠΏΠΎΠ΄ Walgrind. Какво бСшС Ρ‚ΠΎΠ²Π° Π΅ мистСрия. ΠœΠΎΡΡ‚Π° Ρ…ΠΈΠΏΠΎΡ‚Π΅Π·Π° Π΅, Ρ‡Π΅ вСднъТ Π² близост Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° инструкция слСд срив ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° инициализация, gdb ΠΏΠΎΠΊΠ°Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° memset-a с Π²Π°Π»ΠΈΠ΄Π΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π», ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ ΠΈΠ»ΠΈ mmx, ΠΈΠ»ΠΈ xmm рСгистри, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‚ΠΎΠ²Π° Π΅ някаква Π³Ρ€Π΅ΡˆΠΊΠ° Π² подравняванСто, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ всС ΠΎΡ‰Π΅ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС повярва.

Π”ΠΎΠ±Ρ€Π΅, Valgrind ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π΅ ΠΏΠΎΠΌΠ°Π³Π° Ρ‚ΡƒΠΊ. И Ρ‚ΡƒΠΊ Π·Π°ΠΏΠΎΡ‡Π½Π° Π½Π°ΠΉ-ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ - всичко ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄ΠΎΡ€ΠΈ стартира, Π½ΠΎ сС срива ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСизвСстни ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ моТСшС Π΄Π° сС случи ΠΏΡ€Π΅Π΄ΠΈ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ инструкции. Π”ΡŠΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄ΠΎΡ€ΠΈ Π½Π΅ бСшС ясно ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΠΌ. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка всС ΠΏΠ°ΠΊ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° сСдна ΠΈ Π΄Π° отстранявам Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠžΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ²Π°, с ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ прСнаписан Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π°, ΠΏΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°Ρ‚ΠΎ число, Π° ΠΏΠΎ-скоро ΠΊΠ°Ρ‚ΠΎ някакъв Π²ΠΈΠ΄ Π΄Π²ΠΎΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. И, Π΅Ρ‚ΠΎ, Ρ‚ΠΎΠ·ΠΈ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Π½ΠΈΠ· бСшС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ Π² BIOS Ρ„Π°ΠΉΠ»Π° - тоСст сСга бСшС възмоТно Π΄Π° сС ΠΊΠ°ΠΆΠ΅ с Ρ€Π°Π·ΡƒΠΌΠ½Π° увСрСност, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡ€Π΅ΠΏΡŠΠ»Π²Π°Π½Π΅ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ Π΄ΠΎΡ€ΠΈ Π΅ ясно, Ρ‡Π΅ Π΅ записано Π² Ρ‚ΠΎΠ·ΠΈ Π±ΡƒΡ„Π΅Ρ€. Π•, Ρ‚ΠΎΠ³Π°Π²Π° Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ - Π² Emscripten, Π·Π° щастиС, няма Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° адрСсното пространство, няма ΠΈ Π΄ΡƒΠΏΠΊΠΈ Π² Π½Π΅Π³ΠΎ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ някъдС ΠΏΠΎ срСдата Π½Π° ΠΊΠΎΠ΄Π°, Π·Π° Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ Ρ‡Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» ΠΎΡ‚ послСдното стартиранС, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π»Π΅Ρ†Π° ΠΈ, Π°ΠΊΠΎ Π½Π΅ сС Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ», Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ Ρ…Ρ€Π°Π½Π° Π·Π° Ρ€Π°Π·ΠΌΠΈΡΡŠΠ». Вярно Π΅, Ρ‡Π΅ ΠΎΡ‚Π½Π΅ΠΌΠ° няколко ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ слСд всяка промяна, Π½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅? Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° бСшС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ Ρ€Π΅Π΄, ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠΎΠΏΠΈΡ€Π° BIOS ΠΎΡ‚ врСмСнния Π±ΡƒΡ„Π΅Ρ€ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π·Π° гости - ΠΈ наистина нямашС Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ място Π² Π±ΡƒΡ„Π΅Ρ€Π°. НамиранСто Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° Ρ‚ΠΎΠ·ΠΈ странСн адрСс Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ функция qemu_anon_ram_alloc във Ρ„Π°ΠΉΠ» oslib-posix.c - Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° бСшС слСдната: понякога ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚Π΅ адрСса към ΠΎΠ³Ρ€ΠΎΠΌΠ½Π° страница с Ρ€Π°Π·ΠΌΠ΅Ρ€ 2 MB, Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ поискамС mmap ΠΏΡŠΡ€Π²ΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΈ слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π²ΡŠΡ€Π½Π΅ΠΌ излишъка с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° munmap. И Π°ΠΊΠΎ Ρ‚Π°ΠΊΠΎΠ²Π° подравняванС Π½Π΅ сС изисква, Ρ‚ΠΎΠ³Π°Π²Π° Ρ‰Π΅ посочим Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° вмСсто 2 MB getpagesize() - mmap всС ΠΏΠ°ΠΊ Ρ‰Π΅ Π΄Π°Π΄Π΅ ΠΏΠΎΠ΄Ρ€Π°Π²Π½Π΅Π½ адрСс... Π’Π°ΠΊΠ° Ρ‡Π΅ Π² Emscripten mmap само обаТдания malloc, Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π° сС Π½Π΅ сС подравнява Π½Π° страницата. ΠšΠ°Ρ‚ΠΎ цяло Π³Ρ€Π΅ΡˆΠΊΠ°, която ΠΌΠ΅ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Π°ΡˆΠ΅ Π·Π° няколко мСсСца, бСшС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π° Ρ‡Ρ€Π΅Π· промяна Π² Π΄Π²ΡƒΡ… Π»ΠΈΠ½ΠΈΠΈ.

Π₯арактСристики Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

И сСга ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ Π±Ρ€ΠΎΠΈ Π½Π΅Ρ‰ΠΎ, Qemu Π½Π΅ сС срива, Π½ΠΎ Π΅ΠΊΡ€Π°Π½ΡŠΡ‚ Π½Π΅ сС Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΈ ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ Π±ΡŠΡ€Π·ΠΎ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° Π² Ρ†ΠΈΠΊΠ»ΠΈ, съдСйки ΠΏΠΎ ΠΈΠ·Ρ…ΠΎΠ΄Π° -d exec,in_asm,out_asm. Π’ΡŠΠ·Π½ΠΈΠΊΠ½Π° Ρ…ΠΈΠΏΠΎΡ‚Π΅Π·Π°: ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½ΠΈΡΡ‚Π° Π½Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло всички ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½ΠΈΡ) Π½Π΅ пристигат. И наистина, Π°ΠΊΠΎ ΠΎΡ‚Π²ΠΈΠ΅Ρ‚Π΅ ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½ΠΈΡΡ‚Π° ΠΎΡ‚ родния ΠΌΠΎΠ½Ρ‚Π°ΠΆ, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°. Но Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ бСшС ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚: сравнСниСто Π½Π° слСдитС, ΠΈΠ·Π΄Π°Π΄Π΅Π½ΠΈ с Π³ΠΎΡ€Π½Π°Ρ‚Π° опция, ΠΏΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ Π½Π° изпълнСниС сС Ρ€Π°Π·ΠΌΠΈΠ½Π°Π²Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π½ΠΎ. Π’ΡƒΠΊ трябва Π΄Π° сС ΠΊΠ°ΠΆΠ΅ Ρ‚ΠΎΠ²Π° сравнСниС Π½Π° Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ записано с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° стартовия ΠΏΠ°Π½Π΅Π» emrun ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ с ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° родния асСмбли Π½Π΅ Π΅ напълно ΠΌΠ΅Ρ…Π°Π½ΠΈΡ‡Π΅Π½ процСс. НС Π·Π½Π°ΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ сС ΡΠ²ΡŠΡ€Π·Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ emrun, Π½ΠΎ някои Ρ€Π΅Π΄ΠΎΠ²Π΅ Π² ΠΈΠ·Ρ…ΠΎΠ΄Π° сС ΠΎΠΊΠ°Π·Π²Π°Ρ‚ ΠΏΡ€Π΅Π½Π°Ρ€Π΅Π΄Π΅Π½ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° Π² Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΄Π° сС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈ, Ρ‡Π΅ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅ са сС Ρ€Π°Π·ΠΌΠΈΠ½Π°Π²Π°Π»ΠΈ. ΠšΠ°Ρ‚ΠΎ цяло стана ясно, Ρ‡Π΅ спорСд инструкциитС ljmpl ΠΈΠΌΠ° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ към Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ адрСси ΠΈ гСнСрираният Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½: Сдиният ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° инструкция Π·Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½Π° функция, другият Π½Π΅. Π‘Π»Π΅Π΄ Π³ΡƒΠ³ΡŠΠ» инструкциитС ΠΈ ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π° Ρ‚Π΅Π·ΠΈ инструкции, стана ясно, Ρ‡Π΅ ΠΏΡŠΡ€Π²ΠΎ, нСпосрСдствСно ΠΏΡ€Π΅Π΄ΠΈ Π½Π΅Π³ΠΎ Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° cr0 бСшС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ запис - ΡΡŠΡ‰ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ - ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡ΠΈ процСсора Π² Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ, ΠΈ Π²Ρ‚ΠΎΡ€ΠΎ, Ρ‡Π΅ js вСрсията Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡ΠΈ Π² Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ. Но Ρ„Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ Π΄Ρ€ΡƒΠ³Π° характСристика Π½Π° Emscripten Π΅ Π½Π΅ΠΆΠ΅Π»Π°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ Π΄Π° Ρ‚ΠΎΠ»Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° инструкции call Π² TCI, ΠΊΠΎΠΉΡ‚ΠΎ всСки ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» Π½Π° функция Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Ρ‚ΠΈΠΏ long long f(int arg0, .. int arg9) - Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ трябва Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‚ с правилния Π±Ρ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ. Ако Ρ‚ΠΎΠ²Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ бъдС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΎ, Π² зависимост ΠΎΡ‚ настройкитС Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ»ΠΈ Ρ‰Π΅ сС сринС (ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ Π΄ΠΎΠ±Ρ€Π΅), ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Ρ‰Π΅ ΠΈΠ·Π²ΠΈΠΊΠ° Π³Ρ€Π΅ΡˆΠ½Π° функция (ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС Ρ‚ΡŠΠΆΠ½ΠΎ Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ). Има ΠΈ Ρ‚Ρ€Π΅Ρ‚Π° опция - Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΉΡ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ добавят / ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, Π½ΠΎ ΠΊΠ°Ρ‚ΠΎ цяло Ρ‚Π΅Π·ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π·Π°Π΅ΠΌΠ°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ място, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΌΠΈ трябват само ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ сто ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ. Π‘Π°ΠΌΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚ΡŠΠΆΠ½ΠΎ, Π½ΠΎ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ ΠΈΠΌΠ° ΠΏΠΎ-сСриозСн ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: Π² гСнСрирания ΠΊΠΎΠ΄ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ‚ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ‚, Π½ΠΎ понякога функцията с Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π½Π΅ сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° - Π΄ΠΎΠ±Ρ€Π΅, Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ Π² моята рСализация Π½Π° libffi. ВоСст някои ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΡ†ΠΈ просто Π½Π΅ бяха Π΅ΠΊΠ·Π΅ΠΊΡƒΡ‚ΠΈΡ€Π°Π½ΠΈ.

Π—Π° щастиС Qemu ΠΈΠΌΠ° ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΡ‡Π΅Ρ‚ΠΈΠΌΠΈ ΡΠΏΠΈΡΡŠΡ†ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΡ†ΠΈ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π·Π°Π³Π»Π°Π²Π΅Π½ Ρ„Π°ΠΉΠ» ΠΊΠ°Ρ‚ΠΎ

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

Π’Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ доста смСшно: ΠΏΡŠΡ€Π²ΠΎ, макроситС сС ΠΏΡ€Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚ ΠΏΠΎ Π½Π°ΠΉ-странСн Π½Π°Ρ‡ΠΈΠ½ DEF_HELPER_n, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π²ΠΊΠ»ΡŽΡ‡Π²Π° helper.h. Π”ΠΎ стСпСнта, Π² която ΠΌΠ°ΠΊΡ€ΠΎΡΡŠΡ‚ сС Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π° структура ΠΈ запСтая, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° масив ΠΈ вмСсто Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ - #include <helper.h> Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Π½Π°ΠΉ-накрая ΠΈΠΌΠ°Ρ… Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΈΠ·ΠΏΡ€ΠΎΠ±Π²Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° pyparsing, ΠΈ бСшС написан скрипт, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π΅Π·ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π·Π° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ.

И Ρ‚Π°ΠΊΠ°, слСд Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ изглСТдашС Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰. ИзглСТда, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π΅ΠΊΡ€Π°Π½ΡŠΡ‚ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π΅ Π±ΠΈΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ memtest86+ успя Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² родния асСмбли. Π’ΡƒΠΊ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС изясни, Ρ‡Π΅ блоковият I/O ΠΊΠΎΠ΄ Π½Π° Qemu Π΅ написан Π² ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. Emscripten ΠΈΠΌΠ° своя собствСна ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Π° рСализация, Π½ΠΎ всС ΠΏΠ°ΠΊ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π² ΠΊΠΎΠ΄Π° Π½Π° Qemu ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° отстранитС Π³Ρ€Π΅ΡˆΠΊΠΈ Π² процСсора сСга: Qemu ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΎΠΏΡ†ΠΈΠΈ -kernel, -initrd, -append, с ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС Linux ΠΈΠ»ΠΈ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ memtest86+, Π±Π΅Π· ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ устройства. Но Ρ‚ΡƒΠΊ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚: Π² родния асСмбли ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π½Π° Linux ядрото към ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° с опцията -nographic, ΠΈ няма ΠΈΠ·Ρ…ΠΎΠ΄ ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° към Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΎΡ‚ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ стартиран emrun, Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅. ВоСст Π½Π΅ Π΅ ясно: ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈΠ»ΠΈ графичният ΠΈΠ·Ρ…ΠΎΠ΄ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ. И Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΈ Ρ…Ρ€ΡƒΠΌΠ½Π° Π΄Π° ΠΈΠ·Ρ‡Π°ΠΊΠ°ΠΌ ΠΌΠ°Π»ΠΊΠΎ. Оказа сС, Ρ‡Π΅ β€žΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ Π½Π΅ спи, Π° просто ΠΌΠΈΠ³Π° Π±Π°Π²Π½ΠΎβ€œ ΠΈ слСд ΠΎΠΊΠΎΠ»ΠΎ ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ядрото Ρ…Π²ΡŠΡ€Π»ΠΈ ΠΊΡƒΠΏ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° виси. Π‘Ρ‚Π°Π½Π° ясно, Ρ‡Π΅ ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ ΠΊΠ°Ρ‚ΠΎ цяло Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ трябва Π΄Π° сС ΠΏΠΎΡ€Π°Π·Ρ€ΠΎΠ²ΠΈΠΌ Π² ΠΊΠΎΠ΄Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с SDL2. Π—Π° съТалСниС, Π½Π΅ Π·Π½Π°ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π½Π° някои мСста Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° дСйствам Π½Π° случаСн ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ. По някоС Π²Ρ€Π΅ΠΌΠ΅ линията parallel0 ΠΌΠΈΠ³Π° Π½Π° Π΅ΠΊΡ€Π°Π½Π° Π½Π° син Ρ„ΠΎΠ½, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°Π²Π΅ΠΆΠ΄Π° Π½Π° някои мисли. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ Qemu отваря няколко Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†Π° Π² Π΅Π΄ΠΈΠ½ физичСски ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ†, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚Π΅ с Ctrl-Alt-n: Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° компилация, Π½ΠΎ Π½Π΅ ΠΈ Π² Emscripten. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ сС ΠΎΡ‚ΡŠΡ€Π²Π΅Ρ‚Π΅ ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ·ΠΎΡ€Ρ†ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΎΠΏΡ†ΠΈΠΈ -monitor none -parallel none -serial none ΠΈ инструкции Π·Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΡ€Π΅Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π²Π°Π½Π΅ Π½Π° цСлия Π΅ΠΊΡ€Π°Π½ Π½Π° всСки ΠΊΠ°Π΄ΡŠΡ€, всичко извСднъТ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚ΠΈ.

Coroutines

И Ρ‚Π°ΠΊΠ°, Смулацията Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС Π½ΠΈΡ‰ΠΎ интСрСсно Π½Π° Π΅Π΄Π½Π° дискСта Π² Π½Π΅Π³ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ няма Π±Π»ΠΎΠΊ I/O - трябва Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈ. Qemu Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° няколко ΡΡŠΡ€ΡƒΡ‚ΠΈΠ½Π½ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄Π°, Π½ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ СстСството Π½Π° JavaScript ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π° ΠΊΠΎΠ΄ Emscripten, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° ΠΆΠΎΠ½Π³Π»ΠΈΡ€Π°Ρ‚Π΅ със стСковС. ИзглСТда, Ρ‡Π΅ β€žΠ²ΡΠΈΡ‡ΠΊΠΎ Π΅ ΠΈΠ·Ρ‡Π΅Π·Π½Π°Π»ΠΎ, ΠΌΠ°Π·ΠΈΠ»ΠΊΠ°Ρ‚Π° сС ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡΠ²Π°β€œ, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Emscripten Π²Π΅Ρ‡Π΅ са сС ΠΏΠΎΠ³Ρ€ΠΈΠΆΠΈΠ»ΠΈ Π·Π° всичко. Π’ΠΎΠ²Π° Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ доста смСшно: Π½Π΅ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° функция ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ emscripten_sleep ΠΈ няколко Π΄Ρ€ΡƒΠ³ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Asyncify, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ извиквания Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» ΠΈ извиквания към всяка функция, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ Π΄Π²Π° случая ΠΌΠΎΠΆΠ΅ Π΄Π° сС появи ΠΏΠΎ-Π½Π°Π΄ΠΎΠ»Ρƒ Π² стСка. И сСга, ΠΏΡ€Π΅Π΄ΠΈ всяко ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, Ρ‰Π΅ ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ асинхронСн контСкст ΠΈ Π²Π΅Π΄Π½Π°Π³Π° слСд ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ Π΅ Π½Π°ΡΡ‚ΡŠΠΏΠΈΠ»ΠΎ асинхронно ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ Π°ΠΊΠΎ Π΅, Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ всички Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ асинхронСн контСкст, посочСтС коя функция Π·Π° Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅ΠΌ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° функция. Π’ΠΎΠ²Π° Π΅ мястото, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ»Π΅ Π·Π° изслСдванС Π½Π° Π΅Ρ„Π΅ΠΊΡ‚Π° прахосванС β€” Π·Π° Π½ΡƒΠΆΠ΄ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄Π° слСд Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΠΎΡ‚ асинхронно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° β€žΠ·Π°ΠΊΡŠΡΠ½Π΅Π½ΠΈΡβ€œ Π½Π° функцията, стартираща слСд ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ β€” ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½: Π°ΠΊΠΎ ΠΈΠΌΠ° n ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΈ извиквания, Ρ‚ΠΎΠ³Π°Π²Π° функцията Ρ‰Π΅ бъдС Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½Π° някъдС n/2 ΠΏΡŠΡ‚ΠΈ β€” Ρ‚ΠΎΠ²Π° всС ΠΎΡ‰Π΅ Π΅, Π°ΠΊΠΎ Π½Π΅. Π˜ΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ слСд всяко ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΎ асинхронно ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° някои Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ към ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° функция. ВпослСдствиС Π΄ΠΎΡ€ΠΈ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° напиша прост скрипт Π½Π° Python, ΠΊΠΎΠΉΡ‚ΠΎ въз основа Π½Π° Π΄Π°Π΄Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ особСно ΠΏΡ€Π΅ΠΊΠΎΠΌΠ΅Ρ€Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΡƒΠΆ β€žΠ½Π΅ позволяват Π½Π° асинхронността Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ ΠΏΡ€Π΅Π· сСбС ΡΠΈβ€œ (тоСст ΠΏΡ€ΠΎΠΌΠΎΡ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° стСка ΠΈ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚ΠΎΠΊΡƒ-Ρ‰ΠΎ описах, Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π° Π² тях), ΠΏΠΎΠΊΠ°Π·Π²Π° извиквания Ρ‡Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π² ΠΊΠΎΠΈΡ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‚Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π° Π½Π΅ сС считат Π·Π° асинхронни. И Ρ‚ΠΎΠ³Π°Π²Π° JS Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎΠ΄ 60 MB ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ са Ρ‚Π²ΡŠΡ€Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ - Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠΎΠ½Π΅ 30. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ вСднъТ настройвах скрипт Π·Π° асСмблиранС ΠΈ случайно ΠΈΠ·Ρ…Π²ΡŠΡ€Π»ΠΈΡ… ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅, срСд ΠΊΠΎΠΈΡ‚ΠΎ бСшС -O3. ΠŸΡƒΡΠΊΠ°ΠΌ гСнСрирания ΠΊΠΎΠ΄ ΠΈ Chromium изяТда ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ сС срива. Π’ΠΎΠ³Π°Π²Π° случайно ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Ρ… ΠΊΠ°ΠΊΠ²ΠΎ сС ΠΎΠΏΠΈΡ‚Π²Π°ΡˆΠ΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ... Π•, ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΊΠ°ΠΆΠ°, ΠΈ Π°Π· щях Π΄Π° Π·Π°ΠΌΡ€ΡŠΠ·Π½Π°, Π°ΠΊΠΎ ΠΌΠ΅ ΠΏΠΎΠΌΠΎΠ»ΠΈΡ…Π° Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π΄Π° ΠΏΡ€ΠΎΡƒΡ‡Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΌ 500+ MB Javascript.

Π—Π° съТалСниС, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π² ΠΊΠΎΠ΄Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Asyncify Π½Π΅ бяха напълно приятСлски настроСни longjmp-s, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² ΠΊΠΎΠ΄Π° Π½Π° виртуалния процСсор, Π½ΠΎ слСд ΠΌΠ°Π»ΠΊΠ° корСкция, която Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° контСкститС, сякаш всичко Π΅ Π½Π°Ρ€Π΅Π΄, ΠΊΠΎΠ΄ΡŠΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ. И Ρ‚ΠΎΠ³Π°Π²Π° Π·Π°ΠΏΠΎΡ‡Π½Π° Π½Π΅Ρ‰ΠΎ странно: понякога сС задСйстваха ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² ΠΊΠΎΠ΄Π° Π·Π° синхронизация - ΡΡŠΡ‰ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ сриват ΠΊΠΎΠ΄Π°, Π°ΠΊΠΎ спорСд Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° изпълнСниС трябва Π΄Π° бъдС Π±Π»ΠΎΠΊΠΈΡ€Π°Π½ - някой сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ Π²Π΅Ρ‡Π΅ Π·Π°Π»ΠΎΠ²Π΅Π½ ΠΌΡŽΡ‚Π΅ΠΊΡ. Π—Π° щастиС сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² сСриализирания ΠΊΠΎΠ΄ - просто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ… стандартната функционалност Π½Π° главния Ρ†ΠΈΠΊΡŠΠ», прСдоставСна ΠΎΡ‚ Emscripten, Π½ΠΎ понякога асинхронното ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ напълно Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°ΡˆΠ΅ стСка ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сС ΠΏΡ€ΠΎΠ²Π°Π»ΡΡˆΠ΅ setTimeout ΠΎΡ‚ основния Ρ†ΠΈΠΊΡŠΠ» - ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΠΊΠΎΠ΄ΡŠΡ‚ Π²Π»Π΅Π·Π΅ Π² итСрацията Π½Π° основния Ρ†ΠΈΠΊΡŠΠ», Π±Π΅Π· Π΄Π° напуска ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° итСрация. ΠŸΡ€Π΅Π½Π°ΠΏΠΈΡΠ²Π° Π½Π° Π±Π΅Π·ΠΊΡ€Π°Π΅Π½ Ρ†ΠΈΠΊΡŠΠ» ΠΈ emscripten_sleep, ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ с mutexes спряха. ΠšΠΎΠ΄ΡŠΡ‚ Π΄ΠΎΡ€ΠΈ стана ΠΏΠΎ-Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ - Π² края Π½Π° ΠΊΡ€Π°ΠΈΡ‰Π°Ρ‚Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ нямам ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° подготвя слСдващия Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΊΠ°Π΄ΡŠΡ€ - ΠΏΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΡŠΡ‚ просто изчислява Π½Π΅Ρ‰ΠΎ ΠΈ Π΅ΠΊΡ€Π°Π½ΡŠΡ‚ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ спират Π΄ΠΎΡ‚ΡƒΠΊ: понякога ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Qemu просто прСкратява Π±Π΅Π·ΡˆΡƒΠΌΠ½ΠΎ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ. Π’ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сС ΠΎΡ‚ΠΊΠ°Π·Π°Ρ… ΠΎΡ‚ Π½Π΅Π³ΠΎ, Π½ΠΎ, Π³Π»Π΅Π΄Π°ΠΉΠΊΠΈ Π½Π°ΠΏΡ€Π΅Π΄, Ρ‰Π΅ ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ бСшС слСдният: ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ‚Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° setTimeout (ΠΈΠ»ΠΈ ΠΏΠΎΠ½Π΅ Π½Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° чСсто, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ си мислитС): функция emscripten_yield просто Π·Π°Π΄Π°Π²Π° Ρ„Π»Π°Π³Π° Π·Π° асинхронно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅. Цялата Ρ€Π°Π±ΠΎΡ‚Π° Π΅ Π² Ρ‚ΠΎΠ²Π° emscripten_coroutine_next Π½Π΅ Π΅ асинхронна функция: Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎ тя провСрява Ρ„Π»Π°Π³Π°, Π½ΡƒΠ»ΠΈΡ€Π° Π³ΠΎ ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Ρ‚Π°ΠΌ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ВоСст популяризиранСто Π½Π° стСка ΡΠ²ΡŠΡ€ΡˆΠ²Π° Π΄ΠΎΡ‚ΡƒΠΊ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ бСшС, Ρ‡Π΅ ΠΏΠΎΡ€Π°Π΄ΠΈ use-after-free, ΠΊΠΎΠ΅Ρ‚ΠΎ сС появявашС, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΡ€ΡƒΡ‚ΠΈΠ½Π½ΠΈΡΡ‚ ΠΏΡƒΠ» бСшС Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π½Π΅ ΠΊΠΎΠΏΠΈΡ€Π°Ρ… Π²Π°ΠΆΠ΅Π½ Ρ€Π΅Π΄ ΠΊΠΎΠ΄ ΠΎΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ Π±Π΅ΠΊΠ΅Π½Π΄ Π½Π° ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, функцията 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 Π±Π΅ΠΊΠ΅Π½Π΄, Π½ΠΎ Π±ΡŠΡ€Π·ΠΎ сС ΠΎΠ±ΡŠΡ€ΠΊΠ°Ρ… Π² изходния ΠΊΠΎΠ΄ ΠΈ Π½Π΅ съвсСм ясно описаниС Π½Π° инструкциитС Π·Π° Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π΅ΡˆΠΈΡ… Π΄Π° обвия TCI ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π’ΠΎΠ²Π° Π΄Π°Π΄Π΅ няколко прСдимства:

  • ΠΊΠΎΠ³Π°Ρ‚ΠΎ внСдряватС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³Π»Π΅Π΄Π°Ρ‚Π΅ Π½Π΅ описаниСто Π½Π° инструкциитС, Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°
  • ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π·Π° всСки срСщнат Π±Π»ΠΎΠΊ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄, Π½ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ само слСд стотното изпълнСниС
  • Π°ΠΊΠΎ гСнСрираният ΠΊΠΎΠ΄ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ (Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΅ възмоТно, съдСйки ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ с ΠΈΠΌΠ΅Π½Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ Π΄ΡƒΠΌΠ°Ρ‚Π° patch), Ρ‰Π΅ трябва Π΄Π° обСзсиля гСнСрирания JS ΠΊΠΎΠ΄, Π½ΠΎ ΠΏΠΎΠ½Π΅ Ρ‰Π΅ ΠΈΠΌΠ° ΠΎΡ‚ ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌ

Π©ΠΎ сС отнася Π΄ΠΎ Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ°, Π½Π΅ съм сигурСн, Ρ‡Π΅ корСкцията Π΅ възмоТна слСд ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ са Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ.

ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ ΠΊΠΎΠ΄ΡŠΡ‚ бСшС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° голям ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚Π΅Π» Π½Π° адрСса Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° инструкция Π·Π° Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Π½ΠΎ слСд Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ си спомних статията Π·Π° Emscripten, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° гСнСрирания JS ΠΈ повторния Ρ†ΠΈΠΊΠ», Ρ€Π΅ΡˆΠΈΡ… Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ‡ΠΎΠ²Π΅ΡˆΠΊΠΈ ΠΊΠΎΠ΄, особСно слСд ΠΊΠ°Ρ‚ΠΎ Π΅ΠΌΠΏΠΈΡ€ΠΈΡ‡Π½ΠΎ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ СдинствСната Π²Ρ…ΠΎΠ΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π² Π±Π»ΠΎΠΊΠ° Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄ Π΅ нСговият старт. Π’Π΅Π΄Π½Π°Π³Π° слСд ΠΊΠ°Π·Π°Π½ΠΎ, слСд извСстно Π²Ρ€Π΅ΠΌΠ΅ ΠΈΠΌΠ°Ρ…ΠΌΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠΎΠ΄ с ifs (ΠΌΠ°ΠΊΠ°Ρ€ ΠΈ Π±Π΅Π· Ρ†ΠΈΠΊΠ»ΠΈ). Но лош ΠΊΡŠΡΠΌΠ΅Ρ‚, Ρ‚ΠΎΠΉ сС срина, Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, Ρ‡Π΅ инструкциитС са с някаква Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° дълТина. ОсвСн Ρ‚ΠΎΠ²Π° послСдната инструкция Π½Π° Ρ‚ΠΎΠ²Π° Π½ΠΈΠ²ΠΎ Π½Π° рСкурсия бСшС brcond. Π”ΠΎΠ±Ρ€Π΅, Ρ‰Π΅ добавя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° към Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ инструкция ΠΏΡ€Π΅Π΄ΠΈ ΠΈ слСд рСкурсивното ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ... Π½ΠΈΡ‚ΠΎ Π΅Π΄Π½Π° ΠΎΡ‚ тях Π½Π΅ бСшС изпълнСна, Π½ΠΎ слСд ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ assert Ρ‚Π΅ всС ΠΎΡ‰Π΅ сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΡ…Π°. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка, слСд ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ… гСнСрирания ΠΊΠΎΠ΄, Ρ€Π°Π·Π±Ρ€Π°Ρ…, Ρ‡Π΅ слСд ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ, указатСлят към Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° инструкция сС ΠΏΡ€Π΅Π·Π°Ρ€Π΅ΠΆΠ΄Π° ΠΎΡ‚ стСка ΠΈ вСроятно Π΅ прСзаписан ΠΎΡ‚ гСнСрирания JavaScript ΠΊΠΎΠ΄. И Ρ‚Π°ΠΊΠ° сС ΠΎΠΊΠ°Π·Π°. Π£Π²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΡ‚ Π΅Π΄ΠΈΠ½ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ Π½Π° дСсСт Π½Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½ΠΈΡ‰ΠΎ ΠΈ стана ясно, Ρ‡Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π² ΠΊΡ€ΡŠΠ³. Π’Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ Π½Π΅ смС ΠΈΠ·Π»Π΅Π·Π»ΠΈ извън Π³Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° Π’Π‘ ΠΈ Π°ΠΊΠΎ смС Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ, Π΄Π° ΠΈΠ·Π΄Π°Π΄Π΅ΠΌ адрСса Π½Π° слСдващата Π’Π‘ със Π·Π½Π°ΠΊ минус, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π’ допълнСниС, Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ°Π²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€žΠΊΠΎΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π°Π½ΡƒΠ»ΠΈΡ€Π°Π½ΠΈ, Π°ΠΊΠΎ Ρ‚Π°Π·ΠΈ част ΠΎΡ‚ Π±Π°ΠΉΡ‚ ΠΊΠΎΠ΄Π° сС Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»Π°?β€œ β€” само функцията, която ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄, трябва Π΄Π° бъдС Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π°. ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π΄Π΅Π±ΡŠΠ³Π²Π°Ρ… всичко Π² Chromium (Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Firefox ΠΈ ΠΌΠΈ Π΅ ΠΏΠΎ-лСсно Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ Π·Π° СкспСримСнти), Firefox ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌ Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΠΈΡ‚Π΅ със стандарта 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. ΠœΠ΅ΠΆΠ΄ΡƒΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² Gita ΠΈΠΌΠ° Ρ‚Π΅ΠΌΠ° във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π±Π»ΠΎΠ³: Π·Π° всяко β€žΠ½ΠΈΠ²ΠΎβ€œ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ½Π΅ ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ‚ΠΎ, Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ Π½Π° руски Π΅Π·ΠΈΠΊ. Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚Π°Π·ΠΈ статия Π΅ Π΄ΠΎ голяма стСпСн ΠΏΡ€Π΅Ρ€Π°Π·ΠΊΠ°Π· Π½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ git log.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ всичко Ρ‚ΡƒΠΊ (ΠΏΠ°Π·Π΅Ρ‚Π΅ сС ΠΎΡ‚ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°).

Какво Π²Π΅Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ:

  • x86 Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½ процСсор Ρ€Π°Π±ΠΎΡ‚ΠΈ
  • Има Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° JIT ΠΊΠΎΠ΄ ΠΎΡ‚ машинСн ΠΊΠΎΠ΄ към JavaScript
  • Има шаблон Π·Π° сглобяванС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ 32-Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ Π·Π° гости: Ρ‚ΠΎΡ‡Π½ΠΎ сСга ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π²ΡŠΠ·Ρ…ΠΈΡ‰Π°Π²Π°Ρ‚Π΅ Π½Π° Linux Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° MIPS, която Π·Π°ΠΌΡ€ΡŠΠ·Π²Π° Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

Какво Π΄Ρ€ΡƒΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅

  • УскорСтС Смулацията. Π”ΠΎΡ€ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ JIT ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΎΡ‚ Virtual x86 (Π½ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΎ ΠΈΠΌΠ° цял Qemu с ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΠΌΡƒΠ»ΠΈΡ€Π°Π½ Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ)
  • Π—Π° Π΄Π° направя Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ интСрфСйс - чСстно ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ съм Π΄ΠΎΠ±ΡŠΡ€ ΡƒΠ΅Π± Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ засСга ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΈΡ… стандартната ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π° Emscripten, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΌΠΎΠ³Π°
  • ΠžΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ сС Π΄Π° стартиратС ΠΏΠΎ-слоТни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Qemu - Ρ€Π°Π±ΠΎΡ‚Π° Π² ΠΌΡ€Π΅ΠΆΠ°, миграция Π½Π° VM ΠΈ Ρ‚.Π½.
  • UPS: Ρ‰Π΅ трябва Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ няколкото си Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° Emscripten Π½Π°Π³ΠΎΡ€Π΅ ΠΏΠΎ Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π°, ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ прСноситСли Π½Π° Qemu ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ. Благодаря ΠΈΠΌ, Ρ‡Π΅ успяха ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ тСхния принос към Emscripten ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ моята Π·Π°Π΄Π°Ρ‡Π°.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€