JavaScript er einþráða forritunarmál og jafnframt óblokkandi, ósamhverft og samhliða. Í þessari grein verður útskýrt hvernig það gerist.
Hér er tómt.
Keyrslutími
JavaScript er túlkuð forritunarmál, ekki samansett. Þetta þýðir að það þarf túlk sem umbreytir JSkóði í vélkóða. Það eru nokkrar tegundir túlkana (svokölluð vélar). Vinsælustu vafra vélarnar eru V8 (Chrome), Quantum (Firefox) og WebKit (Safari). Að auki er V8 einnig notað í vinsælu forritunarumhverfi utan vafra, Node.js.
Hver vél inniheldur minnishaug, köllunarstafla, atburðarhring, biðröð köllunarkalla og WebAPI með HTTP-beiðnum, tímamótum, atburðum o.s.frv., allt framkvæmt á sinn eigin hátt til að hraðari og öruggari túlkunar á JS-kóðanum.
Grunnuppbygging JS keyrslutímans. Höfundur: Alex Zlatkov
Einstofna þráður
Einstæðra þráða forritunarmál er forritunarmál með einum köllunarpalla og einum minnishaug. Það þýðir að það keyrir aðeins eitt verkefni í einu.
A haugur er samfelldur minnisvæði sem úthlutar staðbundnu samhengi fyrir hvert keyrt fall.
A haugur er mun stærra svæði sem geymir allt sem úthlutað er dýnamískt.
A kallsröð er gögn uppbygging sem í grundvallaratriðum skráir hvar við erum í forritinu.
Kallsröð
Skrifum einfaldan kóða og fylgjumst með því sem gerist á köllunarröðinni.
Eins og sjá má eru fallin bætt við köllunarhringinn, keyrð og síðar eytt. Þetta er svokallað LIFO-kerfi – síðast inn, fyrst út. Hver færsla í köllunarhringnum kallast a stafsrammi.
Þekking á köllunarröðinni er gagnleg til að lesa villuspor. Almennt er nákvæm ástæða villunnar efst í fyrstu línu, þó að framkvæmd kóðans sé frá neðri hluta upp.
Stundum geturðu tekist á við algenga villu sem tilkynnt er um af Hámarksstærð köllunarröð hefur verið farið fram úr. Það er auðvelt að fá þetta með endurköllun:
function foo() {
foo()
}
foo()
og vafrinn eða skelurinn okkar frýs. Hver vafrinn, jafnvel mismunandi útgáfur hans, hefur mismunandi hámarksstærð köllunarstigs. Í langflestum tilfellum duga þær og á að leita vandamálsins annars staðar.
Stíflaður hringingastafli
Hér er dæmi um að hindra JS-þráðinn. Reyndum að lesa a fóó skrár og a bar að nota Knútur.js samstillt fall lestuSkráSamstillt.
Þetta er hringrásargif. Eins og þú sérð, bíður JavaScript-vélin eftir fyrstu kölluninni. lestuSkráSamstillt er lokið. En þetta mun ekki gerast vegna þess að það er ekkert fóó skrá, svo að önnur fallið verður aldrei kallað.
Ósamstillt atferli
Hins vegar getur JS einnig verið óblokkandi og hagað sér eins og það væri fjölþráða. Það þýðir að það bíður ekki eftir svari við forritaskil símtöl, I/O-atburðir o.s.frv., og geta haldið áfram kóðakeyrslu. Þetta er mögulegt þökk sé JS-vélum sem nota (undir vélarhúsinu) raunveruleg fjölþráða forritunarmál, eins og C++ (Chrome) eða Rust (Firefox). Þær bjóða upp á okkur með Vefur API undir vélarhlífum vafra eða t.d. I/O API undir Node.js.
Í GIF-inu hér að ofan sjáum við að fyrsta fallið er sett á köllunarhringinn og Hæ er strax framkvæmt í konsólinni.
Síðan köllum við setTimeout Fall sem vafrinn veitir í gegnum WebAPI. Það fer í köllunarhringinn og asynkróna afturköllun hans. fóó Funkían fer í biðröð WebApi, þar sem hún bíður eftir kölluninni sem á að eiga sér stað eftir 3 sekúndur.
Á meðan heldur forritið áfram kóðanum og við sjáum Hæ. Ég er ekki blokkaður. í stjórnborðinu.
Eftir að því er kallað á það fer hver aðgerð í biðröð WebAPI til Símtalsröð. Það er þar sem fall bíða þar til köllunarhringurinn er tómur. Þegar það gerist eru þau flutt þangað eitt í einu.
Svo, þegar okkar setTimeout Tíminn lýkur niðurtalningunni, okkar fóó fall fer í biðröð köllunaraðferða, bíður þar til köllunarhringrásin verður tiltæk, fer þangað, er keyrt og við sjáum Hæ frá ósamstilltri callback í stjórnborðinu.
Viðburðahringrás
Spurningin er: Hvernig veit keyrslutíminn að köllunarhringurinn sé tómur og hvernig er atburðurinn í callback-röðinni kallaður? Kynntu þér atburðarhringinn. Hann er hluti af JavaScript-vélinni. Þessi ferill athugar stöðugt hvort köllunarhringurinn sé tómur og, ef svo er, fylgist með hvort atburður sé í callback-röðinni sem bíður eftir að vera kallaður.
Þetta er allt töfrinn á bak við tjöldin!
Að draga saman kenninguna
Samhliða vinnsla og samhliða framkvæmd
Samtímisvinna merkir að framkvæma mörg verkefni á sama tíma en ekki samtímis. Til dæmis vinna tvö verkefni á yfirhöfuðnum tímabilum.
Samhliða merkir að framkvæma tvö eða fleiri verkefni samtímis, t.d. að framkvæma margar útreikningar á sama tíma.
Þræðir og ferlar
Þræðir eru röð kóðakeyrslna sem hægt er að keyra óháð hvorri annarri.
Ferli er dæmi um keyrandi forrit. Forrit getur haft marga ferla.
Samskeytis- og ósamkeytis
Í samstilltur Í forritun eru verkefni keyrð eitt á eftir öðru. Hvert verkefni bíður eftir að fyrri verkefni ljúki og er keyrt aðeins þá.
Í ósamstilltur Í forritun, þegar eitt verkefni er keyrt, geturðu skipt yfir í annað verkefni án þess að bíða eftir að hið fyrra ljúki.
Samskeytis- og ósamstilltar aðgerðir í einþráða- og fjölþráðaumhverfi
Samsýnt með einni þræðiVerkefni eru keyrð eitt á eftir öðru. Hvert verkefni bíður eftir að fyrra verkefni sé keyrt.
Samskeytislega með mörgum þráðumVerkefni eru keyrð í mismunandi þráðum en bíða eftir öðrum verkefnum sem eru í gangi á öðrum þráðum.
Ósamsett með einni þræðiVerkefni hefjast handa við að framkvæma án þess að bíða eftir að annað verkefni ljúki. Á hverjum tíma er aðeins eitt verkefni í gangi.
Ósamsett með mörgum þráðumVerkefni eru keyrð í mismunandi þráðum án þess að bíða eftir að önnur verkefni ljúki og ljúka keyrslu sinni sjálfstætt.
JavaScript-flokkun
Ef við skoðum hvernig JavaScript-vélar virka undir vélarhuðinni, getum við flokkað JavaScript sem ósamhverft og einþráða túlkuð forritunarmál. Orðið “túlkað” er mjög mikilvægt því það þýðir að málið sé alltaf háð keyrslutíma og aldrei eins hratt og þýðil þjálpuð forritunarmál með innbyggðu fjölþráða vinnu.
Það er vert að taka fram að Node.js getur náð raunverulegu fjölþráða vinnslu, að því gefnu að hver þráður sé keyrður sem sjálfstæður ferill. Það eru til bókasöfn fyrir þetta, en Node.js hefur innbyggða eiginleika sem kallast Verkþráður.
Allir GIF-ar af atburðahringnum koma frá Stækkunargler Forrit sem Philip Roberts bjó til, þar sem þú getur prófað ósamstilltar aðstæður þínar.