В обновлении среды выполнения javascript и TypeScript Bun 1.1.28 разработчики проекта добавили экспериментальную возможность компиляции и выполнения обработчиков, написанных на языке C.
По информации OpenNET, ранее в этом проекте для вызова низкоуровневого кода требовалось либо создавать N-API-плагины к движку V8, либо компилировать код в формат WebAssembly (WASM/WASI), что усложняло разработку и накладывало определённые ограничения.
Новая версия Bun позволяет напрямую встраивать код на C в javascript и компилировать на лету с использованием компилятора TinyCC, а также подключать динамически связываемые библиотеки.
Для работы с языком C в Bun используется прослойка bun:ffi, которая компилирует исходный код в машинные инструкции, подставляет его в память при выполнении и обеспечивает автоматическую конвертацию типов данных между javascript и С.
Разработчики пояснили, что накладные расходы при обращении к скомпилированному коду на C сведены к минимуму и приводят к задержке на уровне около 2 наносекунд на каждый вызов внешних функций на C. В качестве примера в описание обновления Bun показано, как можно напрямую обращаться к библиотекам FFmpeg для преобразования коротких видео — за счёт исключения таких операций, как ответвление отдельного процесса и выделения памяти для каждого видео, общее время выполнения тестового задания при использовании bun:ffi удалось сократить в три раза.
Примечательно, что уже вышла версия Bun 1.1.29, где для кода на языке C добавлена поддержка N-API (napi), благодаря которому написанные на языке С обработчики могут возвращать объекты, строки, массивы и другие непримитивные значения javascript, помимо свойственных языку C типов, таких как int и float. Механизм вызова обработчиков на языке C действует и при динамической загрузке любых библиотек с C ABI, независимо от того, на каком языке они написаны изначально (C++, Rust, Zig и т.п.), что позволяет вызывать из кода на javascript предоставляемые данными библиотеками функции без отдельной стадии пересборки. Например, теперь можно обращаться из javascript к системным API.
1 апреля 2024 года состоялся релиз Bun 1.1 — среды выполнения javascript и TypeScript с возможностью отладки кода и поддержкой популярных веб-фрейворков. Это событие произошло спустя шесть месяцев после выхода первой мажорной версии проекта Bun 1.0.
Bun — это современная среда выполнения JS типа Node.js или Deno со встроенной поддержкой JSX и TypeScript. Она разработана с акцентом на быстром запуске, высокой производительности и самодостаточности. Внутри Bun есть транспилятор (транспилирующий компилятор) javascript, встроенный в среду выполнения. Это означает, что при работе с Bun можно запускать файлы javascript, TypeScript и даже JSX/TSX без каких-либо зависимостей.
Bun использует движок javascriptCore, разрабатываемый WebKit, который запускается и выполняет операции немного быстрее, а также использует память немного эффективнее, чем классические движки типа V8. Bun написан на Zig — языке программирования низкого уровня с ручным управлением памятью, чем объясняются высокие показатели его скорости.
В Bun работают полнофункциональные приложения, созданные с помощью Next.js, Remix, Nuxt, Astro, SvelteKit, Nest, SolidStart и Vite. Разработчики проекта пояснили, что Bun запускается в 4 раза быстрее, чем Node.js. Эта разница только увеличивается при запуске файла TypeScript, который требует транспиляции, прежде чем Node.js сможет его запустить. Bun запускает тестовый файл hello world на TypeScript в 5 раз быстрее, чем esbuild с Node.js.
В конце апреля 2024 года для среды Bun вышел свой компактный crash reporter для Zig и C++. Отчёт о сбое умещается в URL-адрес размером около 150 байт, не содержащий никакой личной информации.
Источник новости: habr.com