Как стать автором
Обновить

V8 в бэкенде С++: от одного JS-скрипта до фреймворка онлайн-вычислений

Время на прочтение31 мин
Количество просмотров10K
Всего голосов 36: ↑36 и ↓0+36
Комментарии7

Комментарии 7

Тоже недавно выбирал скриптовый движок для связки с С++. Остановился на LUA.

C C++ библиотекой sol прокидывать данные С++ vs LUA оказалось очень просто (и наверное еффективнее чем в тяжеловесном V8). Хотя и есть пару нюансов.

Поэтому, недолго обсудив, мы решили использовать опенсорсный JS-движок V8. Основной аргумент: он уже использовался коллегами в другом сервисе, который находился в том же репозитории, что и наш. Поэтому многое можно было переиспользовать.

Действительно ли ваши аргументы в пользу V8 перевешивают достоинства LUA? Или вопрос о том какой движок выбрать серьезно не рассматривался?

На самом деле мой коллега исследовал вариант с Lua. Он сделал бенчмарки и сравнил LuaJIT с V8. В итоге получилось что с кэшированием контекстов с ростом сложности скрипта V8 начинает выигрывать, но его сложнее готовить чем Lua, тут не поспоришь.

Но у V8 больше возможностей (тот же Wasm), JavaScript более распространен и у руководства не было желания начинать поддерживать еще одну технологию, решающую по сути ту же самую задачу.

В итоге выбор пал на V8.

Да, Луа мог быть тут хорошим и сильно более экономным движком. IIRC, Vanilla Lua по тестам выигрывал на холодном старте у больших и маленьких скриптов. LuaJIT был не хуже на прогретом кеше, всё еще отъедая в десятки-сотни раз меньше чем изолят V8. Но, когда аналитики знают JS, и не знают Lua у вас по сути не остаётся другого выбора...

Есть фреймворк с встроенным V8, https://github.com/macchina-io/macchina.io, он на базе библиотек poco. Смотрели?

Не смотря на то, что позиционируется фреймворк для IoT, я его пользовался для прикладных задач на обычном серваке

Сразу признаюсь что с poco не работал и не знал о существовании данного фреймворка.

Мы не старались искать готовые решения т.к. у нас своя среда: корутины на базе boost, свои мьютексы и другие примитивы синхронизации с которыми скорее всего не получилось бы подружить решения предоставляющие concurrency в том или ином виде из коробки, коим насколько я понимаю и является данный фреймворк.

Спасибо за интересный ресерч и имплементацию!

Спасибо за лестный комментарий :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий