/
Поиск
RU

Учебник

Введение в kola для практикующего разработчика, с какого бы языка вы ни пришли. Знать Rust не нужно: если kola заимствует у него идею, глава объясняет её с нуля, а если отходит от него, разница видна в синтаксисе. Если после какой-то главы осталось непонимание, это ошибка главы, и мы будем рады о ней узнать.

Начните со сборки компилятора — она описана в Быстром старте. Дальше есть два пути. Практикум — лесенка из восьми маленьких программ, и к каждой прилагается упражнение, которое её нарочно ломает. Главы ниже разбирают те же идеи систематически и глубже. Лучше всего сначала пройти практикум, а потом главы. Каждый пример на этих страницах проходит kola check, так что его можно скопировать и запустить. Незнакомое слово ищите в словаре.

Первые восемь глав составляют ядро и опираются друг на друга по порядку. Остальные самостоятельны, и после ядра их можно читать в любом порядке, с одним исключением: главу «Железо» прочитайте раньше главы «Машина», которая считает выданные окна уже знакомыми.

  1. Основы: значения, функции, данные: main и её сигнатура, целые типы и литералы, три вида преобразований, арифметика, которая вместо переноса срабатывает трапом, строки, циклы, структуры, match, кортежи и первые тесты.

  2. Память: регионы и ссылки: арены вместо malloc/free, сборщика мусора или borrow checker; почему это безопасно и чем за это приходится платить; region, два вида ссылок, Vec и Pool.

  3. Ресурсы и линейность: значения, которые нельзя потерять, благодаря чему «забыл закрыть» становится ошибкой компиляции.

  4. Эффекты и капабилити: сигнатура как аудит того, что функция может делать и до чего может дотянуться; бюджеты памяти; детерминизм.

  5. Контракты, трапы и тесты: два вида ошибок, req и ens, проверки, которые нельзя отключить, и что на самом деле останавливает трап.

  6. Модули, стандартная библиотека и fn-ссылки: use, обзор std и полиморфизм без замыканий и трейтов.

  7. Константное время (ct): почему код, работающий с секретным ключом, должен выполняться за одно и то же время при любом ключе, чтобы атакующий не смог узнать ключ замерами; почему из этого следует запрет ветвиться и индексировать по секрету; ct fn, идиома выбора без ветвления и pub-параметры.

  8. Потоки и каналы: параллельное выполнение без общей изменяемой памяти, только перемещаемые значения; spawn, Thread[R] и join; каналы Tx[T] и Rx[T]; планировщик с зерном для детерминированных тестов.

  9. Дженерики: всё, что пишется в квадратных скобках: параметры-типы, ограничение T: data, параметры-регионы, константные параметры [const N: usize], обобщённые блоки impl и то, как компилятор создаёт отдельную копию обобщённой функции для каждого типа, с которым она используется.

  10. Файловая система: Fs с корнем в текущем каталоге и выданные корни, File как линейный дескриптор, атомарная замена файла, stat и симуляция сбоев по зерну.

  11. Командная строка: аргументы, окружение, стандартные потоки и терминал; запуск выданной внешней программы через sys.proc; чем восьмибитный код завершения отличается от трапа.

  12. Сеть: Dial и Listen как две отдельные капабилити, линейные сокеты, поллер, ослабление Dial для рабочего потока, sys.ping и детерминированный симулятор сети.

  13. Время: три показания капабилити Clock (now — монотонное время, now_wall_ns — время от эпохи Unix, now_boot — с учётом сна машины), ожидание, дедлайны, календарные даты и ISO 8601 в std::time, а также симулированные часы.

  14. Окна на рабочем столе: как открыть окно и рисовать в его кадр из пикселей, события клавиатуры и мыши, проверка оконной программы на симулированном окне без экрана и значок в трее с меню — в Linux, Windows и macOS.

  15. Сериализация и кодировки: чтение байтов из сети без копирования и кодировщики std для байтов, base64, DER, JSON, XML и PEM.

  16. Криптография в std: дерево std/crypto (SHA-2 и SHA-3, HMAC и HKDF, AES-GCM, ChaCha20-Poly1305, X25519, Ed25519, P-256, P-384, RSA, ML-KEM, ML-DSA, X.509); дисциплины ct, untrusted и Secret[T]; Entropy для всякого значения, которое атакующий не должен суметь угадать.

  17. SIMD: инструкции, которые обрабатывают сразу несколько чисел, в двух семействах векторных дорожек с противоположными правилами. Дорожки ct (u32x4, u32x8) допускают только побитовые операции, операции с переносом и сдвиги на константу; медиадорожки (u8x16, i16x8, i32x4 и их двойники для AVX2) дают арифметику с насыщением и прочие операции, нужные кодекам.

  18. MCP-слой: kola mcp — компилятор в роли сервера, к которому редактор или агент обращается с запросами вместо поиска по исходникам.

  19. Пакеты (kola.pack): манифест, бюджет [caps], который читает рецензент, kola audit, зависимости и публикация.

  20. Железо: выданные окна и типизированный доступ к устройствам: работа с оборудованием через регистры, отображённые в память (MMIO: чтение и запись по определённым адресам обращаются не к RAM, а к устройству); sys.mmio, выдающая по имени окна MMIO, RAM и портов, где каждое обращение проверяется на границы и выравнивание; окна только для чтения и снимки под seqlock; модель устройства, которая заменяет железо в тестах.

  21. Машина: Cpu, упорядочивание памяти и атомарные операции: эффект hw и почему он отделён от io; sys.cpu для управления прерываниями, остановки процессора и привилегированных регистров; атомарные операции над общим срезом; как опубликовать данные для другого ядра процессора, чтобы оно увидело записи в правильном порядке.

  22. Голое железо: код, работающий без операционной системы, и файлы устройств под её управлением; Dev и Device для символьных устройств из пользовательского пространства, с моделью, которая подменяет устройство при обычном запуске; layout_assert[T](size, align); kola build --freestanding и функции-хуки, которые предоставляет платформа.

  23. Встраивание kola в C-программу: генерируемый заголовок .kh и соответствие типов kola типам C; pub как способ управлять компоновкой; обёртка, которая проверяет req у каждой экспортируемой функции; почему вызовы идут только из C в kola.

  24. Утечки регионов: единственный способ накопить память при регионах — выделение на каждом проходе цикла в регион, который этот цикл не открывал; что находит kola report leaks и чего он не видит; бюджет [leaks] в манифесте.

За пределами глав: Под капотом рассказывает об интерпретаторе, бэкендах, целевых платформах и границе с C. Безопасность объясняет, как kola превращает поверхность программы, значимую для безопасности, в конечный список. IR-0 описывает проверенное промежуточное представление, по которому работают все компилирующие бэкенды; это единственное место, где компилятор может решить, что проверка не нужна. В каталоге golden/ репозитория лежат нормативные примеры.