За последнее десятилетие экосистема JavaScript кардинально расширилась и преобразилась, превратившись из языка, традиционно доступного лишь в браузерах, в универсальный инструмент, применяемый на самых разных платформах — от мощных серверов и облака до небольших устройств и микроконтроллеров. Появление множества новых JavaScript рантаймов подтверждает не только популярность языка, но и разнообразие требований и сценариев использования, для которых один единственный движок или среда исполнения просто не могут быть универсальным решением. Одним из главных драйверов появления новых рантаймов стала потребность в выполнении JavaScript вне браузера. Node.js, созданный в 2009 году, проложил дорогу JavaScript в серверную среду, однако его архитектура и производительность зачастую не подходили для специфических контекстов и новых технологий, в частности для edge-компьютинга, где важна минимальная задержка и высокая масштабируемость.
Понятие edge-компьютинга получило развитие и коммерческую реализацию благодаря таким гигантам, как Amazon и Cloudflare. Первым серьёзным коммерческим шагом в этом направлении стали AWS Lambda и Lambda@Edge, обеспечившие запуск JavaScript функций в серверлес-режиме, близко к конечным пользователям. Однако запуск кода с использованием Node.js на грани сети оказался не оптимальным из-за ресурсоёмкости и ограничений самой платформы. Вскоре на рынке появились специализированные решения, ориентированные на малый вес, высокую скорость запуска и надёжность работы на периферии.
Cloudflare Workers использует сервис-воркеры, изначально разработанные для браузеров, адаптируя их к нуждам edge-платформы. Этот продукт быстро стал популярным, запустив гонку по созданию лёгких, масштабируемых и весьма специфичных JavaScript рантаймов. За успешным примером Cloudflare последовали проекты Deno, созданный бывшим автором Node.js Райаном Далем, ставший наследником и альтернативой Node с улучшенной безопасностью и встроенной поддержкой TypeScript. Deno быстро перешёл к созданию собственной edge-платформы с Deno Deploy, конкурируя с Cloudflare на фронте serverless-развёртываний.
Помимо них, появились Bun, WinterJS и Wasmer, каждый из которых использует разные движки и подходы, подчеркивая, что выбор движка — будь то Google V8, JavaScriptCore, SpiderMonkey или QuickJS — определяется конкретными целями и компромиссами. Встретив разнообразие движков, важно отметить роль QuickJS, движка с минимальным потреблением памяти и отличным потенциалом для работы на ограниченных устройствах. Именно такие характеристики привели к появлению рантаймов для микроконтроллеров — основного класса устройств Интернета вещей. Эти устройства, зачастую с крошечными ресурсами, требуют предельно лёгкие движки. Проекты вроде JerryScript, Duktape, Elk и Moddable ориентированы именно на такие условия, позволяя запускать JavaScript в памяти объёмом в несколько десятков килобайт.
Хотя эти движки жертвуют производительностью ради компактности и энергоэффективности, они открывают новый класс задач для JavaScript, позволяя разрабатывать IoT приложения с использованием знакомого и популярного языка. Это особенно важно там, где баланс между мощностью и размером кода критичен. Следующий пласт – полиглотные движки и рантаймы, позволяющие вызывать JavaScript из других языков и обеспечивающие бесшовную интеграцию. Rhino, движок написанный на Java и впервые появившийся в конце 1990-х, положил начало концепции взаимной интеграции экосистем. Впоследствии Nashorn и Graal.
js от Oracle расширили эти возможности, значительно упростив разработку гибридных приложений на JVM с использованием JavaScript. В экосистеме .NET, Python, Ruby, Go и Rust также появились собственные JavaScript движки и рантаймы, зачастую экспериментальные, но уже дающие возможность не только запускать JS, но и связывать его с нативными интерфейсами. Стоит упомянуть проекты, такие как jint для C#, PyNarcissus для Python или Boa для Rust, иллюстрирующие универсальность и востребованность JavaScript в различных языковых средах. Интересным трендом последних лет стало создание JavaScript движков, реализованных на самом JavaScript.
Например, Narcissus и Porffor служат инструментами для тестирования и прототипирования, а также помогают изучить сам язык и его спецификации. Это подчёркивает зрелость и гибкость языка, способного стать базой даже для построения собственных рантаймов. Не менее значимым направлением развития JavaScript рантаймов стала сфера нативных приложений, где JavaScript в связке с соответствующими фреймворками позволяет писать кросс-платформенный код. Основные подходы здесь — использование webview и вызов нативных API посредством мостов. Webview-фреймворки, такие как PhoneGap/Cordova, Ionic и Electron, способствовали развитию мобильных и десктопных приложений с использованием привычных веб-стеков.
Electron снискал огромную популярность на десктопе, став основой для таких проектов, как Visual Studio Code, Slack и Discord. На мобильных платформах, напротив, React Native занял центральное место, позволяя создавать настоящие нативные UI, написанные на JavaScript. React Native, изначально использовавший движок JavaScriptCore на iOS, со временем развил собственный движок Hermes, оптимизированный для мобильных условий с жёсткими ограничениями по памяти и запуску. Появление абстракций, таких как JSI, позволило ему стать движком-агностиком и поддерживать разные движки вплоть до V8 и QuickJS, что расширяет возможности разработки и интеграции. В Smart TV JavaScript используется для создания приложений на самых разных платформах, включая Amazon Fire TV и Samsung Tizen.
В этом секторе, объединяющем миллиарды устройств, JavaScript выступает универсальным языком благодаря своей веб-ориентированности и возможностям быстрой адаптации под долгоживущие платформы. Параллельно NativeScript развивает идеи нативного доступа к API, предоставляя движками с bindings к iOS, Android и даже Windows (хотя последний уже ушёл в прошлое). Новые изменения в архитектуре NativeScript, основанные на Node-API, делают рантаймы совместимыми с большим числом движков и перспективными для интеграции с другими фреймворками. Node.js, несмотря на свою доминирующую позицию в серверной среде, долгое время с трудом адаптировался к мобильным и встроенным устройствам из-за ограничений по JIT и ресурсам.
Тем не менее, усилия крупных игроков, таких как Janea Systems и Samsung, привели к появлению форков и облегчённых вариантов Node.js, способных функционировать в мобильных условиях. В целом, разнообразие JavaScript рантаймов — это не случайность, а отражение многообразия требований рынка и сценариев использования. Наличие двигателей с разной специализацией, будь то высокая производительность, малый размер или лучшая интеграция с нативными платформами, позволяет выстраивать архитектуры приложений, максимально отвечающие нуждам конкретного проекта. Переход от монополии одного движка к конкуренции среди многих — огромный плюс для всей экосистемы.
Это способствует инновациям, повышает качество, расширяет выбор для разработчиков и бизнесов. JavaScript сегодня — не просто язык браузера, а универсальный язык современного программирования, способный адаптироваться к самым разным задачам и устройствам. Завершая обзор, можно с уверенностью сказать, что эпоха, когда JavaScript ограничивался только браузером или Node.js, осталась в прошлом. Современный ландшафт рантаймов насчитывает десятки различных решений, каждое из которых нацелено на свою нишу.
Эта конкуренция поддерживает разработку, помогает находить лучшие подходы и даёт разработчикам беспрецедентную свободу выбора в построении приложений и сервисов будущего.