ПаукОбезьяна

Движок JavaScript и WebAssembly

ПаукОбезьяна
Разработчик(и)
Репозиторий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]

Версии

История версий SpiderMonkey
ВерсияДата выпускаСоответствующая версия 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

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

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

IonMonkey — это JIT-компилятор JavaScript от Mozilla, целью которого было обеспечить множество новых оптимизаций, которые были невозможны с предыдущей архитектурой JägerMonkey. [18]

IonMonkey был более традиционным компилятором: он транслировал байт-код SpiderMonkey в граф потока управления , используя статическую форму одиночного присваивания (SSA) для промежуточного представления . Эта архитектура позволяла использовать известные оптимизации из других языков программирования для JavaScript, включая специализацию типов, встраивание функций , распределение регистров линейного сканирования , устранение мертвого кода и циклически-инвариантное перемещение кода . [19]

Компилятор может выдавать быстрые собственные переводы кода функций JavaScript на платформах ARM , x86 и x86-64 . Это движок по умолчанию с Firefox 18. [20]

OdinMonkey

OdinMonkey — это название нового модуля оптимизации Mozilla для asm.js , легко компилируемого подмножества JavaScript. Сам по себе OdinMonkey не является JIT-компилятором, он использует текущий JIT-компилятор. Он включен в Firefox с версии 22.

WarpMonkey

WarpMonkey JIT заменяет прежний движок IonMonkey версии 83. [21] Он способен встраивать другие скрипты и специализировать код на основе обрабатываемых данных и аргументов. Он транслирует байт-код и данные встроенного кэша в представление промежуточного представления среднего уровня (Ion MIR). Этот граф преобразуется и оптимизируется перед понижением до промежуточного представления низкого уровня (Ion LIR). Этот LIR выполняет распределение регистров, а затем генерирует собственный машинный код в процессе, называемом генерацией кода. Оптимизации здесь предполагают, что скрипт продолжает видеть данные, похожие на те, что были видны ранее. Базовые JIT необходимы для успеха здесь, потому что они генерируют IC, которые соответствуют наблюдаемым данным. Если после компиляции скрипта с помощью Warp он сталкивается с данными, которые он не готов обработать, он выполняет аварийное отключение. Механизм аварийного отключения восстанавливает собственный машинный стековый фрейм для соответствия макету, используемому базовым интерпретатором, а затем переходит к этому интерпретатору, как если бы мы запускали его все это время. Построение этого стекового фрейма может использовать специальную побочную таблицу, сохраненную Warp, для реконструкции значений, которые в противном случае недоступны. [22]

Использовать

SpiderMonkey предназначен для встраивания в другие приложения, которые предоставляют хост-среды для JavaScript. Ниже приведен неполный список:

  • Mozilla Firefox , Thunderbird , SeaMonkey и другие приложения, использующие фреймворк приложений Mozilla
  • Приложения для хранения данных:
    • MongoDB перешла с V8 на SpiderMonkey в версии 3.2 [23]
    • Riak использует SpiderMonkey в качестве среды выполнения для операций JavaScript MapReduce [24]
    • Система баз данных CouchDB (написана на Erlang ). JavaScript используется для определения карт, фильтров, функций редукции и просмотра данных, например, в формате HTML.
  • Adobe Acrobat и Adobe Reader, Adobe Flash Professional и Adobe Dreamweaver . Adobe Acrobat DC использует Spidermonkey 24.2 с поддержкой ECMA-357, перенесенной вперед. [25]
  • Среда рабочего стола GNOME , версия 3 и более поздние
  • Yahoo! Widgets , ранее называвшийся Konfabulator
  • FreeSWITCH , движок телефонии с открытым исходным кодом, использует SpiderMonkey, чтобы позволить пользователям писать скрипты управления вызовами на JavaScript
  • PythonMonkey использует SpiderMonkey, чтобы позволить пользователям писать программы, в которых функции, типы и события JavaScript и Python взаимодействуют и (где это возможно) совместно используют хранилище памяти. [26]
  • Текстовый веб-браузер ELinks использует SpiderMonkey для поддержки JavaScript [27]
  • Части SpiderMonkey используются в (повторной) реализации JScript проекта Wine [28]
  • Synchronet — BBS, сервер электронной почты, веб-сайтов и приложений, использующий движок SpiderMonkey
  • JavaScript OSA , язык межпроцессного взаимодействия SpiderMonkey для компьютеров Mac
  • 0 AD , стратегическая игра в реальном времени
  • Wasmer включил SpiderMonkey в свой проект с открытым исходным кодом WinterJS — среду выполнения JavaScript.
  • SpiderMonkey также используется во многих других проектах с открытым исходным кодом; внешний список поддерживается на сайте разработчиков Mozilla. [29]

SpiderMonkey включает оболочку JavaScript для интерактивной разработки JavaScript и для вызова файлов программ JavaScript из командной строки. [30]

Смотрите также

Ссылки

  1. ^ "1.8.8 – SpiderMonkey | MDN". Developer.mozilla.org. 10 января 2013 г. Архивировано из оригинала 2 мая 2013 г. Получено 21 марта 2013 г.
  2. ^ "SpiderMonkey Newsletter (Firefox 110-111)". spidermonkey.dev . 16 февраля 2023 г. . Получено 27 декабря 2023 г. .
  3. ^ Mozilla Licensing Policies, mozilla.org, архивировано из оригинала 2 апреля 2013 г. , извлечено 26 марта 2013 г.
  4. ^ "Home". SpiderMonkey JavaScript/WebAssembly Engine . Получено 24 апреля 2023 г.
  5. ^ abc Eich, Brendan (21 июня 2011 г.). "Новый владелец модуля JavaScript Engine". BrendanEich.com. Архивировано из оригинала 14 июля 2011 г. Получено 1 июля 2011 г.
  6. ^ abc Eich, Brendan (3 апреля 2008 г.). "Популярность". BrendanEich.com. Архивировано из оригинала 3 июля 2011 г. Получено 1 июля 2011 г.
  7. ^ Эйх, Брендан (19 августа 2011 г.). «Картографирование Monkeysphere». Архивировано из оригинала 13 января 2013 г. Получено 19 августа 2011 г.
  8. ^ "Новое в JavaScript 1.6". Архивировано из оригинала 5 сентября 2015 г. Получено 28 июля 2015 г.
  9. ^ [1]
  10. ^ "759422 – Удалить использование e4x при создании учетной записи" . Получено 5 февраля 2013 г.
  11. ^ "JavaScript:TraceMonkey, MozillaWiki" . Получено 22 июля 2020 г. .
  12. ^ "TraceMonkey: JavaScript Lightspeed, блог Брендана Эйха" . Получено 22 июля 2020 г.
  13. Пол, Райан (22 августа 2008 г.). «Firefox получит значительный прирост производительности JavaScript». Ars Technica. Архивировано из оригинала 6 мая 2012 г. Получено 21 марта 2013 г.
  14. ^ Nethercote, Nicholas (1 ноября 2011 г.). «SpiderMonkey сидит на диете | Nicholas Nethercote». Blog.mozilla.com. Архивировано из оригинала 28 марта 2012 г. Получено 21 марта 2013 г.
  15. ^ «JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater». Bailopan.net. 26 февраля 2010 г. Архивировано из оригинала 24 марта 2013 г. Получено 21 марта 2013 г.
  16. ^ Пол, Райан (9 марта 2010 г.). «Mozilla заимствует из WebKit для создания быстрого нового движка JS». Ars Technica. Архивировано из оригинала 16 апреля 2012 г. Получено 21 марта 2013 г.
  17. ^ "JaegerMonkey - MozillaWiki". Wiki.mozilla.org. Архивировано из оригинала 23 августа 2013 года . Получено 21 марта 2013 года .
  18. ^ "Platform/Features/IonMonkey - MozillaWiki". Wiki.mozilla.org. 11 февраля 2013 г. Архивировано из оригинала 8 марта 2013 г. Получено 21 марта 2013 г.
  19. ^ "IonMonkey: новый компилятор JavaScript JIT от Mozilla". Infoq.com. Архивировано из оригинала 8 декабря 2012 г. Получено 21 марта 2013 г.
  20. ^ "Firefox Notes - Desktop". Mozilla.org. 8 января 2013 г. Архивировано из оригинала 2 сентября 2014 г. Получено 21 марта 2013 г.
  21. ^ "Warp: улучшенная производительность JS в Firefox 83 – Mozilla Hacks - блог веб-разработчиков". Mozilla Hacks – блог веб-разработчиков . 13 ноября 2020 г. Получено 28 августа 2021 г.
  22. ^ "SpiderMonkey — Документация Firefox Source Docs". firefox-source-docs.mozilla.org . Получено 28 августа 2021 г. .
  23. ^ "JavaScript Changes in MongoDB 3.2 — MongoDB Manual 3.4". Архивировано из оригинала 6 июня 2017 г. Получено 23 ноября 2016 г.
  24. ^ "Выпуск Riak 0.8 и JavaScript Map/Reduce". Архивировано из оригинала 3 ноября 2011 г. Получено 24 апреля 2011 г.
  25. ^ "Acrobat DC SDK Documentation". helpx.adobe.com . Получено 5 ноября 2021 г. .
  26. ^ "Distributive-Network/PythonMonkey: JavaScript-движок Mozilla SpiderMonkey, встроенный в виртуальную машину Python, использующий движок Python для предоставления среды хоста JS". GitHub . 7 июля 2023 г. . Получено 10 июля 2023 г. .
  27. ^ Bolso, Erik Inge (8 марта 2005 г.). "Обзор браузеров текстового режима 2005 г.". Linux Journal . Архивировано из оригинала 15 марта 2010 г. Получено 5 августа 2010 г.
  28. ^ Список рассылки wine-cvs Архивировано 7 февраля 2009 г. на Wayback Machine , 16 сентября 2008 г.: "jscript: Добавлен компилятор регулярных выражений на основе реализации регулярных выражений Mozilla"
  29. ^ "SpiderMonkey > FOSS". MDN Web Docs . Получено 2 апреля 2019 г.
  30. ^ "Введение в оболочку JavaScript". MDN . Mozilla Developer Network. 29 сентября 2010 г. Архивировано из оригинала 29 июня 2011 г. Получено 14 декабря 2010 г. Оболочка JavaScript — это программа командной строки, включенная в исходный дистрибутив SpiderMonkey. [...] Вы можете использовать ее как интерактивную оболочку [...] Вы также можете передать в командной строке файл программы JavaScript для запуска [...]
  • Официальный сайт , движок SpiderMonkey (JavaScript-C)
  • Календарь релизов Firefox (и Spidermonkey)
Взято с "https://en.wikipedia.org/w/index.php?title=SpiderMonkey&oldid=1271598014"