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

JavaScriptCore

JavaScriptCore — это движок JavaScript с открытым исходным кодом, разработанный компанией Apple. Он является частью фреймворка WebKit и используется в браузере Safari, а также в ряде других приложений экосистемы Apple (iOS, iPadOS, macOS, watchOS, tvOS). JavaScriptCore реализует стандарт ECMAScript и обеспечивает выполнение JavaScript-кода, предоставляя интерфейсы для взаимодействия с нативным кодом приложений.

История

Разработка JavaScriptCore началась в 2001 году как часть проекта KHTML (движок для отображения веб-страниц, созданный сообществом KDE). Изначально движок назывался KJS (KDE JavaScript) и был написан Харальдом Хельфегером на основе спецификаций ECMAScript. В 2002 году Apple, ища альтернативу для своего браузера Safari, форкнула KHTML и KJS, создав на их основе WebKit и JavaScriptCore соответственно.

В 2008 году Apple представила SquirrelFish — новую архитектуру интерпретатора, которая значительно повысила производительность. В том же году вышла версия SquirrelFish Extreme (SFX), включавшая JIT-компиляцию (Just-In-Time), что позволило JavaScriptCore конкурировать с другими движками, такими как V8 от Google (разработчик — компания Google, признана иноагентом в РФ) и SpiderMonkey от Mozilla. В 2014 году, с выходом iOS 8 и OS X Yosemite, Apple представила компилятор LLVM-байткода, который оптимизировал выполнение JavaScript на уровне машинного кода.

В 2019 году JavaScriptCore был выделен в отдельный проект WebKit JavaScriptCore, доступный для использования в сторонних приложениях. В 2020-х годах движок продолжает развиваться, поддерживая новые возможности ECMAScript (например, ES2022, ES2023) и улучшая производительность на ARM-архитектурах, используемых в устройствах Apple Silicon.

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

JavaScriptCore состоит из нескольких ключевых компонентов, обеспечивающих его работу:

Парсер

Парсер преобразует исходный код JavaScript в абстрактное синтаксическое дерево (AST). Он поддерживает лексический анализ, синтаксический анализ и обработку ошибок. В JavaScriptCore используется двухпроходный парсер: первый проход — быстрый, для предварительного разбора, второй — полный, для генерации AST.

Интерпретатор (LLInt)

Low-Level Interpreter (LLInt) — это быстрый интерпретатор, который выполняет байт-код, сгенерированный из AST. LLInt написан на C++ и оптимизирован для минимального потребления памяти. Он служит первым этапом выполнения, особенно для кода, который выполняется редко.

JIT-компиляторы

JavaScriptCore включает несколько уровней JIT-компиляции:

  • Baseline JIT: выполняет базовую компиляцию часто используемого кода, генерируя машинный код без глубокой оптимизации.
  • DFG JIT (Data Flow Graph): оптимизирует код на основе анализа потока данных, применяя инлайн-кэширование и другие техники.
  • FTL JIT (Faster Than Light): использует инфраструктуру LLVM для генерации высокооптимизированного машинного кода, применяя глобальные оптимизации (например, цикловые преобразования, устранение мёртвого кода).

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

JavaScriptCore использует поколенческий сборщик мусора (generational garbage collector), который делит объекты на молодое и старое поколения. Молодые объекты проверяются чаще, что ускоряет сборку. Для больших объектов применяется копирующая сборка, а для старых — маркировка и очистка.

Встроенные объекты и API

Движок включает стандартные объекты ECMAScript (Array, Object, Promise, Map, Set и др.) и предоставляет C API для интеграции с нативными приложениями. Через JavaScriptCore можно вызывать функции JavaScript из Objective-C, Swift или C++, а также передавать данные между средами.

Применение

Браузер Safari

Основное применение JavaScriptCore — выполнение JavaScript в браузере Safari на всех платформах Apple. Движок обеспечивает рендеринг интерактивных веб-страниц, работу веб-приложений и поддержку современных веб-стандартов.

Приложения на iOS и macOS

JavaScriptCore используется в приложениях, которые требуют выполнения скриптов или пользовательских расширений. Например:

  • Автоматизация: в приложениях типа Shortcuts (Команды) для выполнения пользовательских сценариев.
  • Игры: в игровых движках (например, Unity) для написания логики на JavaScript.
  • Редакторы кода: в приложениях, таких как Textastic или Codea, для выполнения JavaScript-кода в песочнице.

Сторонние проекты

JavaScriptCore доступен как отдельная библиотека для разработчиков. Например, в проектах Node.js для iOS (через JSCore) или в среде выполнения React Native (до перехода на Hermes). В некоторых случаях JavaScriptCore используется в серверных приложениях, хотя для этой цели чаще применяется V8.

WebKit

JavaScriptCore является частью WebKit — движка для отображения веб-содержимого, который используется не только в Safari, но и в браузерах сторонних разработчиков (например, в GNOME Web, Epiphany), а также в приложениях, использующих WebView (например, в почтовых клиентах, мессенджерах).

Особенности и производительность

JavaScriptCore известен своей высокой производительностью на устройствах Apple, особенно на процессорах Apple Silicon (M1, M2, M3). Благодаря глубокой интеграции с LLVM и оптимизациям под ARM-архитектуру, он часто показывает лучшие результаты в бенчмарках (например, JetStream, Speedometer) по сравнению с другими движками на тех же платформах.

Одной из ключевых особенностей является поддержка WebAssembly (Wasm) с 2017 года. JavaScriptCore выполняет Wasm-модули с производительностью, близкой к нативному коду, что позволяет использовать в браузере сложные вычисления (например, 3D-графика, обработка видео).

Движок также поддерживает экспериментальные функции ECMAScript, такие как временные объекты (Temporal), декораторы и улучшенные модули. Однако из-за консервативной политики Apple в отношении веб-стандартов, некоторые нововведения (например, Service Workers, Push API) внедряются медленнее, чем в других браузерах.

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

JavaScriptCore подвергается критике за несколько аспектов:

  • Закрытость экосистемы: хотя сам движок открыт, его интеграция с iOS и macOS ограничена политиками Apple. Например, сторонние браузеры на iOS обязаны использовать WebKit (и, следовательно, JavaScriptCore), что ограничивает конкуренцию.
  • Отставание от стандартов: в некоторых версиях Safari поддержка новых возможностей ECMAScript задерживается на несколько месяцев или лет по сравнению с Chrome или Firefox.
  • Проблемы с памятью: в сложных веб-приложениях (например, с большими объёмами данных) JavaScriptCore может потреблять больше памяти, чем V8, из-за особенностей сборщика мусора.
  • Производительность на x86: на устройствах с процессорами Intel (до перехода на Apple Silicon) производительность JavaScriptCore была ниже, чем у V8, из-за менее агрессивной JIT-оптимизации.

Сравнение с другими движками

ХарактеристикаJavaScriptCoreV8 (Google)SpiderMonkey (Mozilla)
РазработчикAppleGoogle (иноагент в РФ)Mozilla Foundation
Основное применениеSafari, WebKitChrome, Node.jsFirefox, Thunderbird
JIT-компиляцияBaseline, DFG, FTLIgnition, TurboFanBaseline, IonMonkey
Сборщик мусораПоколенческийПоколенческий (Orinoco)Поколенческий
Поддержка WasmДа (с 2017)Да (с 2016)Да (с 2017)
ЛицензияLGPL 2.1BSDMPL 2.0

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

  • Название «SquirrelFish» (белка-рыба) было выбрано из-за игры слов: «squirrel» (белка) ассоциируется с быстрым движением, а «fish» — с плавностью.
  • JavaScriptCore — один из немногих движков, который использует LLVM для JIT-компиляции, что позволяет ему применять оптимизации, характерные для компиляторов C/C++.
  • В 2010 году Apple открыла исходный код JavaScriptCore под лицензией LGPL 2.1, что способствовало его использованию в сторонних проектах, таких как Node.js для iOS.

Источники

  • WebKit Open Source Project — документация по JavaScriptCore
  • Apple Developer Documentation — JavaScriptCore Framework
  • Статья «JavaScriptCore: The Engine Behind Safari» (2019) — анализ архитектуры
  • Спецификация ECMAScript 2023 — стандарт, реализуемый движком
  • Бенчмарки JetStream 2.0 и Speedometer 3.0 — результаты тестов производительности

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

На главную BFOmetr →