ααΆαααΈααα»ααααΆαααααΆααα»α Fabrice Bellard
- αααααβααΎαβα αα
- αααααααΆααααα»αααΆαααααΎααΆααααααααΆααααααα·ααΈαααααΆααΊαααα
- αααααααΆααααα»αααΆαααααΎααΆααα αααα»αααααα’ααααααααα
- ααΆαααΆαααααααααΆααααααΆααααααααααα αΆαααααα αα·αααααααα½αα ααα½ααα
ααΆααααααΉαα ααα»α ααΈ 3 α₯α‘αΌαααααααα»αα’αΆα ααααααααΆαααΆααΆααα·ααα αααα»ααααα TCI ααΆαα·ααααααΆααΆαααααΆααααααααΆαααΈαααααααααααααΌαααΆαααααααΆααααααααα»αααα bytecode αααααα½αααΆαααΈαα½αααααα»ααααααααα·αααααΆααααααΌαααααΉαααΆααα - ααΎααααΈαααααΎααα·αααααΎαααΆαα Qemu αα ααΎααααΆααααααααααααΈ ααααα·αααΎα’αααααΆαααααΆα α’αααα ααααα C ααΊαααααααααΆααα αΎα ααΆααααααααΌααααααΎαααΌαα’αΆα ααααΌαααΆααααααΆααααα
α αΎαα₯α‘αΌαααα αααααΆααααΈααααααααΈαααααΆαααααΆααααααΆαααα αααΆαα½αααΌαααααα Qemu αααα»ααααααααααααααααα»α ααααΌααΆαααΆααα½αααΆαααα α αααα αααα’αααα’αΆα ααααΎαααΆαααΆαα αΎα α§ααΆα ααα Kolibri OS α
Emscripten ααΊααΆα’αααΈ
ααααααααααα α’αααα
αααααααΆα
αααΎαααΆααααα αΆααααα½α αααααααααα
α»ααααααααΊ JavaScript α αα½αα
ααα½αααΌα
ααΆ Type Script ααΎαα‘αΎαααΆαααααααΆαα·ααΈααα’αααα»ααααα»αααΆαααααααααααΆααααα αααααα αααα»ααααααΆαα½αααααΆααα Emscripten ααΊααΆαα·ααΈαα½αααΎααααΈααααΌα C α¬ C++ αααααΆαααααΆαα α αΎαα
αααααααΆαα
ααΆαααααα browser αααα’αΆα
α’αΆαααΆαα ααΎα
ααΆαααααααααΌα
αα·ααΆαααΆααΌαα
αααα»ααα·ααααααΆααα»αααααααΌαααααααααΎααααα·αααααΆααααααΌα Qemu αα
ααΆαα JavaScript αααααα ααΆααααα½ααα½αααααΌαααΆααα½ααα
ααΎαααα·ααΆ ReactOS ααααα·αααΎααΆα’αΆα
ααααΎαα
ααΆααααααααΎ Emscripten α ααΌααααΈαααα»αααα ααΆαααΆαααα
α
αΆαα’αΆαααΆαααΆ Fabrice Bellard ααΆαααααΎααΏαααααααααααΆαα ααα»ααααααΎααααα»ααα·ααΆαα’αααΈ jslinux αααααΆααααα»αααΉαααΊααααΆααααααΆααΆαααα»ααααααΎααααΈαααααα
ααΆαααΌαααααΎαααΆααααααααααΆαααα
αααα»α JS ααααα α αΎαααααΌαααΆααααααααΈαααα ααααααα αα·αααα·α x86 ααααΌαααΆαααααα - αααααααααα·αααΆαααΆαα
ααααΌαα
αααααααααΌαααΆααααα αααααααΆααααΆ α αΎαααΌα
αααααΆααααααΆαα "ααΆαααααΆαααα·αα" ααΆααααα
αααΎαααααΆαααααΆααααΆαααααΎα±ααααΆα’αΆα
ααααΎ SeaBIOS ααΆαααααα·ααΈααααααα ααΎαααΈαααααα αααΆαα αα
ααΆααααΆαααΆαααα»αααααα½αααΎααααΈα
ααα Qemu αααααααΎ Emscripten - αααα»αααΆαααααΆααΆαααααΎααΆ
ααΌα
αααα ααΆααΉαα αΆααααΈααΌα
ααΆ αααααΊααΆααααα αααααΊααΆ Emscripten - ααααΆ α αΎαα
αααααα ααα»ααααααααΆααααααΆαααααα Qemu α’αΆααααα αα·ααααααΆαααααααααααΆαααααΆαααααα’αΆαααααααα α αΎααα½ααααα»αα
αααααααααΊ
αα
ααΎαααααΌαααΆααααα·ααα½αααΎααααΈααααΆααααααααααααα½α libffi ααΆαα½α JS α αΎαααααΎαααΆαααααααααααααΆα ααα»αααααα
ααΈαααα
αααααα»αααΆαααΆααααααα
ααα‘αα’αααΈαααααααααΎαα―αααΆαααααααΆαααααααα»αααΎααααΈα±αααα½αααα’αΆα
ααααΎααΆαααΆαα½αααΌααααααΆαααααΆαα ααΎαααα»αα’αΆα
ααααΎα’αααΈααΆα? ααΌα
ααααα½ααααα·ααΆαααΆ "ααΎαα·α
αα
ααΆααααα»αααααΆαααΆαα "ααΎααΎααααααααΆααααααα?" αααα»αααααΌαααααΆαα libffi αα
ααΆααααααΆαααααααααα½ααααααααα ααΌα
ααααααΎααααΈαα·ααΆα - ααΆααααΆαααα’ Emscripten ααΆααααΆααααΌααΆααααΈααααααΆααααΆααα½αααααα»αααααΆαααα»ααα½α (αα
αααα»α Javascript ααΆα - ααα’ ααααΆααααααααα’αααΈααααα ααΌα
ααααα’αααααα‘αΎα) αα·ααααααααΆααααα»αααΆαααααΎαααΆαααΌααααααΆααααααΎαααααΆααα ααΆααΌαα
αααααΆααααΈααααΎααΆαααΆαααααααΆαα½αααΉαααααα libffi αααααΉαααα’ααααΎαααα·ααΆαα½αααααα αααα»αααα½αααΆαααΌααααα’αΆα
α
αααααααΆααααα α αΎαααααΎαααΆαααΆαα
ααΎααΆαααΆαααααααααΌαααααααα»αααΆαααααααΆααα ααΆααΆαααααΆααααα’αΎααααααααα»α ααΆαααααΎαααααααΆαααααααα αααα‘αΆααααΆαααααααΆαααα·ααααααααααααααα»α - αα·ααααααΎα
αα ααΆααααΎαααΆαααΆααααΈααΆαα
αΆααααααΎαααααΌα - αααα»ααα
αααα·αααΏααααααααααααα»α ααΆααα
ααΎαααΌαααααααααααααα ααΎααααΈααΆαααααααααααααααααααΌαααΈααααααΆαααααα αααααΆααΎαααΈα’ααααααα»αααααΎαα»α - ααΏααααα½ααααααααααα»αααααΎααΊ ffi_call
- αααααΆαααΆαααΆαααααΈααΆαα α
ααααααα αα·αααΆαααΆαα α
αααα½αα―αααα ααΌα
αααααααα»αααΆαααααΎααααΎαααΆαααααΌααααααααα»α αααααΆαααααα α»ααααα»αααΆαααααΎααααααααα
αααΆααααΆααα
αααααα·ααα Olympiad ααΆαα½α - α
ααα½ααα·ααα·ααα½αααααααααααΆ a == b
αα·αααΌααααΈαααααα a - b < EPS
- α’αααααααααΌαα
αα
αΆααααΌαα»αααα ααΎαα·αααΌα
αααααα 0 ααΉααααααα
ααΆααααΆααααααΎααΉα 1/3... ααΆααΌαα
αααα»αααΆαααααΆααααααΆαα½αααΌαα
αααααΆαα½ααα libffi αααααααααΆααααΆαααΆαααααααααΆαααααααα»α α αΎαααΎ glib αα½αααΆα α
ααααα - αααα»αααΆααααααα
α
α·αααααΆααΆα
αΆαααΆα
α αααα»αααΉαααααααααΆαα
ααααααααα αααααΉααα
αα»α αααα»αααΉααα·ααΆαααΆ ααΌα
αααααΆααΆαααααααααΆα α’αααα
ααααααα·αααΆααααα
αΌααα»αααΆα libffi αα
αααα»αααΌαα
α»ααααααααα
ααα»ααααααΌα ααααααα»αααΆααα·ααΆααα½α ααα αΎαααΆ ααΆααααααααααα½αα ααα½α α αΎααααα»αα ααααααΆαααααΎααααΆααααααα·ααα·αααααααα₯αα·ααΆααααααα·αααΆαααααααααααα αααααααα·αααααααα·αααα’ααΆααααααααααααααΌαααΆαααΆαα - JavaScript ααΆαααΆααα ααΆαα·αααΆαααα multithreading ααΆαα½αα’αααα αα αΆααα½αααα ααΆαααααΆααα ααΆααααααΆααΆα’αΆα ααααΌαααΆαααα α ααΆααΆαααα·αααααα’ ααα»αααααα·αααααααααΆααααΆααααααΌαααΌααααααααΆαααααααααααααα½αααααααΌαααΆαα αααααΆααααΆαα½ααααααααα‘αΆα C αααααα αα·ααΆαααΆααΌαα Firefox αααα»ααα·αααααΆαα½αααΆαααΆααααααααααααααααααΆαα ααααααα α αΎα Emscripten ααΆαααΆαα’αα»αααα pthread αααααΆαααα½ααα ααα»αααααααα»ααα·αα ααααΉαααα’ααααΎααΆααα αααα»αααααΌαα αΆααα¬αααααα·α αααααααΌα multithreading ααΈααΌα 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 ααααα·αααααααααΆααααΌαααΆααααααααΌα ααααα·ααα»αααααΆαααα½αααααΌαααΆααααααΎαα‘αΎα ααααα
αααα»ααααα α
ααΆ processor, RCU αα·αααααααΌα
ααα½αα
ααα½ααααα ααΌα
ααααα αΎα αααα»αααΎαααααΎαααΆα Qemu ααΆαα½αααΉααααααΎα -d exec,in_asm,out_asm
αααααΆααααααΆα’αααααααΌααα·ααΆαααΆαααα»αααααΌαααΆαα½ααααα»αααααΌαααΆαααααα·ααααα· α αΎααα
αααα
αΆααααααΆαααααα ααΎααααΈαααααααΌαααααα α’αααΈαα
ααΆααΌααααΆαααΈα (αααα»αααααΈααα bytecode)α ααΆα
αΆααααααΎα ααααα·ααααα·αααα»αααααααααΆα
αααΎα αααααααΆαααααΆααααα α»αααααααα»αααΆααα»αααΆ RCU ααΉαα
αΆααααααΎα α αΎα... ααΆαα abort()
αα
ααΆααααα»ααα»αααΆααα½αα free()
. ααα tinkering ααΆαα½ααα»αααΆα free()
ααΎαααΆααααααααααααΎααααΈααΉαααΆαα
αααα»αααααααΆαααααα»α heap ααααααα·ααα
αααα»αααααΆαααΈαααα»αα’αααα
αα
αΆααααααΆααααα
αααααα½αα±ααααα ααααα»αα¬α’αααΈαα½ααααααααααααααΆααΆαααααΆαα
ααΆααααααα·α
ααααααΆααααααα - αα½αα±αααααααΆαα ... αααα»αααααΈααααααααΆααααααααΆααααααααΆαααααΆααααααααα - ααΈ (ααααα·αααΎα’αΆα
ααααΎαα
ααΆα) αααααααΌα
ααααΆαααααΌααααα»ααααααααααααααΈαααΎαα αΎαααααΎαααΆαααΆαα
ααααα Valgrind α αααααΆααααΈααααααααααααααααααααΈαααΆαααααααα½α
ααΆααα αααα»αααΎαααααΎαααΆαααΆααΆαα½αααΉααααααΎαααΌα
ααααΆ - ααΆααΆααααΌααααΈαααααα»αα’αα‘α»ααααα
αΆααααααΎα αα»ααααααΆααααααΆαααααα·ααααα·α ααΆααΆααΆααα·ααααααΆαα
α·ααα ααΆααΆααα·αααΆαα ααααααα·αααΌα
ααααΆαα ααααα·ααααααΆααΏααα½αα±ααααααΆααααα’αΎαααααα αααααααΆαααααααα
ααΆααααααααααΆαααααΎαααΎααααααΎααα»αααααΆααααα·α
ααααα½α
ααα»αααααααα»αααΆα Valgrind - ααααΌααααα»αααΉααα½ααα»αααα α»αααα α αΎααααααΆαααα ααααα·αααΎαααα»αααΆαααααΆα ααΎαααΉαααα
α
ααααα αααα»ααααα»αααααΎαααΆαααΏαααααααααα Valgrind... Y-y-y, y-y-y, uh-uh, ααΆααΆαα
αΆααααααΎα, ααααααΆααααΆαα
αΆααααααΎαααΆααααααΆ α αΎαααΆαααααΆααααααΌααα
ααΎα’ααΈαααΆαααααα α»αααΎααααααααΆαααΆααααααΆααααα½αα’αααΈααΆαα
αΌαααααΎα’αααα
αα
αΆααα·αααααΉαααααΌα αα·ααα·ααΆαα’αααΈααΆαααααΆααα ααΈαα·α ααΌα
ααααα½αααααΆααα·ααΆαααΆ αα·αααΆααααα
ααααα»ααααααΆααααΏαααααα - αααααα·ααΈααΆαααααααΆαααα
αααααΎαααααΎαααΆααα
ααααα 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
ααΆαααααΆααααα α»αααΆαα½αααΉαααααααααααΆαααα‘αΎαααΎααα·ααααααΆααααΎαααΆαααααΆαα·αααΆαααααα»ααααααα αααα»αβαα·αβααΉαβα
αααΆααβααΈβααααβαααβαααααα·ααΈβαααβααααΎαααΆαβαααα»αβ browser ααααΆααβαα
emrun
ααα»αααααααααΆαααα½αα
ααα½ααα
αααα»ααα·ααααααααααα
ααΆααααΌαααΆααααα
αα‘αΎααα·α ααΌα
ααααααΆααα»αααααΆαα
αααα»α diff αα·αααΆααααΆα ααα»ααααΎααααΈααααααααΆαααααααΆαααααααααα ααΆααΌαα
ααΆα
αααΆααααΆααααΆααααα
ααΆαααΆαααααΆα ljmpl
ααΆαααΆαααααΆααααααΌααα
α’αΆααααααΆααααααααααΆ α αΎα bytecode αααααΆααααααΎαααΊαα»αααααΆααΆααΌαααααΆαα αα½αααΆαααΆαααααΆαααΎααααΈα α
αα»αααΆααααα½α αα½αααααα·αααΆαα αααααΆααααΈα αααΌα αααααΆαααααΆα αα·ααα·ααααΆααΌααααααααααααΆαααααΆαααΆααααα ααΆα
αααΆααααΆααΆααααΌα ααααΆαααα»ααααααΆαα
αααα»αααΆαα
α»αααααα cr0
ααΆαααααα‘ααααααΌαααΆαααααΎα‘αΎα - αααααααΎαααα½αααΆαααααα - αααααΆαααααΌααα½αααααΆααα
ααΆααααααΆαααΆα α αΎαααΈααΈα αααα js αα·ααααααααΌααα
ααααααΆαααΆαααα ααα»ααααααΆααα·αααΊααΆαααααααα·ααααα½αααααααα Emscripten ααΊααΆαααααΆααααααΎααααα»αααΆαα’ααα±αα
ααααααΌαααΌα
ααΆααΆαα’αα»ααααααΆαααααΆαα call
αα
αααα»α TCI αααααααα·α
αα»αααΆαααΆαα½αααΆαααααααα
αααα»ααααααα long long f(int arg0, .. int arg9)
- αα»αααΆαααααΌαααααααΌαααΆαα α
ααΆαα½αααΉαα
ααα½αα’αΆαα»αααααααααΉαααααΌαα ααααα·αααΎα
αααΆαααααααααΌαααΆαααααΆα α’αΆαααααααΎααΆααααααααΆαααααΆααααα α»α αααααα·ααΈααΉαααΆαα (αααααα’) α¬α α
αα»αααΆααα»αααΆαααααα»α (ααααα½αα±ααααααΆααααα»αααΆαααααΆααααα α»α)α ααΆααααΆααααααΎαααΈααΈααααα - ααΎαααααΎαααΆαααααΆααααααΎααα»αααααααααα / ααα
ααα’αΆαα»αααααααα»ααααααα»ααααα»αααΆαααααααααααααα
αααΎααααααΈααΆααΆααα·ααααα»αααααΌαααΆαααααΆααα½ααααα»αααα»αααααα αααααααααΆααα―αααΊααααα
ααααΆααααΆαα ααα»ααααααΆααΆαααααΆααα
ααΆαααα αΆαααααααααααΆαααααα
αααα αα
αααα»αααΌααααααΆααααααΎααααα»αααΆααα»α α’αΆαα»αααααααααΌαααΆαααααααα αα·αααααααα ααα»ααααααααααααα»αααΆαααΆαα½αα’αΆαα»ααααααααααΆααααααΎααα·αααααΌαααΆαααα α
ααΆ - ααα’ααΌα
αα
αααα»α ααΆαα’αα»αααα libffi αααααααα»αα αααααΊα’ααααααα½ααααααα·αααααΌαααΆααααααααΆααααα
ααΆααααΆαααα’ Qemu ααΆααααααΈαααα½αααααααΆαααΈαα’αΆα α’αΆαααΆααααα»αααααααααΆα―αααΆαααααααΆααΌα ααΆ
DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)
αα½αααΆααααΌαααΆαααααΎαα½αα±ααα’ααααααΎα
ααΆααα ααααΌα αααΆααααΌααααΌαααΆααααααα‘αΎααα·αααΆαααααααα
ααααααααα»αα DEF_HELPER_n
α αΎααααααΆααααααΎα helper.h
. α
αααααα·ααΆαααΆαααααααΆααααΌααααΌαααΆααααααΈααα
ααΆααΆαα»α
αΆααααααΎααα
ααΆαααααααα αα·ααααααΆααααα α αΎααααααΆααααα’αΆααααααΌαααΆαααααα α αΎααααα½αα±ααααΆαα» - #include <helper.h>
ααΆαααααα ααΈαααα»ααααα»αααΆαα±ααΆαααΆααααααααααΆααααα
ααααααααααΎααΆα
α αΎαααΌα
αααααααααΆααααΈααααα½αααααΆαα αΆααααΌα
ααΆααααΎαααΆαα ααΆα αΆααααΌα
ααΆαααααΆαααα’αααααααα·ααααααααΌαααΆαα
αΆααααααΎααα αααααΈααΆ memtest86+ α’αΆα
ααααΎαααΆααα
αααα»ααααΆααΎααααααα αα
ααΈαααααΆα
αΆαααΆα
αααΎααααΈαααααΆααα±ααα
αααΆααααΆααΌα I/O αααα»α Qemu ααααΌαααΆαααααααα
αααα»α coroutines α Emscripten ααΆαααΆαα’αα»ααααααααααΆαααααααΆ ααα»ααααααΆαα
ααααααΌαααΆαααΎααααΈααααΌαααΆαααΆαααααα
αααα»αααΌα Qemu α αΎαα’αααα’αΆα
ααααΆααααα α»ααα½αααααΆαα₯α‘αΌααααα Qemu ααΆαααααααααΎα -kernel
, -initrd
, -append
αααα’αααα’αΆα
α
αΆααααααΎαααΈαα»α
α¬α§ααΆα ααα memtest86+ ααααα·αααααΎα§ααααααααααααΆααααΆαααααααα ααα»αααααααααΊααΆαααα αΆα αα
αααα»αααΆααα½αααααα»αααΎαααα’αΆα
ααΎαααΎαααααααααΊαααααΈαα»α
αα
ααΆαααα»αααΌαααΆαα½αααΉααααααΎα -nographic
α αΎαααααΆαααααααααΈαααααα·ααΈαα»ααααα
ααααΆααΈαααΈαααααααααααΆααααΌαααΆαααΎαααααΎαααΆαααα emrun
, αα·αααΆαααα αααααΊααΆαα·αα
αααΆαααα: αα½αααααΆααα·αααααΎαααΆαα¬ααααααααααΆα ααα·ααα·αααααΎαααΆαα α αΎααααααΆααααααΆααΆαααΎαα‘αΎαααΎααααΈα±αααααα»ααααα
αΆαααααα·α
α ααΆααααααΆ "αα½αααααΆααα·αααααα ααα»ααααααααΆαααααααα·α
αααααααΊαα" α αΎααααααΆααααΈαααα ααααααΆαααΆααΈ ααΊαααααΆααααααΆαααΆα
αααΎααα
ααΎαα»αααΌα α αΎααααααααα½αα ααΆα
αααΆααααΆααααΆ processor ααΆααΌαα
ααααΎαααΆα α αΎαααΎαααααΌαααααααααααΈααΌααααααΆααααααΎααΆαααΆαα½α SDL2α ααΆα’αα»αα αααα»ααα·αααΉαααΈααααααααΎαααααΆαααααααα ααΌα
αααααα
αααααααααααααα»αααααΌαααααΎαααα
αααααα αα
α
ααα»α
αααα αααααΆαααααΆαααΆα‘αα 0 ααΆαααααΊαα
ααΎα’αααααααα
ααΎααααααΆαααααααααααα ααααααα αΆαααΈαααα·ααα½αα
ααα½αα αα
ααΈαααα
αα ααΆααΆαααααααααΆαααΆαααα αΆααΊααΆ Qemu ααΎααααα’α½α
αα·αααα·αααΆα
αααΎααα
αααα»ααααα’α½α
ααΌααααααα½α αααΆααααα’αααα’αΆα
ααααΌααααααααΎ Ctrl-Alt-n: ααΆααααΎαααΆααα
αααα»αααΆααααααΎαααΎα ααα»αααααα·αααααα
αααα»α Emscripten ααα αααααΆααααΈαααα
αΆαααααα’α½α
ααααα·αα
αΆαααΆα
ααααααααΎαααααΎα -monitor none -parallel none -serial none
αα·αααΆαααααΆαααΎααααΈααΌαα’ααααααααΆααααΌαα‘αΎααα·ααααααααααα
ααΎααα»αααΈαα½αα α’αααΈααααααααΆαααααΆααααααααΎαααΆαα
αααααΆαα
ααΌα
αααα ααΆαααααΎααααΆααααΆααααα»ααααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·αααααΎαααΆα ααα»ααααα’ααααα·αα’αΆα
ααααΎαααΆαα’αααΈααααα½αα±ααα
αΆααα’αΆαααααααα½αααααΆαααα
αααα»αααΆααΆααα ααααααα·αααΆααααα»α I/O αα α’αααααααΌαα’αα»ααααααΆαααΆαααααααααΆαααααααΆααα Qemu ααΆα backend coroutine ααΆα
αααΎααα½α
α αΎα ααα»αααααααααΆαααααααααΆαα·αα JavaScript αα·ααααααα·ααΈαααααΎαααΌα Emscripten α’ααααα·αα’αΆα
ααααΆααααα
αΆααααααΎα juggling stacks ααΆαααα ααΆα αΆααααΌα
ααΆααΆ "α’αααΈααααααααΆαααΆααααααα
ααααΆααα·ααΆαααα»αααααΌαααΆαααα
αα" ααα»ααααα’αααα’αα·αααααα Emscripten ααΆααααααααΆα’αααΈαααααααααΆααα½α
α αΎαα αααβααααΌαβααΆαβα’αα»ααααβαα½αβα±ααβα’ααβααααΎα
βααΆααβ: α
αΌαβα α
βααΆαβα α
βαα»αααΆαβααΌα
βααΆβαα½αβα±ααβααααααβαααβ emscripten_sleep
αα·ααα½αα
ααα½ααααααααααααααααΎααααααΆα Asyncify ααααΌα
ααΆααΆαα α
ααΌααααα αα·αααΆαα α
αα
ααΆαααα»αααΆαααΆαα½α αααααααΈαα½ααααα»αα
ααααααααΈααΈααα»αα’αΆα
ααΎαα‘αΎαααααααααααα
αααα»ααααα α αΎαα₯α‘αΌαααα αα»ααααααΆαα α
αα½αα±ααααααααααΈαα½αα ααΎαααΉαααααΎαααΎαααα·ααα’ααααΆα α αΎαααααΆαααααααΆααααΈααΆαα α
ααΌααααα ααΎαααΉααα·αα·αααααΎαααΆααΎααΆαα α
α’ααααΆαααΆαααΎαα‘αΎαα¬α’αα α αΎαααααα·αααΎααΆααΆα ααΎαααΉααααααΆαα»αα’ααααααα»ααααα»αααΆααα’αααα
αααα»αααα·ααα’ααααΆαααα αααα αΆαααΆαα»αααΆαααΆαα½α ααΎααααΈαααααααΆαααααααααααα
ααααααααΎαααααΌαααααααΆαααααα·ααααα· α αΎαα
ααααΈαα»αααΆααα
αα
α»ααααααα αααααΊααΆαααααααααααΆααα·ααΆαααΆααααααΆαααα·ααααΆααΈα₯αααα·αα -O3
. αααα»αααααΎαααΆαααΌααααααΆααααααΎα α αΎα Chromium αααΈα’αααα
αα
αΆα α αΎαααΆααα αααααΆαααααααα»αααΆααααα‘ααααΎαα’αααΈαααααΆαααααα»αααααΆααΆαααΆααααααα
ααααα... α’ααα
αΉαααΎαααα»αα’αΆα
αα·ααΆαα’αααΈααΆα αααα»αααΉααααααααααα ααααα·αααΎαααα»αααααΌαααΆαααααααΎαα»αα±αααα·ααααΆααααα·αααΌα αα·ααααααΎαααααα·αααααΆα Javascript 500+ MBα
ααΆα’αα»αα ααΆααααα½ααα·αα·ααααα
αααα»αααΌααααααΆααααααα½α Asyncify αα·αααΆαααΆααα½αααΆαααΆααααΆααααΆαααααα»αααΆαα½αααα longjmp
-s αααααααΌαααΆαααααΎαα
αααα»αααΌαααααΎαααΆααα·αααα·α ααα»αααααααααΆααααΈααααααΌα
αα½αααααα·αααΆααααα½ααα·αα·αααααΆααααα αα·ααααααα±ααααααΆαααα·ααα‘αΎααα·αααΌα
ααΆααααα·αααΎα’αααΈαααΆααα’ααααα’ ααΌαααααΎαααΆαα α αΎααααααΆααααααΏαα
ααααααα½αααΆαα
αΆααααααΎαα αααααααααΆααααααααααα»αααΌαααααΎααααΆαααααααααΌαααΆαααααα‘αΎα - ααΌα
ααααΆαααααΆααααΌα ααααα·αααΎααααα
ααΆααααααα·ααααΆααααα·ααααα·ααΆαα½αααααααΌαααΆαααΆααΆαα - ααααΆααααΆααααΆαααααΆααΆαα
αΆαααα mutex αααααΆαα
αΆαααααα½α
α αΎαα ααΆααααΆαααα’ ααΆαα·ααααααΆαααα αΆα‘αΌααΈαααα
αααα»αααΌαααααααα - αααα»αααααΆααααααααΎαα»αααΆαααααα·ααα»αα
αααααααααααΆαααααααααααα Emscripten ααα»αααααααααααααΆαα α
α’ααααΆαααΉαααααΆααααααΆαααααα»α α αΎααα
ααααααααΆααΉααααΆαααα setTimeout
ααΈααααα·ααα»ααα - ααΌα
αααα ααΌαααΆααααα
αΌαααααα·ααα»αααααααα·ααααααααα»αααΆαααααΎα‘αΎααα·αααΈαα»αα αααααα‘αΎααα·ααα
ααΎααααα·ααα»αααααΆαααααααα·α emscripten_sleep
α αΎααααα αΆααΆαα½α mutexes ααΆααααα ααΌαααΆααααααΆαααΆαα‘αΌααΈαα - ααΆααα·ααα
αααα»ααα·αααΆαααΌααα½αα
ααα½αααααααα
αααα»αα
αααΆαααααΆαααα - αα½αααααΆαααααΆααααααααΆα’αααΈαα½α α αΎαα’ααααααααααΌαααΆαααααΎαα
αα
α»ααααααααΆαααΆαααΆααααααα αααααΆαααΆαααΆααααααααα αΆαα·αααΆααααααααα
ααΈααααα: αα½αααΆαααΆαααααα·ααααα· Qemu ααΉααααα
ααααααααααααααΆαααααααααΆαααααΈααΎααααα¬ααα α»αα αα
αααααα αααα»αααΆαααααααααΆα
αα ααα»αααααααααΉααα
αα»α αααα»αααΉααα·ααΆαααΆαααα αΆααΊαααα ααΆααα·ααααααΌα coroutine αα·αααααΎααα setTimeout
(α¬αααΆαα αα
ααΆαααα·αααΉαααΆααααΌα
αααα’ααααα·α): αα»αααΆα emscripten_yield
ααααΆααααααααααααα α
α’ααααΆαα α
ααα»α
ααΆααααΌαααΊααΆ emscripten_coroutine_next
αα·ααααααΆαα»αααΆαα’ααααΆαααα αα
ααΆααααα»αααΆαα·αα·αααααα αααααααΆα‘αΎααα·α αα·ααααααααΆαααααααααααα
αααααααααααΆααααΌαααΆαα αααααΊααΆαααααααααααΆαααααααα
αααα
ααΈαααα αααα αΆααΊααΆαααααΆαααααΆαααααΎααααΆαααααααΆααααΈαα·ααα·ααααα αααααΆαααα
α‘αΎααα
αααααα coroutine pool ααααΌαααΆααα·ααααααΆαααααΆααα·ααααααΆαααα»ααα·αααΆαα
αααααααααΆααααααΆααααααΌαααΈ backend coroutine αααααΆαααααΆαα αα»αααΆα qemu_in_coroutine
αααα‘αααα·α αα
ααααααααΆααα·α ααΆαα½ααααααααααααα·ααα·ααα·αα αααααΆαααΆαα±ααααΆαααΆαα α
ααΌαααααα emscripten_yield
ααΆαααΎααααα·αααΆαααααΆααααΆαααα
ααΎααα emscripten_coroutine_next
αααααΆααα
ααααΌα ααα»ααααααα setTimeout
ααΌα
ααααααα»αααΆααα·ααΆααα½α
α αΎα ααΊαα·αααααΌαααΆααααα αΆαααα
ααΆααααααΎαααΌα JavaScript
α αΎαααΆααα·ααα ααΈααα ααΊααΆααΆααααααΆααΆ "ααααααααΆα α minced αααα·α"α αα·αβααααΆααβααα ααΆααΆααα·αααΆαα ααααα·αααΎααΎαααααΎαααΆα Qemu αα αααα»ααααααα·ααΈαα»ααα αα·α Node.js αα αααα»αααΆ αααααΆαααααααΆαα· αααααΆααααΈααΆααααααΎαααΌααα αααα»α Qemu ααΎαααΉαααα½αααΆα JavaScript αα»αααΆαααααα»αα ααα»αααααα ααααΆααααααααααΆαααααΆααααααΌααααα αααΆααα½αα ααα½αα
ααααΌαααααα·α
α’αααΈααααααα Qemu ααααΎααΆαα ααΌαα’ααααααα±αααααα»αααααΆααα αααα»ααα·ααααααΆα’αααα’αα·αααααα Qemu αααααΆαααααΆααα·ααααΆααΈαααα α αΎαααΆαααααα·ααααΆααααααααα»αα’αΆα
ααΉααα»ααα
ααααααααααα ααΌα
ααααα½ααααα·ααΆαααΆ "αααα·ααααααα·ααααα·αααααΌαααααααΉααααα·αααααααααΌαα axiomatics αα·ααα»ααα·αα·α
αααααααα Peano" α Qemu ααΆαα
ααα½αααΆααααΆααααααααΆααααααααααααααααααΆαααα α αΎααααααΆααααΈαα½ααααΆαααααΌα
target-i386
. αα
αααααΆαααα α’αααα’αΆα
αααααΆααααΆαααΆαααααααααΆααααααΆαααααααααααααααΆα
αααΎα ααα»ααααααααααααΉαααααΆααααααΆαααααααααααααΈαααα»αααααα ααΌαααΎααααΈααΆααααααααΆααααααααααααα αααααΎαααααα·ααααα·ααΆαααΆααααα»ααα½αα
ααα½ααααα Qemu ααα TCG (Tiny Code Generator) αααααα
ααΆααΌααααΆαααΈααααααΆααααααΆαααααααααααΆαααΈααα½α
α αΎαα ααΌα
αααααΆααααααΆαααα
αααα»αα―αααΆα readme αααααΆαααΈααΆαααα
αααα»ααα tcg ααΎαα‘αΎααααααΊααΆααααααααααααα·ααΈα
ααααα C ααααααΆ ααααααααααααααΌαααΆαααααααα½ααααααΆαα JIT α ααΌα
αααα ααΆα§ααΆα ααα ααααΆααααααααααααα
αα
αααα»αααααααααααα―αααΆαααααα·ααααααΆααααΆαααααααααααααααααα ααα»ααααααΆααααΆαααααααααααΆαααΈαα αα
α
ααα»α
αααα αααΆαααΆααα½αααααααααααΆααααα αΆααααα½α - α’αααααααααααΌαααΌα
(TCI) ααααα½αααααααα·ααααα·ααΌα (ααααΎαααααααα·ααααα·ααΆαααΆααααα»αααΌα
ααααΆ) αααα»αααααΈαααααααΆααααΆαααΈααααααΎαααΌααααααΆααααααΆαααααααααααΆαααΈαααΆααααΆαααα½αα ααΆαααΆααα·α ααΌα
αααα―αααΆαααααααΆα
αα α’αααααααααααααααα ααααΆαα·ααααααααααΎαααΆαααααΌα
ααΆαααΆαααΈααααααΎαααΌα JIT αα·αααααΉαααααα·ααΆααααα»ααααααααΏαααα»ααααααα ααα»ααααααααΆααα»αααΆααααααα αααααΈααΆαααα»ααα·αααααΆααααΆααΆααα·αααααΆααααααΆααααΆαααααααααΆαααααα»ααααααα
ααααΌαα‘αΎα αααα»αααΆαααααΆααΆααααααΎααααααα·ααΈααΆαααααα TCG αααααα ααα»ααααααΆαααΆαααΆααα ααα‘ααααΆαααΆαααα αααα αααα»αααΌαααααα αα·αααΆααα·αααααΆαα·αα αααΆααααΆααααΆαααααα»αααααΆαααααΆαα’αααΈ bytecode ααΌα αααααααα»ααααααα α α·ααααα»αα’ααααααααα TCI α αααααΆααααααα’αααααααααααααΆα αααΎαα
- αα αααα’αα»αααααααααα·ααΈαααααΎαααΌα α’ααααα·αα’αΆα ααΎαααΆααα·αααααΆααααΆαααααΆαααααα ααα»αααααα αααααΌαα’ααααααααα
- α’αααβα’αΆα βαααααΎαβαα»αααΆαβαα·αβαααβαααααΆααβααΆααβαααα»αβααΆαβααααααβαααβααΆαβαα½αβαααβαα ααα»ααααβααΆβα§ααΆα αααβαααααΆααβααΈβααΆαβααααα·ααααα·βαα½αβααβααα»αααααα
- ααααα·αααΎαααααΌααααααΆααααααΎαααααΆααααααΌα (α αΎααααα αΆααααΌα ααΆα’αΆα ααααΎαα ααΆαααααα·αα·α ααααααααα»αααΆααααααΆαααααααααααΆαααααααΆααα) αααα»αααΉαααααΌαααααΎα±ααααΌα JS αααααΆααααααΎααα·αααααΉαααααΌα ααα»αααααααΆαα αα ααΆαααααα»αααΉαααΆαα’αααΈαααααααΌααααααΎαααΆα‘αΎααα·αααΈ
ααΆααααααΉαα ααα»α ααΈααΈ αααα»ααα·αααααΆααααΆ patching α’αΆα ααααΎαα ααΆααα αααααΆααααΈααΌαααααΌαααΆαααααα·ααααα·ααΆααΎαααααΌα ααα»ααααααΈαα ααα»α ααααΌαααΊαααααααααΆααα αΎαα
ααααΌα ααΌαααααΌαααΆααααααΎααααα»αααααααααΆαα»αααΆαααααα½ααα
α’αΆααααααΆαααααΆαααααΆαααΌαααααΎα ααα»αααααααααΆαααααααα
αα
αΆαα’αααααα’αααΈ Emscripten ααΆααααααΎαααααα·αααααΆααα JS αααααΆααααααΎα αα·αααααΎαααΆαα‘αΎααα·α αααα»αααΆααααααα
α
α·ααααααααΎαααΌαααα»αααααααααααα ααΆαα·αααα
αΆααααΆααααΈααΆααΆαααααααααΆαααααααα ααΆαααααααααΆαααΆα
ααα»α
α
αΌααααα½αααααα
αααα»ααααα»αααααααααΊααΆαα
αΆααααααΎαααααααΆα αα·αααΌααα·αααΆαααα·ααΆαααΆαααααΎαα αααααΆααααΈαα½ααααααΎαααΆααααΆαααΈααααααΎαααΌαααααααααΎαααΌαααΆαα½α ifs (αααααΈααΆααααΆαααααα·ααα»αααααα) α ααα»ααααβααααΆαβα’αΆααααα ααΆβααΆαβααΆαα αααβαααααβααΆαβααΆβααΆαααααΆαβααΆαβααααααβαα»αβααααα ααΎαβααΈβαααβαα
βααα ααΆαβααααΆαβα
α»αβαααααβαα
βααααα·αβαααααΎαβα‘αΎαβαα·αβααΊβ brcond
. αα·αα’αΈαα αααα»αααΉαααααααααΆααααα½ααα·αα·αααααΌα
ααααΆαα
ααΉαααααΆααααααΆαααααΆαααααα»α αα·ααααααααΆαα α
α‘αΎααα·α α αΎα... αα·αααααα½ααααα»αα
αααααα½αααααααΌαααΆαααααα·ααααα·αα ααα»αααααααααΆααααΈααΆαααααΌαα’αα’αΆα αα½ααααα
αααααΆαααα αα
ααΈαααα
αα αααααΆααααΈαα·ααααΆααΌααααααΆααααααΎα αααα»αααΆαααΉαααΆαααααΆααααΈααΆαααααΌα ααααα·α
αα
ααΆαααααΆααα
αα
α»ααααααααααΌαααΆααααα»αα‘αΎααα·αααΈααα α αΎααααα ααααΆααααΌαααΆααααααααΆααααΎαααααΌα JavaScript αααααΆααααααΎαα α αΎαααΌα
ααααααΆααΆαααααααααΆαα ααΆααααααΎαααα·ααααααα’αΆααααααΈαα½αααα αααΆαααααααααα·αααΆααα
ααα’αααΈααααα α αΎαααΆα
αααΆααααΆααααΆαααΆαααΈααααααΎαααΌααααα»αααααΎαααΆαααΆααααααα ααΎαααααΌααα·αα·αααααΎαααΆααΎααα·αααΆαα α½αααΈαααααααααααααΊαααααα
αα
α»αααααααα α αΎαααααα·αααΎααΎαααααΎααΆα αααααΌαα
ααα’αΆααααααΆαααααααααΊαααααααααΆααααΆαα½αααΉααααααΆαα ααΎααααΈααΎαα’αΆα
ααααααΆαααααα·ααααα·ααΆαα ααΎαααΈααα ααΆαααααααΆααααα αΆ "αα»αααΆααααααΆααααααΎααα½ααααα·αααααΉαααααΌα ααααα·αααΎααααααα bytecode αααααΆαααααΆααααααΌα?" - ααΆααααα»αααΆααααααααΌαααααΆααΉααααα»ααααααααααααα»ααααααααααααΌαααααΆααα»ααααΆαα ααααα·ααΈααα αααααΈααΆαααα»αααΆαααααΆααααα α»αααααααααΆααα
αααα»α 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"]
ααα ααααΈααααα·ααααΆα
ααΌα
ααααα αΎα ααΆαααΆααα
αααα·αααΆαααααα
αααα
α‘αΎα ααα»αααααααα»ααα»αααααΆααααΉαααΆααα½α
ααΆαααα»αααΆαααΆααααααααααααααααα±ααααα’α₯αααα
ααα ααΌα
ααααα αΎα ααΎαβαααα»αβαααααα
α
α·αααβααααααααααΆαβα’αααΈαααβαααα»αβααΆαβαα
ααααααβα ααΌαααΊαα½αα±ααααααΆα
ααααα·α
αα
αααααα ααααααααααΊααΆααΆααα·ααααα α αΎαααΆαα·αα
αααΆααααΆαα»αααΌαα’αααΈαααααααΌαααααΎα αααα ααααΆ, αααααΆααααααΆααΆαααααααααα»αααΆαα
αα commits α’αΆααΌαααααααΆαα
ααΎααααΌαααααααααααΎααα½αα
ααα½ααα Qemu α αααα»ααααααΆαα½αααααΆαααααα ααΆααααααααα‘αΆααα½ααα
αααα»α Gita αα
αααα»αααααααααααααα½αα αααααΆαα "ααααα·α" ααΈαα½ααααααααΆαα αα
ααΆααααΆαααααααΆααααΆαα’ααααΆαα·ααααΆααααα’α·αααΆααΆααΆαα»ααααΈααααΌαααΆαααααααα ααΆααα·ααα
α’ααααααααααΊαααα
ααΎαα·ααΆαααΆαααααααΆααα·ααΆαα‘αΎααα·αααααΆαααααα·ααααΆα git log
.
α’αααα’αΆα
ααΆαααααααΆααΆαααΆααα’ααα
α’αααΈαααααααΎαααΆααα½α α αΎαα
- x86 ααααΎαααΆααα·αααα·α
- ααΆαααααΌααααΎαααΆααααααΆαααΈααααααΎαααΌα JIT ααΈααΌααααΆαααΈααα JavaScript
- ααΆαααααΌαααααΆααααα‘αΎαααααΆααααααααααααα 32 αααΈαααααααααα α₯α‘αΌααααα’αααα’αΆα ααααΎαααΈαα»α αααααΆααααΆααααααααααΆαααααααα MIPS αα αααα»ααααααα·ααΈαα»αααααΆαα’ααΈαααΊαα·ααα ααααΆααααΆααααα»α
ααΎααΆαα’αααΈααααααα’αααα’αΆα ααααΎααΆα
- αααααΎαααααΏαααααΆαααααΆααααΆαα ααΌααααΈαααα αααα»ααααα JIT ααΆα αΆααααΌα ααΆααααΎαααΆαααΊαααΆα Virtual x86 (ααα»ααααααΆααααααΆαα»αα Qemu ααΆααααΌαααΆαα½αααΉααααααααΉα αα·αααααΆααααααααααΆα αααΎα)
- ααΎααααΈαααααΎαα ααα»α αααααΆααααααααΆ - αα·ααΆααααααααααα αααα»ααα·ααααααΆα’ααααααααΎαααα αααααααα’αα ααΌα αααααααααΆαααααααααααα»αααΆααααααΎαααα Emscripten αααααααΆαα‘αΎααα·αααΆαααααααα»αα’αΆα ααααΎααΆα
- ααααΆααΆαααΎαααααΎαααΆααα»αααΆα Qemu αααααα»αααααΆα - αααααΆα ααΆαααααΎα αααΆααααα»α VM ααΆααΎαα
- UPSα α’αααααΉαααααΌααααααΌααααΆαααΆαααα’αααΈααΆαα’αα·αααααα αα·ααααα αΆαα½αα ααα½αααααα’ααααα ααΆαα Emscripten upstream ααΌα αααα’αααααΉααααααΌαααΈαα»ααααα Qemu αα·αααααααααααααααααΆαααααΎα ααΌαα’ααα»αααααα½ααααααααΆααααααααΆαααααΎααααΆααααΆααα½αα αααααααααα½αααα αααα Emscripten ααΆααααααααα·α αα ααΆααααααααα»αα
ααααα: www.habr.com