Открыть сервис

SquirrelFish Extreme

SquirrelFish Extreme (также известный как Nitro) — это высокопроизводительный движок JavaScript, разработанный компанией Apple для использования в веб-браузере Safari. Он относится к категории JIT-компиляторов (Just-In-Time), которые преобразуют код JavaScript в машинный код непосредственно во время выполнения программы, что позволяет значительно ускорить работу веб-приложений по сравнению с интерпретируемыми движками. SquirrelFish Extreme является преемником более раннего движка SquirrelFish и на момент своего выхода в 2008 году стал одним из самых быстрых JavaScript-движков в мире, положив начало эпохе интенсивной конкуренции среди браузерных разработчиков за производительность.

История

Предпосылки создания

До середины 2000-х годов производительность JavaScript была относительно низкой. Большинство браузеров использовали простые интерпретаторы, которые выполняли код построчно, без какой-либо оптимизации. С ростом популярности веб-приложений, таких как Gmail и Google Maps, стало очевидно, что скорость выполнения JavaScript становится критическим фактором для пользовательского опыта. В 2008 году Google выпустил браузер Chrome с движком V8, который использовал JIT-компиляцию и показал впечатляющие результаты. Apple, стремясь сохранить конкурентоспособность Safari, начала разработку собственного высокопроизводительного движка.

Разработка и выпуск

SquirrelFish Extreme был анонсирован в сентябре 2008 года вместе с бета-версией Safari 4. Он был построен на основе предыдущего движка SquirrelFish, который сам по себе был значительным улучшением по сравнению с более старым JavaScriptCore. Главным нововведением стала архитектура с четырьмя уровнями компиляции, которая позволяла постепенно оптимизировать код по мере его выполнения. Первая стабильная версия движка была включена в Safari 4, выпущенный в июне 2009 года. Впоследствии движок получил кодовое имя Nitro и стал стандартным компонентом всех версий Safari, включая мобильную версию для iOS.

Эволюция

С момента своего появления SquirrelFish Extreme постоянно совершенствовался. В последующих версиях были добавлены:

  • Поддержка новых возможностей стандарта ECMAScript (ES5, ES6, ES2015+).
  • Улучшенная оптимизация памяти и сборки мусора.
  • Внедрение WebAssembly (Wasm) для выполнения низкоуровневого кода в браузере.
  • Интеграция с другими компонентами WebKit, такими как Web Inspector для отладки производительности.

На сегодняшний день Nitro (SquirrelFish Extreme) остаётся одним из ведущих JavaScript-движков, наряду с V8 (Chrome) и SpiderMonkey (Firefox). Он используется не только в Safari, но и в других браузерах на основе WebKit, таких как GNOME Web (Epiphany) и в некоторых встраиваемых системах.

Архитектура и принцип работы

Многоуровневая компиляция

Ключевой особенностью SquirrelFish Extreme является архитектура с четырьмя уровнями компиляции, которая позволяет балансировать между скоростью запуска и производительностью длительно выполняемого кода:

  1. Интерпретатор (LLInt — Low-Level Interpreter): На начальном этапе код JavaScript выполняется в низкоуровневом интерпретаторе. Он работает быстро, но не оптимизирует код. Этот уровень используется для редко выполняемых функций.
  2. Базовый JIT (Baseline JIT): Если функция выполняется несколько раз (обычно более 10), она компилируется в машинный код с помощью базового JIT-компилятора. Этот уровень даёт умеренный прирост производительности без значительных затрат времени на компиляцию.
  3. Оптимизирующий JIT (DFG JIT — Data Flow Graph JIT): При дальнейшем многократном выполнении функции (например, более 100 раз) в дело вступает оптимизирующий JIT-компилятор. Он анализирует поток данных и генерирует более эффективный машинный код, используя предположения о типах переменных. Если предположения не оправдываются, код может быть «деоптимизирован» обратно на предыдущий уровень.
  4. Продвинутый оптимизирующий JIT (FTL JIT — Faster Than Light JIT): Этот уровень, добавленный в более поздних версиях, использует компилятор LLVM (Low Level Virtual Machine) для генерации высокооптимизированного машинного кода. Он применяется для самых «горячих» функций, которые выполняются тысячи раз. FTL JIT обеспечивает максимальную производительность, но требует больше времени на компиляцию.

Сборка мусора

SquirrelFish Extreme использует поколенческую сборку мусора (Generational Garbage Collection). Память делится на поколения: молодое (где объекты создаются и быстро умирают) и старое (где объекты живут долго). Сборка мусора в молодом поколении происходит часто и быстро, а в старом — реже, но более тщательно. Это позволяет минимизировать паузы в работе программы.

WebAssembly

Начиная с версии Safari 11, Nitro получил поддержку WebAssembly — бинарного формата инструкций, который позволяет выполнять код, написанный на C, C++, Rust и других языках, с почти нативной скоростью. WebAssembly компилируется в машинный код через тот же FTL JIT, что обеспечивает высокую производительность.

Характеристики и производительность

Скорость выполнения

На момент выхода SquirrelFish Extreme продемонстрировал значительное превосходство над предшественниками. В тестах SunSpider (стандартный бенчмарк для JavaScript) он показал скорость, в несколько раз превышающую показатели предыдущего движка SquirrelFish. В последующих версиях производительность Nitro продолжала расти, и в современных тестах, таких как JetStream и Speedometer, он стабильно входит в тройку лидеров, конкурируя с V8 и SpiderMonkey.

Энергоэффективность

Одним из преимуществ SquirrelFish Extreme является его оптимизация для мобильных устройств. Поскольку Safari является основным браузером на iOS, Apple уделяет большое внимание энергопотреблению. Nitro спроектирован так, чтобы минимизировать использование процессора и памяти, что продлевает время работы от аккумулятора на iPhone и iPad. В тестах на энергоэффективность он часто показывает лучшие результаты, чем V8 на Android.

Безопасность

SquirrelFish Extreme включает несколько механизмов безопасности:

  • Изоляция процессов: Каждая вкладка Safari работает в отдельном процессе, что предотвращает влияние сбоев или вредоносного кода на другие вкладки.
  • JIT-защита: Движок использует рандомизацию адресного пространства (ASLR) и другие техники для защиты от атак, направленных на JIT-компиляторы.
  • Песочница: Код JavaScript выполняется в изолированной среде, ограничивающей доступ к системным ресурсам.

Применение

Веб-браузеры

Основное применение SquirrelFish Extreme — это браузер Safari на macOS и iOS. Он также используется в сторонних браузерах на iOS, так как Apple требует, чтобы все браузеры на её платформе использовали WebKit (и, соответственно, Nitro) в качестве движка рендеринга. К таким браузерам относятся, например, Google Chrome для iOS, Mozilla Firefox для iOS и Opera Touch.

Встраиваемые системы

Благодаря своей эффективности и низкому энергопотреблению, Nitro используется в некоторых встраиваемых системах и приложениях, где требуется выполнение JavaScript. Например, он может применяться в электронных книгах, информационных киосках и устройствах «умного дома».

Разработка

Разработчики веб-приложений могут использовать инструменты, встроенные в Safari (Web Inspector), для профилирования производительности JavaScript-кода, выполняемого Nitro. Это позволяет выявлять узкие места и оптимизировать код под конкретный движок.

Критика и ограничения

Закрытость экосистемы

Основная критика в адрес SquirrelFish Extreme связана с его эксклюзивностью. В отличие от V8 (Chrome) и SpiderMonkey (Firefox), которые являются открытыми проектами и доступны на многих платформах, Nitro является частью закрытой экосистемы Apple. Он доступен только на устройствах Apple (macOS, iOS) и в браузерах на основе WebKit, что ограничивает его распространение.

Отсутствие на других платформах

Хотя WebKit является открытым проектом, версия Nitro, используемая в Safari, содержит проприетарные оптимизации, которые не доступны в других реализациях WebKit. Это означает, что пользователи Windows или Linux не могут получить доступ к полной производительности Nitro, если только не используют Safari (который был прекращён для Windows в 2012 году).

Конкуренция с V8

Несмотря на высокую производительность, в некоторых тестах, особенно связанных с асинхронным программированием и обработкой больших объёмов данных, V8 (Chrome) часто опережает Nitro. Это связано с разными подходами к оптимизации: V8 делает больший упор на агрессивную JIT-компиляцию, в то время как Nitro больше фокусируется на энергоэффективности и стабильности.

Интересные факты

  • Название «SquirrelFish Extreme» (буквально «Белка-рыба Экстрим») является отсылкой к внутреннему кодовому имени проекта. «SquirrelFish» было выбрано из-за ассоциации с быстрым и проворным животным, а «Extreme» подчёркивало значительное улучшение производительности.
  • Внутри Apple движок часто называют просто «Nitro», что стало его официальным маркетинговым именем.
  • SquirrelFish Extreme стал первым JavaScript-движком, который использовал LLVM для JIT-компиляции (в версии FTL JIT), что позволило достичь рекордной производительности в некоторых сценариях.

Источники

  • Apple Inc. «Introducing SquirrelFish Extreme» (2008). Презентация на конференции WebKit.
  • Документация WebKit. «JavaScriptCore — The Nitro Engine».
  • Статья «A Survey of JavaScript Engines» (2019) в журнале «ACM Computing Surveys».
  • Технические блоги разработчиков WebKit (webkit.org/blog).
  • Сравнительные тесты производительности браузеров (JetStream, Speedometer, SunSpider).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →