The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

В JavaScript-платформе Bun добавлена поддержка вызова кода на языке Си

23.09.2024 13:30

В платформе Bun, развиваемой в качестве альтернативы Node.js и предназначенной для обособленного выполнения приложений, написанных на языках JavaScript, JSX и TypeScript, реализована экспериментальная возможность компиляции и выполнения обработчиков, написанных на языке Си. Ранее для вызова низкоуровневого кода требовалось либо создавать N-API-дополнения, либо компилировать код в формат WebAssembly (WASM/WASI), что усложняло разработку и накладывало определённые ограничения. Теперь код на языке Си можно напрямую встраивать в JavaScript и компилировать на лету с использованием компилятора TinyCC, а также подключать динамически связываемые библиотеки.


   import { cc } from "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 с дополнительными патчами.

  1. Главная ссылка к новости (https://bun.sh/blog/bun-v1.1.2...)
  2. OpenNews: Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js
  3. OpenNews: Доступна JavaScript-платформа Node.js 22.0.0
  4. OpenNews: В Node.js добавлена экспериментальная поддержка языка TypeScript
  5. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
  6. OpenNews: В JavaScript-платформе Deno обеспечена совместимость с модулями NPM
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/61915-bun
Ключевые слова: bun, javascript, gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (60) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 14:02, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.
     
     
  • 2.19, Аноним (19), 15:15, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.

    Вон то имхо как-то менее криво. Одно дело "писать модули для ноды" (как сишник я в душе не е...у что это за нахрен, и не то чтобы хочу левые ритуалы специфичные для очередной кривульки разучивать). И совсем другое - вызвать существующий сишный код. Как он есть. Вот это уже да, нормальный interop с сями.

    Так что идейка скриптануть работу с мелкими мувиками - нормально смотрится. Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.

     
     
  • 3.26, pavlinux (ok), 15:37, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    >  Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.

    Ждите взломов ваших сайтиков с подстановками  source: "./heIIo.c", вместо "./hello.c",

     
     
  • 4.29, Аноним (29), 16:19, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +10 +/
    > Ждите взломов ваших сайтиков с подстановками  source: "./heIIo.c", вместо "./hello.c",

    Если какой-то чудик может патчить файло бэкэнда, подставляя туда всякий крап, ему уже ничего ломать и не надо по идее?

    Более того - если кто может залить и скомпилить сищный сорец на мой сервак, очевидно, у меня уже есть нехилые проблемы, не? :)

     
  • 4.39, Аноним (-), 17:13, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Павлинукс ты вроде за Раст топишь? Так ведь?
     
  • 4.60, Аноним (60), 21:18, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Взломы сайтиков с подстановками, например "./heIIo.rs" вместо "./hello.rs", это конечно совсем другое.
     

  • 1.2, Аноним (2), 14:05, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.
     
     
  • 2.5, Аноним (1), 14:06, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ты хотел сказать Майнер. В джаваскрипт и так без ограничений можно вставить что угодно.
     
  • 2.7, Аноним (7), 14:07, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +4 +/
    JavaScript сам большой зонд, загружаемый на компьютеры миллиарда пользователей.
     
     
  • 3.27, pavlinux (ok), 15:40, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > JavaScript сам большой зонд, загружаемый на компьютеры

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

     
     
  • 4.30, Аноним (29), 16:21, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Задача хацкера не раскрутить сайт на лям юзеров, чтоб пихать свои зонды, а
    > пихнуть зонд на сайт, где бродят лямы юзеров, чтоб от имени сайта всунуть зонд.

    А до этого то что мешало? Ты типа принципиальный и твой зонд должен быть - high performance, не то что какая-то там скриптота? А иначе тебе обидно и ты не будешь бяку делать чтоли? :)

     
  • 2.20, Аноним (19), 15:17, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.

    Куда вы их встраивать собрались? И что раньше то мешало? Типа, хотите "obfuscated C contest" устроить?

     

  • 1.6, Вы забыли заполнить поле Name (?), 14:07, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Зуммеры или кто они там придумали ffi?
     
     
  • 2.13, Аноним (13), 14:17, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы
     
     
  • 3.21, Аноним (19), 15:19, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы

    Ах ты черт, они услышали идею Fabrice Bellard'а на тему того что си можно сделать скриптовым движком :)

     
     
  • 4.37, Аноним (37), 17:06, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    И вот это вот всё выполнять в эмуляторе на 4004 :)
     

  • 1.10, Аноним (-), 14:13, 23/09/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +1 +/
     
     
  • 2.16, Вы забыли заполнить поле Name (?), 14:25, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +3 +/
     
  • 2.25, Ydro (?), 15:35, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 3.31, Фнон (-), 16:25, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 4.33, Серб (ok), 16:29, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 4.36, Аноним (1), 17:04, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.28, Аноним (28), 16:19, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 3.34, Аноним (34), 16:53, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 4.61, Аноним (60), 21:26, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 5.64, Аноним (60), 21:51, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 3.35, Фнон (-), 17:03, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • –2 +/
     
     
  • 4.38, Аноним (1), 17:08, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
     
  • 5.43, Фнон (-), 17:39, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 4.42, BeLord (ok), 17:39, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 5.47, Аноним (-), 18:14, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.40, Bottle (?), 17:19, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 3.45, Аноним (2), 17:53, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +2 +/
     
  • 3.57, Аноним (57), 20:10, 23/09/2024 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     

     ....ответы скрыты (17)

  • 1.17, YetAnotherOnanym (ok), 14:53, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В целом - одобрям!
    > а также подключать динамически связываемые библиотеки

    А вот за это - отдельно тройное "ку!".

     
  • 1.18, Ilya Indigo (ok), 15:13, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.
     
     
  • 2.24, Аноним (-), 15:28, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.

    Учитывая в скольких ЯП есть FFI - тут можно разве что посоветовать держать синдром утенка под контролем.

    FFI - "foreign function interface" и есть в дофига разных ЯП, внезапно.

     
     
  • 3.32, Ilya Indigo (ok), 16:26, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Я знаю что такое FFI, и знаю что он есть много где.
    Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.
    А в других языках он просто для галочки и не играет никакой роли.
     
     
  • 4.41, _ (??), 17:34, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Я знаю что такое FFI, и знаю что он есть много где.

    Настолько много где, что если в ЯП такого нет - ты сразу думаешь "а понятно, студенты развлекаются" :)

    > Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.

    Это - да, чертовски верно подмечено! ;-)

    > А в других языках он просто для галочки и не играет никакой роли.

    А вот зря ты так. Почти все серьёзные робяты умеют. Пистон к примеру даже ffi и ctypes.
    Да даже из Go дергаются win32 коллы легко и непринуждённо 8-) Мне тут наш толковый Гошник показал как - я чуть шляпой не подавился :)

     
  • 4.46, YetAnotherOnanym (ok), 17:55, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > А в других языках он просто для галочки и не играет никакой роли.

    Это, мягко говоря, неверно.

     
  • 4.66, Аноним (66), 23:17, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Я знаю что такое FFI, и знаю что он есть много где.
    > Но в lua он раскрывается по полной, можно сказать lua был специально
    > написан чтобы вызывать C/C++ ф-ии.

    Как махровый сишник я скажу так: если что-то пишется "чтобы вызывать сишные функции", тогда, бжад, сделайте синтаксис похожий на сишный! Не, паскакальобразное при этом втулить - это вообще совсем не то! Так что этот тезис, имхо, не доказан и жестко отдает синдромом утенка. В этом смысле JS и то - лучше, увы и ах.

    > А в других языках он просто для галочки и не играет никакой роли.

    А я то думал - что там тоже сишные/плюсатые, а порой и еще какие функции вызывают.

     
  • 4.67, mos87 (ok), 07:00, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >А в других языках он просто для галочки и не играет никакой роли.

    это настолько толсто что автор даже не Д.Б., а не знаю что.

    Perl, Tcl, Пестон или прастихоспаде Жаба-кодеры щас померли со смеху.

     

  • 1.49, Аноним (49), 18:24, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > что позволяет вызывать из JavaScript-кода предоставляемые данными библиотеками функции

    Самый большой вопрос это обработка событий. Ведь JavaScript это язык событийно ориентированный. Так вот вызов API в целом дело хорошее, но что делать когда у тебя несколько потоков со своими событиями в классичейсокй Node нужно городить контексты и хватать какие-то там блокировки, а что в Bun есть общий механизм или пока нет ничего и нужно дергать (pull) функцию для обработки очередей?

     
     
  • 2.52, Tyrr (?), 19:10, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Интересно как они отрабатывают время жизни ресурсов, конкурентный доступ и многопоточность при вызове кода на С - который в общем случае может себя ни в чём не ограничивать. Опять же почему компилятор внутри, а не линковка с dll?
     

  • 1.50, 12yoexpert (ok), 18:31, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    запускаем браузер на с++ с интерфейсом на java, в нём запускаем java, в которой запускаем си

    что вообще происходит?

     
     
  • 2.55, Аноним (55), 19:18, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Java и JavaScript разные языки, прикинь.
     
  • 2.56, Аноним (56), 19:56, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Браузер здесь ни при чём, bun это отдельный JS-рантайм
     
  • 2.62, Аноним (60), 21:36, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Происходит непонимание базовых вещей.
     

  • 1.51, Аноним (51), 18:51, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    почему C? нужны вызовы rust
     
     
  • 2.58, Аноним (-), 20:27, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > почему C? нужны вызовы rust

    Странный вопрос.
    Bun написан зиганутыми, которые считают что он круче раста.
    Разумеется они не будут добавлять его поддержку.
    Плюс раст не настолько примитивный язык, чтобы таскать с собой маленький компилятор для этих целей.

     
     
  • 3.63, Аноним (60), 21:46, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Еще какие инсайды из чертогов воображения? Зиггеры и растеры это зачастую одни и те же люди и отношения между сообществами теплые и дружественные. Многие учат Zig как второй язык после Раста и выбирают для работы тот инструмент, который лучше подходит для их целей. Понимаю, фанатикам такое трудно принять, но что есть то есть.

    >Плюс раст не настолько примитивный язык, чтобы таскать с собой маленький компилятор для этих целей.

    Ну надо же какие признания пошли хоть и в завуалированной форме.

     
     
  • 4.65, errandrunner (?), 23:02, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    местный контингент просто живет первобытно-общинным строем и не представляет возможности кооперации и даже пересечений между двумя группами людей
     
     
  • 5.77, Аноним (37), 18:15, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    А чем мы здесь все заняты, как не пересечением?
     
  • 4.76, Аноним (37), 18:13, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >Многие учат Zig как второй язык после Раста

    Не фан, но понял. Нужно учить Дотракийский, как второй язык после Клингонского и выбирать для общения тот язык, которых лучше подходит для их понимания.

     

  • 1.69, Бывалый Смузихлёб (ok), 10:20, 24/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > По производительности Bun заметно обгоняет Deno и Node.js
    > (в тестах на базе фреймворка React платформа
    > Bun в 2 раза опережает Deno и почти в 5 раз Node.js)
    > React

    А... какое вообще отношение имеет Реакт к тесту производительности подобия ноды которое вообще про сервер а не браузер ?

     
     
  • 2.71, Аноним (71), 11:58, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Странно человеку с ником "Бывалый Смузихлёб" не знать что react можно рендерить на сервере.
     
     
  • 3.72, Бывалый Смузихлёб (ok), 14:02, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Можно-то можно, но это далеко не типовое и основное применение серваков вроде ноды
    Причём, последние годы от подобного стараются уйти подальше, т.к сильно много жрёт ресурсов и особенно сильно грузится при DDoS-атаках

    Тем более, что к поддержке сей на серваке и снижения накладных расходов при запуске это вообще никакого отношения не имеет

     

  • 1.70, ОШИБКА Отсутствуют данные в поле Name (?), 11:10, 24/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?
     
     
  • 2.74, Вы забыли заполнить поле Name (?), 15:14, 24/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?

    NAPI в ноде придумали, чтобы не надо было расширение на С++ перекомпилировать под каждую версию ноды. Вообще расширение (addon) и ffi - не одно и тоже.

     

  • 1.75, Аноним (75), 15:41, 24/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В свете последних нововведений складывается впечатление, что делаются глобальные дырки. Чтобы страны опирающиеся на опенсорс решения имели дырявую инфраструктуру или выпали из мейнстрим.  
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру