В платформе Bun, развиваемой в качестве альтернативы Node.js и предназначенной для обособленного выполнения приложений, написанных на языках JavaScript, JSX и TypeScript, реализована экспериментальная возможность компиляции и выполнения обработчиков, написанных на языке Си. Ранее для вызова низкоуровневого кода требовалось либо создавать N-API-плагины к движку V8, либо компилировать код в формат WebAssembly (WASM/WASI), что усложняло разработку и накладывало определённые ограничения. Теперь код на языке Си можно напрямую встраивать в JavaScript и компилировать на лету с использованием компилятора TinyCC, а также подключать динамически связываемые библиотеки...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=61915
В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.
> В своё время возможность написать на c/c++ модули для ноды сделали ноду пушкой гонкой.Вон то имхо как-то менее криво. Одно дело "писать модули для ноды" (как сишник я в душе не е...у что это за нахрен, и не то чтобы хочу левые ритуалы специфичные для очередной кривульки разучивать). И совсем другое - вызвать существующий сишный код. Как он есть. Вот это уже да, нормальный interop с сями.
Так что идейка скриптануть работу с мелкими мувиками - нормально смотрится. Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.
> Без каких-то трахов мозгов с какими-то там написаниями каких-то там модулей.Ждите взломов ваших сайтиков с подстановками source: "./heIIo.c", вместо "./hello.c",
> Ждите взломов ваших сайтиков с подстановками source: "./heIIo.c", вместо "./hello.c",Если какой-то чудик может патчить файло бэкэнда, подставляя туда всякий крап, ему уже ничего ломать и не надо по идее?
Более того - если кто может залить и скомпилить сищный сорец на мой сервак, очевидно, у меня уже есть нехилые проблемы, не? :)
Павлинукс ты вроде за Раст топишь? Так ведь?
Взломы сайтиков с подстановками, например "./heIIo.rs" вместо "./hello.rs", это конечно совсем другое.
Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.
Ты хотел сказать Майнер. В джаваскрипт и так без ограничений можно вставить что угодно.
JavaScript сам большой зонд, загружаемый на компьютеры миллиарда пользователей.
> JavaScript сам большой зонд, загружаемый на компьютерыЗадача хацкера не раскрутить сайт на лям юзеров, чтоб пихать свои зонды, а
пихнуть зонд на сайт, где бродят лямы юзеров, чтоб от имени сайта всунуть зонд.
> Задача хацкера не раскрутить сайт на лям юзеров, чтоб пихать свои зонды, а
> пихнуть зонд на сайт, где бродят лямы юзеров, чтоб от имени сайта всунуть зонд.А до этого то что мешало? Ты типа принципиальный и твой зонд должен быть - high performance, не то что какая-то там скриптота? А иначе тебе обидно и ты не будешь бяку делать чтоли? :)
> Отлично, теперь легко встраивать любые зонды, без всяких там ограничений WebAssembly.Куда вы их встраивать собрались? И что раньше то мешало? Типа, хотите "obfuscated C contest" устроить?
> легко встраивать любые зондыРечь же про серверную часть кода. Bun не для client-side
Зуммеры или кто они там придумали ffi?
Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлы
> Они таскают с собой tcc, чтобы можно было налету компилять и запускать сишные файлыАх ты черт, они услышали идею Fabrice Bellard'а на тему того что си можно сделать скриптовым движком :)
И вот это вот всё выполнять в эмуляторе на 4004 :)
Круто! Джва года этого ждал!
Теперь можно обойти тупый ограничения безопасного js и портить память прям из сишки.
Как диды завещали!
Это ансейф блоки, отнеситесь с пониманием.
Zig - классный, но его ещё пилить и пилить. На YouTube есть сравнение серверов на Zig и на Rast, пока Zig проигрывает по потреблению памяти и загрузки CPU
> Zig - классный, но его ещё пилить и пилить. На YouTube есть сравнение серверов на Zig и на Rast, пока Zig проигрывает по потреблению памяти и загрузки CPUПроизводительность думаю можно улучшить.
У него ИМХО проблемы с позиционированием.Если посмотреть на сайт ziglang.org - то там цель ЯП robust, optimal and reusable.
Из преимуществ перечислены "No hidden control flow/memory allocations. No preprocessor, no macros."
Вроде неплохо.. но в СИ можно обхоиться и без макросов.
Фичи типа zero-dependency, drop-in C/C++ compiler и легкого добавления в существующий код, тоже не выглядит как что-то сверхъестественное.Ничего про "большую безопасность" не сказано, для этого нужно лезть в подробное описание.
А сишные ошибки типа use-after-free никуда не делись.Плюс тудушки на такие ʼненужныеʼ вещи как Out of Bounds Float to Integer Cast - не добавляют доверию
> Ничего про "большую безопасность" не сказано, для этого нужно лезть в подробное описание.Потому что люди создают язык для разработки, а не для менеджеров изображающих из себя разбирающихся.
В zig зато нормальные не нулевые указатели по умолчанию. И нулевые опциональные только для взаимодействия с си.
> и портить память прям из сишки.
> Как диды завещали!Послушай, циркач. В ассемблере тоже легко можно портить память, а сишка - это "кроссплатформерный ассемблер".
Настолько кроссплатформенный, что на нём даже нельзя написать эмулятор процессора для 4004. Какой-то поэт сказанул пятьдесят лет назад, а школота с тех пор повторяет.
А как тогда на Intel 4004 запустили Linux? Запуск системы занимает 8 часов, но она работает.
А все, видел пояснения к статье. Стека нет и по ресурсам ограничен, но все же подмножество Си реализовать можно.
> Послушай, циркач. В ассемблере тоже легко можно портить память, а сишка - это "кроссплатформерный ассемблер".Да, неужели!
Разве в ассемблере может команда не сработать?
Или там есть UB и CMP там может давать рандомный результат?Я помню анекдоты про "программист на ассемблере делает два JMP. Но зачем? А вдруг первый не сработает", но ни разу с такой дичь за 20 лет работы не сталкивался.
И кстати, если открыть стандарт, то там написано
This document specifies the form and establishes the interpretation of programs expressed in the
programming language C.И ни про какой "кроссплатформерный ассемблер" там не говорится.
Так что хватит нести чушь и позориться.
Конечно может быть. Чуть другой проц все твой корректный аси код выдает что угодно кроме того что надо и это не говоря про недокументированные возможности или доп команды.
> Конечно может быть. Чуть другой проц все твой корректный аси код выдает что угодно кроме того что надо и это не говоря про недокументированные возможности или доп команды.Ненене, девид блейн! У нас ассемблер пишется под процессор.
Именно поэтому надо делать всякие хитрые штуки для кроссплатформенности.
Для чуть "другого проца" у тебя будет другой ассемблерый код.
На асм в мультизадачном режиме команда может не сработать, если код полезет туда, куда не положено.-)
> команда может не сработатьИменно не сработает? Или вернет ошибку?
Жаббаскрипт небезопасный сам по себе, нестрогая типизация всё сводит нет.
В каком языке ещё можно сложить 2 + "2" и получить "22"? А baNaNa чего только стоит!
А не фиг складывать разные типы. Или ты через 5 минут забываешь что у тебя хранится в переменной?
т.е. ты пытаешься "безопасно" сложить число со строкой и ругаешься, что язык не тот?:) лол. для тебя любой автомобиль "небезопасный" - вдруг тебе захочется на красный поехать? не нуачё - огоньки-то они ж светятся
В целом - одобрям!
> а также подключать динамически связываемые библиотекиА вот за это - отдельно тройное "ку!".
Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.
> Не совсем понял что такое Bun и для чего оно, но ffi у меня жёстко с lua ассоциируется.Учитывая в скольких ЯП есть FFI - тут можно разве что посоветовать держать синдром утенка под контролем.
FFI - "foreign function interface" и есть в дофига разных ЯП, внезапно.
Я знаю что такое FFI, и знаю что он есть много где.
Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.
А в других языках он просто для галочки и не играет никакой роли.
> Я знаю что такое FFI, и знаю что он есть много где.Настолько много где, что если в ЯП такого нет - ты сразу думаешь "а понятно, студенты развлекаются" :)
> Но в lua он раскрывается по полной, можно сказать lua был специально написан чтобы вызывать C/C++ ф-ии.
Это - да, чертовски верно подмечено! ;-)
> А в других языках он просто для галочки и не играет никакой роли.
А вот зря ты так. Почти все серьёзные робяты умеют. Пистон к примеру даже ffi и ctypes.
Да даже из Go дергаются win32 коллы легко и непринуждённо 8-) Мне тут наш толковый Гошник показал как - я чуть шляпой не подавился :)
> А в других языках он просто для галочки и не играет никакой роли.Это, мягко говоря, неверно.
> Я знаю что такое FFI, и знаю что он есть много где.
> Но в lua он раскрывается по полной, можно сказать lua был специально
> написан чтобы вызывать C/C++ ф-ии.Как махровый сишник я скажу так: если что-то пишется "чтобы вызывать сишные функции", тогда, бжад, сделайте синтаксис похожий на сишный! Не, паскакальобразное при этом втулить - это вообще совсем не то! Так что этот тезис, имхо, не доказан и жестко отдает синдромом утенка. В этом смысле JS и то - лучше, увы и ах.
> А в других языках он просто для галочки и не играет никакой роли.
А я то думал - что там тоже сишные/плюсатые, а порой и еще какие функции вызывают.
>А в других языках он просто для галочки и не играет никакой роли.это настолько толсто что автор даже не Д.Б., а не знаю что.
Perl, Tcl, Пестон или прастихоспаде Жаба-кодеры щас померли со смеху.
> что позволяет вызывать из JavaScript-кода предоставляемые данными библиотеками функцииСамый большой вопрос это обработка событий. Ведь JavaScript это язык событийно ориентированный. Так вот вызов API в целом дело хорошее, но что делать когда у тебя несколько потоков со своими событиями в классичейсокй Node нужно городить контексты и хватать какие-то там блокировки, а что в Bun есть общий механизм или пока нет ничего и нужно дергать (pull) функцию для обработки очередей?
Интересно как они отрабатывают время жизни ресурсов, конкурентный доступ и многопоточность при вызове кода на С - который в общем случае может себя ни в чём не ограничивать. Опять же почему компилятор внутри, а не линковка с dll?
запускаем браузер на с++ с интерфейсом на java, в нём запускаем java, в которой запускаем сичто вообще происходит?
Java и JavaScript разные языки, прикинь.
Браузер здесь ни при чём, bun это отдельный JS-рантайм
Происходит непонимание базовых вещей.
почему C? нужны вызовы rust
> почему C? нужны вызовы rustСтранный вопрос.
Bun написан зиганутыми, которые считают что он круче раста.
Разумеется они не будут добавлять его поддержку.
Плюс раст не настолько примитивный язык, чтобы таскать с собой маленький компилятор для этих целей.
Еще какие инсайды из чертогов воображения? Зиггеры и растеры это зачастую одни и те же люди и отношения между сообществами теплые и дружественные. Многие учат Zig как второй язык после Раста и выбирают для работы тот инструмент, который лучше подходит для их целей. Понимаю, фанатикам такое трудно принять, но что есть то есть.>Плюс раст не настолько примитивный язык, чтобы таскать с собой маленький компилятор для этих целей.
Ну надо же какие признания пошли хоть и в завуалированной форме.
местный контингент просто живет первобытно-общинным строем и не представляет возможности кооперации и даже пересечений между двумя группами людей
А чем мы здесь все заняты, как не пересечением?
>Многие учат Zig как второй язык после РастаНе фан, но понял. Нужно учить Дотракийский, как второй язык после Клингонского и выбирать для общения тот язык, которых лучше подходит для их понимания.
> По производительности Bun заметно обгоняет Deno и Node.js
> (в тестах на базе фреймворка React платформа
> Bun в 2 раза опережает Deno и почти в 5 раз Node.js)
> ReactА... какое вообще отношение имеет Реакт к тесту производительности подобия ноды которое вообще про сервер а не браузер ?
Странно человеку с ником "Бывалый Смузихлёб" не знать что react можно рендерить на сервере.
Можно-то можно, но это далеко не типовое и основное применение серваков вроде ноды
Причём, последние годы от подобного стараются уйти подальше, т.к сильно много жрёт ресурсов и особенно сильно грузится при DDoS-атакахТем более, что к поддержке сей на серваке и снижения накладных расходов при запуске это вообще никакого отношения не имеет
А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?
> А почему сразу так не сделали, а какие-то NAPI модули понавыдумывали?NAPI в ноде придумали, чтобы не надо было расширение на С++ перекомпилировать под каждую версию ноды. Вообще расширение (addon) и ffi - не одно и тоже.
В свете последних нововведений складывается впечатление, что делаются глобальные дырки. Чтобы страны опирающиеся на опенсорс решения имели дырявую инфраструктуру или выпали из мейнстрим.
always has been
Так глядишь - и постепенно, постепенно, количество JS в коде будет уменьшаться... :D