Чему вы научитесь
- - Работать в режиме BetterC: отключать тяжелый рантайм DRuntime и писать производительный системный код без сборщика мусора.
- - Использовать объектно-ориентированное программирование без GC: эмулировать объектно-ориентированную архитектуру без GC с помощью экосистемы numem, управлять памятью используя nogc_new и nogc_delete.
- - Применять концепцию RAII и защиту памяти: настраивать гарантированное уничтожение ресурсов через деструкторы структур и конструкции scope(exit), и др.
- - Бесшовно интегрироваться с экосистемой Си.
- - Многое другое в планах
О курсе
Вы устали от макросов Си, но не хотите мириться с тяжелым рантаймом C++? Добро пожаловать в BetterC!
Этот курс посвящен уникальному режиму компилятора языка D (Dlang) — betterC(далее BC). Мы предлагаем вам взглянуть на системное программирование по-новому: сохранив полный контроль над памятью и железом, вы получите доступ к мощным современным инструментам, которых так не хватает в обычном Си.
BC превосходит стандартный язык D с рантаймом в задачах, где критически важны минимальный размер бинарного файла, предсказуемость производительности и простота интеграции с существующим кодом на C.
Курс находится в активной разработке и обновляется каждую неделю. Мы пройдем последовательный путь от фундаментальных основ синтаксиса до продвинутых инженерных решений.
🌍 Кросс-компиляция «из коробки»
Связка LDC2 + Zig позволяет собрать статический бинарник под любую ОС без установки системных библиотек. Zig использует кастомный порт musl (единая libc для всех платформ), что даёт минимальные бинарники размером ~50-100 КБ. Один исходник → работает на Windows, Linux, macOS без зависимостей.
📊 Ключевые отличия BC от стандартного Dlang:
- Сборщик мусора (GC): В стандартном D включен (вызывает паузы «stop-all»). В BC — полностью отключен.
- Размер бинарника: В стандартном D весит от нескольких мегабайт. В BC — всего несколько килобайт (как в C).
- Использование памяти: В стандартном D непредсказуемое из-за GC. В BC — строго контролируемое вручную.
- Поддержка RAII: В стандартном D ограничена для классов. В BC — полная через деструкторы структур (struct).
- Интеграция с C / WebAssembly: В стандартном D требует сложной инициализации рантайма. В BC — прямая, без накладных расходов.
⚡ Четыре столпа BC
Отсутствие сборщика мусора
- Проблема: Стандартный GC может остановить выполнение программы в любой момент. Это недопустимо в системах реального времени (видеоигры, аудио-плагины, робототехника).
- Решение BC: Память выделяется вручную (malloc/free) или автоматически на стеке. Вы получаете детерминированное время отклика без неожиданных пауз.
Минимальный размер выходных файлов
- Проблема: Даже простая программа «Hello World» тащит за собой DRuntime и весит мегабайты.
- Решение BC: Бинарный файл содержит только ваш код. Это делает BC идеальным выбором для микроконтроллеров (embedded систем), драйверов устройств и WebAssembly (Wasm).
Идеальная интеграция с экосистемой C
- Проблема: Чтобы вызвать код на D из C, нужно предварительно настраивать рантайм D с помощью rt_init().
- Решение BC: Код компилируется в стандартные объектные файлы, которые ведут себя в точности как код на C. Вы можете использовать BC как прямую, более безопасную замену C в существующих проектах, не меняя сборочную систему.
Безопасность без накладных расходов
В отличие от чистого C, в режиме BC вам остаются доступны лучшие защитные механизмы D:
- Защита от переполнения буфера: Массивы знают свою длину и проверяют границы.
- Контроль на этапе компиляции: Мощнейшие шаблоны, static if и вычисления во время компиляции (CTFE).
- Управление ресурсами: Гарантированное уничтожение объектов через RAII (деструкторы структур) и конструкции scope(exit).
🛠️ Реальные проекты
Проекты numem и nulib от команды Inochi2D доказывают: выбирать между эргономикой кода и системными требованиями больше не нужно. Они буквально переворачивают традиционное представление о компромиссах:
- ООП больше не проблема в NoGC: Вы можете использовать полноценные классы, интерфейсы и строки D, создавая их на куче через nogc_new и уничтожать через nogc_delete. Архитектура уровня C# или Java со скоростью чистого C!
- Выброшенный druntime: Минималистичный рантайм nurt вообще без GC. Высокоуровневые конструкции D теперь работают там, где стандартный D просто не запустился бы.
- Влияние на индустрию: Популярный аудио-фреймворк Dplug - создание музыкальных VST-плагинов, где малейшая задержка критична, официально перешел на numem для безопасного выделения памяти в реальном времени.
🧮 Быстрые вычисления с LibMir: NumPy на стероидах
Экосистема LibMir (mir-algorithm, mir-random, mir-ion) меняет представление о тяжелых вычислениях в режиме -betterC, работая в безопасных атрибутах @nogc, pure и nothrow.
- mir.ndslice — без аллокаций: n-мерные слайсы — это zero-cost «окна» над любым куском памяти (стек, куча, Си-массивы). Срезы, транспонирование и изменение формы матриц происходят мгновенно, без копирования памяти.
- Авто-векторизация (SIMD): Сложные математические выражения компилятор автоматически превращает в один цикл, выполняемый процессором через векторные инструкции.
- mir-ion — Сверхскоростная сериализация: Фреймворк парсит JSON, YAML и CSV лениво, без аллокаций в куче, являясь одной из самых быстрых библиотек в мире.
⚡ Что мы разберем на курсе:
1. Базовый фундамент (Доступно сейчас)
- Специфика компиляции и отличия от стандартного Dlang.
- Базовые конструкции языка Dlang и их отличия от Си
- Типы данных, управление потоком выполнения, функции и т.д.
2. Системные механизмы и метапрограммирование (В разработке)
- Документирование кода средствами языка D.
- Структуры данных и гарантированное уничтожение ресурсов через деструкторы (RAII, scope).
- CTFE — скриптинг в процессе сборки. Пишите обычный Dlang-код, который выполняется во время компиляции и встраивает результат прямо в бинарник. Генерация таблиц, валидация конфигов, парсинг данных — всё это происходит до запуска программы, не добавляя ни байта в рантайм.
3. Низкоуровневый контроль (Финальный этап)
- Динамическая память, ручные аллокаторы, malloc/free и работа без сборщика мусора (NoGC).
- Введение в экосистемы Inochi2D (numem/nulib) для создания ООП-архитектуры без GC.
- Быстрые n-мерные вычисления с помощью библиотеки LibMir (mir.ndslice).
Для кого этот курс
Начальные требования
- Базовые знания языка Си: понимание указателей, структур данных, стека и кучи.
- Опыт работы с терминалом: умение запустить компилятор и выполнить базовые команды.
- Основы алгоритмов: циклы, условия, функции (синтаксис D похож на C-family, вы быстро освоитесь).
- 📌 Примечание: Мы изучаем строгое подмножество языка D с нуля. Знать «стандартный» Dlang с его сборщиком мусора не требуется.
Наши преподаватели
Как проходит обучение
- 📖 Теория без «воды»: Короткие и емкие уроки по BetterC с жестким фокусом на системное программирование.
- 💻 Локальная разработка: Весь код вы пишете на своем компьютере. Никаких встроенных браузерных песочниц — только реальный компилятор и терминал.
- 🛠️ Прозрачная сборка: Мы настроим легковесные ручные билд-системы. Вы увидите, как ваш бинарный файл собирается «изнутри», без скрытой магии тяжелых IDE.
- 🏗️ Хардкорная практика: Основная работа идет в вашем любимом редакторе кода. Вы сами реализуете управление памятью, сокеты, графику на OpenGL и математику в LibMir
- 🔍 Глубокий разбор кода: Мы детально анализируем архитектуру решений, чтобы вы могли сразу перенести эти паттерны в свои боевые проекты.
- 💬 Инженерное комьюнити: Застряли на ошибке компиляции или сегфолте? Обсуждайте технические нюансы и детелизируйте логи сборки прямо в комментариях к урокам.
Программа курса
Что вы получаете
- 🚀 Навык работы с современным стеком
- 🧠 Полный контроль над памятью
- ⚡ Магию метапрограммирования.
- 📁 Готовые шаблоны билд-скриптов.
- 🔗 Опыт бесшовной интеграции с Си.
- 🎛️ Фундамент для low-level систем.