Обновить

Комментарии 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 когда-нибудь.

Спасибо за звезду на GitHub! На данный момент это действительно пет-проект. Но кто знает, во что это может вырасти с поддержкой сообщества. В планах как раз создание стабильной базы, на которой можно будет запускать изолированные пользовательские приложения.

Очень хорошая статья, для меня ценная.

time - Show current date and time

Жаль что не date это делает, а time засекает время выполнения команды. Уже привычка в *nix у всех.

Справедливое замечание. В v0.24 обязательно добавлю алиас date для вывода времени, а логику time переделаю под замер длительности выполнения команд.

Очень круто. И спасибо что напомнил про Zig.

Zig — стал для меня золотой серединой.

Нет скрытых аллокаций

Comptime

Взаимодействие ASM

А как это помогает избежать ошибок при работе с памятью? Только благодаря наличию в языке defer?

Defer— это отличный инструмент для предотвращения утечек, но безопасность Zig в ядре строится на более фундаментальных вещах:

  1. Слайсы: В C мы передаем char* и надеемся, что не вылетим за пределы. В Zig []u8 — это структура из указателя и длины. Компилятор (и рантайм-чеки в дебаге) просто не дадут тебе обратиться к data[limit + 1].

  2. Optional Types (?T): В Zig нельзя просто так разыменовать указатель, который может быть null. Язык заставляет тебя сначала проверить его (if (ptr) |p| ...). Это убивает целый класс ошибок «NULL Pointer Dereference» еще на этапе написания кода.

  3. Явные аллокаторы: В ядре нет «магической» кучи. Каждая функция, которой нужна память, принимает аллокатор как аргумент.

  4. Error Unions: Ошибки — это часть системы типов. Ты не можешь проигнорировать результат read_sector, компилятор заставит тебя обработать возможный error.DiskFailure.

Так что нет, это не только defer. Это комбинация строгого контроля типов и отсутствия неявного поведения.

Не боишься того, что в будущем возможно придётся переписывать тонну кода на "новый" Zig? Он же не в релизе ещё, а значит оттуда могут спокойно выпилить что угодно. Даже я с этим столкнулся когда его начал изучать на маленьких проектах, а ОС вообще большой проект

Риск есть, и я с ним уже сталкивался. Но для OSDev это скорее плюс, чем минус:

  1. Язык развивается в сторону упрощения: Каждое крупное изменение в Zig обычно выпиливает какой-то магический кусок из C или делает синтаксис более логичным. Обновлять код под новые версии помогает лучше понять, как работают внутренности компилятора.

  2. Малый объем синтаксиса: Zig очень компактный. Даже если завтра изменят способ объявления export fn, пройтись по 11к строкам и поправить это — задача на один вечер, зато профит от использования comptime и отсутствия legacy-мусора C перекрывает эти затраты.

  3. Архитектура важнее синтаксиса: Основная сложность моей ОС — это логика SMP, работа с таблицами страниц и ACPI. Это всё не изменится от того, что в Zig поменяют название ключевого слова.

Отличная статья и главное вовремя! Сам думаю о том же. Было бы очень интересно почитать более подробно о том как организованы и работают SMP, планировщик и виртуальная память. Спасибо!

Честно говоря, статья попахивает нейрослопом. От ответов автора в комментариях несет им еще сильнее.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации