Разработчик(и) | |
---|---|
Репозиторий | github.com/mozilla-spidermonkey |
Написано в | С , С++ , Rust |
Операционная система | Кроссплатформенный |
Платформа | IA-32 , x86-64 , ARM , MIPS , SPARC , [1] RISC-V [2] |
Тип | Движок JavaScript и WebAssembly |
Лицензия | МПЛ 2.0 [3] |
Веб-сайт | spidermonkey.dev |
SpiderMonkey — это движок JavaScript и WebAssembly с открытым исходным кодом от Mozilla Foundation . [4] Движок обеспечивает работу веб-браузера Firefox и использует несколько поколений компиляторов JavaScript JIT (Just-in-Time) , включая TraceMonkey, JägerMonkey, IonMonkey и текущий WarpMonkey.
Это первый движок JavaScript , написанный Бренданом Эйхом в Netscape Communications, а затем выпущенный с открытым исходным кодом и в настоящее время поддерживаемый Mozilla Foundation. Его конструкция позволяет встраивать его в приложения за пределами веб-браузеров, с реализациями, включая систему баз данных MongoDB, Adobe Acrobat и среду рабочего стола GNOME.
Айх «написал JavaScript за десять дней» в 1995 году [5] , будучи «завербованным в Netscape с обещанием «делать Scheme » в браузере». [6] (Идея использования Scheme была оставлена, когда «инженерное руководство [решило], что язык должен «выглядеть как Java » ».) [6] В конце 1996 года Айх, которому нужно было «выплатить [существенный] технический долг », оставшийся с первого года, «остался дома на две недели, чтобы переписать Mocha как кодовую базу, которая стала известна как SpiderMonkey». [5] (Mocha было первоначальным рабочим названием языка.) [6] [7] В 2011 году Айх передал управление кодом SpiderMonkey Дэйву Манделину. [5]
Версия | Дата выпуска | Соответствующая версия ECMAScript | Версия браузера | Добавлена функциональность |
---|---|---|---|---|
Старая версия, больше не поддерживается:1.0 | Март 1996 г. | Netscape Навигатор 2.0 | ||
Старая версия, больше не поддерживается:1.1 | Август 1996 г. | Netscape Навигатор 3.0 | ||
Старая версия, больше не поддерживается:1.2 | Июнь 1997 г. | Netscape Навигатор 4.0 - 4.05 | ||
Старая версия, больше не поддерживается:1.3 | Октябрь 1998 г. | ECMA-262 1-е и 2-е издание | Netscape Навигатор 4.06-4.7x | |
Старая версия, больше не поддерживается:1.4 | Сервер Netscape | |||
Старая версия, больше не поддерживается:1.5 | Ноябрь 2000 г. | ECMA-262 3-е издание | Netscape Navigator 6, Firefox 1.0 | |
Старая версия, больше не поддерживается:1.6 | Ноябрь 2005 г. [8] | Firefox 1.5 | дополнительные методы массива, обобщенные массивы и строки, E4X | |
Старая версия, больше не поддерживается:1.7 | Октябрь 2006 г. | Firefox 2.0 | итераторы и генераторы, оператор let, массивы, деструктурирующее присваивание | |
Старая версия, больше не поддерживается:1.8 | Июнь 2008 г. | Firefox 3.0 | выражения генератора, замыкания выражений | |
Старая версия, больше не поддерживается:1.8.5 | Март 2011 г. | ECMA-262 5-е издание | Firefox 4.0 | Поддержка JSON |
Старая версия, больше не поддерживается:1.8.8 | Январь 2012 г. | Firefox 10.0 | ||
Старая версия, больше не поддерживается:17 | Ноябрь 2012 г. | Firefox 17.0 | ||
Старая версия, больше не поддерживается:24 | Сентябрь 2013 г. | Firefox 24.0 | ||
Старая версия, больше не поддерживается:31 | Июль 2014 г. | Firefox 31.0 | ||
Старая версия, больше не поддерживается:38 | Май 2015 г. | Firefox 38.0 | ||
Старая версия, больше не поддерживается:45 | Март 2016 г. | Firefox 45.0 | ||
Старая версия, больше не поддерживается:52 | Март 2017 г. | Firefox 52.0 | ||
Старая версия, больше не поддерживается:60 | Май 2018 г. | Firefox 60.0 | ||
Старая версия, больше не поддерживается:68 | Июль 2019 г. | Firefox 68.0 | ||
Старая версия, больше не поддерживается:78 | Июнь 2020 г. | Firefox 78.0 | ||
Старая версия, больше не поддерживается:91 | Август 2021 г. | Firefox 91.0 | ||
Старая версия, больше не поддерживается:102 | Июнь 2022 г. | Firefox 102.0 | ||
Старая версия, больше не поддерживается:103 | Июль 2022 г. | Firefox 103.0 | ||
Последняя версия: 131 | Сентябрь 2024 г. [9] | Firefox 131.0 |
SpiderMonkey реализует спецификацию ECMA-262 ( ECMAScript ). ECMA-357 ( ECMAScript для XML (E4X)) был отменен в начале 2013 года. [10]
SpiderMonkey написан на языке C / C++ и содержит интерпретатор , JIT-компилятор WarpMonkey и сборщик мусора .
TraceMonkey [11] был первым JIT-компилятором, написанным для языка JavaScript. Первоначально представленный как опция в бета-версии и представленный в блоге Брендана Эйха 23 августа 2008 г., [12] компилятор стал частью основного релиза как часть SpiderMonkey в Firefox 3.5 , обеспечивая «улучшение производительности в диапазоне от 20 до 40 раз быстрее» по сравнению с базовым интерпретатором в Firefox 3. [ 13]
Вместо компиляции целых функций, TraceMonkey был трассирующим JIT , который работает, записывая поток управления и типы данных во время выполнения интерпретатора. Эти данные затем информировали о построении деревьев трассировки , узкоспециализированных путей собственного кода .
Улучшения JägerMonkey в конечном итоге сделали TraceMonkey устаревшим, особенно с развитием механизма вывода типов SpiderMonkey . TraceMonkey отсутствует в SpiderMonkey, начиная с Firefox 11. [14]
JägerMonkey, внутренне именуемый MethodJIT, был JIT-компилятором целого метода, разработанным для повышения производительности в случаях, когда TraceMonkey не мог генерировать стабильный собственный код . [15] [16] Впервые он был выпущен в Firefox 4 и в конечном итоге полностью вытеснил TraceMonkey. Сам он был заменен на IonMonkey.
JägerMonkey работал совсем не так, как другие компиляторы в своем классе: в то время как типичные компиляторы работали, создавая и оптимизируя граф потока управления, представляющий функцию, JägerMonkey вместо этого работал, итерируя линейно вперед через байт-код SpiderMonkey , внутреннее представление функции. Хотя это запрещает оптимизации, требующие переупорядочивания инструкций, компиляция JägerMonkey имеет преимущество в том, что она очень быстрая, что полезно для JavaScript, поскольку перекомпиляция из-за изменения типов переменных является частой.
Mozilla реализовала ряд критических оптимизаций в JägerMonkey, наиболее важными из которых являются полиморфные встроенные кэши и вывод типов . [17]
Разница между методами JIT TraceMonkey и JägerMonkey и необходимость в обоих были объяснены в статье hacks.mozilla.org. Более подробное объяснение технических деталей было предоставлено Крисом Лири, одним из разработчиков SpiderMonkey, в сообщении в блоге Архивировано 9 декабря 2012 года на archive.today . Более подробную техническую информацию можно найти в блогах других разработчиков: dvander, dmandelin.
IonMonkey — это JIT-компилятор JavaScript от Mozilla, целью которого было обеспечить множество новых оптимизаций, которые были невозможны с предыдущей архитектурой JägerMonkey. [18]
IonMonkey был более традиционным компилятором: он транслировал байт-код SpiderMonkey в граф потока управления , используя статическую форму одиночного присваивания (SSA) для промежуточного представления . Эта архитектура позволяла использовать известные оптимизации из других языков программирования для JavaScript, включая специализацию типов, встраивание функций , распределение регистров линейного сканирования , устранение мертвого кода и циклически-инвариантное перемещение кода . [19]
Компилятор может выдавать быстрые собственные переводы кода функций JavaScript на платформах ARM , x86 и x86-64 . Это движок по умолчанию с Firefox 18. [20]
OdinMonkey — это название нового модуля оптимизации Mozilla для asm.js , легко компилируемого подмножества JavaScript. Сам по себе OdinMonkey не является JIT-компилятором, он использует текущий JIT-компилятор. Он включен в Firefox с версии 22.
WarpMonkey JIT заменяет прежний движок IonMonkey версии 83. [21] Он способен встраивать другие скрипты и специализировать код на основе обрабатываемых данных и аргументов. Он транслирует байт-код и данные встроенного кэша в представление промежуточного представления среднего уровня (Ion MIR). Этот граф преобразуется и оптимизируется перед понижением до промежуточного представления низкого уровня (Ion LIR). Этот LIR выполняет распределение регистров, а затем генерирует собственный машинный код в процессе, называемом генерацией кода. Оптимизации здесь предполагают, что скрипт продолжает видеть данные, похожие на те, что были видны ранее. Базовые JIT необходимы для успеха здесь, потому что они генерируют IC, которые соответствуют наблюдаемым данным. Если после компиляции скрипта с помощью Warp он сталкивается с данными, которые он не готов обработать, он выполняет аварийное отключение. Механизм аварийного отключения восстанавливает собственный машинный стековый фрейм для соответствия макету, используемому базовым интерпретатором, а затем переходит к этому интерпретатору, как если бы мы запускали его все это время. Построение этого стекового фрейма может использовать специальную побочную таблицу, сохраненную Warp, для реконструкции значений, которые в противном случае недоступны. [22]
SpiderMonkey предназначен для встраивания в другие приложения, которые предоставляют хост-среды для JavaScript. Ниже приведен неполный список:
SpiderMonkey включает оболочку JavaScript для интерактивной разработки JavaScript и для вызова файлов программ JavaScript из командной строки. [30]
JavaScript — это программа командной строки, включенная в исходный дистрибутив SpiderMonkey. [...] Вы можете использовать ее как интерактивную оболочку [...] Вы также можете передать в командной строке файл программы JavaScript для запуска [...]