Каким образом Deno и Node.js достигают значительного улучшения производительности по сравнению с Node.js, если последний написан на C/C++? Какие особенности и различия в структуре и реализации Deno и Node.js позволяют им быть настолько быстрыми?
Первоначально, Deno и Node.js оба используют движок V8 для выполнения JavaScript-кода, который написан на C++. Однако есть несколько факторов, которые делают Deno и Bon (форк Node.js) более быстрыми, чем оригинальный Node.js. 1. Упрощенная архитектура: Deno и Bon убирают некоторые устаревшие компоненты и абстракции, присутствующие в Node.js, что позволяет им работать намного эффективнее. Они сосредоточены на базовых функциональных возможностях, что влияет на улучшение производительности. 2. Удаление callback-ов и введение асинхронных функций: Deno и Bon поддерживают использование асинхронных функций и оператора `await`, что упрощает разработку кода и улучшает его производительность. Код, написанный с использованием асинхронных функций, может работать в фоновом режиме без блокировки основного потока выполнения, что позволяет более эффективно использовать ресурсы. 3. Более современные версии V8: Deno и Bon используют более новые версии движка V8, которые обеспечивают улучшенную производительность и оптимизации выполнения JavaScript. Эти версии V8 могут лучше оптимизировать и компилировать код, что приводит к более быстрой работе приложений. 4. Различные оптимизации и улучшения: Deno и Bon содержат множество мелких оптимизаций и улучшений по сравнению с Node.js, которые могут незначительно, но аккумулятивно улучшать производительность. Также они могут предоставлять более дружественный интерфейс разработчикам и использовать более эффективный механизм загрузки модулей. В целом, Bon и Deno оба стремятся улучшить и оптимизировать процесс выполнения JavaScript-кода, что позволяет им быть более быстрыми по сравнению с оригинальным Node.js.
У bun может быть быстрее старт приложения благодаря использованию JavaScriptCore вместо V8 в node/deno. Однако, V8 обеспечивает самую полную поддержку ECMAScript на сегодняшний день. Важно отметить, что старт рантайма происходит только один раз во время жизни приложения. Так что решение о выборе движка связано с философским вопросом, считать ли это преимуществом. Если вы стремитесь к скорости за счет смены движка, то может быть разумнее выбрать QuickJS. Еще одним потенциальным выигрышем является переписывание некоторых частей, которые в node реализованы на JS. В node на самом деле очень многое написано на JS. Большинство встроенных модулей написаны на JS и вызывают функции из C++. Хотя я не изучал исходники deno/bun, я экспериментировал с v8 на Rust (благодаря deno за нормальный биндинг). Это будет работать быстрее, но обработка JS Promise из нативного кода является вызовом, и хочется редко использовать JS Promise внутри таких вызовов, как это происходит в node. Rust (deno) и Zig (bun) примерно сравнимы по скорости с плюсами (иногда быстрее, иногда медленнее, но в среднем примерно одинаково). Основная накладная расходы у языков с рантаймом создает сам рантайм (сборка мусора, компиляция JIT и т.д.), у C++, Rust и Zig практически нет подобного рантайма, в то время как у JS есть V8 и другие движки. Кроме того, как bun, так и deno работают с TypeScript из коробки. Однако TypeScript - это язык без формальной спецификации, есть только открытый компиляторный код (который сложен в понимании), есть релизные заметки, но нет спецификации. Это означает, что никто не может гарантировать 100% совместимость с tsc. Это проблема не только этих сред, но также WebStorm и babel-typescript, например. Насколько я понимаю, они идут по пути babel - просто затранспилировать (в сущности, отбросить все типы), но иногда babel все же ломает код...