View on GitHub

info

Материјали за курс из УВИТ-а на Математичком факултету Универзитета у Београду

УВИТ - Програмски језик ЈаваСкрипт

Владимир Филиповић

Увод

Материјал курса који се односи на језик ЈаваСкрипт је изложен уз претпоставку да је слушалац овладао основним и напредним концептима програмирања у програмском језику C. Ако то није случај, слушалац се упућује на обимнију литературу.

Програмски језик ЈаваСкрипт је један од најпопуларнијих програмских језика на свету. Креиран је пре двадесетак година и прошао је дугачак пут од својих релативно скромних почетака.

Програмски језик ЈаваСкрипт је први и једини скрипт-језик који директно подржавају прегледачи веба (енгл. web browsers).

На самом свом почетку, он није ни изблиза био тако моћан као што је то сада случај - највише се користио за креирање богатих анимација и “чудеса” 😆 која су у то време била позната као Динамички HTML (енгл. Dynamic HTML - DHTML).

Са порастом захтева које је постављао развој веба као платформе, повећавала се потреба да се развија и да расте програмски језик ЈаваСкрипт, како би се језик могао успешно прилагодити потребама једног од најшире коришћених информатичких екосистема на свету.

Дакле, са увођењем нових елемената на веб платформи, са API-јима прегледача, растао је и усавршавао се програмски језик ЈаваСкрипт.

У данашње време се ЈаваСкрипт често и интензивно користи и ван прегледача веба. Развој платформе node.js, која је нарочито постала популарна у последњих неколико година, омогућио је да се овај језик користи и за развој на серверској страни (што је донедавно био ексклузивни домен традиционалних серверских прогамских језика, као што су: Јава, Руби, C#, PHP, итд).

Уз програмски језик ЈаваСкрипт се лако могу користити базе података и бројне друге апликације. Чак је могуће користити ЈаваСкрипт за развој уметнутих (енгл. embedded) и мобилних апликација, апликација за паметне телевизоре итд. Можемо закључити да програмски језик ЈаваСкрипт, који је свој живот почео као мали језик који се извршава у прегледачу, данас представља један од најпопуларнијих програмских језика на свету.

Карактеристике језика ЈаваСкрипт

Програмски језик ЈаваСкрипт има следеће карактеристике:

Напомена. Осим сличности имена, језик ЈаваСкрипт нема скоро ништа заједничко са језиком Јава (бар не више него што је то случај са језиком C) - само је сплет околности и пословна политика компанија Sun и Netscape је довео до таквог именовања.

ЈаваСкрипт окружење за извршавање

ЈаваСкрипт је скриптни језик, стога је неопходно да се “смести” у неки контејнер који би му омогућио рад, тај контејнер се зове ЈаваСкрипт окружење за извршавање (енгл. JS Runtime Environment). Постоје два типа окружења: уграђено у прегледач (за рад на клијенту) и node.js (за рад на серверу), али је начин рада ова два окружења концептуално исти.

Као што показује следећа схема, ЈаваСкрипт окружење за извршавање се састоји од следећих компоненти:

ЈаваСкрипт окружење за извршавање

Напомена. ЈаваСкрипт је програмски језик који се извршава у једној нити и он сам не може да извршава више истовремених паралелних радњи. Ипак, овако организовано окружење за извршавање омогућава више паралелних радњи (тзв. асихроно извршавање) - о томе ће бити речи касније.

У наставку су детаљније описане компоненте ЈаваСкрипт окружења за извршавање.

ЈаваСкрипт машина (JS Engine)

ЈаваСкрипт машина је апликација писана у C++ која извршава ЈаваСкрипт код. Приликом извршавања, ради обезбеђења најбољих перформанси, при сваком покретању ЈаваСкрипт програма врши се “превођње у правом тренутку” (енгл. “just-in-time compilation”). Најпознатија ЈаваСкрипт машина је Google-ов “V8” који се иначе налази у прегледачу Chromе али и у node.js-у. Осталe машине су: Mozilla-ин “Rhino”, Firefox-ов “SpiderMonkey”, Microsoft-ов “Chakra”. ЈаваСкрипт машина за рад користи два типа меморије: Хип и Стек.

Стек

Компонета стек је добила име због начина притупа овом делу меомрије (енгл. Last In First Out - LIFO). Стек служи за привремено чување података (функција, аргумената, локалних променљивих) при извршавању кода. Стек карактеришу и велика брзина рада и унапред ограничен капацитет.

Хип

Хип представља неструктуирану меморију у којој се смештају и чувају динамички подаци (објекти). Овај тип меморије је спорији од Стека. За разлику од Стека, Хип је ограничен само величином расположиве меморије. Подаци чувани у Хипу немају међусобних зависности и може им се приступати независно - сваки податак има своју адресу.

Спољашњи API

Већ је истакнуто да је ЈаваСкрипт скриптни језик, па је приликом извршавања неопходно да се “смести” у неки контејнер који би му омогућио рад. Под Спољашњи API-јем се најчешће подразумевају објекти и методе које омогућавају комуникацију ЈаваСкрипта са спољним светом. Спољашњи API зависи од окружења, па се тако разликује API прегледача од API-ја node.js.

Листа расположивих спољашњих API-ја за ЈаваСкрипт се налази на следећој адреси.

Ред повратних позива

У ред повратних позива се смешта део кода који је спреман да се пошаље на извршавање ЈаваСкрипт машини. Ова меморија се заузима и ослобађа на начин карактеристичан за редове (енгл. First In First Out - FIFO). Део кода који се шаље на извршавање ЈаваСкрипт машини се из Реда повратних позива пребацује на Стек. Одлуку о томе када ће се извршити пребацивање кода из Реда повратних позива на Стек доноси компонента Петља за догађаје. С обзиром да Ред повратних позива садржи задатке које треба извршити ЈаваСкрипт окружење, понегде у литератури се овај ред још назива и Ред задатака (енгл. Task Queue).

Петља за догађаје

Ова компонента ЈаваСкрипт окружења за извршавање је у ствари процес који стално проверава да ли је Стек празан и да ли постоје неке функције у Реду повратних позива да се изврше. Уколико се то деси, бира се прва на реду функција из реда (она која најдуже чека - тј. “најстарија”), пребацује се на Стек и почиње њено извршавање.

Литература

  1. Haverbeke M.: Eloquent JavaScript

  2. JavaScript - Mozzila Developer Network (MDN)

  3. Живановић, Д.: Веб програмирање - ЈаваСкрипт

  4. Copes F.: Complete JavaScript Handbook