LINUX.ORG.RU

Bun v1.1.30

 bun, , , ,

Bun v1.1.30

0

3

Тихо и незаметно была опубликована новая стабильная версия Bun – 1.1.30.

Bun – это среда выполнения ECMAScript / JavaScript, по многим параметрам аналогичная nodejs. В основе Bun используется JavaScriptCore от Apple, но сам Bun как и многие его модули написан на языке zig. Bun старается быть максимально совместимым с nodejs по опциям командной строки, поддерживает модули ECMAScript (ESM) и CommonJS. Управление пакетами npm и поддержка typescript встроены прямо в приложение как нативный код, и программы на typescript могут исполняться напрямую интерпретатором без предварительной конфигурации.

Однако Bun не является лишь «копией» nodejs по своим возможностям. Помимо более быстрой работы в ряде сценариев (начиная прямо с запуска приложения) и почти полной поддержки доступного в nodejs API, Bun предоставляет широкие возможности для приложений на сервере – от работы с файлами до трансформации HTML-дерева (HTMLRewriter), модулем транспиляции typescript (Bun.Transpiler), встроенной работе с базами данных sqlite, модулей для взаимодействия с нативными библиотеками платформы через API яызка Си – ffi, встроенный инструментарий тестирования и множество других возможностей.

Кроме того, в экспериментальном режиме Bun поддерживает интеграцию с кодом на Си через прозрачный вызов tcc:

hello.c:

	int hello()
	{
	  return 42;
	}

hello.js:

	import { cc } from "bun:ffi";
	import source from "./hello.c" with { type: "file" };

	const {
	  symbols: { hello },
	} = cc({
	  source,
	  symbols: {
	    hello: {
	      args: [],
	      returns: "int",
	    },
	  },
	});

	console.log("What is the answer to the universe?", hello());


$ bun hello.js
What is the answer to the universe? 42

В этом релизе среди прочего был добавлен парсер CSS на основе LightningCSS который специально для этого был переписан с таких legacy-технологий как rust на zig, что позволило прозрачно интегрировать css и typescript, и теперь можно импортировать css-файл напрямую в модуль typescript:

index.ts:
	import "./style.css";
	import Component from "./MyComponent.tsx";

	// ... rest of your app

style.css:
	/* результат сборки: */
	/* style.css */
	.hello {
	  background: red;
	}

	/* MyComponent.css */
	.MyComponent {
	  color: green;
	}

Bun позволяет собрать всё приложение со всеми ресурсами в единый исполняемый файл.

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: unfo (всего исправлений: 5)
Ответ на: комментарий от vbr

Так зиг вроде как нормально линкуется с сишными и плюсовыми либами, в отличии от. Это была одна из причин его создания.

Мало что понял, зачем пересобирать libstd? C++ не тянет за собой ничего. Ну исключения отключить, конечно, а так вроде ничего не мешает на C++ писать со всеми фичами и нулевым рандаймом

Что бы выделять память и иметь доступ к io нужна библиотека, а в ней поддержка корутин и прочей прикладной шлабуды на ~5мб

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

uin ★★★
()
Ответ на: комментарий от uin

Что бы выделять память и иметь доступ к io нужна библиотека, а в ней поддержка корутин и прочей прикладной шлабуды на ~5мб

Чтобы выделять память, нужна любая реализация маллока. Например из newlib. А можно и не выделять. IO точно не нужен. Насчёт корутин не знаю, не пользовался, но полагаю, что тоже не нужно, если только не используешь какой-нибудь RTOS на C++, построенный на этих корутинах (такие есть?), хотя скорей всего просто будешь использовать что-то вроде FreeRTOS.

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

Ну -Os пишешь и всё, этого недостаточно что-ли?

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Чтобы выделять память, нужна любая реализация маллока.

Для того что бы писать на плюсах полноценно и удобно с new delete и auto v = vector<char>(), нужна плюсовая реализация аллокатора, а иначе тогда получаем сишный код на указателях через сишную библиотеку какой тогда смысл?

IO точно не нужен.

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

uin ★★★
()
Ответ на: комментарий от uin

Для того что бы писать на плюсах полноценно и удобно с new delete и auto v = vector(), нужна плюсовая реализация аллокатора, а иначе тогда получаем сишный код на указателях через сишную библиотеку какой тогда смысл?

Так new/delete это же просто типобезопасные обёртки для malloc/free, никакого самостоятельного кода они не вносят.

IO точно не нужен.

Тем более, как минимум без него пересобрать.

Зачем? Если ты его не будешь использовать, линкер всё выкинет, разве не так?

vbr ★★★★
()
Ответ на: комментарий от vbr

Так new/delete это же просто типобезопасные обёртки для malloc/free

Нет. Это шаблонные функции которые в зависимости от типа вызывают конструктор/деструктор.
а из библиотеки вызывается обжект аллокатор который не только выделяет/перевыделяет но и инициализирует.

Аналогом malloc можно назвать std::vector<T>::reserve который просто заранее выделяет область но не заполняет ее.

uin ★★★
()
Ответ на: комментарий от uin

Это всё понятно, но по факту new Bla() это то же, что bla = malloc(sizeof(bla)); bla_init(bla); и в плане сгенерированного кода отличий не будет. И на С человек напишет плюс-минус то же, т.е. разницы не будет. Инициализировать члены по умолчанию С++ не будет, если ты их не проинициализировал, там будет мусор. Если ты написал код, который инициализирует члены чем-то, то и его и на С напишешь, раз тебе это надо.

Собственно вот пример реализации из https://en.cppreference.com/w/cpp/memory/new/operator_new

void* operator new(std::size_t sz)
{
    std::printf("1) new(size_t), size = %zu\n", sz);
    if (sz == 0)
        ++sz; // avoid std::malloc(0) which may return nullptr on success
 
    if (void *ptr = std::malloc(sz))
        return ptr;
 
    throw std::bad_alloc{}; // required by [new.delete.single]/3
}

Как видно, из тяжёлого тут только кидок исключения. Для эмбеддеда, конечно, это лучше заменить на что-то другое. А в остальном это буквально вызов malloc.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Ну так вроде никто и не спорит что на си все можно написать.
Но на плюсах писать поприятнее хочется сосредоточится на работе с данными а не на их распределении.

uin ★★★
()
Ответ на: комментарий от uin

Ну я про то, что C++ с new совсем не обязательно должен тянуть там чего-то по размеру кода. Будет ровно тот же размер, что и у C с маллоком. Главное с исключениями разрулить аккуратно (или пересобрать libstd с -fno-exceptions, или везде писать new (nothrow)). Ну или просто писать с исключениями и смириться с небольшим распуханием кода, вроде там не так страшно всё.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

На реддите всплыл такой ресурс. Но я бы сильно не радовался, в языке постоянно что-то ломается.

https://zigistry.dev/

sarumeister
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.