ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π€Π°Π±ΡΠΈΡ ΠΠ΅Π»Π°ΡΠ΄
- ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
- Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π±Π΅Π· Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π½Π° ΡΠ΄ΡΠΎΡΠΎ
- Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠ΅Π²ΠΎΠ΄Π°Ρ
- ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΊΠ°ΠΊΡΠΎ Ρ ΠΎΡΡ, ΡΠ°ΠΊΠ° ΠΈ Π³ΠΎΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ
ΠΡΠ½ΠΎΡΠ½ΠΎ ΡΡΠ΅ΡΠ°ΡΠ° ΡΠΎΡΠΊΠ°, ΡΠ΅Π³Π° ΠΌΠΎΠ³Π° Π΄Π° ΠΎΠ±ΡΡΠ½Ρ, ΡΠ΅ Π²ΡΡΡΠ½ΠΎΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ TCI Π½Π΅ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ°Ρ ΡΠ°ΠΌΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π·Π° Π³ΠΎΡΡΠΈ, Π° Π±Π°ΠΉΡ ΠΊΠΎΠ΄ΡΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΡ ΡΡΡ , Π½ΠΎ ΡΠΎΠ²Π° Π½Π΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΡΡΠ½ΠΎΡΡΡΠ° - Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Qemu Π½Π° Π½ΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΊΡΡΠΌΠ΅Ρ, C ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ - ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠ»ΠΎΠΆΠΈ.
Π ΡΠ΅Π³Π°, ΡΠ»Π΅Π΄ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π±ΡΡΠ½ΠΈΠΊΠ°Π½Π΅ Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Qemu Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΡΠΎ ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ°Π±ΠΎΡΠ΅Ρ ΠΏΡΠΎΡΠΎΡΠΈΠΏ, Π² ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Kolibri OS.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Emscripten
Π Π΄Π½Π΅ΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ
Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ, ΡΠΈΠΉΡΠΎ ΠΊΡΠ°Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π΅ JavaScript. ΠΡΠΊΠΎΠΈ, ΠΊΠ°ΡΠΎ Type Script, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Emscripten Π΅ Π½Π°ΡΠΈΠ½ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ C ΠΈΠ»ΠΈ C++ ΠΊΠΎΠ΄ ΠΈ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅ Π² ΡΠ΅ΡΠΈΠΌΠ° ΠΎΡ Π±ΡΠ°ΡΠ·ΡΡ ΡΠΎΡΠΌΠ°. ΠΠ°
ΠΡΡΠ²ΠΈ ΠΎΠΏΠΈΡ
ΠΠ°ΠΉ-ΠΎΠ±ΡΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ ΡΡΠΌ ΠΏΡΡΠ²ΠΈΡΡ ΡΠΎΠ²Π΅ΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·Π»Π΅Π·Π΅ Ρ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° Qemu ΠΊΡΠΌ JavaScript. ΠΡΠ² ΡΠΎΡΡΠΌΠ° Π½Π° ReactOS Π±Π΅ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅Π½ Π²ΡΠΏΡΠΎΡ Π΄Π°Π»ΠΈ ΡΠΎΠ²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Emscripten. ΠΡΠ΅ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ»ΡΡ
ΠΎΠ²Π΅, ΡΠ΅ Π€Π°Π±ΡΠΈΡ ΠΠ΅Π»Π°ΡΠ΄ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΡΠΎΠ²Π° Π»ΠΈΡΠ½ΠΎ, Π½ΠΎ Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡ
ΠΌΠ΅ Π·Π° jslinux, ΠΊΠΎΠΉΡΠΎ, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π·Π½Π°ΠΌ, Π΅ ΠΏΡΠΎΡΡΠΎ ΠΎΠΏΠΈΡ Π·Π° ΡΡΡΠ½ΠΎ ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡΠ°ΡΡΡΠ½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π² JS ΠΈ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ ΠΎΡ Π½ΡΠ»Π°ΡΠ°. ΠΠΎ-ΠΊΡΡΠ½ΠΎ Π±Π΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Virtual x86 - Π·Π° Π½Π΅Π³ΠΎ Π±ΡΡ
Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ΠΈ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ ΠΈ, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ, ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈΡΡ βΡΠ΅Π°Π»ΠΈΠ·ΡΠΌβ Π½Π° Π΅ΠΌΡΠ»Π°ΡΠΈΡΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° SeaBIOS ΠΊΠ°ΡΠΎ ΡΡΡΠΌΡΠ΅Ρ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΠ½Π΅ Π΅Π΄ΠΈΠ½ ΠΎΠΏΠΈΡ Π·Π° ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ Π½Π° Qemu Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Emscripten - ΠΎΠΏΠΈΡΠ°Ρ
ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΡΠΎΠ²Π°
Π’Π°ΠΊΠ° ΡΠ΅, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Π΅ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅, Π΅ΡΠΎ Emscripten - Π²Π·Π΅ΠΌΠ΅ΡΠ΅ Π³ΠΎ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΉΡΠ΅. ΠΠΎ ΠΈΠΌΠ° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π·Π°Π²ΠΈΡΠΈ Qemu, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ Π·Π°Π²ΠΈΡΡΡ ΡΠ΅Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Ρ.Π½., ΠΈ Π΅Π΄Π½Π° ΠΎΡ ΡΡΡ
Π΅
Π Π½Π°ΡΠ°Π»ΠΎΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΈΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ° Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° 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>
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° Π½Π°ΠΉ-Π½Π°ΠΊΡΠ°Ρ ΠΈΠΌΠ°Ρ
Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°
Π ΡΠ°ΠΊΠ°, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Ρ. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, Π·Π°ΡΠΎΡΠΎ Π΅ΠΊΡΠ°Π½ΡΡ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π΅ Π±ΠΈΠ» ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ 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, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΊΡΠΌ Π²ΡΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΡΠ΄Π΅ΡΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡΠ΅ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΠΎ-Π½Π°Π΄ΠΎΠ»Ρ Π² ΡΡΠ΅ΠΊΠ°. Π ΡΠ΅Π³Π°, ΠΏΡΠ΅Π΄ΠΈ Π²ΡΡΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅, ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ Π΅ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ Π°ΠΊΠΎ Π΅, ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² ΡΠΎΠ·ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΏΠΎΡΠΎΡΠ΅ΡΠ΅ ΠΊΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π΄Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΠΈΠΌ ΠΊΠΎΠ½ΡΡΠΎΠ»Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅ΠΌ ΠΎΡ ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ. Π’ΠΎΠ²Π° Π΅ ΠΌΡΡΡΠΎΡΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ»Π΅ Π·Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° Π΅ΡΠ΅ΠΊΡΠ° -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