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 обязательно


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

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

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

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

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

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

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

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

     

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

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

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

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

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

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

     

  • 1.4, Вы забыли заполнить поле Name (?), 14:05, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Ранее для вызова низкоуровневого кода требовалось либо создавать N-API-плагины к движку V8

    Это неверная информация: в булочке используется js движок от вебкита, а не v8

     
  • 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 [^] [^^] [^^^] [ответить]  
  • +/
    > Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы

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

     

  • 1.10, Аноним (-), 14:13, 23/09/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Круто! Джва года этого ждал!
    Теперь можно обойти тупый ограничения безопасного js и портить память прям из сишки.
    Как диды завещали!
     
     
  • 2.16, Вы забыли заполнить поле Name (?), 14:25, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это ансейф блоки, отнеситесь с пониманием.
     
  • 2.25, Ydro (?), 15:35, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Zig - классный, но его ещё пилить и пилить. На YouTube есть сравнение серверов на Zig и на Rast, пока Zig проигрывает по потреблению памяти и загрузки CPU
     
  • 2.28, Аноним (28), 16:19, 23/09/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > и портить память прям из сишки.
    > Как диды завещали!

    Послушай, циркач. В ассемблере тоже легко можно портить память, а сишка - это "кроссплатформерный ассемблер".

     

  • 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" и есть в дофига разных ЯП, внезапно.

     

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



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

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