
Комментарии 26
Класс, только вчера вечером про Zig читал. Было не ясно- он живой в принципе или как, а тут уже товарищи на нем новую ОС написали. :)
Успехов.
Поделитесь опытом, как вы на Zig подсели и что там вообще происходит
Спасибо за пожелания. Рад, что статья попалась вам как раз вовремя.
Zig сейчас один из самых динамично развивающихся системных языков. На нем уже написаны такие серьезные штуки, как рантайм Bun или бд TigerBeetle.
Почему я «подсел» на него при разработке ядра:
Comptime: Возможность генерировать код и проверять типы на этапе компиляции в ядре экономит кучу места и времени.
В Zig нет скрытых аллокаций. Если функция что-то выделяет — она просит аллокатор. В Ring 0 — ты контролируешь каждый байт.
Интероп с C/ASM: Zig умеет импортировать C-хедеры напрямую, а работа с ассемблерными вставками гораздо приятнее, чем в классическом GCC.
После C/C++ Zig ощущается как «Си, который наконец-то починили». Нет нужды в заголовочных файлах, есть нормальные слайсы и отличная система обработки ошибок.
Да жив и развивается. Но пока всё ещё в бете. Не так давно IO обновили, добавив IOContext из которого уже можно собирать поллинг всех цветов фломастеров и соотвественно асинхронные экзекуторы. А штуки типа Bun и Tiger Beetle DB поддерживают спрос в проде.
Не так давно IO обновили
Только zig doc теперь из-за этого не собирается
Поэтому оно и не 1.0
Это как бы понятно. Но выкатывать какой никакой релиз, в котором не билдится основа, это не ок.
Ну блин, изобрели же всякие для этого всякие си-сд,
Перековыряли кстати, .std.Io.net так основательно, что малой кровью поправить не удалось. Надо переписывать на новый WebServer или пихать во все вызовы ввода вывода какую то новую непонятную структуру io// v0.16.0-dev.1484
Upd. Я немного не домучил задачу, как выяснилось. Можно поправить исходник для 0.60 согласно этому пуллреквесту, хотя он и отменен (скорее всего влит позже или продублирован)
Не знаю живой он или нет, но кросскомпиляция из коробки за 200мб под любую архитектуру и ОС это киллер-фича лично для меня.
Красавчик! Звезду тебе на гитхабе поставил!
Статья/карма/подписка: +/+/+.
PS неплохой пэт проект для самообразования!
Впечатляет! Starred!
Жаль только перспективы туманны, хотя наверное это в чистом виде пет-проект.
Но кто знает, возможно станет на уровне linux когда-нибудь.
Очень хорошая статья, для меня ценная.
time - Show current date and time
Жаль что не date это делает, а time засекает время выполнения команды. Уже привычка в *nix у всех.
Очень круто. И спасибо что напомнил про Zig.
Zig — стал для меня золотой серединой.
— Нет скрытых аллокаций
— Comptime
— Взаимодействие ASM
А как это помогает избежать ошибок при работе с памятью? Только благодаря наличию в языке defer?
Defer— это отличный инструмент для предотвращения утечек, но безопасность Zig в ядре строится на более фундаментальных вещах:
Слайсы: В C мы передаем
char*и надеемся, что не вылетим за пределы. В Zig[]u8— это структура из указателя и длины. Компилятор (и рантайм-чеки в дебаге) просто не дадут тебе обратиться кdata[limit + 1].Optional Types (
?T): В Zig нельзя просто так разыменовать указатель, который может быть null. Язык заставляет тебя сначала проверить его(if (ptr) |p| ...). Это убивает целый класс ошибок «NULL Pointer Dereference» еще на этапе написания кода.Явные аллокаторы: В ядре нет «магической» кучи. Каждая функция, которой нужна память, принимает аллокатор как аргумент.
Error Unions: Ошибки — это часть системы типов. Ты не можешь проигнорировать результат
read_sector, компилятор заставит тебя обработать возможныйerror.DiskFailure.
Так что нет, это не только defer. Это комбинация строгого контроля типов и отсутствия неявного поведения.
Не боишься того, что в будущем возможно придётся переписывать тонну кода на "новый" Zig? Он же не в релизе ещё, а значит оттуда могут спокойно выпилить что угодно. Даже я с этим столкнулся когда его начал изучать на маленьких проектах, а ОС вообще большой проект
Риск есть, и я с ним уже сталкивался. Но для OSDev это скорее плюс, чем минус:
Язык развивается в сторону упрощения: Каждое крупное изменение в Zig обычно выпиливает какой-то магический кусок из C или делает синтаксис более логичным. Обновлять код под новые версии помогает лучше понять, как работают внутренности компилятора.
Малый объем синтаксиса: Zig очень компактный. Даже если завтра изменят способ объявления export fn, пройтись по 11к строкам и поправить это — задача на один вечер, зато профит от использования comptime и отсутствия legacy-мусора C перекрывает эти затраты.
Архитектура важнее синтаксиса: Основная сложность моей ОС — это логика SMP, работа с таблицами страниц и ACPI. Это всё не изменится от того, что в Zig поменяют название ключевого слова.
Отличная статья и главное вовремя! Сам думаю о том же. Было бы очень интересно почитать более подробно о том как организованы и работают SMP, планировщик и виртуальная память. Спасибо!
Честно говоря, статья попахивает нейрослопом. От ответов автора в комментариях несет им еще сильнее.
Пишем свою OS на Zig: Первый релиз с многоядерностью, FAT32 и скриптами