УВИТ - Програмски језик ЈаваСкрипт
Увод
Материјал курса који се односи на језик ЈаваСкрипт је изложен уз претпоставку да је слушалац овладао основним и напредним концептима програмирања у програмском језику C. Ако то није случај, слушалац се упућује на обимнију литературу.
Програмски језик ЈаваСкрипт је један од најпопуларнијих програмских језика на свету. Креиран је пре двадесетак година и прошао је дугачак пут од својих релативно скромних почетака.
Програмски језик ЈаваСкрипт је први и једини скрипт-језик који директно подржавају прегледачи веба (енгл. web browsers).
На самом свом почетку, он није ни изблиза био тако моћан као што је то сада случај - највише се користио за креирање богатих анимација и “чудеса” 😆 која су у то време била позната као Динамички HTML (енгл. Dynamic HTML - DHTML).
Са порастом захтева које је постављао развој веба као платформе, повећавала се потреба да се развија и да расте програмски језик ЈаваСкрипт, како би се језик могао успешно прилагодити потребама једног од најшире коришћених информатичких екосистема на свету.
Дакле, са увођењем нових елемената на веб платформи, са API-јима прегледача, растао је и усавршавао се програмски језик ЈаваСкрипт.
У данашње време се ЈаваСкрипт често и интензивно користи и ван прегледача веба. Развој платформе node.js, која је нарочито постала популарна у последњих неколико година, омогућио је да се овај језик користи и за развој на серверској страни (што је донедавно био ексклузивни домен традиционалних серверских прогамских језика, као што су: Јава, Руби, C#, PHP, итд).
Уз програмски језик ЈаваСкрипт се лако могу користити базе података и бројне друге апликације. Чак је могуће користити ЈаваСкрипт за развој уметнутих (енгл. embedded) и мобилних апликација, апликација за паметне телевизоре итд. Можемо закључити да програмски језик ЈаваСкрипт, који је свој живот почео као мали језик који се извршава у прегледачу, данас представља један од најпопуларнијих програмских језика на свету.
Карактеристике језика ЈаваСкрипт
Програмски језик ЈаваСкрипт има следеће карактеристике:
-
Језик високог нивоа: Обезбеђује апстракције које програмеру дозвољавају да игнорише детаље рачунара на коме се скрипт извршава. Даље, управљање меморијом је аутоматизовано коришћењем сакупљача отпадака (енгл. garbage collector), па се програмер може концентрисати на сам програмски кŏд, уместо да се брине о заузетости меморијских локацијам. На крају (мада не најмање важно), језик обезбеђује бројне конструкције које програмеру омогућавају да рукује са моћним променљивима, објектима и функцијама.
-
Динамичан: Код програма написаних на динамичким програмским језицима ће се приликом извршавања реализовати многе активности које се код програма написаних на статичким програмским језицима реализују током превођења. Такав приступ има и предности и мане. Што се предности тиче, оваквим приступом се обезбеђују моћне каракеритике као што су: димамичкa типизaција (енгл. dynamic typing), касно повезивање (енгл. late binding), рефлексија, могућност коришћења функционалне програмске парадигме, могућност промене структуре објекта током извршавања, могућност коришћења затворења за функције итд.
-
Динамички типизиран: Код динамички типитзираних језика, променљива не утиче на тип. Дакле, програмер може доделити променљивој вредност ма ког типа, нпр. променљивој која је претходно садржавала целобројну вредност се може доделити ниска знакова (енгл. string) и сл.
-
Слабо типизиран: За разлику од јако типизираних језика, код слабо типизираних језика тип не утиче на објекат. Дакле, овде објекти нису строго типизирани, чиме је програмеру допуштена већа флексибилност. Са друге стране, динамличка типизираност значи али нема провере сигурности типае (што се покушава поправити у језицима TypeScript и Flow).
-
Интерпретиран: Ово значи да је непотребна фаза превођења програма пре његовог извршавања, као што је то нпр. случај са програмским језиком C. Иако се може рећи да је ЈаваСкрипт интерпретиран језика, у пракси прегледачи веба обично (због бољих перформанси) преведу ЈаваСкрипт кŏд у међукŏд пре његовог извршења. Међутим, ово превођење је транспарентно и не захтева додатне кораке, тј. додатне акције корисника.
-
Подржава више парадигми: Сам језик не форсира једну фиксирану парадигму. Програмер може писати ЈаваСкрипт и користити објектно-оријентисану парадигму - и то на два начина: преко прототипа и преко класа (почев од верзије ES2015 тј. ES6). Даље, програмер може писати ЈаваСкрипт програме коришћењем функционалне парадигме (где су функције “грађани првог реда”), или коришћењем императивне парадгигме (као што је нпр. случај у програмском језику C).
Напомена. Осим сличности имена, језик ЈаваСкрипт нема скоро ништа заједничко са језиком Јава (бар не више него што је то случај са језиком C) - само је сплет околности и пословна политика компанија Sun и Netscape је довео до таквог именовања.
ЈаваСкрипт окружење за извршавање
ЈаваСкрипт је скриптни језик, стога је неопходно да се “смести” у неки контејнер који би му омогућио рад, тај контејнер се зове ЈаваСкрипт окружење за извршавање (енгл. JS Runtime Environment). Постоје два типа окружења: уграђено у прегледач (за рад на клијенту) и node.js (за рад на серверу), али је начин рада ова два окружења концептуално исти.
Као што показује следећа схема, ЈаваСкрипт окружење за извршавање се састоји од следећих компоненти:
- ЈаваСкрипт машина (енгл. JS Engine)
- Хип (енгл. Heap)
- Стек (енгл. Stack)
- Спољашњи API-ји
- Ред повратних позива (енгл. Callback Queue)
- Петља за догађаје (енгл. Event loop)
Напомена. ЈаваСкрипт је програмски језик који се извршава у једној нити и он сам не може да извршава више истовремених паралелних радњи. Ипак, овако организовано окружење за извршавање омогућава више паралелних радњи (тзв. асихроно извршавање) - о томе ће бити речи касније.
У наставку су детаљније описане компоненте ЈаваСкрипт окружења за извршавање.
ЈаваСкрипт машина (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-ја за ЈаваСкрипт се налази на следећој адреси.
- API прегледача
- Објект модел документа (енгл. Document Object Model - DOM) - повезује веб страницу са скриптом тј. програмским језиком, јер рад са HTML, SVG, или XML документима као објектима није део језика ЈаваСкрипт.
window
објекат APIsetTimeout()
setInterval()
- …
document
објекат API- event API
- web worker API
- …
navigator
објекатXMLHttpRequest
објекат за интеракцију са сервером- animation API
- HTML5 API-ји
- video i audio API
- canvas API
- fullscreen API
- geolocation API
- local storage API
- notifications API
- …
- Објект модел документа (енгл. Document Object Model - DOM) - повезује веб страницу са скриптом тј. програмским језиком, јер рад са HTML, SVG, или XML документима као објектима није део језика ЈаваСкрипт.
- node.js API
Process
објекатBuffe
r објекатrequire()
setTimeout()
- …
- АPI треће стране: Поред АPI-ја окружења (прегледача или node.js), постоје и АPI-ји од спољних ресурса (тзв. АPI треће стране), који су неопходни ако треба да се користе услиге те треће стране. Најпознатији такви АPI-ји су:
- Google Maps
- PayPal
- …
Ред повратних позива
У ред повратних позива се смешта део кода који је спреман да се пошаље на извршавање ЈаваСкрипт машини. Ова меморија се заузима и ослобађа на начин карактеристичан за редове (енгл. First In First Out - FIFO). Део кода који се шаље на извршавање ЈаваСкрипт машини се из Реда повратних позива пребацује на Стек. Одлуку о томе када ће се извршити пребацивање кода из Реда повратних позива на Стек доноси компонента Петља за догађаје. С обзиром да Ред повратних позива садржи задатке које треба извршити ЈаваСкрипт окружење, понегде у литератури се овај ред још назива и Ред задатака (енгл. Task Queue).
Петља за догађаје
Ова компонента ЈаваСкрипт окружења за извршавање је у ствари процес који стално проверава да ли је Стек празан и да ли постоје неке функције у Реду повратних позива да се изврше. Уколико се то деси, бира се прва на реду функција из реда (она која најдуже чека - тј. “најстарија”), пребацује се на Стек и почиње њено извршавање.
Литература
-
Haverbeke M.: Eloquent JavaScript
-
JavaScript - Mozzila Developer Network (MDN)
-
Живановић, Д.: Веб програмирање - ЈаваСкрипт
-
Copes F.: Complete JavaScript Handbook