Кіріспе
JavaScript және WebAssembly қозғалтқышы, Mozilla Foundation-мен ұсталып тұрады. SpiderMonkey – Mozilla Foundation-ның ашық кодты JavaScript және WebAssembly қозғалтқышы. Бұл қозғалтқыш алғаш рет Netscape Communications компаниясында Брендан Эйх жазып, кейіннен ашық бастапқы код ретінде жарияланып, қазіргі уақытта Mozilla Foundation-мен күтіліп келеді. Ол Firefox веб-браузерінде пайдаланылады.
the software
SpiderMonkey is an open source JavaScript and WebAssembly engine by the Mozilla Foundation. It is the first JavaScript engine, written by Brendan Eich at Netscape Communications, and later released as open source and currently maintained by the Mozilla Foundation. It is used in the Firefox web browser.
Стандарттар
SpiderMonkey ECMA 262 спецификациясын (ECMAScript) жүзеге асырады. ECMA 357 (XML (E4X) үшін ECMAScript) 2013 жылдың басында қолданудан шығарылды.
Ішкі істер
SpiderMonkey C/C++ тілінде жазылған және интерпретаторды, IonMonkey JIT компиляторын, сондай-ақ қоқыс жинаушыны қамтиды.
TraceMonkey (ТрасМонки)
TraceMonkey – JavaScript тілі үшін жазылған алғашқы JIT компиляторы. Алғаш рет бета нұсқасында опция ретінде ұсынылып, 2008 жылдың 23 тамызында Брендан Айхтың блогында жарияланған бұл компилятор Firefox 3.5-тегі SpiderMonkey құрамына еніп, негізгі нұсқаның бір бөлігі болды. Ол Firefox 3-тегі базалық интерпретатордан "20-40 есе жылдамдыққа дейін жақсарту" мүмкіндігін ұсынды. TraceMonkey толық функцияларды компиляциялаудың орнына, интерпретатор жұмыс істеген кезде басқару ағыны мен дерек түрлерін тіркеп, осы деректердің негізінде түпкі кодтың жоғары мамандандырылған жолдары – іздік ағаштарды құрды. JägerMonkey-ді жетілдіру, әсіресе SpiderMonkey типтік қорытындылау механизмінің дамуымен бірге, TraceMonkey-ді қолданыстан шығарды. TraceMonkey Firefox 11 нұсқасынан бастап SpiderMonkey құрамына енбейді.
JägerMonkey (Жерқоқыш)
JägerMonkey, ішкі атауы MethodJIT, TraceMonkey тұрақты кодты жасауға мүмкін болмаған жағдайларда өнімділікті арттыруға арналған толық әдіс JIT компиляторы болды. Ол алғаш рет Firefox 4-те пайда болды және ақырында TraceMonkey-ді толығымен ығыстырды. Кейіннен оның орнына IonMonkey келді. JägerMonkey өз класындағы басқа компиляторлардан өте ерекше жұмыс істеді: әдеттегі компиляторлар функцияны көрсететін бақылау ағыны графигін құрып, оны оңтайландырса, JägerMonkey SpiderMonkey байт-коды арқылы сызықты түрде алға қарай итерация жасау арқылы жұмыс істеді – бұл функцияның ішкі өрнегі. Бұл командаларды қайта реттеуді қажет ететін оңтайландыруларға шектеу қойғанымен, JägerMonkey компиляциясының өте жылдам болуының артықшылығы бар, бұл JavaScript үшін пайдалы, себебі өзгермелі айнымалы түрлеріне байланысты жиі қайта компиляция жасалады. Mozilla JägerMonkey-де бірнеше маңызды оңтайландыруларды енгізді, ең бастысы – полиморфты желілік кэштер және типтік қорытынды. TraceMonkey және JägerMonkey JIT техникаларының айырмашылығы және екеуінің қажеттілігі hacks.mozilla.org сайтындағы мақалада түсіндірілген. Техникалық егжей-тегжейлі ақпаратты SpiderMonkey-ді әзірлеушілердің бірі Крис Лири өз блогында келтірген. Басқа әзірлеушілердің блогтарында да қосымша техникалық ақпарат табуға болады: dvander, dmandelin.
IonMonkey (айтқыш)
IonMonkey - Mozilla-ның JavaScript JIT компиляторы, бұл JägerMonkey архитектурасымен мүмкін болмаған көптеген жаңа оңтайландыруларды іске асыруға арналған. IonMonkey көбірек дәстүрлі компилятор болды: ол SpiderMonkey байт-кодын басқару ағыны графигіне аударды және аралық өрнек үшін статикалық бір рет тағайындалу түрін (SSA) пайдаланды. Бұл архитектура басқа бағдарламалау тілдерінен белгілі оңтайландыруларды JavaScript үшін қолдануға мүмкіндік берді, соның ішінде типтік мамандану, функцияны ішке енгізу, сызықтық сканерлеу арқылы тіркелімдерді бөлу, пайдасыз кодты жою және циклдегі өзгермейтін кодты жылжыту. Компилятор ARM, x86 және x86 64 платформаларында JavaScript функцияларының жылдам түпнұсқа кодқа аудармасын жасауға қабілетті. Firefox 18 нұсқасынан бастап ол стандартты қозғалтқыш болып табылады.
Один Маймыл
OdinMonkey — Mozilla-ның asm.js үшін жаңа оптимизациялық модулінің атауы, JavaScript-тің оңай компиляцияланатын кіші жиынтығы. OdinMonkey өзі JIT компиляторы емес, ол қолданыстағы JIT компиляторын пайдаланады. Ол Firefox-тың 22-ші нұсқасынан бастап енгізілген.
WarpMonkey-тің түрі
WarpMonkey JIT 83-ші нұсқадан бастап бұрынғы IonMonkey қозғалтқышын алмастырады. Ол басқа скрипттерді ішке ендіріп, өңделіп жатқан деректер мен аргументтерге сәйкес кодты жаңартуға мүмкіндік береді. Бұл байт-кодты және желілік кэш деректерін орта деңгейдегі аралық өрнеуге (Ion MIR) аударады. Бұл график төмен деңгейлі аралық өрнеуге (Ion LIR) түсірілмей тұрып өңделіп, оңтайландырылады. Бұл LIR тіркелімдерді бөлуді жүзеге асырып, содан кейін кодты құру процесінде түпкілікті машиналық кодты жасайды. Мұндағы оңтайландырулар скрипт бұрынғыдай ұқсас деректерді көре береді деп есептейді. Базалық JIT-тердің сәтті болуы үшін маңызды рөл атқарады, себебі олар байқалған деректерге сай IC-терді жасайды. Егер Warp-пен құрастырылғаннан кейін скрипт күтпеген деректерге тап болса, ол құтқару операциясын іске қосады. Құтқару механизмі базалық интерпретатордың стегімен сәйкес келетін түпкілікті машиналық стек фреймін қайта құрады, содан кейін интерпретаторға бұрылып, оны бастапқыда орындағандай етіп іске қосады. Бұл стек фреймін құру үшін Warp сақтаған қосымша кестелерді пайдаланып, әдетте қол жетімді емес мәндерді қалпына келтіруге болады.