Текст площадки «Stepik». Упомянутые цены и обещанные результаты могут быть неактуальны; условия покупки проверяйте у продавца.
Освойте BetterC — подмножество Dlang без GC и рантайма. Полная ABI-совместимость с C-библиотеками и системными вызовами, шаблоны, CTFE, LibMir и ручное управление памятью для highload и embedded-систем.
Читать полное описание
Вы устали от макросов Си, но не хотите мириться с тяжелым рантаймом C++? Добро пожаловать в BetterC!
Этот курс посвящен уникальному режиму компилятора языка D (Dlang) — betterC(далее BC). Мы предлагаем вам взглянуть на системное программирование по-новому: сохранив полный контроль над памятью и железом, вы получите доступ к мощным современным инструментам, которых так не хватает в обычном Си.
BC превосходит стандартный язык D с рантаймом в задачах, где критически важны минимальный размер бинарного файла, предсказуемость производительности и простота интеграции с существующим кодом на C.
Курс находится в активной разработке и обновляется каждую неделю. Мы пройдем последовательный путь от фундаментальных основ синтаксиса до продвинутых инженерных решений.
«Суть курса — системное программирование. Язык — лишь средство, но важно, чтобы он не мешал. Си слишком неудобен, а популярные современные языки заваливают вас абстракциями. Даже ассемблер и классический C++ часто загоняют программиста в жесткие рамки. Dlang же — это про свободу. Это не просто «второй Си», как многие думают после беглого осмотра. Это язык, который позволяет проворачивать сложнейшие архитектурные решения без лишних оков, открывая возможности, недоступные в стандартной парадигме СП».
🌍 Кросс-компиляция «из коробки»
Связка 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).