Qemu.js me te tautoko JIT: ka taea tonu e koe te huri whakamuri i te mīti mōrohe

I etahi tau ki muri ko Fabrice Bellard i tuhia e jslinux he emulator PC kua tuhia ki te JavaScript. I muri i tera ka nui ake x86 mariko. Engari ko ratou katoa, ki taku mohio, he kaiwhakamaori, ko Qemu, i tuhia i mua ake nei e te taua Fabrice Bellard, a, tera pea, tetahi emulator hou e whakaute ana ia ia ano, e whakamahi ana i te whakahiato JIT o te waehere manuhiri ki te waehere punaha manaaki. Ko te ahua ki ahau kua tae ki te wa ki te whakatinana i te mahi rerekee e pa ana ki te mea e whakaotihia ana e nga kaitirotiro: JIT whakahiatotanga o te waehere miihini ki roto i te JavaScript, he mea tino tika ki te tauranga Qemu. Te ahua nei, he aha a Qemu, he ngawari ake, he hoa-kaiwhakamahi emulators - ko taua VirtualBox, hei tauira - kua whakauruhia me te mahi. Engari he maha nga ahuatanga whakamere a Qemu

  • puna tuwhera
  • te kaha ki te mahi kaore he taraiwa kernel
  • te kaha ki te mahi i roto i te aratau whakamaori
  • tautoko mo te maha o nga hoahoanga manaaki me nga manuhiri

Mo te tuatoru o nga korero, ka taea e au te whakamarama inaianei, i roto i te tikanga TCI, ehara i te mea ko nga tohutohu miihini manuhiri e whakamaoritia ana, engari ko te bytecode i riro mai i a raatau, engari kaore tenei e whakarereke i te kaupapa - hei hanga me te whakahaere. Qemu i runga i te hoahoanga hou, mena kei te waimarie koe, he nui te A C compiler - ka taea te hiki te tuhi i te kaihanga waehere.

Na inaianei, i muri i nga tau e rua o te maataki ki te waehere puna Qemu i taku wa waatea, ka puta mai he tauira mahi, ka taea e koe te whakahaere, hei tauira, Kolibri OS.

He aha te Emscripten

I enei wa, he maha nga kaitoi kua puta, ko te mutunga ko JavaScript. Ko etahi, penei i te Momo Tuhituhi, i whakaaro tuatahi hei huarahi pai ki te tuhi mo te ipurangi. I taua wa ano, he huarahi a Emscripten ki te tango i te waehere C, C++ ranei, ka whakahiato ki roto i te puka ka taea te panui. Kei runga tenei whārangi Kua kohia e matou he maha nga tauranga o nga kaupapa rongonui: koneiHei tauira, ka taea e koe te titiro ki a PyPy - na te mea, kei te kii ratou kei a raatau a JIT. Inaa, kaore nga kaupapa katoa e taea te whakahiato noa me te whakahaere i roto i te kaitirotiro - he maha āhuatanga, e tika ana kia mau ki a koe, heoi, i te mea ko te tuhinga kei te wharangi kotahi e kii ana "Ka taea te whakamahi a Emscripten ki te whakahiato tata ki nga mea katoa. kawe C/C++ code to JavaScript". Ara, he maha nga mahi kaore i te tautuhia te whanonga i runga i te paerewa, engari ko te nuinga o te waa ka mahi i runga i te x86 - hei tauira, ko te urunga kore ki nga taurangi, e aukati ana i etahi o nga hoahoanga. , Ko Qemu he kaupapa whakawhiti-whakawhitinga, a, i pirangi ahau ki te whakapono, a kaore ano kia nui te ahua o te whanonga kaore i tautuhia - tangohia ka whakahiatohia, katahi ka huri iti ki te JIT - kua oti koe! take...

Ngana tuatahi

Ko te tikanga, ehara ahau i te tangata tuatahi ki te whakaaro ki te kawe i a Qemu ki te JavaScript. I patai tetahi patai ki te huihuinga ReactOS mena ka taea tenei ma te whakamahi i te Emscripten. Ahakoa i mua ake nei, i puta nga korero i mahia e Fabrice Bellard tenei, engari e korero ana matou mo te jslinux, ki taku mohio, he ngana noa ki te whakatutuki i nga mahi tika i roto i te JS, ka tuhia mai i te waa. I muri mai, ka tuhia te Virtual x86 - i whakairihia nga puna korero mo taua mea, a, e ai ki te korero, ko te "tino" nui o te tauira ka taea te whakamahi i te SeaBIOS hei firmware. I tua atu, kotahi te ngana ki te tauranga Qemu ma te whakamahi i te Emscripten - I whakamatau ahau ki te mahi i tenei takirua turanga, engari ko te whanaketanga, ki taku mohio, i whakatotoka.

Na, ko te ahua nei, koinei nga puna korero, ko Emscripten - tangohia, whakahiato. Engari tera ano etahi whare pukapuka e whakawhirinaki ai a Qemu, me nga whare pukapuka e whakawhirinaki ai aua whare pukapuka, aha atu, a ko tetahi ko libffi, e whakawhirinaki ana te glib. I puta nga korero i runga i te Ipurangi ko tetahi kei roto i te kohinga nui o nga tauranga o nga whare pukapuka mo Emscripten, engari he ahua uaua ki te whakapono: tuatahi, ehara i te mea he kaikoipi hou, tuarua, he iti rawa te taumata a whare pukapuka ki te tiki noa, ka whakahiato ki JS. A ehara i te mea ko te whakaurunga huihuinga - tera pea, mena ka huri ke koe, mo etahi huihuinga karanga ka taea e koe te whakaputa i nga tautohetohe e tika ana i runga i te puranga me te karanga i te mahi me te kore. Engari he mea uaua a Emscripten: kia mohio ai te waehere kua hangaia ki te kaitirotiro JS engine optimizer, ka whakamahia etahi tinihanga. Ina koa, ko te mea e kiia nei ko te relooping - he kaihanga waehere e whakamahi ana i te LLVM IR kua riro mai me etahi tohutohu whakawhiti waitara e ngana ana ki te hanga ano i nga mea e tika ana, nga koropiko, aha atu. Ana, me pehea te tuku i nga tohenga ki te mahi? Ko te tikanga, hei tohenga mo nga mahi a JS, ara, mena ka taea, kaua ma te tapae.

I te timatanga i puta he whakaaro ki te tuhi noa i te whakakapi mo te libffi me te JS me te whakahaere i nga whakamatautau paerewa, engari i te mutunga ka raruraru ahau me pehea te hanga i aku konae pane kia mahi tahi me te waehere o naianei - he aha taku mahi, e kii ana ratou, "He tino uaua nga mahi "He poauau rawa tatou?" Me kawe e au te libffi ki tetahi atu hoahoanga, hei korero - Waimarie, kei a Emscripten nga tonotono e rua mo te huihuinga-a-roto (i roto i te Javascript, ae - pai, ahakoa te hoahoanga, na te assembler), me te kaha ki te whakahaere waehere i hangaia i runga i te rere. I te nuinga o te waa, i muri i te tarai ki nga kongakonga libffi e whakawhirinaki ana ki te turanga mo etahi wa, ka whiwhi ahau i etahi waehere whakauru ka whakahaere i te whakamatautau tuatahi i kitea e ahau. Ki taku miharo, i angitu te whakamatautau. I miharo ki taku mohio - kaore he kata, i mahi mai i te whakarewanga tuatahi - Ko ahau, kaore tonu i te whakapono ki oku kanohi, ka haere ano ahau ki te titiro ano ki te tohu kua puta, ki te arotake i hea ka keri i muri mai. I konei ka mutu taku mahi nati mo te wa tuarua - ko taku mahi anake ffi_call - i kii mai he waea angitu tenei. Karekau he waea ake. Na ka tukuna e ahau taku tono kume tuatahi, i whakatika i te hapa o te whakamatautau e marama ana ki nga akonga Olympiad - kaua e whakatauritea nga nama tuturu a == b me pehea hoki a - b < EPS - Me mahara ano koe ki te waahanga, ki te kore 0 ka tino rite ki te 1/3... I te nuinga o te waa, i tae mai ahau ki tetahi tauranga o te libffi, ka paahitia nga whakamatautau ngawari, me te glib whakahiato - I whakatau ahau ka tika, ka taapirihia e au i muri mai. Ma te titiro whakamua, ka kii ahau, na te mea i puta mai, kaore i whakauruhia e te kaitoi te mahi libffi ki te waehere whakamutunga.

Engari, penei i taku korero, he waahi etahi, a, i roto i te whakamahi noa i nga momo whanonga kaore i tautuhia, kua hunahia he ahuatanga kino ake - ko te JavaScript na te hoahoa kaore e tautoko i te tinithreading me te mahara tahi. Ko te tikanga, ka kiia tenei he whakaaro pai, engari ehara mo te kawe i te waehere kua herea te hoahoanga ki nga miro C. Ko te tikanga, kei te whakamatau a Firefox ki te tautoko i nga kaimahi tiritahi, a kei a Emscripten te whakatinanatanga pthread mo ratou, engari kaore au i pai ki te whakawhirinaki ki runga. Me ata unu e ahau te miro maha mai i te waehere Qemu - ara, rapua kei hea nga miro e rere ana, nekehia te tinana o te kapiti e rere ana i tenei miro ki tetahi mahi motuhake, ka karanga takitahi i aua mahi mai i te kohanga matua.

Te ngana tuarua

I etahi wa, ka marama kei te noho tonu te raru, a, ko te kopikopiko noa i nga toka huri noa i te waehere ka kore e puta he painga. Te Whakamutunga: Me whakarite e tatou te tikanga o te whakauru tootoo. Na reira, ko te putanga 2.4.1, he mea hou i tera wa, i tangohia (ehara i te 2.5.0, na te mea, ko wai ka mohio, ka puta nga pepeke i roto i te putanga hou kaore ano kia mau, ka nui noa atu aku pepeke. ), a ko te mea tuatahi ko te tuhi ano marie thread-posix.c. Ae, ara, he haumaru: ki te ngana tetahi ki te mahi i tetahi mahi e arai ana ki te aukati, ka karangahia te mahi abort() - Ko te tikanga, kaore tenei i whakaoti i nga raru katoa i te wa kotahi, engari i te mea he pai ake i te tango marie i nga raraunga koretake.

I te nuinga o te waa, he tino awhina nga whiringa Emscripten ki te kawe waehere ki JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - ka mau ratou i etahi momo whanonga kaore i tautuhia, penei i nga waea ki te waahi noho kore (kaore rawa i te rite ki te waehere mo nga rarangi patopato penei HEAP32[addr >> 2] = 1) te waea ranei i tetahi taumahi me te he te maha o nga tohenga.

Ma te ara, ko nga hapa whakatikatika he take motuhake. Ka rite ki taku korero kua korero ake nei, kei a Qemu he "whakaheke" whakamuri whakamaori mo te whakatipuranga waehere TCI (te kaiwhakamaori waehere iti), me te hanga me te whakahaere i a Qemu i runga i tetahi hoahoanga hou, mena he waimarie koe, he nui te kaitoha C. Kupumatua "ki te waimarie koe". Kaore au i waimarie, ka puta ko te whakamahi a TCI i te urunga kore i te wa e tarai ana i tana bytecode. Arā, i runga i nga momo ARM me etahi atu hoahoanga me te uru atu ki te taumata, ka whakahiato e Qemu na te mea kei a raatau te tuara TCG noa e whakaputa waehere taketake, engari mena ka mahi a TCI ki a raatau he patai ano. Heoi, i te mea i puta mai, ko nga tuhinga TCI i tino whakaatu i tetahi mea rite. Ko te mutunga mai, ko nga piiraa mahi mo te panui kore i honoa i taapirihia ki te waehere, i kitea i tetahi atu waahanga o Qemu.

Te whakangaromanga puranga

Ko te mutunga, i whakatikahia te urunga kore ki te TCI, i hangaia he kohanga matua ka kiia ko te tukatuka, RCU me etahi atu mea iti. Na ka whakarewahia e ahau a Qemu me te whiringa -d exec,in_asm,out_asm, ko te tikanga me kii koe he aha nga poraka o te waehere kei te mahia, me te wa ano o te haapurorotanga ki te tuhi he aha te waehere manuhiri, he aha te waehere kaihautu (i tenei keehi, bytecode). Ka timata, ka mahia etahi poraka whakamaori, ka tuhi i te karere patuiro i waiho e ahau ka timata te RCU inaianei ka... tukinga abort() roto i tetahi mahi free(). Ma te tarai i te mahi free() I kitea e matou kei roto i te pane o te poraka puranga, kei roto i nga paita e waru i mua i te mahara kua tohatohahia, hei utu mo te rahi o te poraka, he mea rite ranei, he para.

Te whakangaromanga o te puranga - he tino ataahua... I roto i tenei keehi, he rongoa whai hua - mai i (mehemea ka taea) nga punaa ano, whakahiatohia he takirua taketake ka whakahaere i raro i te Valgrind. I muri i etahi wa, kua rite te rua. Ka whakarewahia e au me nga whiringa ano - ka pakaru noa i te wa o te arawhitinga, i mua i te taenga atu ki te mahi. He mea kino, o te akoranga - te ahua, kaore i rite nga punawai, ehara i te mea miharo, na te mea ko te whirihora i rapu i nga whiringa rereke, engari kei a au a Valgrind - tuatahi ka whakatika ahau i tenei pepeha, katahi ka waimarie au. , ka puta te mea taketake. He rite tonu taku whakahaere i raro i a Valgrind... Y-y-y, y-y-y, uh-uh, i timata, i haere i roto i te aratakitanga i te nuinga o te waa ka neke ki mua i te bug taketake me te kore he whakatupato mo te urunga mahara he, kaua e whakahua mo te hinga. Ko te ora, e kii ana ratou, kaore au i whakareri mo tenei - ka mutu te tukinga o te kaupapa pakaru ina whakarewahia i raro i a Walgrind. He mea ngaro tera. Ko taku whakapae ko tetahi wa i te takiwa o te ako o naianei i muri i te tukinga i te wa o te aratakitanga, i whakaatu a gdb i te mahi. memset-a me te atatohu whaimana ma te whakamahi i tetahi mmx, ranei xmm rehita, katahi pea he momo hapa tirohanga, ahakoa he uaua tonu te whakapono.

Kaati, kaore a Valgrind e awhina i konei. Na i konei ka timata te mea tino whakarihariha - ka tiimata nga mea katoa, engari ka pakaru mo nga take tino kore e mohiotia na tetahi huihuinga kua pa ki nga miriona tohutohu i mua. Mo te wa roa, kaore i tino marama me pehea te whakatata atu. I te mutunga, me noho tonu ahau ki te patuiro. Ko te tuhi i te mea i tuhia ano te pane ka whakaatu ehara i te ahua o te tau, engari he momo raraunga rua. Na, nana, i kitea tenei aho-rua i roto i te konae BIOS - ara, inaianei ka taea te kii me te tino maia he putunga putunga, a kua tino marama kua tuhia ki tenei papa. Na, ko tetahi mea penei - i Emscripten, he waimarie, kaore he waahi o te waahi waahi, kaore he kohao kei roto, na ka taea e koe te tuhi i tetahi waahi i waenganui o te waehere ki te whakaputa raraunga ma te tohu mai i te whakarewatanga whakamutunga, titiro ki nga raraunga, titiro ki te tohu tohu, a, ki te kore e rereke, rapua he kai hei whakaaro. Pono, e rua meneti te roa ki te hono i muri i tetahi huringa, engari ka aha koe? Ko te hua o tenei, i kitea he raina motuhake i kape i te BIOS mai i te kaitarai mo te wa poto ki te mahara manuhiri - a, he pono, kaore i te nui te waahi i roto i te papaa. Ko te kimi i te puna o taua wahitau papaa rereke ka puta he mahi qemu_anon_ram_alloc i roto i te kōnae oslib-posix.c - ko te tikanga tenei: i etahi wa ka whai hua ki te whakahāngai i te wahitau ki tetahi wharangi nui e 2 MB te rahi, mo tenei ka patai matou mmap he iti ake te tuatahi, katahi ka whakahokia e matou te toenga me te awhina munmap. A, ki te kore e hiahiatia te whakarite, katahi ka tohuhia te hua hei utu mo te 2 MB getpagesize() - mmap ka tukuna tonutia he wahi noho e tika ana... Na i Emscripten mmap karanga noa malloc, engari o te akoranga e kore e hängai i runga i te wharangi. I te nuinga o te waa, ko tetahi bug i whakapouri i ahau mo nga marama e rua i whakatikahia e te whakarereketanga Tuhinga o mua raina.

Nga ahuatanga o nga mahi waea

Na inaianei kei te tatauhia e te kaitukatuka tetahi mea, kaore a Qemu e pakaru, engari kaore te mata e huri, ka tere haere te tukatuka ki roto i nga koropiko, ma te whakatau i te putanga. -d exec,in_asm,out_asm. Kua puta mai he whakapae: karekau e tae mai nga haukoti o te matama (i te nuinga o te waa, nga aukati katoa). Ae, ki te wetewete koe i nga aukati mai i te huihuinga Maori, na etahi take i mahi, ka whiwhi koe i tetahi pikitia rite. Engari ehara tenei i te whakautu: ko te whakataurite o nga tohu i tukuna me te whiringa i runga ake nei i whakaatu ko nga huarahi whakamate i tino rerekee. I konei me kii ko te whakataurite o nga mea i tuhia ma te whakamahi i te kaiwhakarewa emrun Ko te patuiro i te putanga me te whakaputanga o te huihuinga Maori ehara i te mahi miihini katoa. Kaore au i te tino mohio me pehea te hono atu o tetahi papatono i roto i te kaitirotiro emrun, engari ko etahi rarangi i roto i te putanga ka huri ke te whakarereke, na ko te rereketanga o te rereketanga kaore ano i te take ki te whakaaro kua rereke nga huarahi. I te nuinga o te waa, ka marama mai i runga i nga tohutohu ljmpl he whakawhitinga ki nga wahitau rereke, a he rereke te tikanga o te bytecode i hangaia: kei roto i tetahi he tohutohu ki te karanga i tetahi mahi kaiawhina, ko tetahi kaore. Whai muri i te tirotiro i nga tohutohu me te ako i te waehere e whakamaori ana i enei tohutohu, ka marama ko, tuatahi, i mua tonu i te rehita cr0 i mahia he rekoata - ma te whakamahi ano i te kaiawhina - i huri te tukatuka ki te aratau pare, tuarua, kaore te putanga js i huri ki te aratau pare. Engari ko te mea ko tetahi atu ahuatanga o Emscripten ko tana kore e pai ki te whakaae ki nga waehere penei i te whakatinanatanga o nga tohutohu. call i roto i te TCI, ka puta he momo tohu tohu mahi long long f(int arg0, .. int arg9) - me karanga nga mahi me te tau tika o nga tohenga. Mena ka takahia tenei ture, i runga i nga tautuhinga patuiro, ka pakaru te papatono (he pai) ka karanga ranei i te mahi he (he pouri ki te patuiro). He whiringa tuatoru ano - ka taea te whakatipuranga o nga takai hei taapiri / tango i nga tautohetohe, engari i te katoa ka nui te waahi o enei takai, ahakoa te mea he iti noa atu i te kotahi rau nga takai e hiahiatia ana e au. Ko tenei anake he tino pouri, engari i puta ake he raru nui ake: i roto i te waehere i hangaia o nga mahi takai, i hurihia nga tautohetohe ka hurihia, engari i etahi wa kaore i kiia te mahi me nga tautohetohe i hangaia - pai, pera ano i roto taku whakatinanatanga libffi. Arā, ko etahi kaiawhina kaore i mate.

Waimarie, kei a Qemu nga raarangi kaiawhina ka taea e te miihini te ahua o te konae pane penei

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

He tino rorirori te whakamahi: tuatahi, kua tautuhia ano nga tonotono i roto i te huarahi tino rerekee DEF_HELPER_n, ka huri helper.h. Ki te mea ka whakaroahia te tonotono ki roto i te hangahanga arataki me te piko, katahi ka tautuhia he huānga, hei utu mo nga huānga - #include <helper.h> Ko te mutunga mai, ka whai waahi ahau ki te whakamatau i te whare pukapuka i te mahi pyparsing, a ka tuhia he tuhinga hei whakaputa i aua takai mo nga mahi e hiahiatia ana.

Na, i muri i tera ka ahua mahi te tukatuka. Te ahua nei na te mea kaore ano te mata i arawhiti, ahakoa i taea e memtest86+ te whakahaere i roto i te huihuinga Maori. I konei he mea tika ki te whakamarama kua tuhia te waehere I/O poraka Qemu ki nga coroutines. Kei a Emscripten tana ake whakatinanatanga tino uaua, engari me tautoko tonu i te waehere Qemu, a ka taea e koe te patuiro i te tukatuka inaianei: Ka tautoko a Qemu i nga whiringa -kernel, -initrd, -append, ka taea e koe te whakaara i a Linux, hei tauira, memtest86+, me te kore e whakamahi i nga taputapu poraka. Engari koinei te raru: i roto i te huihuinga taketake ka taea e tetahi te kite i te putanga kernel Linux ki te papatohu me te whiringa -nographic, karekau he putanga mai i te kaitirotiro ki te tauranga mai i te wahi i whakarewaina ai emrun, kaore i tae mai. Arā, kaore i te marama: kaore te tukatuka i te mahi, kaore ranei te putanga whakairoiro e mahi. Na ka puta ake te whakaaro me tatari ahau mo te wa poto. I puta mai "kare te kaitukatuka e moe ana, engari he ata kimomata," a i muri tata ki te rima meneti ka tukuna e te kakano te tini o nga karere ki runga i te papatohu ka mau tonu te iri. I marama te mahi o te tukatuka, i te nuinga o te waa, a me keri tatou ki te waehere mo te mahi tahi me SDL2. Kia aroha mai, kare au e mohio ki te whakamahi i tenei whare pukapuka, no reira i etahi waahi me mahi ohorere ahau. I etahi wa, ka whiti te rarangi whakarara0 ki runga i te mata i runga i te papamuri kahurangi, i puta etahi whakaaro. I te mutunga, ka puta ko te raru ko te whakatuwhera a Qemu i etahi matapihi mariko i roto i te matapihi tinana kotahi, i waenga ka taea e koe te huri ma te whakamahi Ctrl-Alt-n: ka mahi i roto i te hanga taketake, engari kaore i te Emscripten. I muri i te whakakore i nga matapihi kore e tika ana ma te whakamahi i nga whiringa -monitor none -parallel none -serial none me nga tohutohu ki te tarai ano i te mata katoa ki ia anga, ka puta ohorere nga mea katoa.

Coroutines

Na, ka mahi te peehi i roto i te kaitirotiro, engari kaore e taea e koe te whakahaere i tetahi mea whakamere ki roto, na te mea kaore he poraka I/O - me whakatinana koe i te tautoko mo nga coroutines. Kei a Qemu te maha o nga coroutine backends, engari na te ahua o te JavaScript me te kaihanga waehere Emscripten, kaore e taea e koe te timata ki te tarai i nga puranga. Ko te ahua "kua ngaro nga mea katoa, kua tangohia te raima," engari ko nga kaihanga Emscripten kua oti te tiaki i nga mea katoa. He tino rorirori tenei mahi: me kii tatou i tetahi waea mahi penei i te whakapae emscripten_sleep me etahi atu e whakamahi ana i te tikanga Asyncify, tae atu ki nga waea aatohu me nga waea ki tetahi mahi ka puta mai tetahi o nga keehi e rua o mua ki raro i te puranga. Na inaianei, i mua i ia waea whakapae, ka tohua e matou he horopaki tukutahi, a, i muri tonu i te waea, ka tirohia mena kua puta he waea tukutahi, a ki te mea, ka tiakina e matou nga taurangi rohe katoa i roto i tenei horopaki tukutahi, tohu ko tehea mahi. ki te whakawhiti mana ki te wa e hiahia ana tatou ki te haere tonu te mahi , ka puta i te mahi o naianei. Koinei te waahi mo te ako i te paanga moumou — mo nga hiahia kia haere tonu te mahi waehere i muri i te hokinga mai i te waea tukutahi, ka whakaputahia e te kaitoi he "stubs" o te mahi ka timata i muri i te waea whakapae — penei: mena he n waea whakapae, katahi ka whakawhanuihia te mahi ki tetahi waahi n/2 wa — kei te noho tonu tenei, ki te kore Kia maumahara i muri i ia waea tukutahitanga, me taapiri koe ki te penapena i etahi taurangi rohe ki te mahi taketake. I muri mai, me tuhi ahau i tetahi tuhinga ngawari ki te Python, na, i runga i te huinga o nga mahi kua tino whakamahia e kii ana "kaore e tukua te asynchrony ki roto i a raatau" (ara, ko te whakatairanga puranga me nga mea katoa i whakaahuahia e au kaore. mahi i roto ia ratou), ka tohu i nga waea ma roto i nga tohutohu e kore ai e arohia nga mahi e te kaitoi kia kore ai enei mahi e kiia he tukutahi. Na ko nga konae JS kei raro iho i te 60 MB he tino nui rawa - me kii i te iti rawa 30. Ahakoa, i te wa e whakatuu ana ahau i tetahi tuhinga huihuinga, katahi ka peia e ahau nga whiringa hono, i roto i enei ko. -O3. Ka whakahaerehia e ahau te waehere i hangaia, ka kai a Chromium te mahara me nga tukinga. Katahi ahau ka titiro pohehe ki tana e ngana ana ki te tango... Kaati, he aha taku korero, kua tio hoki ahau mena i tonohia ahau ki te ako whakaaro me te arotau i te 500+ MB Javascript.

Kia aroha mai, ko nga arowhai i roto i te waehere whare pukapuka tautoko Asyncify kaore i tino pai longjmp-s e whakamahia ana i roto i te waehere tukatuka mariko, engari i muri i te papaki iti e whakakore ana i enei arowhai me te kaha ki te whakahoki i nga horopaki me te mea he pai nga mea katoa, ka mahi te waehere. Na ka timata tetahi mea rereke: i etahi wa ka tiimata te tirotiro i te waehere tukutahi - ko nga mea ano e pakaru ana i te waehere mena, i runga i te arorau mahi, me aukati - ka ngana tetahi ki te hopu i tetahi mutex kua mau. Waimarie, karekau tenei he raruraru arorau i roto i te waehere rangatū - I te whakamahi noa ahau i te taumahinga kopae matua paerewa e whakaratohia ana e Emscripten, engari i etahi wa ko te waea tukutahi ka tino wetewete i te puranga, a i taua wa ka taka. setTimeout mai i te kopae matua - na reira, ka uru te waehere ki te whitiwhitinga kopae matua me te kore e waiho i te waahanga o mua. Tuhia ano i runga i te kapiti mutunga kore me te emscripten_sleep, ka mutu nga raruraru me nga mutex. Ko te waehere kua kaha ake te arorau - i muri i nga mea katoa, me te mea, kaore au i etahi waehere hei whakarite i te anga hākoritanga e whai ake nei - ka tatauhia e te kaitukatuka tetahi mea ka whakahoutia te mata i ia wa. Heoi, kaore nga raruraru i mutu i reira: i etahi wa ka mutu noa te mahi a Qemu me te kore he rereke, he hapa ranei. I taua wa ka whakarerea e ahau, engari, ka titiro whakamua, ka kii ahau ko te raru ko tenei: ko te waehere coroutine, kaore e whakamahia. setTimeout (kaore ranei i nga wa katoa e whakaaro ana koe): mahi emscripten_yield ka tautuhi noa i te haki waea tukutahi. Ko te kaupapa katoa ko tera emscripten_coroutine_next ehara i te mahi tukutahi: i roto ka tirohia e ia te haki, ka tautuhi ano, ka whakawhitia te mana ki te waahi e hiahiatia ana. Arā, ka mutu ki reira te whakatairanga o te tāpae. Ko te raruraru na te whakamahi-muri-kore, i puta mai i te wa i monoa ai te puna coroutine na te mea kaore au i kape i tetahi rarangi tohu nui mai i te tuara o te coroutine, te mahi. qemu_in_coroutine i whakahokia pono i te mea me hoki he teka. Na tenei ka puta he waea emscripten_yield, i runga ake karekau he tangata i runga i te puranga emscripten_coroutine_next, ka horahia te puranga ki runga rawa, engari kaore setTimeout, pera i taku korero i mua, kaore i whakaatuhia.

Te hanga waehere JavaScript

Na konei, ko te mea pono, ko te kupu whakaari "ka huri ki muri i te kai tapatapahi." Kaore rawa. Ko te tikanga, ki te whakahaere tatou i te Qemu i roto i te tirotiro, me te Node.js kei roto, na, ko te tikanga, i muri i te whakaputanga waehere i Qemu ka tino he te JavaScript. Engari ano, etahi momo huringa whakamuri.

Tuatahi, he iti mo te mahi a Qemu. Tena koa murua ahau i tenei wa tonu: Ehara ahau i te kaiwhakawhanake Qemu ngaio, ka pohehe pea aku whakatau i etahi waahi. I a ratou e kii ana, "kaore te whakaaro o te akonga e taurite ki te whakaaro o te kaiako, ki te axiomatics me te mohio o Peano." Kei a Qemu te maha o nga hoahoanga manuhiri e tautokohia ana, a, mo ia tangata he whaiaronga penei target-i386. I te wa e hanga ana, ka taea e koe te tohu tautoko mo te maha o nga hoahoanga manuhiri, engari ko te hua he maha noa nga taarua. Ko te waehere hei tautoko i te hoahoanga manuhiri, ka whakaputa i etahi mahi Qemu o roto, kua huri ke te TCG (Tiny Code Generator) hei waehere miihini mo te hoahoanga manaaki. Ka rite ki te korero i roto i te konae readme kei roto i te raarangi tcg, he waahanga tuatahi tenei o te kaitoi C, i muri mai i urutau mo JIT. No reira, hei tauira, ko te hoahoanga whainga i runga i tenei tuhinga ehara i te hoahoa manuhiri, engari he hoahoanga manaaki. I etahi wa, ka puta mai tetahi atu waahanga - Tiny Code Interpreter (TCI), me mahi i te waehere (tata ki nga mahi o roto) i te kore o te kaihanga waehere mo tetahi hoahoanga kaihautu motuhake. Inaa, e kii ana ana tuhinga, kaore pea tenei kaiwhakamaori e mahi i nga wa katoa me te kaihanga waehere JIT, ehara i te ine anake i runga i te tere, engari i te kounga. Ahakoa kaore au i te tino mohio he tino tika tana korero.

I te tuatahi ka ngana ahau ki te hanga i tetahi tuara TCG katoa, engari ka pohehe i roto i te waehere puna me te whakaahuatanga kore tino marama mo nga tohutohu bytecode, no reira ka whakatau ahau ki te takai i te kaiwhakamaori TCI. I hoatu e tenei he maha nga painga:

  • i te wa e whakatinana ana i te kaihanga waehere, kaua e titiro ki te whakaahuatanga o nga tohutohu, engari ki te waehere kaiwhakamaori
  • ka taea e koe te whakaputa i nga mahi ehara mo ia poraka whakamaoritanga ka tutakina, engari, hei tauira, i muri noa iho i te raupatutanga
  • Mena ka huri te waehere i hangaia (a ka taea tenei, ma te whakatau i nga mahi me nga ingoa kei roto i te kupu papaki), me whakakore e ahau te waehere JS i hangaia, engari ko te iti rawa ka whai ahau i tetahi mea hei whakaora mai.

Mo te wahanga tuatoru, kaore au i te tino mohio ka taea te tarai i muri i te mahi i te waehere mo te wa tuatahi, engari ko nga tohu tuatahi e rua ka nui.

I te timatanga, i hangaia te waehere i roto i te ahua o te whakawhiti nui i te wahitau o te tohutohu bytecode taketake, engari ka mahara ki te tuhinga mo Emscripten, te arotautanga o te JS i hangaia me te relooping, ka whakatau ahau ki te whakaputa i etahi atu waehere tangata, ina koa mai i nga ahuatanga o te ao. ka puta ko te waahi urunga ki roto i te poraka whakamaori ko tana Timata. Kare i roa ake te korero, i muri i etahi wa ka whiwhi matou i te kaihanga waehere i hanga waehere me nga ifs (ahakoa karekau he koropiko). Engari he kino, i tukitukia, ka puta he korero he he te roa o nga tohutohu. Ano, ko te ako whakamutunga i tenei taumata recursion ko brcond. Kaati, ka taapirihia e ahau he haki rite ki te whakatipuranga o tenei ako i mua atu i muri mai i te piiraa recursive a... karekau tetahi o ratou i mahia, engari i muri i te whakahuri o te whakapae i rahua tonu. I te mutunga, i muri i te ako i te waehere i hangaia, ka mohio ahau i muri i te huringa, ka utaina ano te tohutoro ki te ako o naianei mai i te puranga, a, ka tuhia pea e te waehere JavaScript kua hangaia. Na ka puta. Ko te whakanui ake i te parepare mai i te kotahi megabyte ki te tekau kaore i arahi ki tetahi mea, a ka marama kei te rere te kaihanga waehere i roto i nga porowhita. Me tirotiro matou karekau matou i eke ki tua o nga rohe o te mate TB o naianei, a, ki te mahia e matou, katahi ka tukuna te wahi noho o te TB e whai ake nei me te tohu iti kia taea ai e matou te mahi tonu. I tua atu, ka whakatauhia e tenei te raru "he aha nga mahi i hangaia me whakakorehia mena kua rereke tenei waahanga o te bytecode?" — ko te mahi e rite ana ki tenei poraka whakamaori me whakakore. Ma te ara, ahakoa i whakakorehia e ahau nga mea katoa i roto i te Chromium (i te mea ka whakamahi ahau i te Firefox me te ngawari ake ki ahau te whakamahi i tetahi kaitirotiro motuhake mo nga whakamatautau), na Firefox i awhina i ahau ki te whakatika i nga mea koretake ki te paerewa asm.js, i muri mai ka timata te mahi tere o te waehere. Chromium.

He tauira o te waehere i hangaia

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

mutunga

Na, kaore ano kia oti te mahi, engari kua hoha ahau ki te kawe puku i tenei hanga roa ki te tino pai. Na reira, i whakatau ahau ki te whakaputa i aku mea mo tenei wa. He iti te wehi o te waehere ki nga waahi, na te mea he whakamatautau tenei, a kaore i te maarama i mua he aha te mahi. Tena pea, he pai ki te tuku i nga mahi ngota noa ki runga ake i etahi putanga hou o Qemu. I tenei wa, he miro kei roto i te Gita i roto i te whakatakotoranga rangitaki: mo ia "taumata" kua paahitia, kua taapirihia he korero taipitopito i roto i te reo Russian. Inaa, ko tenei tuhinga he korero ano mo te mutunga git log.

Ka taea e koe te whakamatau katoa konei (kia tupato ki nga waka).

He aha kei te mahi:

  • x86 tukatuka mariko e rere ana
  • He tauira mahi o te kaihanga waehere JIT mai i te waehere miihini ki te JavaScript
  • He tauira mo te whakahiato i etahi atu hoahoanga manuhiri 32-bit: i tenei wa ka taea e koe te mihi ki a Linux mo te MIPS hoahoanga mīti i roto i te tirotiro i te wa e utaina ana.

He aha atu ka taea e koe

  • Whakaterehia te tauira. Ahakoa i roto i te aratau JIT te ahua he puhoi ake te rere atu i te Virtual x86 (engari tera pea he Qemu katoa me te maha o nga taputapu me nga hoahoanga tauira)
  • Hei hanga i tetahi atanga noa - he pono, ehara ahau i te kaiwhakawhanake paetukutuku pai, no reira i tenei wa kua hanga ano e ahau te anga Emscripten paerewa i nga mea e taea ana e au.
  • Ngana ki te whakarewa i nga mahi Qemu uaua ake - whatunga, VM migration, etc.
  • UPS: ka hiahia koe ki te tuku i etahi whanaketanga me nga purongo pepeke ki Emscripten whakarunga, pera i nga kaitarai o mua o Qemu me etahi atu kaupapa. He mihi ki a raatau mo te kaha ki te whakamahi i o raatau takoha ki a Emscripten hei waahanga o taku mahi.

Source: will.com

Tāpiri i te kōrero