У JavaScript-платформе Bun дададзена падтрымка выкліку кода на мове Сі

У платформе Bun, якая развіваецца ў якасці альтэрнатывы Node.js і прызначанай для адасобленага выканання прыкладанняў, напісаных на мовах JavaScript, JSX і TypeScript, рэалізаваная эксперыментальная магчымасць кампіляцыі і выкананні апрацоўшчыкаў, напісаных на мове Сі. Раней для выкліку нізкаўзроўневага кода патрабавалася альбо ствараць N-API-дадаткі, альбо кампіляваць код у фармат WebAssembly (WASM/WASI), што ўскладняла распрацоўку і накладвала пэўныя абмежаванні. Цяпер код на мове Сі можна напроста ўбудоўваць у JavaScript і кампіляваць на лёце з выкарыстаннем кампілятара TinyCC, а таксама падлучаць дынамічна злучаныя бібліятэкі. import {cc} ад "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); hello();

Для працы з мовай Сі выкарыстоўваецца праслойка bun:ffi, якая кампілюе зыходны код у машынныя інструкцыі, падстаўляе яго ў памяць пры выкананні і забяспечвае аўтаматычную канвертаванне тыпаў дадзеных паміж JavaScript і Сі. Адзначаецца, што накладныя выдаткі пры звароце да скампіляванага Сі-кода зведзены да мінімуму і прыводзяць да затрымкі на ўзроўні каля 2 нанасекунд на кожны выклік знешніх Сі-функцый. У якасці прыкладу паказана як мага напроста звяртацца да бібліятэк FFmpeg для пераўтварэння кароткіх відэа - за кошт выключэння такіх аперацый як адгалінаванне асобнага працэсу і вылучэнні памяці для кожнага відэа, агульны час выканання тэставага задання пры выкарыстанні bun:ffi атрымалася скараціць у тры разы.

Больш таго, у выпуску Bun 1.1.29 для кода на мове Сі дададзена падтрымка N-API (napi), дзякуючы якому напісаныя на мове Сі-апрацоўшчыкі могуць вяртаць аб'екты, радкі, масівы і іншыя не прымітыўныя значэнні JavaScript, апроч уласцівых мове Сі тыпаў , такіх як int і float. Механізм выкліку апрацоўшчыкаў на мове Сі дзейнічае і пры дынамічнай загрузцы любых бібліятэк з C ABI, незалежна ад таго, на якой мове яны напісаны першапачаткова (C++, Rust, Zig і да т.п.), што дазваляе выклікаць з JavaScript-кода якія прадстаўляюцца дадзенымі бібліятэкамі функцыі без асобнай стадыі перазборкі. Напрыклад, зараз можна звяртацца з JavaScript да сістэмных API.

Нагадаем, што праект Bun развіваецца з аглядкай на забеспячэнне сумяшчальнасці з сервернымі прыкладаннямі, напісанымі для Node.js, і падтрымлівае большую частку API Node.js. У склад платформы ўваходзіць набор прылад для стварэння і выкананні прыкладанняў на мовах JavaScript і TypeScript, а таксама runtime для выканання JavaScript-прыкладанняў без браўзэра, пакетны мэнэджар (сумяшчальны з NPM), інструментар для выканання тэстаў і сістэма зборкі самадастатковых пакетаў. Па прадукцыйнасці Bun прыкметна абганяе Deno і Node.js (у тэстах на базе фрэймворка React платформа Bun у 2 разы апярэджвае Deno і амаль у 5 разоў Node.js). Код Bun напісаны на мовах Zig і З++, і распаўсюджваецца пад ліцэнзіяй MIT. Для выканання JavaScript задзейнічаны JavaScript-рухавічок JavaScriptCore і кампаненты праекту WebKit з дадатковымі патчамі.

Крыніца: opennet.ru

Дадаць каментар