Qemu.js me ke kākoʻo JIT: hiki iā ʻoe ke hoʻohuli i ka mince i hope

He mau makahiki i hala aku nei ʻo Fabrice Bellard i kākau ʻia e jslinux he emulator PC i kākau ʻia ma JavaScript. Ma hope o kēlā, ua nui aʻe X86 pono. Akā ʻo lākou a pau, e like me kaʻu ʻike, he mau unuhi ʻōlelo, ʻoiai ʻo Qemu, i kākau mua ʻia e ka Fabrice Bellard like, a, ʻoiai paha, kekahi emulator hou e pili ana iā ia iho, e hoʻohana ana i ka JIT compilation o nā code malihini i loko o ka code system host. Me he mea lā iaʻu ua hiki i ka manawa e hoʻokō i ka hana ʻē aʻe e pili ana i ka mea e hoʻoponopono ai nā mākaʻikaʻi: JIT compilation of machine code in JavaScript, no ka mea he mea kūpono loa ia i ka port Qemu. Me he mea lā, no ke aha ʻo Qemu, aia nā emulators maʻalahi a me ka mea hoʻohana - ʻo VirtualBox like, no ka laʻana - hoʻokomo a hana. Akā he mau hiʻohiʻona hoihoi ko Qemu

  • puna hāmama
  • hiki ke hana me ka ʻole o ka mea hoʻokele kernel
  • hiki ke hana ma ke ano unuhi
  • kākoʻo no ka nui o nā hale hoʻokipa a me nā hale hoʻokipa

E pili ana i ke kolu o ka helu, hiki iaʻu ke wehewehe i ka ʻoiaʻiʻo, ma ke ʻano TCI, ʻaʻole ia nā ʻōlelo aʻoaʻo mīkini hoʻokipa iā lākou iho i unuhi ʻia, akā ʻo ka bytecode i loaʻa mai iā lākou, akā ʻaʻole kēia e hoʻololi i ke ʻano - i mea e kūkulu ai a holo. ʻO Qemu ma kahi papa hana hou, inā ua laki ʻoe, ua lawa ka mea hoʻopili C - hiki ke hoʻopanee ke kākau ʻana i kahi code generator.

A i kēia manawa, ma hope o ʻelua mau makahiki o ka leisurely tinkering me ka Qemu source code i koʻu manawa kūʻokoʻa, ua ʻike ʻia kahi prototype hana, kahi hiki iā ʻoe ke holo, no ka laʻana, Kolibri OS.

He aha ka Emscripten

I kēia mau lā, ua ʻike ʻia nā mea hōʻuluʻulu he nui, ʻo ia ka hopena o JavaScript. ʻO kekahi, e like me Type Script, i manaʻo mua ʻia e lilo i ala maikaʻi loa e kākau ai no ka pūnaewele. Ma ka manawa like, ʻo Emscripten kahi ala e lawe ai i ka code C a i ʻole C ++ a hoʻohui iā ia i kahi palapala hiki ke heluhelu ʻia. Ma ka kēiaʻaoʻao Ua hōʻiliʻili mākou i nā awa he nui o nā papahana kaulana: maaneiNo ka laʻana, hiki iā ʻoe ke nānā iā PyPy - ma ke ala, ʻōlelo lākou ua loaʻa iā JIT. ʻO ka ʻoiaʻiʻo, ʻaʻole hiki ke hōʻuluʻulu wale ʻia nā papahana āpau a holo i kahi polokalamu kele - aia kekahi helu hiʻona, pono ʻoe e hoʻomanawanui, akā naʻe, e like me ka ʻōlelo ʻana ma ka ʻaoʻao hoʻokahi "Hiki ke hoʻohana ʻia ʻo Emscripten e hōʻuluʻulu i nā mea āpau. lawe C/C++ code to JavaScript". ʻO ia hoʻi, aia kekahi mau hana i wehewehe ʻole ʻia e like me ka maʻamau, akā hana maʻamau ma x86 - no ka laʻana, hiki ʻole ke komo i nā mea hoʻololi, i pāpā ʻia ma kekahi mau hale hana. , Qemu mea he cross-platform papahana a , I makemake e manaoio, a 'aʻole i loko o ka hailona undefined 'ano - lawe ia a houluulu, a laila tinker iki me JIT - a ua pau oe! hihia...

ʻO ka ho'āʻo mua

ʻO ka ʻōlelo maʻamau, ʻaʻole wau ka mea mua i hele mai me ka manaʻo o ka lawe ʻana iā Qemu i JavaScript. Aia kahi nīnau i nīnau ʻia ma ka ʻaha ReactOS inā hiki kēia me ka hoʻohana ʻana iā Emscripten. ʻOiai ma mua, aia nā lono i hana ponoʻī ʻo Fabrice Bellard i kēia, akā ke kamaʻilio nei mākou e pili ana i ka jslinux, e like me kaʻu i ʻike ai, he hoʻāʻo wale nō ia e hoʻokō pono i ka hana ma JS, a ua kākau ʻia mai ka ʻōpala. Ma hope mai, ua kākau ʻia ʻo Virtual x86 - ua hoʻopuka ʻia nā kumu unobfuscated no ia, a, e like me ka ʻōlelo ʻana, ʻoi aku ka nui o ka "realism" o ka emulation i hiki ai ke hoʻohana iā SeaBIOS i firmware. Eia kekahi, aia ma kahi o hoʻokahi hoʻāʻo e port Qemu me ka hoʻohana ʻana iā Emscripten - ua hoʻāʻo wau e hana i kēia hui pū, akā, ʻo ka hoʻomohala ʻana, i koʻu hoʻomaopopo ʻana, ua maloʻo.

No laila, me he mea lā, eia nā kumu, eia ʻo Emscripten - lawe a hōʻuluʻulu. Akā aia kekahi mau hale waihona puke e hilinaʻi ai ʻo Qemu, a me nā hale waihona puke e hilinaʻi ai kēlā mau hale waihona puke, etc., a ʻo kekahi o lākou libffi, e pili ana i ka glib. Aia nā lono ma ka Pūnaewele aia kekahi i loko o ka hōʻiliʻili nui o nā awa o nā hale waihona puke no Emscripten, akā he mea paʻakikī ke manaʻoʻiʻo: ʻo ka mea mua, ʻaʻole ia i manaʻo ʻia e lilo i mea hōʻuluʻulu hou, ʻo ka lua, he haʻahaʻa loa ia. hale waihona puke e kiʻi wale, a hōʻuluʻulu iā JS. A ʻaʻole ia he mea wale no ka hoʻokomo ʻana i ka hui - malia paha, inā ʻoe e wili iā ia, no kekahi mau ʻaha kūkā e hiki ai iā ʻoe ke hoʻopuka i nā manaʻo kūpono ma ka waihona a kāhea i ka hana me ka ʻole o lākou. Akā he mea paʻakikī ʻo Emscripten: i mea e maʻa ai ke code i hana ʻia i ka polokalamu kele pūnaewele JS engine optimizer, hoʻohana ʻia kekahi mau hana hoʻopunipuni. ʻO ka mea kūikawā, ka mea i kapa ʻia ʻo relooping - kahi code generator e hoʻohana ana i ka LLVM IR i loaʻa me kekahi mau ʻōlelo aʻoaʻo hoʻololi abstract e hoʻāʻo e hana hou i nā mea kūpono, nā puka lou, etc. ʻAe, pehea e hāʻawi ʻia ai nā manaʻo i ka hana? Ma keʻano maʻamau, e like me nā hoʻopaʻapaʻa i nā hana JS, ʻo ia hoʻi, inā hiki, ʻaʻole ma o ka waihona.

I ka hoʻomaka ʻana aia kahi manaʻo e kākau wale i kahi pani no libffi me JS a holo i nā hoʻokolohua maʻamau, akā i ka hopena ua huikau au e pili ana i ka hana ʻana i kaʻu mau faila poʻomanaʻo i mea e hana ai lākou me ke code e loaʻa nei - he aha kaʻu e hana ai, e like me kā lākou e ʻōlelo nei, "He paʻakikī loa nā hana "He naʻaupō mākou?" Pono wau e hoʻokomo i ka libffi i kahi hale kiʻi ʻē aʻe, no laila e ʻōlelo ai - ʻoi aku ka maikaʻi, loaʻa iā Emscripten nā macros ʻelua no ka hui inline (ma Javascript, ʻae - maikaʻi, ʻo kēlā me kēia hale hana, no laila ka mea hoʻohui), a me ka hiki ke holo i nā code i hana ʻia ma ka lele. Ma keʻano laulā, ma hope o ka tinkering me nā ʻāpana libffi hilinaʻi i ka platform no kekahi manawa, ua loaʻa iaʻu kahi code compilable a holo ia ma ka hoʻāʻo mua aʻu i ʻike ai. I ko'u kahaha, ua holomua ka hoao ana. Pīhoihoi ʻia e koʻu akamai - ʻaʻohe hoʻohenehene, ua hana ia mai ka hoʻomaka mua ʻana - ʻaʻole wau i manaʻoʻiʻo i koʻu mau maka, hele e nānā hou i ke code hopena, e loiloi i kahi e ʻeli ai. Eia au i hele ai i ka nati no ka lua o ka manawa - ʻo kaʻu hana wale nō i hana ai ffi_call - ua hōʻike kēia i kahi kelepona kūleʻa. ʻAʻohe kelepona iā ia iho. No laila ua hoʻouna au i kaʻu noi huki mua, nāna i hoʻoponopono i kahi hewa i ka hoʻāʻo i maopopo i nā haumāna Olympiad - ʻaʻole pono e hoʻohālikelike ʻia nā helu maoli. a == b a pehea hoi a - b < EPS - pono ʻoe e hoʻomanaʻo i ka module, inā ʻaʻole e lilo ʻo 0 i mea like loa me 1/3 ... Ma ke ʻano laulā, ua hele mai au me kahi awa o libffi, kahi i hala i nā hoʻokolohua maʻalahi, a me ka glib. hōʻuluʻulu ʻia - Ua hoʻoholo wau he pono ia, e hoʻohui wau ma hope. Ke nānā nei i mua, e ʻōlelo wau, e like me ka mea i ʻike ʻia, ʻaʻole i hoʻokomo ka mea hoʻopili i ka hana libffi i ka code hope.

Akā, e like me kaʻu i ʻōlelo ai, aia kekahi mau palena, a ma waena o ka hoʻohana manuahi ʻana i nā ʻano like ʻole i wehewehe ʻia, ua hūnā ʻia kahi hiʻohiʻona maikaʻi ʻole - ʻaʻole kākoʻo ʻo JavaScript ma ka hoʻolālā ʻana i ka multithreading me ka hoʻomanaʻo like. Ma ke kumu, hiki ke kapa ʻia kēia he manaʻo maikaʻi, akā ʻaʻole no ka porting code i hoʻopaʻa ʻia ka hale hana i nā kaula C. ʻO ka mea maʻamau, ke hoʻāʻo nei ʻo Firefox me ke kākoʻo ʻana i nā limahana hana, a he hoʻokō pthread ʻo Emscripten no lākou, akā ʻaʻole wau makemake e hilinaʻi iā ia. Pono au e uhuki lohi i ka multithreading mai ke code Qemu - ʻo ia hoʻi, e ʻike i kahi e holo ai nā kaula, e hoʻoneʻe i ke kino o ka loop e holo ana i kēia kaula i kahi hana ʻokoʻa, a kāhea i kēlā mau hana i kēlā me kēia mai ka loop loop.

ʻO ka ho'āʻo ʻelua

I kekahi manawa, ua maopopo ka pilikia ma laila, a ʻaʻole e alakaʻi i ka maikaʻi o ka hoʻokuʻu wale ʻana i nā koʻokoʻo a puni ke code. Ka hopena: pono mākou e hoʻonohonoho i ke kaʻina hana o ka hoʻohui ʻana i nā koʻokoʻo. No laila, ua lawe ʻia ka mana 2.4.1, ka mea hou i kēlā manawa, (ʻaʻole 2.5.0, no ka mea, ʻaʻole ʻoe i ʻike, e loaʻa ana nā pōpoki i ka mana hou ʻaʻole i hopu ʻia, a ua lawa kaʻu mau mea ponoʻī. bugs), a ʻo ka mea mua aʻu i hana ai ʻo ia ke kākau hou ʻana me ka palekana thread-posix.c. ʻAe, ʻo ia hoʻi, palekana: inā i hoʻāʻo kekahi e hana i kahi hana e alakaʻi ai i ka pale ʻana, ua kāhea koke ʻia ka hana abort() - ʻoiaʻiʻo, ʻaʻole kēia i hoʻoponopono i nā pilikia āpau i ka manawa hoʻokahi, akā ma ka liʻiliʻi ʻoi aku ka ʻoluʻolu ma mua o ka loaʻa ʻana o ka ʻikepili inconsistent.

Ma keʻano laulā, kōkua nui nā koho Emscripten i ka lawe ʻana i ka code i JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - hopu lākou i kekahi mau ʻano hana i wehewehe ʻole ʻia, e like me ke kelepona ʻana i kahi helu helu ʻole (ʻaʻole i kūlike loa me ke code no nā arrays typed. HEAP32[addr >> 2] = 1) a i ʻole ke kāhea ʻana i kahi hana me ka helu hewa o nā manaʻo.

Ma ke ala, he pilikia kaawale nā ​​hewa alignment. E like me kaʻu i ʻōlelo ai, aia ʻo Qemu i kahi "degenerate" interpretive backend no ka code generation TCI (liny code interpreter), a no ke kūkulu ʻana a hoʻokele iā Qemu ma kahi hoʻolālā hou, inā ʻoe e laki, ua lawa ka C compiler. "inā laki ʻoe". ʻAʻole wau i pōmaikaʻi, a ua ʻike ʻia ua hoʻohana ʻo TCI i ke komo ʻole i ka wā e hoʻopau ai i kāna bytecode. ʻO ia hoʻi, ma nā ʻano ARM a me nā ʻano hana ʻē aʻe me ka loaʻa ʻana o ke kiʻekiʻe, hoʻohui ʻo Qemu no ka mea he backend TCG maʻamau lākou e hoʻopuka ai i nā code maoli, akā inā e hana ʻo TCI iā lākou he nīnau ʻē aʻe. Eia naʻe, e like me ka mea i ʻike ʻia, ua hōʻike maopopo ka palapala TCI i kahi mea like. ʻO ka hopena, ua hoʻohui ʻia nā kelepona hana no ka heluhelu unaligned i ke code, i ʻike ʻia ma kekahi ʻāpana o Qemu.

Puʻu luku

ʻO ka hopena, ua hoʻoponopono ʻia ke komo ʻole i ka TCI, ua hana ʻia kahi loop loop i kapa ʻia ʻo ka processor, RCU a me kekahi mau mea liʻiliʻi ʻē aʻe. A no laila hoʻomaka wau iā Qemu me ke koho -d exec,in_asm,out_asm, ʻo ia hoʻi, pono ʻoe e haʻi i nā poloka o ke code e hoʻokō ʻia nei, a i ka manawa hoʻi i hoʻolaha ʻia e kākau i ke code malihini, he aha ka host code i lilo (i kēia hihia, bytecode). Hoʻomaka ia, hoʻokō i kekahi mau poloka unuhi, kākau i ka memo debugging aʻu i waiho ai e hoʻomaka ana ʻo RCU a ... hāʻule. abort() i loko o kahi hana free(). Ma ka hana ʻana i ka hana free() Ua hiki iā mākou ke ʻike aia ma ke poʻo o ka heap block, aia i loko o nā bytes ʻewalu ma mua o ka hoʻomanaʻo i hāʻawi ʻia, ma kahi o ka nui o ka poloka a i ʻole kekahi mea like, aia ka ʻōpala.

ʻO ka luku ʻana i ka puʻu - pehea ka nani ... Ma ia ʻano, aia kahi lāʻau kūpono - mai (inā hiki) nā kumu like, e hōʻuluʻulu i kahi binary maoli a holo ma lalo o Valgrind. Ma hope o kekahi manawa, ua mākaukau ka binary. Hoʻomaka wau me nā koho like - hāʻule ia i ka wā hoʻomaka, ma mua o ka hiki ʻana i ka hoʻokō. He mea leʻaleʻa, ʻoiaʻiʻo - ʻike ʻia, ʻaʻole like nā kumu, ʻaʻole ia he mea kupanaha, no ka mea, ʻo ka hoʻonohonoho ʻana i nā koho ʻokoʻa iki, akā loaʻa iaʻu ʻo Valgrind - e hoʻoponopono mua wau i kēia bug, a laila, inā laki wau. , e puka mai ana ka mea mua. Ke holo nei au i ka mea like ma lalo o Valgrind ... Y-y-y, y-y-y, uh-uh, ua hoʻomaka, hele ma ka hoʻomaka maʻamau a neʻe ma mua o ka pahu kumu me ka ʻole o kahi ʻōlelo aʻo e pili ana i ka komo ʻana i ka hoʻomanaʻo hewa, ʻaʻole e haʻi e pili ana i ka hāʻule. ʻO ke ola, e like me kā lākou e ʻōlelo nei, ʻaʻole i hoʻomākaukau iaʻu no kēia - ua hoʻōki kahi papahana hāʻule i ka wā i hoʻokuʻu ʻia ma lalo o Walgrind. He mea pohihihi ia. ʻO kaʻu kuhiakau ʻo ia hoʻokahi ma kahi kokoke i ke aʻo ʻana i kēia manawa ma hope o kahi ulia i ka wā o ka hoʻomaka ʻana, hōʻike ʻo gdb i ka hana. memset-a me kahi kuhikuhi kūpono e hoʻohana ana i kekahi mmx, a i ʻole xmm nā papa inoa, a laila paha he ʻano hewa alignment, ʻoiai paʻakikī ke manaʻoʻiʻo.

ʻAe, ʻaʻole kōkua ʻo Valgrind ma ʻaneʻi. A maanei i hoʻomaka ai ka mea hoʻopailua loa - ua hoʻomaka nā mea a pau, akā hāʻule no nā kumu ʻike ʻole ʻia ma muli o kahi hanana i hiki ke hana ʻia he mau miliona o nā ʻōlelo i hala. No ka manawa lōʻihi, ʻaʻole maopopo i ke ʻano o ka hoʻokokoke ʻana. I ka hopena, pono wau e noho i lalo a hoʻopau. ʻO ke paʻi ʻana i ka mea i kākau hou ʻia me ke poʻo, ʻaʻole ia i like me ka helu, akā he ʻano ʻikepili binary. A, aia hoʻi, ua loaʻa kēia kaula binary i loko o ka faila BIOS - ʻo ia hoʻi, i kēia manawa ua hiki ke ʻōlelo me ka hilinaʻi kūpono ʻo ia ka hoʻoheheʻe ʻana, a maopopo loa ua kākau ʻia i kēia buffer. ʻAe, a laila kekahi mea e like me kēia - ma Emscripten, ʻoi aku ka maikaʻi, ʻaʻohe randomization o ka wahi kikoʻī, ʻaʻohe puka i loko, no laila hiki iā ʻoe ke kākau ma kahi o ka waena o ke code e hoʻopuka i ka ʻikepili ma ka pointer mai ka hoʻomaka hope. e nānā i ka ʻikepili, e nānā i ke kuhikuhi, a inā ʻaʻole i loli, e kiʻi i ka meaʻai no ka noʻonoʻo. ʻOiaʻiʻo, he mau minuke e hoʻopili ai ma hope o kekahi hoʻololi, akā he aha kāu e hana ai? ʻO ka hopena, ua ʻike ʻia kahi laina kikoʻī nāna i kope i ka BIOS mai ka buffer manawa i ka hoʻomanaʻo malihini - a, ʻoiaʻiʻo, ʻaʻole lawa ka wahi i ka buffer. ʻO ka loaʻa ʻana o ke kumu o kēlā helu hoʻopaʻa ʻē aʻe i loaʻa i kahi hana qemu_anon_ram_alloc ma ka waihona oslib-posix.c - ʻo ia ka manaʻo: i kekahi manawa hiki ke hoʻopili i ka helu wahi i kahi ʻaoʻao nui o 2 MB ka nui, no kēia mea mākou e nīnau ai. mmap ʻoi aku ka mua, a laila e hoʻihoʻi mākou i ke koena me ke kōkua munmap. A inā ʻaʻole koi ʻia kēlā alignment, a laila e hōʻike mākou i ka hopena ma kahi o 2 MB getpagesize() - mmap e hāʻawi mau ana ia i kahi helu kuhi ... No laila ma Emscripten mmap kelepona wale malloc, akā ʻaʻole pololei ia ma ka ʻaoʻao. Ma keʻano laulā, ua hoʻoponopono ʻia kahi pōpoki i hoʻonāukiuki iaʻu no kekahi mau mahina e ka hoʻololi ʻana двух laina laina.

Nā hiʻohiʻona o nā hana kelepona

A i kēia manawa ke helu nei ka mea hana i kekahi mea, ʻaʻole hāʻule ʻo Qemu, akā ʻaʻole i ʻā ka pale, a hele koke ka mea hana i nā puka lou, e hoʻoholo ana i ka hopena. -d exec,in_asm,out_asm. Ua puka mai kekahi kuhiakau: ʻaʻole hiki mai nā manawa hoʻopau (a i ʻole, ma ke ʻano nui, nā hoʻopau āpau). A ʻoiaʻiʻo, inā ʻoe e wehe i nā interrupts mai ka hui maoli, no kekahi kumu i hana ai, loaʻa iā ʻoe ke kiʻi like. Akā ʻaʻole kēia ka pane: ʻo ka hoʻohālikelike ʻana i nā ʻāpana i hoʻopuka ʻia me ke koho ma luna aʻe nei i hōʻike ʻia ua hoʻokaʻawale koke nā trajectories hoʻokō. Maanei pono e ʻōlelo ʻia ka hoʻohālikelike o ka mea i hoʻopaʻa ʻia me ka hoʻohana ʻana i ka launcher emrun ʻO ka hoʻopau ʻana i ka hoʻopuka me ka hoʻopuka ʻana o ka hui ʻōiwi ʻaʻole ia he kaʻina hana mechanical loa. ʻAʻole maopopo iaʻu pehea e hoʻopili ai kahi polokalamu i kahi polokalamu kele pūnaewele emrun, akā, ua hoʻonohonoho hou ʻia kekahi mau laina i ka puka, no laila ʻaʻole ʻo ka ʻokoʻa i ka diff ke kumu e manaʻo ai ua ʻokoʻa nā alahele. Ma keʻano laulā, ua maopopo e like me nā kuhikuhi ljmpl aia kahi hoʻololi i nā helu ʻokoʻa, a ʻokoʻa ka bytecode i hana ʻia: aia kekahi i kahi ʻōlelo aʻoaʻo e kāhea i kahi hana kōkua, ʻaʻole kekahi. Ma hope o ka ʻimi ʻana i nā ʻōlelo aʻo a me ke aʻo ʻana i ke code e unuhi i kēia mau ʻōlelo aʻoaʻo, ua maopopo, ʻo ka mea mua, ma mua koke o ia i ka papa inoa. cr0 ua hoʻopaʻa ʻia - me ka hoʻohana ʻana i kahi mea kōkua - nāna i hoʻololi i ke kaʻina hana i ke ʻano pale, a ʻo ka lua, ʻaʻole i hoʻololi ʻia ka mana js i ke ʻano pale. Akā ʻo ka mea ʻoiaʻiʻo, ʻo kahi hiʻohiʻona ʻē aʻe o Emscripten ʻo kona makemake ʻole e ʻae i ka code e like me ka hoʻokō ʻana i nā kuhikuhi. call i TCI, ka mea i loaʻa i kekahi kuhikuhi hana i ke ʻano long long f(int arg0, .. int arg9) - pono e kāhea ʻia nā hana me ka helu kūpono o nā manaʻo. Inā ʻae ʻia kēia lula, e pili ana i nā hoʻonohonoho debugging, e hāʻule ka polokalamu (ʻo ia ka maikaʻi) a i ʻole ke kāhea ʻana i ka hana hewa ʻole (he mea kaumaha ke debug). Aia kekahi koho ʻekolu - hiki i ka hanauna o nā mea hoʻopili e hoʻohui / wehe i nā hoʻopaʻapaʻa, akā i ka huina o kēia mau mea hoʻopili e lawe i ka nui o ka nui, ʻoiai ʻo ka mea ʻoiaʻiʻo he mea liʻiliʻi wale nō wau ma mua o hoʻokahi haneli. ʻO kēia wale nō ke kaumaha loa, akā ua lilo i pilikia koʻikoʻi: i ke code i hana ʻia o nā hana wrapper, ua hoʻololi ʻia nā hoʻopaʻapaʻa a hoʻololi ʻia, akā i kekahi manawa ʻaʻole i kapa ʻia ka hana me nā hoʻopaʻapaʻa i hana ʻia - maikaʻi, e like me ka koʻu hoʻokō libffi. ʻO ia hoʻi, ʻaʻole i hoʻokō ʻia kekahi mau kōkua.

ʻO ka mea pōmaikaʻi, loaʻa iā Qemu nā papa inoa o nā mea kōkua ma ke ʻano o kahi faila poʻo e like me

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

Hoʻohana ʻia lākou he mea ʻakaʻaka: ʻo ka mea mua, ua wehewehe hou ʻia nā macros ma ke ʻano ʻano ʻano ʻē DEF_HELPER_n, a laila ho'ā helper.h. I ka nui o ka hoʻonui ʻia ʻana o ka macro i loko o kahi mea hoʻomaka a me kahi koma, a laila wehewehe ʻia kahi array, a ma kahi o nā mea - #include <helper.h> ʻO ka hopena, ua loaʻa iaʻu kahi manawa e hoʻāʻo ai i ka waihona ma ka hana pyparsing, a ua kākau ʻia kahi ʻatikala e hoʻopuka pololei i kēlā mau ʻōwili no nā hana e pono ai lākou.

A no laila, ma hope o kēlā me he mea lā ua hana ka mea hana. Me he mea lā ʻaʻole i hoʻomaka mua ʻia ka pale, ʻoiai ua hiki i ka memtest86+ ke holo i ka hui maoli. Eia ka mea pono e wehewehe i ka palapala Qemu block I/O i kākau ʻia ma nā coroutines. Loaʻa iā Emscripten kāna hoʻokō paʻakikī, akā pono ke kākoʻo ʻia i ke code Qemu, a hiki iā ʻoe ke debug i ke kaʻina hana i kēia manawa: Kākoʻo ʻo Qemu i nā koho -kernel, -initrd, -append, hiki iā ʻoe ke hoʻomaka i ka Linux a, no ka laʻana, memtest86+, me ka ʻole o ka hoʻohana ʻana i nā polokalamu poloka. Eia naʻe ka pilikia: i ka hui ʻōiwi hiki ke ʻike i ka puka Linux kernel i ka console me ke koho -nographic, a ʻaʻohe mea hoʻopuka mai ka polokalamu kele pūnaewele a i ka pahu mai kahi i hoʻokuʻu ʻia ai emrun, 'a'ole i hiki mai. ʻO ia hoʻi, ʻaʻole maopopo: ʻaʻole hana ka mea hana a i ʻole ka hana ʻana o nā kiʻi kiʻi. A laila, manaʻo wau e kali iki. Ua ʻike ʻia "ʻaʻole hiamoe ke kaʻina hana, akā e lohi mālie ana," a ma hope o ʻelima mau minuke ua hoʻolei ka kernel i kahi pūʻulu o nā memo ma luna o ka console a hoʻomau i ke kau ʻana. Ua maopopo i ka hana, ma ka laulā, hana, a pono mākou e ʻeli i ke code no ka hana ʻana me SDL2. ʻO ka mea pōʻino, ʻaʻole maopopo iaʻu pehea e hoʻohana ai i kēia waihona, no laila ma kekahi mau wahi pono wau e hana maʻamau. I kekahi manawa, ua ʻānaʻi ka laina parallel0 ma ka ʻaoʻao ma kahi ʻaoʻao polū, kahi i manaʻo ai i kekahi mau manaʻo. I ka hopena, ua ʻike ʻia ʻo ka pilikia ka wehe ʻana o Qemu i kekahi mau puka aniani ma ka puka aniani hoʻokahi, ma waena e hiki ai iā ʻoe ke hoʻololi me ka hoʻohana ʻana iā Ctrl-Alt-n: hana ia i ka hale maoli, akā ʻaʻole ma Emscripten. Ma hope o ka hoʻopau ʻana i nā puka makani pono ʻole me ka hoʻohana ʻana i nā koho -monitor none -parallel none -serial none a me nā ʻōlelo aʻoaʻo e huki hou i ka pale holoʻokoʻa ma kēlā me kēia kiʻi, ua hana koke nā mea a pau.

Coroutines

No laila, emulation i ka polokalamu kele pūnaewele, akā, ʻaʻole hiki iā ʻoe ke holo i kekahi mea hoihoi hoʻokahi-floppy i loko, no ka mea ʻaʻohe poloka I / O - pono ʻoe e hoʻokō i ke kākoʻo no nā coroutines. Ua loaʻa iā Qemu kekahi mau coroutine backends, akā ma muli o ke ʻano o JavaScript a me ka Emscripten code generator, ʻaʻole hiki iā ʻoe ke hoʻomaka i ka juggling stacks. Me he mea lā "ua pau nā mea a pau, ua wehe ʻia ka plaster," akā ua mālama mua nā mea hoʻomohala Emscripten i nā mea āpau. Ua hoʻokō ʻia kēia mea ʻakaʻaka: e kāhea mākou i kahi kelepona hana e like me kēia kānalua emscripten_sleep a me nā mea ʻē aʻe e hoʻohana ana i ka mīkini Asyncify, a me nā kelepona kuhikuhi a me nā kelepona i kekahi hana kahi e hiki mai ai kekahi o nā hihia ʻelua ma mua o ka waihona. A i kēia manawa, ma mua o kēlā me kēia kelepona kānalua, e koho mākou i kahi pōʻaiapili async, a ma hope koke o ke kāhea ʻana, e nānā mākou inā ua hiki mai kahi kelepona asynchronous, a inā loaʻa, e mālama mākou i nā ʻano āpau āpau i kēia ʻano async, e hōʻike i ka hana. e hoʻololi i ka mana i ka wā e pono ai mākou e hoʻomau i ka hoʻokō, a haʻalele i ka hana o kēia manawa. ʻO kēia kahi kahi e hiki ai ke aʻo i ka hopena hoomaunauna wale - no nā pono o ka hoʻomau ʻana i ka hoʻokō code ma hope o ka hoʻi ʻana mai kahi kelepona asynchronous, hana ka mea hoʻopili i nā "stubs" o ka hana e hoʻomaka ana ma hope o kahi kelepona kānalua - penei: inā he n kelepona kānalua, a laila e hoʻonui ʻia ka hana ma kahi n/2 mau manawa - ʻo ia nō, inā ʻaʻole E hoʻomanaʻo ʻoe ma hope o kēlā me kēia kelepona hiki ʻole, pono ʻoe e hoʻohui i ka mālama ʻana i kekahi mau loli kūloko i ka hana kumu. A laila, pono wau e kākau i kahi palapala maʻalahi ma Python, ka mea, e pili ana i kahi hoʻonohonoho o nā hana i hoʻohana nui ʻia i manaʻo ʻia "ʻaʻole e ʻae i ka asynchrony e hele ma o lākou iho" (ʻo ia hoʻi, ka hoʻolaha ʻana a me nā mea āpau aʻu i wehewehe ai ʻaʻole. hana i loko o ia mau mea), hōʻike i nā kelepona ma o nā kuhikuhi kahi e mālama ʻole ʻia ai nā hana e ka mea hoʻopili i ʻole i manaʻo ʻia kēia mau hana asynchronous. A laila, ʻoi aku ka nui o nā faila JS ma lalo o 60 MB - e ʻōlelo kākou ma ka liʻiliʻi loa 30. ʻOiai, i ka manawa aʻu i hoʻonohonoho ai i kahi hōʻuluʻulu hui, a ua hoʻolei ʻia nā koho linker, i waena o ia. -O3. Holo wau i ke code i hana ʻia, a ʻai ʻo Chromium i ka hoʻomanaʻo a me nā hāʻule. A laila, ʻike koke wau i kāna mea e hoʻāʻo nei e hoʻoiho ... ʻAe, he aha kaʻu e ʻōlelo ai, inā ua noi ʻia au e noʻonoʻo pono a hoʻopaʻa i kahi Javascript 500+ MB.

ʻO ka mea pōʻino, ʻaʻole maikaʻi loa nā loiloi i ka code waihona kākoʻo Asyncify longjmp-s i hoʻohana ʻia i ka code processor virtual, akā ma hope o kahi pā liʻiliʻi e hoʻopau i kēia mau loiloi a hoʻihoʻi ikaika i nā pōʻaiapili me he mea lā ua maikaʻi nā mea a pau, ua hana ke code. A laila hoʻomaka kahi mea ʻē aʻe: i kekahi manawa ua hoʻomaka ʻia ka nānā ʻana i ke code synchronization - nā mea like i hoʻopololei i ke code inā, e like me ka loiloi hoʻokō, pono e pāpā ʻia - ua hoʻāʻo kekahi e hopu i kahi mutex i hopu ʻia. ʻO ka mea pōmaikaʻi, ʻaʻole ia he pilikia kūpono i ka code serialized - ke hoʻohana wale nei au i ka hana loop loop maʻamau i hāʻawi ʻia e Emscripten, akā i kekahi manawa e wehe loa ke kelepona asynchronous i ka waihona, a i kēlā manawa e hāʻule. setTimeout mai ka loop loop - no laila, ua komo ke code i ka ʻike loop nui me ka haʻalele ʻole i ka ʻike mua. Kākau hou ʻia ma ka loop pau ʻole a emscripten_sleep, a ua pau nā pilikia me nā mutexes. Ua ʻoi aku ka maikaʻi o ke code - ma hope o nā mea a pau, ʻoiaʻiʻo, ʻaʻohe oʻu code e hoʻomākaukau ai i ke kiʻi animation aʻe - ke helu wale nei ka mea hana i kekahi mea a hoʻonui ʻia ka pale. Eia naʻe, ʻaʻole i pau nā pilikia ma laila: i kekahi manawa e hoʻopau wale ka hoʻokō Qemu me ka ʻole o nā ʻokoʻa a i ʻole nā ​​​​hewa. I kēlā manawa ua haʻalele wau iā ia, akā, e nānā ana i mua, e ʻōlelo wau ʻo ka pilikia kēia: ʻo ka code coroutine, ʻoiaʻiʻo, ʻaʻole hoʻohana. setTimeout (a i ʻole ma ka liʻiliʻi ʻaʻole e like me kou manaʻo): hana emscripten_yield hoʻonohonoho wale i ka hae kelepona asynchronous. ʻO ka manaʻo holoʻokoʻa kēlā emscripten_coroutine_next ʻAʻole ia he hana asynchronous: i loko e nānā i ka hae, hoʻihoʻi hou a hoʻololi i ka mana i kahi e pono ai. ʻO ia hoʻi, pau ka hoʻolaha ʻana o ka waihona ma laila. ʻO ka pilikia ma muli o ka hoʻohana-ma hope-noa, i ʻike ʻia i ka wā i pio ʻia ai ka wai coroutine ma muli o ka ʻoiaʻiʻo ʻaʻole wau i kope i kahi laina koʻikoʻi o ke code mai ka coroutine backend e kū nei, ka hana. qemu_in_coroutine hoʻi ʻoiaʻiʻo inā hoʻi he hoʻopunipuni. Ua alakaʻi kēia i kahi kelepona emscripten_yield, ma luna aʻe ʻaʻohe mea ma ka waihona emscripten_coroutine_next, ua wehe ʻia ke ahu a hiki i luna loa, akā ʻaʻole setTimeout, e like me kaʻu i ʻōlelo ai, ʻaʻole i hōʻike ʻia.

Hoʻokumu code JavaScript

A eia ka ʻoiaʻiʻo, ʻo ka mea i ʻōlelo ʻia "hoʻohuli i ka ʻiʻo minced." ʻaʻole naʻe. ʻOiaʻiʻo, inā mākou e holo Qemu i ka polokalamu kele pūnaewele, a ʻo Node.js i loko, a laila, maʻamau, ma hope o ke code generation ma Qemu e loaʻa hewa loa mākou iā JavaScript. Akā naʻe, kekahi ʻano hoʻololi hoʻohuli.

ʻO ka mea mua, e pili ana i ka hana a Qemu. E ʻoluʻolu e kala koke mai iaʻu: ʻAʻole wau he mea hoʻomohala ʻoihana Qemu a he hewa paha kaʻu mau manaʻo i kekahi mau wahi. E like me kā lākou e ʻōlelo nei, "ʻaʻole pono ka manaʻo o ka haumāna me ka manaʻo o ke kumu, ka axiomatics a me ka noʻonoʻo maʻamau o Peano." Loaʻa iā Qemu kekahi helu o nā hale hoʻokipa malihini i kākoʻo ʻia a no kēlā me kēia he papa kuhikuhi like target-i386. I ke kūkulu ʻana, hiki iā ʻoe ke kuhikuhi i ke kākoʻo no nā hale hoʻokipa malihini, akā ʻo ka hopena he mau binaries wale nō. ʻO ke code e kākoʻo i ka hale hoʻokipa malihini, ʻo ia hoʻi, hoʻopuka i kekahi mau hana Qemu i loko, kahi i hoʻololi ʻia e ka TCG (Tiny Code Generator) i code mīkini no ka hale hoʻokipa. E like me ka mea i ʻōlelo ʻia ma ka faile readme aia ma ka papa kuhikuhi tcg, he ʻāpana mua kēia o ka mea hoʻopili C maʻamau, i hoʻololi ʻia ma hope no JIT. No laila, no ka laʻana, ʻaʻole ia he hale hoʻokipa malihini, akā he hale hoʻokipa. I kekahi manawa, ua ʻike ʻia kahi mea ʻē aʻe - Tiny Code Interpreter (TCI), pono e hoʻokō i ke code (kokoke i nā hana kūloko like) me ka loaʻa ʻole o kahi code generator no kahi hale hoʻokipa kūikawā. ʻO ka ʻoiaʻiʻo, e like me kāna palapala i hōʻike ʻia, ʻaʻole hiki i kēia unuhi ʻōlelo ke hana i nā manawa a pau e like me ka JIT code generator, ʻaʻole wale i ka quantitatively ma ke ʻano o ka wikiwiki, akā i ka qualitative. ʻOiai ʻaʻole maopopo iaʻu he pili pono kāna wehewehe.

I ka wā mua, ua hoʻāʻo wau e hana i kahi backend TCG piha, akā ua huikau koke wau i ke kumu kumu a me ka wehewehe ʻole ʻana o nā ʻōlelo aʻoaʻo bytecode, no laila ua hoʻoholo wau e kāʻei i ka unuhi ʻōlelo TCI. Ua hāʻawi kēia i kekahi mau pono:

  • i ka wā e hoʻokō ai i kahi code generator, ʻaʻole hiki iā ʻoe ke nānā i ka wehewehe ʻana o nā ʻōlelo aʻo, akā i ke code unuhi
  • hiki iā ʻoe ke hana i nā hana ʻaʻole no kēlā me kēia poloka unuhi i ʻike ʻia, akā, no ka laʻana, ma hope wale nō o ka hoʻokō ʻana i ka haneli
  • inā hoʻololi ke code i hana ʻia (a he mea hiki paha kēia, e noʻonoʻo ana i nā hana me nā inoa i loaʻa i ka huaʻōlelo patch), pono wau e hōʻole i ka code JS i hana ʻia, akā ma ka liʻiliʻi loa e loaʻa iaʻu kahi mea e hana hou ai.

E pili ana i ke kolu o ka helu, ʻaʻole maopopo iaʻu e hiki ke hoʻopaʻa ʻia ma hope o ka hoʻokō ʻia ʻana o ke code no ka manawa mua, akā ua lawa nā helu ʻelua.

I ka hoʻomaka ʻana, ua hana ʻia ke code ma ke ʻano o kahi hoʻololi nui ma ka helu o ke kumu aʻo bytecode, akā, e hoʻomanaʻo ana i ka ʻatikala e pili ana iā Emscripten, optimization o JS i hana ʻia a relooping, ua hoʻoholo wau e hoʻohua i nā code kanaka hou aʻe, ʻoiai ʻo ia ka mea empirically. ua ʻike ʻia ʻo ka hoʻomaka wale nō ke komo ʻana i ka poloka unuhi. ʻAʻole i ʻōlelo koke ʻia ma hope o ka hana ʻana, ma hope o kekahi manawa ua loaʻa iā mākou kahi code generator i hana i nā code me ifs (ʻoiai ʻaʻohe puka lou). Akā ʻo ka pōʻino, ua hāʻule ia, e hāʻawi ana i kahi leka no ka lōʻihi o nā kuhikuhi. Eia kekahi, ʻo ke aʻo hope loa ma kēia pae recursion brcond. ʻAe, e hoʻohui au i kahi loiloi like i ka hanauna o kēia ʻōlelo aʻo ma mua a ma hope o ke kelepona recursive a ... ʻaʻole i hoʻokō ʻia kekahi o lākou, akā ma hope o ka hoʻololi ʻana ua hāʻule mau lākou. I ka hopena, ma hope o ke aʻo ʻana i ke code i hana ʻia, ʻike wau ma hope o ka hoʻololi ʻana, e hoʻouka hou ʻia ka mea kuhikuhi i ke aʻo ʻana i kēia manawa mai ka waihona a ua kākau ʻia paha e ka code JavaScript i hana ʻia. A pēlā i hoʻololi ʻia ai. ʻO ka hoʻonui ʻana i ka buffer mai hoʻokahi megabyte a hiki i ka ʻumi ʻaʻole i alakaʻi i kekahi mea, a ua maopopo ka holo ʻana o ka code generator i nā pōʻai. Pono mākou e nānā ʻaʻole mākou i hele ma waho o nā palena o ka TB o kēia manawa, a inā mākou e hana, a laila e hoʻopuka i ka helu o ka TB aʻe me kahi hōʻailona hōʻemi i hiki iā mākou ke hoʻomau i ka hoʻokō. Eia kekahi, hoʻoponopono kēia i ka pilikia "he aha nā hana i hana ʻia e hōʻole ʻia inā ua loli kēia ʻāpana bytecode?" — ʻo ka hana e pili ana i kēia poloka unuhi pono e hoʻopau ʻia. Ma ke ala, ʻoiai ua hoʻopau wau i nā mea āpau ma Chromium (no ka mea ua hoʻohana wau iā Firefox a ʻoi aku ka maʻalahi o ka hoʻohana ʻana i kahi polokalamu kele pūnaewele no nā hoʻokolohua), ua kōkua ʻo Firefox iaʻu e hoʻoponopono i nā mea like ʻole me ka maʻamau asm.js, a laila hoʻomaka ke code e hana wikiwiki i loko. Chromium.

Laʻana o ke code i hana ʻia

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"]

hopena

No laila, ʻaʻole i pau ka hana, akā ua luhi wau i ka lawe malū ʻana i kēia kūkulu lōʻihi i ka hemolele. No laila, ua hoʻoholo wau e hoʻolaha i kaʻu mea i kēia manawa. He mea makaʻu iki ke code ma nā wahi, no ka mea, he hoʻokolohua kēia, a ʻaʻole maopopo i ka mea e pono ai ke hana. Malia paha, pono e hoʻopuka i nā hana atomika maʻamau ma luna o kekahi mana hou o Qemu. I kēia manawa, aia kahi pae i loko o ka Gita ma kahi moʻomanaʻo blog: no kēlā me kēia "pae" i hala ma kahi liʻiliʻi, ua hoʻohui ʻia kahi ʻōlelo kikoʻī ma ka Lūkini. ʻO kaʻoiaʻiʻo, ʻo kēia ʻatikala ma kahi ākea ka haʻi hou ʻana i ka hopena git log.

Hiki iā ʻoe ke hoʻāʻo i nā mea a pau maanei (e makaala i ke kalaiwa).

He aha ka mea e hana nei:

  • x86 kaʻina hana virtual e holo ana
  • Aia kekahi prototype hana o kahi mea hana JIT code mai ka mīkini code a JavaScript
  • Aia kahi laʻana no ka hoʻohui ʻana i nā hale hoʻokipa malihini 32-bit: i kēia manawa hiki iā ʻoe ke mahalo iā Linux no ka hoʻoheheʻe ʻana o ka hoʻolālā MIPS i ka polokalamu kele ma ka pae hoʻouka.

He aha hou kāu e hana ai

  • E hoʻolalelale i ka emulation. ʻOiai ma ke ʻano JIT, ʻoi aku ka lohi ma mua o Virtual x86 (akā aia paha kahi Qemu holoʻokoʻa me ka nui o nā lako hana a me nā hale hana)
  • No ka hana ʻana i kahi interface maʻamau - ʻoiaʻiʻo, ʻaʻole wau he mea hoʻomohala pūnaewele maikaʻi, no laila i kēia manawa ua hana hou au i ka shell Emscripten maʻamau e like me kaʻu hiki.
  • E hoʻāʻo e hoʻomaka i nā hana Qemu paʻakikī - pūnaewele, VM migration, etc.
  • UPD: Pono ʻoe e hoʻouna i kāu mau hoʻomohala liʻiliʻi a me nā hōʻike bug iā Emscripten upstream, e like me nā mea lawe mua o Qemu a me nā papahana ʻē aʻe. Mahalo iā lākou no ka hiki iā lākou ke hoʻohana i kā lākou hāʻawi iā Emscripten ma ke ʻano o kaʻu hana.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka