Qemu.js ma le lagolago a le JIT: e mafai lava ona e liliu le mince i tua

I nai tausaga ua mavae Fabrice Bellard tusia e jslinux o se PC emulator tusia i le JavaScript. Ina ua uma lena sa i ai le itiiti ifo ma le sili atu x86. Ae oi latou uma, e pei ona ou iloa, o le au faaliliu, ae o Qemu, na tusia muamua e le Fabrice Bellard lava e tasi, ma, masalo, soʻo se emulator faʻaonaponei faʻapitoa, faʻaaogaina le JIT tuʻufaʻatasiga o le code guest code i le host system code. Na foliga mai ia te aʻu ua oʻo i le taimi e faʻatino ai le galuega faʻafeagai e fesoʻotaʻi ma le mea e foia e tagata suʻesuʻe: JIT faʻapipiʻiina o numera masini i totonu o le JavaScript, lea e foliga mai e sili ona talafeagai i le taulaga Qemu. E foliga mai, aisea Qemu, e sili atu ona faigofie ma faʻaoga faʻaoga emulators - tutusa VirtualBox, mo se faʻataʻitaʻiga - faʻapipiʻi ma galue. Ae o Qemu e tele mea manaia

  • puna tatala
  • mafai ona galue e aunoa ma se avetaavale kernel
  • mafai ona galue i le fa'aliliu upu
  • lagolago mo se numera tele o fale talimalo ma fale talimalo

E tusa ai ma le vaega lona tolu, ua mafai nei ona ou faʻamatalaina o le mea moni, i le TCI mode, e le o faʻatonuga masini faʻapitoa latou lava e faʻamatalaina, ae o le bytecode na maua mai ia i latou, ae e le suia ai le uiga - ina ia fausia ma tamoe. Qemu i luga o se fausaga fou, afai e te laki, A C compiler ua lava - e mafai ona tolopo le tusiaina o se code generator.

Ma o lenei, i le mavae ai o le lua tausaga o faʻataʻitaʻi malie i le Qemu source code i loʻu taimi avanoa, na faʻaalia ai se faʻataʻitaʻiga galue, lea e mafai ona e tamoe, mo se faʻataʻitaʻiga, Kolibri OS.

O le a le Emscripten

I aso nei, e tele tagata faʻapipiʻi ua faʻaalia, o le taunuuga mulimuli o le JavaScript. O nisi, e pei o le Type Script, na muai fuafuaina e avea ma auala sili e tusitusi ai mo le upega tafaʻilagi. I le taimi lava e tasi, Emscripten o se auala e ave ai le C poʻo le C ++ code ma tuʻufaʻatasia i totonu o se suʻesuʻega e mafai ona faitau. luga lenei itulau Ua matou aoina le tele o taulaga o polokalame lauiloa: iineiMo se faʻataʻitaʻiga, e mafai ona e vaʻai i PyPy - i le ala, latou te fai mai ua uma ona i ai le JIT. O le mea moni, e le o polokalame uma e mafai ona faʻapipiʻiina ma taʻavale i totonu o se suʻega - o loʻo i ai se numera foliga, lea e tatau ona e faʻafeiloaʻi, peitaʻi, e pei ona taʻua i luga o le itulau lava lea e tasi "Emscripten e mafai ona faʻaaogaina e faʻapipiʻi toetoe o soʻo se mea. ma 'aveina C/C++ code to JavaScript ". O lona uiga, o loʻo i ai le tele o gaioiga e le faʻamalamalamaina amioga e tusa ai ma le tulaga masani, ae masani ona galue i luga o le x86 - mo se faʻataʻitaʻiga, le faʻaogaina avanoa i fesuiaiga, lea e masani ona faʻasaina i luga o nisi fausaga. , Qemu o se polokalame cross-platform ma, na ou manaʻo e talitonu, ma e leʻi aofia ai le tele o amioga e leʻi faʻamalamalamaina - ave ma faʻapipiʻi, ona tinker teisi i le JIT - ma ua e maeʻa! mataupu...

Muamua taumafai

I se tulaga lautele, e le o aʻu le tagata muamua na sau ma le manatu o le feaveaʻi Qemu i le JavaScript. Sa i ai se fesili na fesiligia i le ReactOS forum pe a mafai ona faʻaaoga Emscripten. E oo lava i le taimi muamua, sa i ai tala na faia e Fabrice Bellard lenei mea, ae sa matou talanoa e uiga i le jslinux, lea, e pei ona ou iloa, ua na o se taumafaiga e ausia ma le lima ia lava le faatinoga i le JS, ma sa tusia mai le sasa. Mulimuli ane, na tusia ai le Virtual x86 - o punaoa e leʻi faʻamaonia na lafoina mo ia, ma, e pei ona taʻua, o le sili atu o le "mea moni" o le faʻataʻitaʻiga na mafai ai ona faʻaoga SeaBIOS e fai ma firmware. E le gata i lea, e le itiiti ifo ma le tasi le taumafaiga e faʻaoga Qemu e faʻaaoga ai Emscripten - Na ou taumafai e fai lenei mea socketpaipa, ae o le atinae, i lo'u malamalama i ai, sa aisa.

O lea la, e foliga mai, o punaoa nei, o le Emscripten - ave ma tuufaatasia. Ae e iai foʻi faletusi e faalagolago i ai Qemu, ma faletusi e faalagolago i ai na faletusi, ma isi, ma o se tasi o na faletusi libffi, lea e faalagolago i ai le glib. Sa i ai tala i luga o le Initaneti o loʻo i ai se tasi i le aofaʻi tele o taulaga o faletusi mo Emscripten, ae sa faigata ona talitonuina: muamua, e leʻi faʻamoemoeina e avea ma se tuʻufaʻatasiga fou, lona lua, e maualalo tele a. faletusi e na o le pikiina, ma tuufaatasia i le JS. Ma e le na o se mataupu o faʻapipiʻi faʻapipiʻi - masalo, afai e te mimilo, mo nisi faʻasalalauga e mafai ona e faʻatupuina finauga talafeagai i luga o le faaputuga ma valaʻau le galuega e aunoa ma latou. Ae o le Emscripten o se mea taufaaleaga: ina ia faʻaalia le faʻaogaina o le code e foliga masani i le masini suʻesuʻe JS engine optimizer, o loʻo faʻaaogaina nisi togafiti. Aemaise lava, o le mea ua taʻua o le toe faʻaleleia - o se generator code e faʻaaoga ai le LLVM IR maua ma nisi o faʻatonuga o suiga faʻapitoa e taumafai e toe faʻaleleia pe afai, faʻaoga, ma isi. Ia, e fa'afefea ona tu'uina atu finauga i le galuega? E masani lava, e pei o finauga i galuega a le JS, o lona uiga, pe a mafai, ae le o le faaputuga.

I le amataga sa i ai se manatu e na o le tusia o se sui mo le libffi ma le JS ma faʻataʻitaʻi faʻataʻitaʻiga masani, ae i le faaiuga na ou le mautonu pe faʻafefea ona fai aʻu faila faila ina ia latou galulue ma le code o loʻo i ai - o le a se mea e mafai ona ou faia, e pei ona latou fai mai, "O galuega faigata "O tatou valea?" Sa tatau ona ou tuʻuina atu le libffi i se isi fausaga, o lea e tautala ai - o le mea e lelei ai, o Emscripten e lua macros mo le faʻapotopotoga faʻapipiʻi (i le Javascript, ioe - lelei, poʻo le a lava le fausaga, o le tagata faʻapipiʻi), ma le mafai ona faʻatautaia le code na faia i luga o le lele. I se tulaga lautele, ina ua maeʻa ona faʻataʻitaʻiina i luga o faʻavae-faʻalagolago i vaega libffi mo sina taimi, na ou maua ai se faʻailoga faʻapipiʻi ma faʻatautaia i luga o le suʻega muamua na ou sau ai. Na ou te'i, na manuia le suega. Maofa i loʻu atamai - e leai se tala malie, na aoga mai le amataga muamua - O aʻu, e leʻi talitonuina oʻu mata, na ou alu e toe vaʻai i le faʻailoga, e iloilo po o fea e eli ai. O lea na ou fa'atauva'a mo le taimi lona lua - na'o le pau lava le mea na fai e la'u galuega ffi_call - na lipotia mai se valaau manuia. Sa leai se valaau lava ia. O lea na ou auina atu ai laʻu talosaga toso muamua, lea na faʻasaʻo ai se mea sese i le suʻega e manino i soʻo se tamaititi aoga Olympiad - numera moni e le tatau ona faʻatusalia a == b ma pe faapefea foi a - b < EPS - e manaʻomia foʻi ona e manatua le module, a leai o le 0 o le a sili atu ona tutusa ma le 1/3 ... I se tulaga lautele, na ou sau i luga ma se taulaga o libffi, lea e pasia ai suʻega sili ona faigofie, ma o le glib tuufaatasia - Na ou filifili e tatau, o le a ou faʻaopoopoina mulimuli ane. Vaʻai i luma, o le a ou fai atu, e pei ona aliali mai, e leʻi aofia ai e le tagata faʻapipiʻi le galuega libffi i le tulafono mulimuli.

Ae, e pei ona uma ona ou fai atu, o loʻo i ai ni tapulaʻa, ma i totonu o le faʻaaogaina saoloto o amioga le faʻamalamalamaina, o se mea e sili atu le le fiafia ua natia - JavaScript e ala i le mamanu e le lagolagoina le tele o filo ma le mafaufau faʻasoa. I le mataupu faavae, e masani lava e mafai ona taʻua o se manatu lelei, ae le mo le porting code o lona fausaga e nonoa i filo C. I se tulaga masani, o loʻo faʻataʻitaʻiina e Firefox le lagolagoina o tagata faigaluega fefaʻasoaaʻi, ma Emscripten o loʻo i ai le faʻatinoga o le pthread mo i latou, ae ou te leʻi manaʻo e faʻalagolago i ai. Sa tatau ona ou liaʻi lemu multithreading mai le Qemu code - o lona uiga, saili po o fea o loʻo tafe ai filo, faʻanofo le tino o le matasele o loʻo taʻavale i lenei filo i se isi galuega, ma valaʻau ia galuega taʻitasi mai le matasele autu.

O le taumafaiga lona lua

I se taimi, na manino mai ai o loʻo i ai pea le faʻafitauli, ma o le faʻaogaina faʻafuaseʻi o tootoo faʻataʻamilo i le code o le a le maua ai se lelei. Fa'ai'uga: tatou te mana'omia le fa'atulagaina o le fa'agasologa o le fa'aopoopoina o tootoo. O le mea lea, o le version 2.4.1, lea sa fou i lena taimi, na ave (e le o le 2.5.0, aua, o ai na te iloa, o le ai ai ni mea sese i le lomiga fou e leʻi maua, ma ua lava aʻu lava mea sese. ), ma o le mea muamua o le toe tusia ma le saogalemu thread-posix.c. Ia, o lona uiga, e saogalemu: afai e taumafai se tasi e faia se taotoga e taʻitaʻia ai le poloka, na vave ona valaʻau le galuega abort() - o le mea moni, e leʻi foia uma faʻafitauli i le taimi e tasi, ae o le mea sili na sili atu le manaia nai lo le mauaina filemu o faʻamatalaga le fetaui.

I se tulaga lautele, o filifiliga Emscripten e fesoasoani tele i le lafoina o code i le JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - latou te pu'eina nisi o ituaiga o amio e le'i fa'amalamalamaina, e pei o le vala'au i se tuatusi e le'i fa'aogaina (lea e le'o fetaui lelei ma le fa'ailoga mo fa'asologa fa'apipi'i pei o HEAP32[addr >> 2] = 1) po'o le vala'au i se galuega ma le numera sese o finauga.

I le ala, o le faʻaogaina o mea sese o se mataupu ese. E pei ona uma ona ou fai atu, o Qemu o loʻo i ai se "degenerate" faʻaliliuga pito i tua mo le faʻasologa o tulafono TCI (faʻaliliuga tulafono laiti), ma ia fausia ma faʻatautaia Qemu i luga o se fausaga fou, afai e te laki, e lava le C compiler. Keywords "afai e te laki". Sa ou le manuia, ma na aliali mai o le TCI e faʻaogaina le avanoa e le faʻaogaina pe a faʻasalalau lona bytecode. O lona uiga, i luga o ituaiga uma o ARM ma isi faʻataʻitaʻiga faʻatasi ai ma le faʻaogaina o avanoa, Qemu faʻapipiʻi aua o loʻo i ai a latou TCG backend masani e maua ai le tulafono faʻapitoa, ae pe o le TCI o le a galue ia i latou o se isi fesili. Ae ui i lea, e pei ona aliali mai, o le TCI pepa o loʻo faʻaalia manino ai se mea tutusa. O le i'uga, na fa'aopoopoina ai le fa'atonuga i le fa'ailoga, lea na maua i se isi vaega o Qemu.

Fa'aleaga fa'aputuga

O le iʻuga, na faʻasaʻoina le avanoa e le faʻaogaina i le TCI, na faia ai se matasele autu lea e taʻua o le processor, RCU ma isi mea laiti. Ma o lea ou te tatalaina Qemu ma le filifiliga -d exec,in_asm,out_asm, o lona uiga e tatau ona e taʻu atu po o fea poloka o code o loʻo faʻatinoina, faʻapea foʻi i le taimi o faʻasalalauga e tusi ai poʻo le a le code malo, o le a le code host na avea (i lenei tulaga, bytecode). E amata, faʻatino le tele o poloka faʻaliliuga, tusia le savali faʻafefe na ou tuʻua o le RCU o le a amata nei ma ... faʻalavelave abort() totonu o se galuega free(). E ala i le taina o le galuega free() Na mafai ona matou iloa i totonu o le ulutala o le poloka faʻaputu, o loʻo taoto i totonu o le valu bytes i luma atu o le manatua na tuʻuina atu, nai lo le poloka poloka poʻo se mea faapena, sa i ai lapisi.

Faʻaleagaina o le faʻaputu - e ese le manaia ... I se tulaga faʻapea, o loʻo i ai se fofo aoga - mai (pe a mafai) ia lava punaoa, faʻapipiʻi se binary masani ma taʻavale i lalo o Valgrind. Ina ua mavae sina taimi, ua saunia le binary. Ou te faʻalauiloaina i filifiliga tutusa - e paʻu e oʻo lava i le amataga, ae leʻi oʻo i le faʻataunuʻuina. E le manaia, ioe - e foliga mai, o punaoa e le tutusa lelei, e le o se mea e ofo ai, aua o le configure na suʻesuʻeina ni filifiliga eseese, ae o loʻo ia te aʻu Valgrind - muamua ou te faʻaleleia lenei pusa, ona, pe a ou laki. , o le a aliali mai le mea muamua. O loʻo ou tamoe i le mea lava e tasi i lalo o Valgrind ... Y-y-y, y-y-y, uh-uh, na amata, alu i le amataga masani ma agai atu i tua atu o le pusa muamua e aunoa ma se lapataiga e tasi e uiga i le le saʻo o mafaufauga, ae le o le taʻua e uiga i le pa'ū. O le olaga, e pei ona latou fai mai, e leʻi saunia aʻu mo lenei mea - o se polokalame faʻalavelave e taofi le paʻu pe a faʻalauiloa i lalo o Walgrind. O le mea sa i ai o se mealilo. O loʻu manatu o le tasi i tafatafa o le faʻatonuga o loʻo i ai nei ina ua maeʻa se faʻalavelave i le taimi o le amataga, na faʻaalia e le gdb le galuega. memset-a faʻatasi ai ma se faʻailoga aoga e faʻaaoga ai mmx, pe xmm resitalaina, atonu o se ituaiga o mea sese, e ui lava e faigata ona talitonuina.

Lelei, Valgrind e foliga mai e le fesoasoani iinei. Ma o iinei na amata ai le mea sili ona inosia - o mea uma e foliga mai e amata, ae paʻu mo mafuaʻaga e le iloa ona o se mea na tupu na ono tupu i le faitau miliona o faʻatonuga talu ai. Mo se taimi umi, e leʻi manino lava pe faʻafefea ona faʻalatalata atu. I le faaiuga, sa tatau lava ona ou nofo i lalo ma debug. O le lolomiina o le mea na toe tusia ai le ulutala na faʻaalia ai e le o se numera, ae o se ituaiga o faʻamaumauga binary. Ma, faʻauta, o lenei manoa binary na maua i le faila BIOS - o lona uiga, o lea ua mafai ona fai atu ma le mautinoa talafeagai o se paʻu faʻafefe, ma e manino lava na tusia i lenei paʻu. Ia, o se mea faapena - i Emscripten, o le mea e lelei ai, e leai se faʻavasegaina o le avanoa o le tuatusi, e leai foi ni pu i totonu, o lea e mafai ai ona e tusi i se mea i le ogatotonu o le code e faʻaalia ai faʻamatalaga e ala i le faʻailoga mai le faʻalauiloaina mulimuli, va'ai i fa'amaumauga, va'ai i le fa'asino, ma, afai e le'i suia, ia maua se mea'ai mo mafaufauga. E moni, e mana'omia ni nai minute e feso'ota'i ai pe a uma so'o se suiga, ae o le a se mea e mafai ona e faia? O se taunuuga, na maua ai se laina faʻapitoa na kopiina le BIOS mai le paʻu le tumau i le manatuaga o tagata asiasi - ma, ioe, e le lava le avanoa i totonu o le pa. O le su'eina o le puna o lena tuatusi pa'u ese na iu i se galuega qemu_anon_ram_alloc i faila oslib-posix.c - o le manatu sa i ai lenei: o nisi taimi e mafai ona aoga le faʻaogaina o le tuatusi i se itulau tele o le 2 MB i le lapopoa, mo lenei mea o le a matou fesili ai mmap muamua teisi atu, ona tatou toe faafoi atu lea o le sili ma le fesoasoani munmap. Ma afai e le manaʻomia le faʻaogaina, ona matou faʻaalia lea o le taunuuga nai lo le 2 MB getpagesize() - mmap o le a tuʻuina atu pea se tuatusi faʻaogaina ... O lea i Emscripten mmap na'o le vala'au malloc, ae o le mea moni e le fetaui i luga o le itulau. I se tulaga lautele, o se pusa na ou le fiafia ai mo ni nai masina na faʻasaʻo e se suiga i totonu Gaoioiga laina.

Fa'aaliga o galuega vala'au

Ma o lenei o loʻo faitauina e le processor se mea, e le paʻu Qemu, ae le faʻaalia le lau, ma e vave ona alu le gaioiga i totonu o faʻamau, faʻamasino i le gaioiga. -d exec,in_asm,out_asm. Ua tula'i mai se manatu fa'apea: e le'i taunu'u le taimi fa'alavelave (po'o le lautele, fa'alavelave uma). Ma e moni lava, afai e te tatalaina le faʻalavelave mai le faʻapotopotoga faʻapitoa, lea mo nisi mafuaaga na aoga, e te maua se ata tutusa. Ae e leʻo le tali lava lea: o se faʻatusatusaga o faʻailoga na tuʻuina atu i le filifiliga o loʻo i luga na faʻaalia ai o le faʻataunuʻuina o auala e vave tele. O iinei e tatau ona fai mai o le faʻatusatusaga o mea na faʻamauina i le faʻaaogaina o le launcher emrun le fa'apipi'iina o galuega fa'atino fa'atasi ai ma fa'aulufalega a le atunu'u e le'o se faiga fa'ainisinia atoa. Ou te le iloa tonu pe faʻafefea ona fesoʻotaʻi se polokalame i totonu o se masini suʻesuʻe emrun, ae o nisi laina i totonu o le gaioiga e foliga mai e toe faʻatulagaina, o le eseesega i le eseesega e leʻo se mafuaaga e manatu ai ua vavae ese auala. I se tulaga lautele, na manino mai e tusa ai ma faatonuga ljmpl o loʻo i ai se suiga i tuatusi eseese, ma o le bytecode na gaosia e matua ese lava: o le tasi o loʻo i ai se faʻatonuga e valaʻau ai se galuega fesoasoani, o le isi e leai. Ina ua uma ona suʻesuʻeina faatonuga ma suʻesuʻeina le code lea e faʻaliliu ai nei faʻatonuga, na manino ai, muamua, i le taimi lava na muamua ai i le tusi resitala. cr0 na faia se lipine - e faʻaaoga ai foi se fesoasoani - lea na suia ai le gaioiga i le tulaga puipuia, ma lona lua, o le js version e leʻi suia i le tulaga puipuia. Ae o le mea moni o le isi vaega o Emscripten o lona mumusu e faʻafeiloaʻi tulafono laiti e pei o le faʻatinoina o faʻatonuga. call i le TCI, lea e maua ai so'o se fa'ailoga galuega i le ituaiga long long f(int arg0, .. int arg9) - e tatau ona vala'au galuega ma le numera sa'o o finauga. Afai e solia lenei tulafono, e faalagolago i le tulaga o le debugging, o le a paʻu le polokalame (lea e lelei) pe valaau le galuega sese uma (lea o le a faanoanoa e debug). E iai foʻi le filifiliga lona tolu - faʻatagaina le faʻatupuina o afifi e faʻaopoopo / aveese finauga, ae i le aofaʻi o nei afifi e tele avanoa, e ui lava i le mea moni e naʻo le sili atu ma le selau afifi e manaʻomia. Na o lenei lava e matua faanoanoa lava, ae o loʻo i ai se faʻafitauli sili atu ona ogaoga: i le faʻatulagaina o le faʻailoga o le afifiina galuega, o finauga na liua ma liua, ae o nisi taimi o le galuega faʻatasi ai ma finauga na faia e leʻi taʻua - lelei, pei lava i totonu. laʻu faʻatinoga libffi. O lona uiga, e le'i fasiotia lava nisi o fesoasoani.

O le mea e lelei ai, o Qemu o loʻo i ai lisi e mafai ona faitau i masini fesoasoani i foliga o se faila faila pei

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

O lo'o fa'aaogaina e fai si malie: muamua, o macros ua toe fa'auigaina i se auala sili ona mata'utia DEF_HELPER_n, ona ki lea helper.h. I le tulaga e faʻalauteleina ai le macro i se fausaga amata ma se koma, ona faʻamalamalamaina lea o se array, ae nai lo elemene - #include <helper.h> O se taunuuga, na iu lava ina ou maua se avanoa e faataitai ai le faletusi i le galuega pyparsing, ma sa tusia ai se tusitusiga e maua tonu ai na afifi mo galuega tonu e manaʻomia ai.

Ma o lea, ina ua maeʻa na foliga mai na galue le processor. E foliga mai ona o le lau e leʻi amataina, e ui lava na mafai ona tamoʻe le memtest86+ i le faʻapotopotoga masani. O iinei e tatau ai ona faamanino o le Qemu poloka I / O code o loʻo tusia i coroutines. Emscripten o loʻo i ai lana lava faʻatinoga faigata, ae e manaʻomia lava ona lagolagoina i le Qemu code, ma e mafai ona e faʻaogaina le gaioiga i le taimi nei: E lagolagoina e Qemu filifiliga. -kernel, -initrd, -append, lea e mafai ai ona e faʻaaogaina Linux poʻo, mo se faʻataʻitaʻiga, memtest86+, e aunoa ma le faʻaogaina o masini poloka. Ae o le faʻafitauli lenei: i totonu o le faʻapotopotoga faʻapitoa e mafai e se tasi ona vaʻaia le gaosiga o le fatu Linux i le faʻamafanafanaga ma le filifiliga -nographic, ma e leai se mea e maua mai le su'esu'ega i le mea na fa'alauiloa ai emrun, e le'i sau. O lona uiga, e le o manino: e le o galue le gaioiga poʻo le gaioiga o ata e le o galue. Ona oo mai lea ia te au e faatali teisi. Na aliali mai "e le o moe le processor, ae na o le emo lemu," ma pe a ma le lima minute na togi ai e le fatu le tele o feʻau i luga o le faʻamafanafanaga ma faʻaauau pea ona tautau. Na manino mai o le processor, i se tulaga lautele, galue, ma e tatau ona tatou eli i totonu o le code mo le galulue faatasi ma SDL2. Ae paga lea, ou te le iloa pe faʻafefea ona faʻaogaina lenei faletusi, o lea i nisi o nofoaga sa tatau ona ou galue faʻafuaseʻi. I se taimi, o le laina parallel0 na moli i luga o le lau i luga o se lanu lanumoana, lea na fautua mai ai ni manatu. I le faaiuga, na aliali mai o le faʻafitauli o le tatalaina lea e Qemu ni faʻamalama faʻamalama i le tasi faʻamalama faʻapitoa, i le va e mafai ona e fesuiaʻi faʻaaoga Ctrl-Alt-n: e galue i totonu o le fale, ae le o le Emscripten. A maeʻa ona faʻaumatia faʻamalama e le manaʻomia e faʻaaoga ai filifiliga -monitor none -parallel none -serial none ma faatonuga e toe tusi faʻamalosi le lau atoa i luga o faʻavaa taʻitasi, na faʻafuaseʻi ona galue mea uma.

Coroutines

O lea la, faʻataʻitaʻiga i totonu ole suʻesuʻega e galue, ae e le mafai ona e taʻavale i se mea manaia e tasi-floppy i totonu, aua e leai se poloka I / O - e te manaʻomia le faʻatinoina o le lagolago mo coroutines. Qemu ua uma ona i ai le tele o coroutine backends, ae ona o le natura o le JavaScript ma le Emscripten code generator, e le mafai ona e amata faʻatauvaʻa faaputuga. E foliga mai "ua leai mea uma, ua aveese le sima," ae ua uma ona tausia e le au atinaʻe Emscripten mea uma. O le fa'atinoina o lenei mea e malie tele: se'i ta'ua se vala'au fa'atino e pei o lea e masalomia emscripten_sleep ma le tele o isi o loʻo faʻaogaina le masini Asyncify, faʻapea foʻi ma le faʻailoga telefoni ma valaʻau i soʻo se galuega e ono tupu ai se tasi o mataupu muamua e lua i lalo o le faaputuga. Ma o lenei, aʻo leʻi oʻo i le masalosalo masalosalo, o le a tatou filifilia se async context, ma i le taimi lava e maeʻa ai le valaʻau, o le a tatou siaki pe ua tupu se valaau asynchronous, ma afai ei ai, o le a tatou faʻasaoina uma fesuiaiga i le lotoifale i lenei async context, faʻaalia po o le a le galuega. e faʻafeiloaʻi le pule i le taimi tatou te manaʻomia ai le faʻaauau pea o le faʻatinoga, ma alu ese mai le galuega o loʻo iai nei. O le mea lea e iai le avanoa e suʻesuʻe ai le aafiaga faama'imau - mo manaʻoga o le faʻaauauina o le faʻatinoina o le code pe a uma ona toe foʻi mai i se telefoni e le faʻaogaina, o le tagata faʻapipiʻi e faʻatupuina "stubs" o le galuega e amata pe a maeʻa se valaau masalosalo - pei o lenei: afai e iai ni masalosaloga, ona faʻalauteleina lea o le galuega i se mea n / 2 taimi - o loʻo i ai pea, pe a leai Ia manatua pe a maeʻa telefoni taʻitasi e le mafai ona faʻaogaina, e tatau ona e faʻaopoopo le faʻasaoina o nisi o fesuiaiga i le lotoifale i le galuega muamua. Mulimuli ane, sa tatau foi ona ou tusia se tusitusiga faigofie i le Python, lea, e faavae i luga o se seti tuʻufaʻatasia o galuega faʻaoga faʻapitoa e manatu "e le faʻatagaina le asynchrony e pasia i latou lava" (o lona uiga, faʻapipiʻi faʻapipiʻi ma mea uma na ou faʻamatalaina e le galue i totonu), faʻaalia valaau e ala i faʻailoga lea e tatau ona le amanaʻia e le tagata faʻapipiʻi ina ia le manatu o nei galuega e le tutusa. Ma o faila JS i lalo o le 60 MB e manino lava le tele - seʻi tatou fai atu a itiiti ifo i le 30. E ui lava, i le taimi na ou faʻatulagaina ai se faʻasalalauga faʻapotopotoga, ma faʻafuaseʻi ona lafo ese le fesoʻotaʻiga filifiliga, e aofia ai -O3. Ou te faʻatautaia le tulafono faʻavae, ma Chromium 'ai le manatua ma faʻalavelave. Ona ou vaʻavaʻai faʻafuaseʻi lea i le mea o loʻo ia taumafai e sii mai ... Ia, o le a se mea e mafai ona ou fai atu ai, semanu ou te aisa foi pe ana fai mai ia te aʻu e suʻesuʻe ma le mafaufau lelei ma faʻaogaina le Javascript 500+ MB.

Ae paga lea, o siaki i le Asyncify support library code e leʻi faauo atoatoa i ai longjmp-s o loʻo faʻaaogaina i le komipiuta komepiuta, ae a maeʻa se laʻititi laʻititi e faʻamalo ai nei siaki ma toe faʻafoisia faʻamalosi e pei o mea uma e lelei, na galue le code. Ona amata ai lea o se mea uiga ese: o nisi taimi o siaki i le code synchronization na faʻaosoina - o mea lava e tasi e faʻalavelaveina le code pe afai, e tusa ai ma le faʻatinoga o le faʻatinoga, e tatau ona poloka - na taumafai se tasi e puʻeina se mutex ua uma ona puʻeina. O le mea e lelei ai, o lenei mea na foliga mai e le o se faʻafitauli talafeagai i le faʻasologa faʻasologa - sa na o loʻu faʻaaogaina o le faʻaogaina o le faʻaogaina o le faʻaogaina e Emscripten, ae o nisi taimi o le asynchronous telefoni o le a tatalaina atoa le faaputuga, ma i lena taimi o le a le manuia. setTimeout mai le matasele autu - o le mea lea, o le code na ulufale i le faʻasologa autu matasele e aunoa ma le tuua o le faʻasologa muamua. Toe tusi i luga o se matasele e le gata ma emscripten_sleep, ma ua taofia faafitauli i mutexes. O le code ua sili atu ona talafeagai - pe a uma, o le mea moni, e leai saʻu code e saunia ai le isi faʻasologa o le animation - o le gaioiga naʻo le fuafuaina o se mea ma o le lau e faʻafouina i lea taimi ma lea taimi. Ae ui i lea, e leʻi muta ai faʻafitauli: o nisi taimi e faʻamutaina lemu Qemu e aunoa ma ni tuusaunoaga poʻo ni mea sese. I lena taimi na ou fiu ai, ae, o le tilotilo i luma, ou te fai atu o le faafitauli o lenei: o le coroutine code, i le mea moni, e le faʻaaogaina. setTimeout (pe le itiiti ifo i le tele o taimi e te mafaufau ai): galuega emscripten_yield na'o le setiina o le fu'a valaau asynchronous. O le manatu atoa o lena emscripten_coroutine_next e le o se galuega asynchronous: i totonu e siaki le fuʻa, toe setiina ma faʻafeiloaʻi le pule i le mea e manaʻomia. O lona uiga, o le fa'alauiloaina o le fa'aputuga e muta i'ina. O le faʻafitauli ona o le faʻaaogaina-pe a uma-saoloto, lea na aliali mai ina ua le atoatoa le vaitaele coroutine ona o le mea moni ou te leʻi kopiina se laina taua o le code mai le coroutine backend o loʻo i ai nei, o le galuega. qemu_in_coroutine toe faafoi moni ae o le mea moni sa tatau ona toe foi sese. O lenei mea na taitai atu ai i se valaau emscripten_yield, i luga ae sa leai se tasi i luga o le faaputuga emscripten_coroutine_next, ua tatala le faaputuga i le pito i luga, ae leai setTimeout, e pei ona ou fai atu, e leʻi faʻaalia.

Fausia code JavaScript

Ma o le mea moni, o le folafolaga lenei o le "faaliliuina o aano o manu'ai." Pe lava. Ioe, afai tatou te taʻavale Qemu i totonu o le browser, ma Node.js i totonu, o lona uiga, pe a uma le faʻasologa o tulafono i Qemu o le a tatou maua atoatoa le JavaScript. Ae ui i lea, o se ituaiga o suiga faʻafefe.

Muamua, o sina mea itiiti e uiga i le auala e galue ai Qemu. Fa'amolemole fa'amagalo mai a'u i le taimi lava lena: E le o a'u o se tagata fa'apolofesa fa'atupuina Qemu ma e ono sese a'u fa'ai'uga i nisi o nofoaga. E pei ona latou fai mai, "o le manatu o le tamaititi aoga e le tatau ona fetaui ma le manatu o le faiaoga, o le axiomatics ma le mafaufau masani a Peano." O Qemu e iai se numera fa'apitoa o fa'ata'ita'iga fa'apitoa e lagolagoina ma mo ta'itasi o lo'o iai se fa'atonuga target-i386. A'o fau, e mafai ona e fa'amaoti le lagolago mo le tele o fa'ata'ita'iga a malo, ae o le i'uga o le a na'o le tele o binaries. O le tulafono e lagolago ai le fausaga a tagata asiasi, i le isi itu, e fa'atupuina ai nisi o galuega Qemu i totonu, lea o le TCG (Tiny Code Generator) ua uma ona liua i le masini fa'ailoga mo le fale talimalo. E pei ona taʻua i le faila readme o loʻo i totonu o le tcg directory, o se vaega muamua lea o le C compiler masani, lea na mulimuli ane fetuunai mo JIT. O le mea lea, mo se faʻataʻitaʻiga, faʻataʻitaʻiga faʻataʻitaʻiga i tulaga o lenei pepa e le toe avea ma fale talimalo, ae o se fale talimalo. I se taimi, na faʻaalia ai se isi vaega - Tiny Code Interpreter (TCI), lea e tatau ona faʻatinoina le code (toetoe lava tutusa faʻatinoga i totonu) i le leai o se code generator mo se fale faʻapitoa faʻapitoa. O le mea moni, e pei ona taʻua e ana faʻamaumauga, e le mafai e lenei faʻamatala ona faʻatino i taimi uma e pei o se JIT code generator, e le gata i le faʻatusatusaina o le saoasaoa, ae faʻapea foʻi ma le agavaʻa. E ui lava ou te le o mautinoa o lana faʻamatalaga e matua talafeagai.

I le taimi muamua sa ou taumafai e fai se TCG backend atoatoa, ae na vave ona fenumiai i le source code ma se faamatalaga le atoatoa manino o faatonuga bytecode, o lea na ou filifili ai e afifi le TCI faaliliu. O lenei mea na maua ai ni nai mea lelei:

  • pe a faʻatinoina se generator code, e le mafai ona e vaʻai i le faʻamatalaga o faʻatonuga, ae i le faʻaliliuga code
  • e mafai ona e fa'atupuina galuega e le mo fa'aliliuga poloka uma e feagai, ae, mo se fa'ata'ita'iga, na'o le mae'a o le fa'asalaga lona selau
  • afai e suia le code faʻatupuina (ma e foliga mai e mafai, faʻamasinoina i galuega ma igoa o loʻo i ai le upu patch), o le a ou manaʻomia le faʻaleaogaina o le JS code na gaosia, ae o le mea sili o le a ou maua se mea e toe faʻafouina mai.

E tusa ai ma le vaega lona tolu, ou te le o mautinoa e mafai ona faʻapipiʻi pe a uma ona faʻatinoina le code mo le taimi muamua, ae o mea muamua e lua e lava.

I le taimi muamua, o le code na faia i le tulaga o se ki tele i le tuatusi o le uluai bytecode faatonuga, ae mulimuli ane, manatua le tusiga e uiga i Emscripten, optimization o le gaosia JS ma relooping, na ou filifili ai e faatupuina atili code tagata, aemaise lava talu ai empirically e. na aliali mai e na o le pau lava le mea e ulufale ai i le poloka faaliliu o lona Amata. E leʻi leva ona fai atu, ina ua mavae sina taimi sa i ai se matou generator code lea na gaosia ai le code ma ifs (e ui lava e leai ni matasele). Ae leaga, na paʻu, ma avatu ai se feʻau e le saʻo le umi o faatonuga. E le gata i lea, o le faatonuga mulimuli i lenei tulaga toe faʻaleleia o brcond. Lelei, o le a ou faʻaopoopoina se siaki tutusa i le faʻatupuina o lenei faʻatonuga aʻo leʻi maeʻa le valaau toe faʻafoʻi ma ... e leai se tasi oi latou na faʻataunuʻuina, ae a maeʻa le faʻamautu o le suiga na latou le manuia. I le faaiuga, ina ua uma ona ou suʻesuʻeina le code na faia, na ou iloa ai a maeʻa le ki, o le faʻailoga i le faʻatonuga o loʻo i ai nei e toe faʻapipiʻiina mai le faʻaputuga ma atonu o loʻo faʻauluina e le code JavaScript. Ma o lea na tupu ai. O le faʻateleina o le paʻu mai le tasi megabyte i le sefulu e leʻi taʻitaʻia ai se mea, ma na manino ai o le code generator o loʻo tamoe i liʻo. Sa tatau ona matou siakia matou te le oo atu i tua atu o tuaoi o le TB o loʻo i ai nei, ma afai matou te faia, ona tuʻuina atu lea o le tuatusi o le isi TB ma se faʻailoga toesea ina ia mafai ai ona faʻaauau le faʻataunuʻuina. E le gata i lea, o lenei mea e foia ai le faʻafitauli "o le a le mea e gaosia ai galuega e tatau ona faʻaleaogaina pe afai ua suia lenei vaega ole bytecode?" — na'o le galuega e fetaui ma lenei poloka fa'aliliuga e tatau ona fa'aleaogaina. I le auala, e ui lava na ou faʻaogaina mea uma i Chromium (talu ai ou te faʻaogaina Firefox ma e faigofie atu ia te aʻu ona faʻaogaina se isi suʻesuʻega mo suʻega), na fesoasoani Firefox ia te aʻu e faʻasaʻo le le fetaui ma le asm.js standard, ina ua maeʻa ona amata galue vave le code i totonu. Chromium.

Fa'ata'ita'iga o le code fa'atupu

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

iʻuga

O lea la, e leʻi maeʻa lava le galuega, ae ua ou fiu e faʻalilolilo lenei fausiaina umi i le atoatoa. O le mea lea, na ou filifili ai e faʻasalalau mea o loʻo ia te aʻu mo le taimi nei. O le code e fai si taufaafefe i nofoaga, aua o se faʻataʻitaʻiga lea, ma e le o manino muamua le mea e tatau ona fai. Masalo, o lona uiga e aoga le tuʻuina atu o mea masani atomic i luga o nisi faʻaonaponei faʻaonaponei o Qemu. I le taimi nei, o loʻo i ai se filo i le Gita i le blog format: mo "tulaga" taʻitasi ua uma ona pasia, o se faʻamatalaga auiliili i le gagana Rusia ua faʻaopoopoina. O le mea moni, o lenei tusiga o se vaega tele o le toe faamatalaina o le faaiuga git log.

E mafai ona e taumafai uma iinei (faaeteete i feoaiga).

O le a le mea o loʻo galue:

  • x86 virtual processor o loʻo tamoe
  • O loʻo i ai se faʻataʻitaʻiga galue o le JIT code generator mai le masini numera i le JavaScript
  • O loʻo i ai se faʻataʻitaʻiga mo le faʻapipiʻiina o isi 32-bit faʻataʻitaʻiga faʻapitoa: i le taimi nei e mafai ona e faamemelo i le Linux mo le MIPS architecture faʻamaisa i totonu o le masini i le taimi o le utaina.

O le a se isi mea e mafai ona e faia

  • Faatelevave le faataitai. E oʻo lava i le JIT mode e foliga mai e sili atu lemu nai lo Virtual x86 (ae atonu o loʻo i ai se Qemu atoa ma le tele o meafaigaluega faʻataʻitaʻi ma fausaga)
  • Ina ia faia se atinaʻe masani - saʻo, e le o aʻu o se tagata e faia le upega tafaʻilagi lelei, o lea mo le taimi nei ua ou toe faia le atigi masani Emscripten i le mea sili ou te mafaia
  • Taumafai e fa'alauiloa galuega fa'alavelave Qemu - networking, VM migration, etc.
  • FUAFUAGA: e mana'omia le tu'uina atu o nai au atina'e ma fa'amatalaga pusi i Emscripten i luga, e pei ona faia e le au leoleo muamua o Qemu ma isi galuega. Faʻafetai ia i latou mo le mafai ona faʻaogaina le latou sao i Emscripten o se vaega o laʻu galuega.

puna: www.habr.com

Faaopoopo i ai se faamatalaga