Uvod

asnhorni JS okruzenje

JavaScript je skriptni jezik, stoga je neophodno da se “smesti” u neki kontejner koji bi mu omogućio rad, taj kontejner se zove JS Runtime Environment (srp. okruženje). Postoje dva tipa okruženja: browser (za rad na klijentu) i node.js (za rad na serveru). Runtime Environment čine :

  1. JS Engine/Runtime
    • Heap
    • Stack
  2. External API
  3. Queue
  4. Event loop

OBJAŠNJENJE:
JavaScript je “single thread” programski jezik i on sam ne može da izvršava više istovremenih paralelnih radnji. Ipak izvršavanje više paralelnih radnji (tzv. asihrono izvršavanje) je moguće uz medjusobnu saradnju JavaScript-a i njegovog okruženja. Više o ovome prolitajte u članku “Princip rada asinhronog JavaScript-a”.

JS engine/runtime

JS runtime/engine je aplikacija pisana u C++ koja kompajlira JavaScript kod u mašinski kod. Kompajliranje se vrši pri svakom startovanju programa tzv. “just-in-time compilation”. Najpoznatiji JS Engine je Google-ov “V8” koji se inače nalazi u Chromu ali i u Node.js-u. Ostali engine su: Mozilin “Rhino”, Firefox-ov “SpiderMonkey”, Microsoft-ov “Chakra”… JS Runtime za rad koristi dva tipa memorije: Heap i Stack.

Memorija

a) Stack

stack

“Stack” je linearno struktuirana memorija, koja je “brza” i služi za privremeno čuvanje podataka (prostih primitiva,funkcija…) pri izvršavanju koda. Podaci se smeštaju u memoriju sekvencijalno, tako da “noviji” podaci dolaze preko “starijih”. Često se za ovaj tip organizovanja podataka pravi paralela sa gomilom poredjanih sudova jedan na drugi. Kako prestane potreba za nekim podatkom na vrhu stack-a, njega garbage collector sklanja sa stack-a. Ovakva organizacija podrazumeva da se može pristupiti trenutno najnovijim podacima. Što znači da se ne može pristupiti nekim starijim podacima pre nego što se uklone svi noviji podaci.

Pogledajte animaciju rada callstack-a ovde (Savet: kliknite na ikonicu dva ukrštena čekića u gornjem levom uglu aplikacije da promenite brzinu izvršavanja koda).

Napomena:
Obratite pažnju da stack može da primi jedan odredjeni broj taskova, pa ukoliko pozovemo previše taskova javiće se greška “Range Error: Maximum CalStack size exceeded”.

b) “Heap”

Heap predstavlja ne struktuirani tip memorije u koji se smeštaju i čuvaju dinamički podaci (objekti). Ovo je sporiji tip memorije. Za razliku od stack-a koji ima ograničenu veličinu, “heap je ograničen samo veličinom virtuelne memorije. Podaci čuvani na ovoj vrsti skladišta nemaju medjusobnih zavisnosti i može im se pristupiti bilo kojim redom u bilo koje vreme. Svaki podatak ima svoju adresu preko koje možemo da ga pronadjemo.

External API

Već smo pomenuli da je JavaScript skriptni jezik, i da je neophodno da se “smesti” u neki kontejner koji bi mu omogućio rad. Pod External API-jem se najčešće podrazumevaju objekti i metode koje omogućavaju komunikaciju JavaScript-a sa spoljnim svetom. External API zavisi od okruženja, pa se tako razlikuje API borwser-a od APi-ja NODE.js. Spisak svih Web API-ja možete pogledati na stranici https://developer.mozilla.org/en-US/docs/Web/API

Browser API

Node.je API

  • Process objekat
  • Buffer objekat
  • require()
  • setTimeout()

Third party API

Pored API ja okruženja (browser-a ili Node.js), postoje i API-ji od spoljnih resursa tzv. Third party API koji su neophodni ako želimo da koristimo njihove usluge. Najpoznatiji “Third party API” su:

  • Google Maps
  • Twitter
  • Facebook
  • PayPal

Queue

Ovaj tip memorije ima linearnu strukturu a rad sa podacima je takodje sekvencijalan kao kod stack-a. Smeštanje podataka je isto kao kod stack-a ali je zato pristup podacima prema obrnutom redosledu od najstarijeg podatka ka novijem.
Ovde se smešta deo koda koji je spreman da se pošalje na izvršavanje JS Engine-u. Ova memorija se oslobadja sekvencijalno tako što se odredjeni deo koda pošalje na izvršavanje JS Engine-u i prebaci na stack. Ali kada će se to desiti “odlučuje” Event loop (ovo se dešava tek kada je stack izmedju dve operacije ostao prazan). Queue se još često naziva “Event queue” ili “Callback queue” u zavisnosti sa čime je napunjen.

Event loop

Event loop je proces koji stalno proverava da li je stack prazan i da li postoje neke funkcije u queue da se izvrše. Ukoliko se to desi poziva se prva na redu funckcija iz queue (“najstarija”) i prebacuje se na stack.

Pogledajte animaciju rada JavaScrip-a ovde, a više o asinhronom radu javascripta možete pročitati u članku Princip rada asinhronog javascript-a

Podelite:

Ostavite komentar