ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»Π΅Ρ Π½Π°Π·Π°Π΄ Π€Π°Π±ΡΠΈΡ ΠΠ΅Π»Π»Π°Ρ
- ΠΎΡΠΊΡΡΡΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ
- Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΡΠ΄ΡΠ°
- Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°
- ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠ°ΠΊ Ρ ΠΎΡΡΠΎΠ²ΡΡ , ΡΠ°ΠΊ ΠΈ Π³ΠΎΡΡΠ΅Π²ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ
ΠΠ° ΡΡΡΡ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΠΏΡΠ½ΠΊΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ-ΡΠΎ Ρ ΡΠΆΠ΅ ΠΌΠΎΠ³Ρ ΠΏΠΎΡΡΠ½ΠΈΡΡ, ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ TCI ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ Π½Π΅ ΡΠ°ΠΌΠΈ Π³ΠΎΡΡΠ΅Π²ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΈΠ· Π½ΠΈΡ Π±Π°ΠΉΡΠΊΠΎΠ΄, Π½ΠΎ ΡΡΡΠΈ ΡΡΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ β ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Qemu Π½Π° Π½ΠΎΠ²ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ²Π΅Π·ΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° C β Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ.
Π Π²ΠΎΡ, ΠΏΠΎΡΠ»Π΅ Π΄Π²ΡΡ Π»Π΅Ρ Π½Π΅ΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ²ΡΡΡΠ½ΠΈΡ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² Qemu ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Kolibri OS.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Emscripten
Π Π½Π°ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ², ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΡΠ²Π»ΡΠ΅ΡΡΡ JavaScript. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Type Script, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΠΈΡΡ ΠΊΠ°ΠΊ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΈΡΠ°ΡΡ Π΄Π»Ρ Π²Π΅Π±Π°. Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, Emscripten β ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ± Π²Π·ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° C ΠΈΠ»ΠΈ C++, ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄, ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ Π±ΡΠ°ΡΠ·Π΅ΡΡ. ΠΠ°
ΠΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠΏΡΡΠΊΠ°
ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Ρ Π½Π΅ ΠΏΠ΅ΡΠ²ΡΠΉ, ΠΊΠΎΠΌΡ ΠΏΡΠΈΡΠ»Π° Π² Π³ΠΎΠ»ΠΎΠ²Ρ ΠΈΠ΄Π΅Ρ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Qemu Π½Π° JavaScript. ΠΠ° ΡΠΎΡΡΠΌΠ΅ ReactOS Π·Π°Π΄Π°Π²Π°Π»ΡΡ Π²ΠΎΠΏΡΠΎΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Emscripten. ΠΡΡ ΡΠ°Π½ΡΡΠ΅ Ρ
ΠΎΠ΄ΠΈΠ»ΠΈ ΡΠ»ΡΡ
ΠΈ, ΡΡΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π» Π»ΠΈΡΠ½ΠΎ Π€Π°Π±ΡΠΈΡ ΠΠ΅Π»Π»Π°Ρ, Π½ΠΎ ΡΠ΅ΡΡ ΡΠ»Π° ΠΎ jslinux, ΠΊΠΎΡΠΎΡΡΠΉ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ Π²ΡΡΡΠ½ΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π½Π° JS Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ Ρ Π½ΡΠ»Ρ. ΠΠΎΠ·Π΄Π½Π΅Π΅ Π±ΡΠ» Π½Π°ΠΏΠΈΡΠ°Π½ Virtual x86 β ΠΊ Π½Π΅ΠΌΡ Π±ΡΠ»ΠΈ Π²ΡΠ»ΠΎΠΆΠ΅Π½Ρ Π½Π΅ΠΎΠ±ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ, ΠΈ, ΠΊΠ°ΠΊ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π»Π°ΡΡ, Π±ΠΎΠ»ΡΡΠ°Ρ "ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎΡΡΡ" ΡΠΌΡΠ»ΡΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ SeaBIOS Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ firmware. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π±ΡΠ»Π° ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΎΠ΄Π½Π° ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Qemu Ρ ΠΏΠΎΠΌΠΎΡΡΡ Emscripten β ΡΡΠΎ ΠΏΡΡΠ°Π»ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ
ΠΡΠ°ΠΊ, ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π²ΠΎΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ, Π²ΠΎΡ Emscripten β Π±Π΅ΡΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉ. ΠΠΎ Π΅ΡΡΡ Π΅ΡΡ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ
Qemu Π·Π°Π²ΠΈΡΠΈΡ, ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ
Π·Π°Π²ΠΈΡΡΡ ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ Ρ.Π΄., ΠΏΡΠΈΡΡΠΌ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ
β
Π Π½Π°ΡΠ°Π»Π΅ Π±ΡΠ»Π° ΠΌΡΡΠ»Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°ΠΌΠ΅Π½Ρ libffi Π½Π° JS ΠΈ ΠΏΡΠΎΠ³Π½Π°ΡΡ ΡΡΠ°ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡ, Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Ρ Π·Π°ΠΏΡΡΠ°Π»ΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ β ΡΡΠΎ ΡΠΆ ΠΏΠΎΠ΄Π΅Π»Π°ΡΡ, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, "Π’ΠΎ Π»ΠΈ Π·Π°Π΄Π°ΡΠΈ ΡΠ°ΠΊΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅, ΡΠΎ Π»ΠΈ ΠΌΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠΏΡΠ΅". ΠΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ libffi Π½Π° Π΅ΡΡ ΠΎΠ΄Π½Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ Π²ΡΡΠ°Π·ΠΈΡΡΡΡ β ΠΊ ΡΡΠ°ΡΡΡΡ, Π² Emscripten Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΎΡΡ Π΄Π»Ρ inline assembly (Π½Π° Π΄ΠΆΠ°Π²Π°ΡΠΊΡΠΈΠΏΡΠ΅, Π°Π³Π° β Π½Ρ, ΠΊΠ°ΠΊΠ°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΠ°ΠΊΠΎΠΉ ΠΈ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ), ΡΠ°ΠΊ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° Ρ
ΠΎΠ΄Ρ ΠΊΠΎΠ΄. Π ΠΎΠ±ΡΠ΅ΠΌ, ΠΏΠΎΠ²ΠΎΠ·ΠΈΠ²ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎ-Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ libffi, Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» Π½Π΅ΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΠΈΠΉΡΡ ΠΊΠΎΠ΄, ΠΈ ΠΏΡΠΎΠ³Π½Π°Π» Π΅Π³ΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΠΎΠΏΠ°Π²ΡΠ΅ΠΌΡΡ ΡΠ΅ΡΡΠ΅. Π ΠΌΠΎΠ΅ΠΌΡ ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡ, ΡΠ΅ΡΡ ΠΏΡΠΎΡΡΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ. ΠΡΠΈΠ³Π΅Π² ΠΎΡ ΡΠ²ΠΎΠ΅ΠΉ Π³Π΅Π½ΠΈΠ°Π»ΡΠ½ΠΎΡΡΠΈ β ΡΡΡΠΊΠ° Π»ΠΈ, Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° β Ρ, Π²ΡΡ Π΅ΡΡ Π½Π΅ Π²Π΅ΡΡ ΡΠ²ΠΎΠΈΠΌ Π³Π»Π°Π·Π°ΠΌ, ΠΏΠΎΠ»Π΅Π· Π΅ΡΡ ΡΠ°Π· ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄, ΠΎΡΠ΅Π½ΠΈΡΡ, ΠΊΡΠ΄Π° ΠΊΠΎΠΏΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅. Π’ΡΡ Ρ ΠΎΡΠΈΠ³Π΅Π» Π²ΡΠΎΡΠΈΡΠ½ΠΎ β Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ Π΄Π΅Π»Π°Π»Π° ΠΌΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ ffi_call
β ΡΡΠΎ ΡΠ°ΠΏΠΎΡΡΠΎΠ²Π°Π»Π° ΠΎΠ± ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅. Π‘Π°ΠΌΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π½Π΅ Π±ΡΠ»ΠΎ. Π’Π°ΠΊ Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» ΡΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ pull request, ΠΈΡΠΏΡΠ°Π²Π»ΡΠ²ΡΠΈΠΉ ΠΏΠΎΠ½ΡΡΠ½ΡΡ Π»ΡΠ±ΠΎΠΌΡ ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π½ΠΈΠΊΡ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΠ΅ΡΡΠ΅ β Π²Π΅ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΈΡΠ»Π° Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ a == b
ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠ°ΠΊ a - b < EPS
β Π½Π°Π΄ΠΎ Π΅ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π΅ Π·Π°Π±ΡΡΡ, Π° ΡΠΎ 0 ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄Π°ΠΆΠ΅ ΡΠ°Π²Π΅Π½ 1/3β¦ Π ΠΎΠ±ΡΠ΅ΠΌ, Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΡΡ libffi, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΡΠ°ΠΌΡΠ΅ ΠΏΡΠΎΡΡΡΠ΅ ΡΠ΅ΡΡΡ, ΠΈ Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ glib β ΡΠ΅ΡΠΈΠ», Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ, ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠΏΠΈΡΡ. ΠΠ°Π±Π΅Π³Π°Ρ Π²ΠΏΠ΅ΡΡΠ΄ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, Π² ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ libffi ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π°ΠΆΠ΅ Π½Π΅ Π²ΠΊΠ»ΡΡΠΈΠ».
ΠΠΎ, ΠΊΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΈ ΡΡΠ΅Π΄ΠΈ Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π·Π°ΡΠ΅ΡΠ°Π»Π°ΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΠΏΠΎΠ½Π΅ΠΏΡΠΈΡΡΠ½Π΅Π΅ β JavaScript by design Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠ°ΠΌΡΡΡΡ. Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π°Π·Π²Π°ΡΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°, ΡΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π°Π²ΡΠ·Π°Π½Π° Π½Π° ΡΠΈΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π² Firefox ΠΈΠ΄ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ shared workers, ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ pthread Π΄Π»Ρ Π½ΠΈΡ Π² Emscripten ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ, Π½ΠΎ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ. ΠΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΡΠΈΡ ΠΎΠ½ΡΠΊΡ Π²ΡΠΊΠΎΡΡΡΠ²ΡΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ ΠΈΠ· ΠΊΠΎΠ΄Π° Qemu β ΡΠΎ Π΅ΡΡΡ Π²ΡΠΈΡΠΊΠΈΠ²Π°ΡΡ, Π³Π΄Π΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, Π²ΡΠ½ΠΎΡΠΈΡΡ ΡΠ΅Π»ΠΎ ΡΠΈΠΊΠ»Π°, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π³ΠΎΡΡ Π² ΡΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈ ΠΏΠΎΠΎΡΠ΅ΡΡΠ΄Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°.
ΠΡΠΎΡΠ°Ρ ΠΏΠΎΠΏΡΡΠΊΠ°
Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π²ΠΎΠ· ΠΈ Π½ΡΠ½Π΅ ΡΠ°ΠΌ, ΠΈ ΡΡΠΎ Π±Π΅ΡΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΠΈΡ
ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΡΡΠ»Π΅ΠΉ ΠΏΠΎ ΠΊΠΎΠ΄Ρ Π΄ΠΎ Π΄ΠΎΠ±ΡΠ° Π½Π΅ Π΄ΠΎΠ²Π΅Π΄ΡΡ. ΠΡΠ²ΠΎΠ΄: Π½Π°Π΄ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΡΡΡΠ»Π΅ΠΉ. ΠΠΎΡΡΠΎΠΌΡ Π±ΡΠ»Π° Π²Π·ΡΡΠ° ΡΠ²Π΅ΠΆΠ°Ρ Π½Π° ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π΅ΡΡΠΈΡ 2.4.1 (Π½Π΅ 2.5.0, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΌΠ°Π»ΠΎ Π»ΠΈ, ΡΠ°ΠΌ ΠΎΠΊΠ°ΠΆΡΡΡΡ Π΅ΡΡ Π½Π΅ ΠΎΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π±Π°Π³ΠΈ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, Π° ΠΌΠ½Π΅ ΠΈ ΡΠ²ΠΎΠΈΡ
Π±Π°Π³ΠΎΠ² Ρ
Π²Π°ΡΠΈΡ), ΠΈ ΠΏΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Π±ΡΠ» Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½ thread-posix.c
. ΠΡ ΡΠΎ Π΅ΡΡΡ, ΠΊΠ°ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ: Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΏΡΡΠ°Π»ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅, ΡΡΡ ΠΆΠ΅ Π²ΡΠ·ΡΠ²Π°Π»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ abort()
β ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ Π½Π΅ ΡΠ΅ΡΠ°Π»ΠΎ ΡΡΠ°Π·Ρ Π²ΡΠ΅Ρ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΠΏΡΠΈΡΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΡΠΈΡ
ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π½Π΅ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ
.
ΠΠΎΠΎΠ±ΡΠ΅, Π² ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π½Π° JS ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΎΠΏΡΠΈΠΈ Emscripten -s ASSERTIONS=1 -s SAFE_HEAP=1
β ΠΎΠ½ΠΈ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΈΠ΄Ρ undefined behavior Π²ΡΠΎΠ΄Π΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ Π½Π΅ Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ (ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΡΠ΅ΡΡΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ typed arrays Π²ΡΠΎΠ΄Π΅ HEAP32[addr >> 2] = 1
) ΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
ΠΡΡΠ°ΡΠΈ, ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ β ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ΅ΠΌΠ°. ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», Π² Qemu Π΅ΡΡΡ "Π²ΡΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ" ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΠΈΠΉ Π±ΡΠΊΠ΅Π½Π΄ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ TCI (tiny code interpreter), ΠΈ ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Qemu Π½Π° Π½ΠΎΠ²ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ²Π΅Π·ΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° C. ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° "Π΅ΡΠ»ΠΈ ΠΏΠΎΠ²Π΅Π·ΡΡ". ΠΠ½Π΅ Π²ΠΎΡ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ TCI ΠΏΡΠΈ ΡΠ°Π·Π±ΠΎΡΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π΅ Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ. Π’ΠΎ Π΅ΡΡΡ Π½Π° Π²ΡΡΠΊΠΈΡ ΡΠ°ΠΌ ARM ΠΈ ΠΏΡΠΎΡΠΈΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°Ρ Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Qemu ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΄Π»Ρ Π½ΠΈΡ Π΅ΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ TCG-Π±ΡΠΊΠ΅Π½Π΄, Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠΈΠΉ Π½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΊΠΎΠ΄, Π° Π·Π°ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ Π½Π° Π½ΠΈΡ TCI β ΡΡΠΎ Π΅ΡΡ Π²ΠΎΠΏΡΠΎΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° TCI ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΎΡΡ. Π ΠΈΡΠΎΠ³Π΅ Π² ΠΊΠΎΠ΄ Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ Π½Π΅ Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈΡΡ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°ΡΡΠΈ Qemu.
Π Π°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΊΡΡΠΈ
Π ΠΈΡΠΎΠ³Π΅, Π½Π΅ Π²ΡΡΠΎΠ²Π½Π΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ Π² TCI Π±ΡΠ» ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½, ΡΠ΄Π΅Π»Π°Π½ Π³Π»Π°Π²Π½ΡΠΉ ΡΠΈΠΊΠ», ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π²ΡΠ·ΡΠ²Π°Π²ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, RCU ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎ ΠΌΠ΅Π»ΠΎΡΠΈ. Π Π²ΠΎΡ Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ Qemu Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ -d exec,in_asm,out_asm
, ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅ΠΉ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΠΏΠΈΡΠ°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ Π±ΡΠ», ΠΊΠ°ΠΊΠΎΠΉ Ρ
ΠΎΡΡΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ°Π» (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π±Π°ΠΉΡΠΊΠΎΠ΄). ΠΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π»ΠΎΠΊΠΎΠ² ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ, ΠΏΠΈΡΠ΅Ρ ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π·Π°ΠΏΡΡΡΠΈΡΡΡ RCU ΠΈβ¦ ΠΏΠ°Π΄Π°Π΅Ρ ΠΏΠΎ abort()
Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ free()
. ΠΡΡΡΠΌ ΠΊΠΎΠ²ΡΡΡΠ½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ free()
ΡΠ΄Π°Π»ΠΎΡΡ Π²ΡΡΡΠ½ΠΈΡΡ, ΡΡΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ° ΠΊΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π»Π΅ΠΆΠΈΡ Π² Π²ΠΎΡΡΠΌΠΈ Π±Π°ΠΉΡΠ°Ρ
, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ
Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±Π»ΠΎΠΊΠ° ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΡΡ ΠΌΡΡΠΎΡ.
Π Π°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΊΡΡΠΈ β ΠΊΠ°ΠΊ ΠΌΠΈΠ»ΠΎβ¦ Π ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ β ΠΈΠ· (ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ) ΡΠ΅Ρ
ΠΆΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² ΡΠΎΠ±ΡΠ°ΡΡ Π½Π°ΡΠΈΠ²Π½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ ΠΈ ΠΏΡΠΎΠ³Π½Π°ΡΡ ΠΏΠΎΠ΄ Valgrind. Π§Π΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ Π±ΡΠ» Π³ΠΎΡΠΎΠ². ΠΠ°ΠΏΡΡΠΊΠ°Ρ Ρ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΠΎΠΏΡΠΈΡΠΌΠΈ β ΠΏΠ°Π΄Π°Π΅Ρ Π΅ΡΡ Π½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½Π΅ Π΄ΠΎΠΉΠ΄Ρ Π΄ΠΎ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ΅ΠΏΡΠΈΡΡΠ½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ β Π²ΠΈΠ΄Π°ΡΡ, ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ Π±ΡΠ»ΠΈ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ΅ ΠΆΠ΅, ΡΡΠΎ Π½Π΅ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π²Π΅Π΄Ρ configure ΡΠ°Π·Π²Π΅Π΄Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ, Π½ΠΎ Ρ ΠΌΠ΅Π½Ρ ΠΆΠ΅ Π΅ΡΡΡ Valgrind β ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡ Π±Π°Π³Ρ ΠΏΠΎΡΠΈΠ½Ρ, Π° ΠΏΠΎΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ²Π΅Π·ΡΡ, ΠΈ ΠΈΡΡ
ΠΎΠ΄Π½Π°Ρ ΠΏΡΠΎΡΠ²ΠΈΡΡΡ. ΠΠ°ΠΏΡΡΠΊΠ°Ρ Π²ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΠΎΠ΄ Valgrindβ¦ Π«-Ρ-Ρ, Ρ-Ρ-Ρ, Ρ-Ρ-Ρ, ΠΎΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΎΡΡ, Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ»ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΠΎΡΠ»ΠΎ Π΄Π°Π»ΡΡΠ΅ ΠΌΠΈΠΌΠΎ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π³Π° Π±Π΅Π· Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ ΡΠΆ ΠΎ ΠΏΠ°Π΄Π΅Π½ΠΈΡΡ
. Π ΡΠ°ΠΊΠΎΠΌΡ ΠΆΠΈΠ·Π½Ρ ΠΌΠ΅Π½Ρ, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, Π½Π΅ Π³ΠΎΡΠΎΠ²ΠΈΠ»Π° β ΠΏΠ°Π΄Π°ΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΠΏΠ°Π΄Π°ΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΠΎΠ΄ Π²Π°Π»Π³ΡΠΈΠ½Π΄ΠΎΠΌ. Π§ΡΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ β Π·Π°Π³Π°Π΄ΠΊΠ°. ΠΠΎΡ Π³ΠΈΠΏΠΎΡΠ΅Π·Π°, ΡΡΠΎ ΡΠ°Π· Π² ΠΎΠΊΡΠ΅ΡΡΠ½ΠΎΡΡΡΡ
ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ gdb ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π» ΡΠ°Π±ΠΎΡΡ memset
-Π° Ρ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎ Π»ΠΈ mmx
, ΡΠΎ Π»ΠΈ xmm
ΡΠ΅Π³ΠΈΡΡΡΠΎΠ², ΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ, Ρ
ΠΎΡΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π²Π΅ΡΠΈΡΡΡ ΡΠ»Π°Π±ΠΎ.
Π-ΠΊΠ΅ΠΉ, Valgrind Π·Π΄Π΅ΡΡ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, Π½Π΅ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ. Π Π²ΠΎΡ ΡΡΡ Π½Π°ΡΠ°Π»ΠΎΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠ΅ β Π²ΡΡ, Π²ΡΠΎΠ΄Π΅, Π΄Π°ΠΆΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π½ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅Π²Π΅Π΄ΠΎΠΌΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΠΈΠ·-Π·Π° ΡΠΎΠ±ΡΡΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π½Π°Π·Π°Π΄. ΠΠΎΠ»Π³ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄ΡΡΡΠΏΠΈΡΡΡΡ Π±ΡΠ»ΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ ΠΊΠ°ΠΊ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² ΠΏΡΠΈΡΠ»ΠΎΡΡ Π²ΡΡ-ΡΠ°ΠΊΠΈ ΡΠ΅ΡΡΡ ΠΈ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ. ΠΠ΅ΡΠ°ΡΡ ΡΠΎΠ³ΠΎ, ΡΠ΅ΠΌ Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π΅ Π½Π° ΡΠΈΡΠ»ΠΎ, Π°, ΡΠΊΠΎΡΠ΅Π΅, Π½Π° ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π, ΠΎ ΡΡΠ΄ΠΎ, ΡΡΠ° Π±ΠΈΠ½Π°ΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ° Π½Π°ΡΠ»Π°ΡΡ Π² ΡΠ°ΠΉΠ»Π΅ Ρ Π±ΠΈΠΎΡΠΎΠΌ β ΡΠΎ Π΅ΡΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ°, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π² ΡΡΠΎΡ Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π»ΠΎΡΡ. ΠΡ Π° Π΄Π°Π»ΡΡΠ΅ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ°ΠΊ β Π² Emscripten, ΠΊ ΡΡΠ°ΡΡΡΡ, ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π½Π΅Ρ, Π΄ΡΡ Π² Π½ΡΠΌ ΡΠΎΠΆΠ΅ Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π³Π΄Π΅ Π½ΠΈΠ±ΡΠ΄Ρ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΠΊΠΎΠ΄Π° Π²ΡΠ²ΠΎΠ΄ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Ρ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΈ, Π΅ΡΠ»ΠΈ ΡΠΎΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΡ. ΠΡΠ°Π²Π΄Π°, Π½Π° Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡ ΠΏΠΎΡΠ»Π΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΡΡ ΠΏΠ°ΡΠ° ΠΌΠΈΠ½ΡΡ, Π½ΠΎ ΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»Π°Π΅ΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π±ΡΠ»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ°, ΠΊΠΎΠΏΠΈΡΡΡΡΠ°Ρ BIOS ΠΈΠ· Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° Π² Π³ΠΎΡΡΠ΅Π²ΡΡ ΠΏΠ°ΠΌΡΡΡ β ΠΈ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π² Π±ΡΡΠ΅ΡΠ΅ Π½Π΅ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°. ΠΠΎΠΈΡΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ° Π±ΡΡΠ΅ΡΠ° ΠΏΡΠΈΠ²Π΅Π» Π² ΡΡΠ½ΠΊΡΠΈΡ qemu_anon_ram_alloc
Π² ΡΠ°ΠΉΠ»Π΅ oslib-posix.c
β Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°ΠΌ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ: ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π²ΡΡΠΎΠ²Π½ΡΡΡ Π°Π΄ΡΠ΅Ρ ΠΏΠΎ huge page ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 2 ΠΠ±, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΠΌ Ρ mmap
ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅, Π° ΠΏΠΎΡΠΎΠΌ Π»ΠΈΡΠ½Π΅Π΅ Π²Π΅ΡΠ½ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ munmap
. Π Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ΅ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΠΎ ΡΠΊΠ°ΠΆΠ΅ΠΌ Π²ΠΌΠ΅ΡΡΠΎ 2 ΠΠ± ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ 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+. Π’ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΡΠΎΡΠ½ΠΈΡΡ, ΡΡΠΎ ΠΊΠΎΠ΄ Π±Π»ΠΎΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Qemu Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΊΠΎΡΡΡΠΈΠ½Π°Ρ
. Π Emscripten Π΅ΡΡΡ ΡΠ²ΠΎΡ Π²Π΅ΡΡΠΌΠ° Π·Π°ΠΊΠΎΠ²ΡΡΠΈΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, Π½ΠΎ Π΅Ρ Π΅ΡΡ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ Π² ΠΊΠΎΠ΄Π΅ Qemu, Π° ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ: Qemu ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠΏΡΠΈΠΈ -kernel
, -initrd
, -append
, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Linux ΠΈΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, memtest86+, Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π±Π»ΠΎΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠΎ Π²ΠΎΡ Π½Π΅Π·Π°Π΄Π°ΡΠ°: Π² Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ Π²ΡΠ²ΠΎΠ΄ Linux kernel Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ -nographic
, Π° ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π», ΠΎΡΠΊΡΠ΄Π° Π±ΡΠ» Π·Π°ΠΏΡΡΠ΅Π½ emrun
, Π½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΠ»ΠΎ. Π’ΠΎ Π΅ΡΡΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ: ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈΠ»ΠΈ Π²ΡΠ²ΠΎΠ΄ Π³ΡΠ°ΡΠΈΠΊΠΈ. Π ΠΏΠΎΡΠΎΠΌ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ. ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ "ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π½Π΅ ΡΠΏΠΈΡ, Π° ΠΏΡΠΎΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΌΠΎΡΠ³Π°Π΅Ρ", ΠΈ ΠΌΠΈΠ½ΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΡΡΡ ΡΠ΄ΡΠΎ Π²ΡΠΊΠΈΠ½ΡΠ»ΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΏΠ°ΡΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΡΠ»ΠΎ Π²ΠΈΡΠ½ΡΡΡ Π΄Π°Π»ΡΡΠ΅. Π‘ΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ, Π² ΡΠ΅Π»ΠΎΠΌ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΈ ΠΊΠΎΠΏΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ Π² ΠΊΠΎΠ΄Π΅ ΡΠ°Π±ΠΎΡΡ Ρ SDL2. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Ρ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π΅ ΡΠΌΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π°ΡΠ³Π°Π΄. Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΏΡΠΎΠΌΠ΅Π»ΡΠΊΠ½ΡΠ»Π° ΡΡΡΠΎΡΠΊΠ° parallel0 Π½Π° ΡΠΈΠ½Π΅ΠΌ ΡΠΎΠ½Π΅, ΡΡΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΠ»ΠΎ Π½Π° Π½Π΅ΠΊΠΈΠ΅ ΠΌΡΡΠ»ΠΈ. Π ΠΈΡΠΎΠ³Π΅ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ Π΄Π΅Π»ΠΎ Π±ΡΠ»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Qemu ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ
ΠΎΠΊΠΎΠ½ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΎΠΊΠ½Π΅, ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΏΠΎ Ctrl-Alt-n: Π² Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΎΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π² Emscripten β Π½Π΅Ρ. ΠΠΎΡΠ»Π΅ ΠΈΠ·Π±Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΡ Π»ΠΈΡΠ½ΠΈΡ
ΠΎΠΊΠΎΠ½ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΉ -monitor none -parallel none -serial none
ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΡΠ²Π°ΡΡ Π²Π΅ΡΡ ΡΠΊΡΠ°Π½ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠ°Π΄ΡΠ΅ Π²ΡΡ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ.
ΠΠΎΡΡΡΠΈΠ½Ρ
ΠΡΠ°ΠΊ, ΡΠΌΡΠ»ΡΡΠΈΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΠ΄ΠΈΡΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ Π² Π½Π΅ΠΉ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Ρ Π±Π»ΠΎΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° β Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΊΠΎΡΡΡΠΈΠ½. Π Qemu ΡΠΆΠ΅ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ coroutine backend-ΠΎΠ², Π½ΠΎ Π² ΡΠΈΠ»Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ JavaScript ΠΈ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Emscripten Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΎΡΡΠΎ Π²Π·ΡΡΡ ΠΈ Π½Π°ΡΠ°ΡΡ ΠΆΠΎΠ½Π³Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΊΠ°ΠΌΠΈ. ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, "ΡΡΡ ΠΏΡΠΎΠΏΠ°Π»ΠΎ, Π³ΠΈΠΏΡ ΡΠ½ΠΈΠΌΠ°ΡΡ", Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Emscripten ΡΠΆΠ΅ ΠΎΠ±ΠΎ Π²ΡΡΠΌ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΠ»ΠΈΡΡ. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π·Π°Π±Π°Π²Π½ΠΎ: Π° Π΄Π°Π²Π°ΠΉΡΠ΅ Π½Π°Π·ΠΎΠ²ΡΠΌ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΎΠ΄Π΅ emscripten_sleep
ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π΄ΡΡΠ³ΠΈΡ
, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ
ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ Asyncify, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΏΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈ Π²ΡΠ·ΠΎΠ²Ρ Π»ΡΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π³Π΄Π΅ Π½ΠΈΠΆΠ΅ ΠΏΠΎ ΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
Π΄Π²ΡΡ
ΡΠ»ΡΡΠ°Π΅Π². Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Π²ΡΠ΄Π΅Π»ΠΈΠΌ async context, Π° ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° β ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ, Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΡΠ» Π»ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ², ΠΈ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΡΡΠ», ΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΠΌ Π²ΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π² ΡΡΠΎΡ async context, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π° ΠΊΠ°ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈ Π²ΡΠΉΠ΄Π΅ΠΌ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΡ ΡΠΆ Π³Π΄Π΅ ΠΏΡΠΎΡΡΠΎΡ Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠ° -O3
. ΠΠ°ΠΏΡΡΠΊΠ°Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΈ Chromium Π²ΡΠΆΠΈΡΠ°Π΅Ρ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΏΠ°Π΄Π°Π΅Ρ. Π― ΠΏΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π» Π½Π° ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΠΏΡΡΠ°Π»ΡΡ Π·Π°Π³ΡΡΠ·ΠΈΡΡβ¦ ΠΡ, ΡΡΠΎ Ρ ΠΌΠΎΠ³Ρ ΡΠΊΠ°Π·Π°ΡΡ, Ρ Π±Ρ ΡΠΎΠΆΠ΅ Π·Π°Π²ΠΈΡ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΠ»ΠΈ Π²Π΄ΡΠΌΡΠΈΠ²ΠΎ ΠΈΠ·ΡΡΠΈΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΆΠ°Π²Π°ΡΠΊΡΠΈΠΏΡ Π½Π° 500+ ΠΠ±.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Asyncify Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠΆΠΈΠ»ΠΈ Ρ longjmp
-Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΊΠΎΠ΄Π΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, Π½ΠΎ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΡΠ°, ΠΎΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ Π²ΡΡ Ρ
ΠΎΡΠΎΡΠΎ, ΠΊΠΎΠ΄ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π». Π ΡΡΡ Π½Π°ΡΠ°Π»ΠΎΡΡ ΡΡΡΠ°Π½Π½ΠΎΠ΅: ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ β ΡΠ΅ ΡΠ°ΠΌΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΠΊΠΎΠ΄, Π΅ΡΠ»ΠΈ ΠΏΠΎ Π»ΠΎΠ³ΠΈΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ β ΠΊΡΠΎ-ΡΠΎ ΠΏΡΡΠ°Π»ΡΡ Π·Π°Ρ
Π²Π°ΡΠΈΡΡ ΡΠΆΠ΅ Π·Π°Ρ
Π²Π°ΡΠ΅Π½Π½ΡΠΉ ΠΌΡΡΡΠ΅ΠΊΡ. Π ΡΡΠ°ΡΡΡΡ, ΡΡΠΎ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ Π½Π΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ β ΠΏΡΠΎΡΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠ°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ main loop, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Emscripten, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π» ΡΡΠ΅ΠΊ, Π° Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π» setTimeout
ΠΎΡ main loop β ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ Π·Π°Ρ
ΠΎΠ΄ΠΈΠ» Π² ΠΈΡΠ΅ΡΠ°ΡΠΈΡ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°, Π½Π΅ Π²ΡΠΉΠ΄Ρ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π» Π½Π° Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΠΈ emscripten_sleep
, ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΌΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΈΡΡ. ΠΠΎΠ΄ Π΄Π°ΠΆΠ΅ Π»ΠΎΠ³ΠΈΡΠ½Π΅Π΅ ΡΡΠ°Π» β Π²Π΅Π΄Ρ, ΠΏΠΎ ΡΡΡΠΈ, Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΠΊΠ°Π΄Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ β ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΡΡΠΎ-ΡΠΎ ΡΡΠΈΡΠ°Π΅Ρ ΠΈ ΡΠΊΡΠ°Π½ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° ΡΡΠΎΠΌ Π½Π΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΈΡΡ: ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Qemu ΠΏΡΠΎΡΡΠΎ ΡΠΈΡ
ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π»ΠΎΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ
Π±Ρ ΡΠΎ Π½ΠΈ Π±ΡΠ»ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. Π ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ Π½Π° ΡΡΠΎ Π·Π°Π±ΠΈΠ», Π½ΠΎ, Π·Π°Π±Π΅Π³Π°Ρ Π²ΠΏΠ΅ΡΡΠ΄ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Π²ΠΎΡ Π² ΡΡΠΌ: ΠΊΠΎΠ΄ ΠΊΠΎΡΡΡΠΈΠ½, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ setTimeout
(Π½Ρ ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π½Π΅ ΡΠ°ΠΊ ΡΠ°ΡΡΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ): ΡΡΠ½ΠΊΡΠΈΡ emscripten_yield
ΠΏΡΠΎΡΡΠΎ Π²ΡΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»Π°ΠΆΠΎΠΊ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. ΠΡΡ ΡΠΎΠ»Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ emscripten_coroutine_next
Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ: Π²Π½ΡΡΡΠΈ ΡΠ΅Π±Ρ ΠΎΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠ»Π°ΠΆΠΎΠΊ, ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΠ΄Π° Π½Π°Π΄ΠΎ. Π’ΠΎ Π΅ΡΡΡ Π½Π° Π½Π΅ΠΉ ΡΠ°ΡΠΊΡΡΡΠΊΠ° ΡΡΠ΅ΠΊΠ° Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΈΠ·-Π·Π° use-after-free, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΡΠ²Π»ΡΠ»ΡΡ ΠΏΡΠΈ ΠΎΡΠΊΠ»ΡΡΡΠ½Π½ΠΎΠΌ ΠΏΡΠ»Π΅ ΠΊΠΎΡΡΡΠΈΠ½ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Ρ Π½Π΅ Π΄ΠΎΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π» Π²Π°ΠΆΠ½ΡΡ ΡΡΡΠΎΡΠΊΡ ΠΊΠΎΠ΄Π° ΠΈΠ· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ coroutine backend, ΡΡΠ½ΠΊΡΠΈΡ qemu_in_coroutine
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»Π° true, ΠΊΠΎΠ³Π΄Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΠ»Π° Π²Π΅ΡΠ½ΡΡΡ false. ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π²ΡΠ·ΠΎΠ²Ρ emscripten_yield
, Π²ΡΡΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎ ΡΡΠ΅ΠΊΡ Π½Π΅ Π±ΡΠ»ΠΎ emscripten_coroutine_next
, ΡΡΠ΅ΠΊ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π»ΡΡ Π΄ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Π²Π΅ΡΡ
Π°, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
setTimeout
, ΠΊΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», Π½Π΅ Π²ΡΡΡΠ°Π²Π»ΡΠ»ΠΎΡΡ.
ΠΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΡ JavaScript
Π Π²ΠΎΡ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΠΎΠ±Π΅ΡΠ°Π½Π½ΠΎΠ΅ "ΠΏΡΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠ° Π½Π°Π·Π°Π΄". ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅Ρ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Qemu, Π° Π² Π½ΡΠΌ β Node.js, ΡΠΎ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π² Qemu ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ ΡΠΎΡ JavaScript. ΠΠΎ Π²ΡΡ-ΡΠ°ΠΊΠΈ, ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠΊΠ°ΠΊΠΎΠ΅, Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Qemu. Π‘ΡΠ°Π·Ρ ΠΏΡΠΎΡΡ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΈΡΡ: Ρ Π½Π΅ ΡΠ²Π»ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ Qemu ΠΈ ΠΌΠΎΠΈ Π²ΡΠ²ΠΎΠ΄Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΎΡΠΈΠ±ΠΎΡΠ½Ρ. ΠΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, "ΠΌΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ΄Π΅Π½ΡΠ° Π½Π΅ ΠΎΠ±ΡΠ·Π°Π½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΠΌΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ, Π°ΠΊΡΠΈΠΎΠΌΠ°ΡΠΈΠΊΠΎΠΉ ΠΠ΅Π°Π½ΠΎ ΠΈ Π·Π΄ΡΠ°Π²ΡΠΌ ΡΠΌΡΡΠ»ΠΎΠΌ". Π£ Qemu Π΅ΡΡΡ Π½Π΅ΠΊΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ
Π³ΠΎΡΡΠ΅Π²ΡΡ
Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡ ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΅ΡΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π²ΡΠΎΠ΄Π΅ target-i386
. ΠΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π³ΠΎΡΡΠ΅Π²ΡΡ
Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡ, Π½ΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΎΠ². ΠΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π½Π΅ΠΊΠΈΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Qemu, ΠΊΠΎΡΠΎΡΡΠ΅ TCG (Tiny Code Generator) ΡΠΆΠ΅ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ Π² ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ Ρ
ΠΎΡΡΠΎΠ²ΠΎΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ. ΠΠ°ΠΊ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² readme-ΡΠ°ΠΉΠ»Π΅, Π»Π΅ΠΆΠ°ΡΠ΅ΠΌ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ tcg, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎ Π±ΡΠ»Π° ΡΠ°ΡΡΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° C, ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ JIT. ΠΠΎΡΡΠΎΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, target architecture Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ
ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° β ΡΡΠΎ ΡΠΆΠ΅ Π½Π΅ Π³ΠΎΡΡΠ΅Π²Π°Ρ, Π° Ρ
ΠΎΡΡΠΎΠ²Π°Ρ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°. Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ β Tiny Code Interpreter (TCI), ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠ΄ (ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ ΠΆΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ) Π² ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Ρ
ΠΎΡΡΠΎΠ²ΡΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ Π² Π΅Π³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ Ρ
ΠΎΡΠΎΡΠΎ, ΠΊΠ°ΠΊ JIT-ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΠ»Π°Π½Π΅ ΡΠΊΠΎΡΠΎΡΡΠΈ, Π½ΠΎ ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ. Π₯ΠΎΡΡ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π΅Π³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ.
ΠΠΎΠ½Π°ΡΠ°Π»Ρ Ρ ΠΏΡΡΠ°Π»ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ TCG backend, Π½ΠΎ Π±ΡΡΡΡΠΎ Π·Π°ΠΏΡΡΠ°Π»ΡΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°Ρ ΠΈ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π±Π°ΠΉΡΠΊΠΎΠ΄Π°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΡΠΈΠ» ΠΎΠ±Π΅ΡΠ½ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ TCI. ΠΡΠΎ Π΄Π°Π»ΠΎ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²:
- ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π΅ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, Π° Π² ΠΊΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°
- ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΡΡΡΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ, Π° Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
- Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Π° ΡΠ°ΠΊΠΎΠ΅, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌ Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌΠΈ ΡΠ»ΠΎΠ²ΠΎ patch) ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ JS-ΠΊΠΎΠ΄, Π½ΠΎ Ρ ΠΌΠ΅Π½Ρ Ρ ΠΎΡΡ Π±Ρ Π±ΡΠ΄Π΅Ρ, ΠΈΠ· ΡΠ΅Π³ΠΎ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ
ΠΠ° ΡΡΡΡ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΠΏΡΠ½ΠΊΡΠ° Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΠΏΠ°ΡΡΠΈΠ½Π³ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»Π½Π΅Π½, Π½ΠΎ ΠΈ ΠΏΠ΅ΡΠ²ΡΡ Π΄Π²ΡΡ ΠΏΡΠ½ΠΊΡΠΎΠ² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ.
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΊΠΎΠ΄ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π»ΡΡ Π² Π²ΠΈΠ΄Π΅ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ switch ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π±Π°ΠΉΡΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΠΎΡΠΎΠΌ, Π²ΡΠΏΠΎΠΌΠ½ΠΈΠ² ΡΡΠ°ΡΡΡ ΠΏΡΠΎ Emscripten, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ JS ΠΈ relooping, ΡΠ΅ΡΠΈΠ» Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ ΡΠΌΠΏΠΈΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΎΡΡ, ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠΎΡΠΊΠ° Π²Ρ
ΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ β ΡΡΠΎ Π΅Π³ΠΎ Π½Π°ΡΠ°Π»ΠΎ. Π‘ΠΊΠ°Π·Π°Π½ΠΎ β ΡΠ΄Π΅Π»Π°Π½ΠΎ, ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡ, Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Ρ if-Π°ΠΌΠΈ (Ρ
ΠΎΡΡ ΠΈ Π±Π΅Π· ΡΠΈΠΊΠ»ΠΎΠ²). ΠΠΎ Π²ΠΎΡ Π½Π΅Π·Π°Π΄Π°ΡΠ°, ΠΎΠ½ ΠΏΠ°Π΄Π°Π», Π²ΡΠ΄Π°Π²Π°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π° ΡΡΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΠ΅ΠΊΡΡΡΠΈΠΈ Π±ΡΠ»Π° brcond
. Π₯ΠΎΡΠΎΡΠΎ, Π΄ΠΎΠ±Π°Π²Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π² Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΡΠΎΠΉ ΠΈΠ½ΡΡΡΠΊΡΠΈΠΈ Π΄ΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΈβ¦ Π½Π΅ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ
Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ, Π½ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠ²ΠΈΡΠ° ΠΏΠΎ assert-Ρ Π²ΡΡ ΠΆΠ΅ ΡΠΏΠ°Π»ΠΈ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΈΠ·ΡΡΠΈΠ² ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, Ρ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ switch-Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅ΠΊΡΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠΎ ΡΡΠ΅ΠΊΠ° ΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°Π΅ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΌ JavaScript-ΠΊΠΎΠ΄ΠΎΠΌ. Π’Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ. Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡΠ° Π΄ΠΎ Π΄Π΅ΡΡΡΠΈ Π½ΠΈ ΠΊ ΡΠ΅ΠΌΡ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π»ΠΎ, ΠΈ ΡΡΠ°Π»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π±Π΅Π³Π°Π΅Ρ ΠΏΠΎ ΠΊΡΡΠ³Ρ. ΠΡΠΈΡΠ»ΠΎΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, ΡΡΠΎ ΠΌΡ Π½Π΅ Π²ΡΡΠ»ΠΈ Π·Π° Π³ΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ TB, ΠΈ Π΅ΡΠ»ΠΈ Π²ΡΡΠ»ΠΈ, ΡΠΎ Π²ΡΠ΄Π°Π²Π°ΡΡ Π°Π΄ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ TB ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ ΠΌΠΈΠ½ΡΡ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π ΡΠΎΠΌΡ ΠΆΠ΅ ΡΡΠΎ ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ "ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΡΡ Π²ΠΎΡ ΡΡΠΎΡ ΠΊΡΡΠΎΡΠ΅ΠΊ Π±Π°ΠΉΡΠΊΠΎΠ΄Π°?" β ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠΎΠΌΡ Π±Π»ΠΎΠΊΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ. ΠΡΡΠ°ΡΠΈ, Ρ
ΠΎΡΡ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°Π» Ρ Π²ΡΡ Π² 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. ΠΠΎΠΊΠ° ΠΆΠ΅ Π΅ΡΡΡ Π²Π΅ΡΠΊΠ° Π² Π³ΠΈΡΠ΅ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Π±Π»ΠΎΠ³Π°: ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ Ρ
ΠΎΡΡ ΠΊΠ°ΠΊ-ΡΠΎ ΠΏΡΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡ "ΡΡΠΎΠ²Π½Ρ" Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΡΠ°Π·Π²ΡΡΠ½ΡΡΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅. Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠ° ΡΡΠ°ΡΡΡ Π² Π½Π΅ΠΌΠ°Π»ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ β ΠΏΠ΅ΡΠ΅ΡΠΊΠ°Π· Π²ΡΠ²ΠΎΠ΄Π° git log
.
ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠΎ Π²ΡΡ ΠΌΠΎΠΆΠ½ΠΎ
Π§ΡΠΎ ΡΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
- Π Π°Π±ΠΎΡΠ°Π΅Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ x86
- ΠΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠΎΡΠΈΠΏ JIT-ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° JavaScript
- ΠΡΡΡ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π΄ΡΡΠ³ΠΈΡ 32-Π±ΠΈΡΠ½ΡΡ Π³ΠΎΡΡΠ΅Π²ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ: Π²Ρ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΠ±ΠΎΠ²Π°ΡΡΡΡ Π½Π° Π²ΠΈΡΠ½ΡΡΠΈΠΉ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Π½Π° ΡΡΠ°ΠΏΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΠΈΠ½ΡΠΊΡ Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ MIPS
Π§ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ
- Π£ΡΠΊΠΎΡΠΈΡΡ ΡΠΌΡΠ»ΡΡΠΈΡ. ΠΠ°ΠΆΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ JIT ΠΎΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΡΠ΅ΠΌ Virtual x86 (Π·Π°ΡΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΅ΡΡΡ ΡΠ΅Π»ΡΠΉ Qemu Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΌΡΠ»ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΆΠ΅Π»Π΅Π·Π° ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ)
- Π‘Π΄Π΅Π»Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ β Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΠ· ΠΌΠ΅Π½Ρ, ΠΏΡΡΠΌΠΎ ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ°ΠΊ ΡΠ΅Π±Π΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π΅Π»Π°Π» ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ Emscripten, ΠΊΠ°ΠΊ ΡΡΠΌΠ΅Π»
- ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Qemu β ΡΠ΅ΡΡ, ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ VM ΠΈ Ρ.Π΄.
- UPD: Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΄Π°ΡΡ Π² Π°ΠΏΡΡΡΠΈΠΌ Emscripten ΡΠ²ΠΎΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π½Π°ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π±Π°Π³-ΡΠ΅ΠΏΠΎΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΈ Qemu ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ². Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ ΠΈΠΌ Π·Π° ΡΠΎ, ΡΡΠΎ Π±ΡΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΡ Π²ΠΊΠ»Π°Π΄ΠΎΠΌ Π² Emscripten Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠ²ΠΎΠ΅ΠΉ Π·Π°Π΄Π°ΡΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com