Учебник
Введение в kola для практикующего разработчика, с какого бы языка вы ни пришли. Знать Rust не нужно: если kola заимствует у него идею, глава объясняет её с нуля, а если отходит от него, разница видна в синтаксисе. Если после какой-то главы осталось непонимание, это ошибка главы, и мы будем рады о ней узнать.
Начните со сборки компилятора — она описана в Быстром старте. Дальше есть два пути. Практикум — лесенка из восьми маленьких программ, и к каждой прилагается упражнение, которое её нарочно ломает. Главы ниже разбирают те же идеи систематически и глубже. Лучше всего сначала пройти практикум, а потом главы. Каждый пример на этих страницах проходит kola check, так что его можно скопировать и запустить. Незнакомое слово ищите в словаре.
Первые восемь глав составляют ядро и опираются друг на друга по порядку. Остальные самостоятельны, и после ядра их можно читать в любом порядке, с одним исключением: главу «Железо» прочитайте раньше главы «Машина», которая считает выданные окна уже знакомыми.
Основы: значения, функции, данные:
mainи её сигнатура, целые типы и литералы, три вида преобразований, арифметика, которая вместо переноса срабатывает трапом, строки, циклы, структуры,match, кортежи и первые тесты.Память: регионы и ссылки: арены вместо
malloc/free, сборщика мусора или borrow checker; почему это безопасно и чем за это приходится платить;region, два вида ссылок,VecиPool.Ресурсы и линейность: значения, которые нельзя потерять, благодаря чему «забыл закрыть» становится ошибкой компиляции.
Эффекты и капабилити: сигнатура как аудит того, что функция может делать и до чего может дотянуться; бюджеты памяти; детерминизм.
Контракты, трапы и тесты: два вида ошибок,
reqиens, проверки, которые нельзя отключить, и что на самом деле останавливает трап.Модули, стандартная библиотека и fn-ссылки:
use, обзор std и полиморфизм без замыканий и трейтов.Константное время (ct): почему код, работающий с секретным ключом, должен выполняться за одно и то же время при любом ключе, чтобы атакующий не смог узнать ключ замерами; почему из этого следует запрет ветвиться и индексировать по секрету;
ct fn, идиома выбора без ветвления иpub-параметры.Потоки и каналы: параллельное выполнение без общей изменяемой памяти, только перемещаемые значения;
spawn,Thread[R]иjoin; каналыTx[T]иRx[T]; планировщик с зерном для детерминированных тестов.Дженерики: всё, что пишется в квадратных скобках: параметры-типы, ограничение
T: data, параметры-регионы, константные параметры[const N: usize], обобщённые блокиimplи то, как компилятор создаёт отдельную копию обобщённой функции для каждого типа, с которым она используется.Файловая система:
Fsс корнем в текущем каталоге и выданные корни,Fileкак линейный дескриптор, атомарная замена файла,statи симуляция сбоев по зерну.Командная строка: аргументы, окружение, стандартные потоки и терминал; запуск выданной внешней программы через
sys.proc; чем восьмибитный код завершения отличается от трапа.Сеть:
DialиListenкак две отдельные капабилити, линейные сокеты, поллер, ослаблениеDialдля рабочего потока,sys.pingи детерминированный симулятор сети.Время: три показания капабилити
Clock(now— монотонное время,now_wall_ns— время от эпохи Unix,now_boot— с учётом сна машины), ожидание, дедлайны, календарные даты и ISO 8601 вstd::time, а также симулированные часы.Окна на рабочем столе: как открыть окно и рисовать в его кадр из пикселей, события клавиатуры и мыши, проверка оконной программы на симулированном окне без экрана и значок в трее с меню — в Linux, Windows и macOS.
Сериализация и кодировки: чтение байтов из сети без копирования и кодировщики std для байтов, base64, DER, JSON, XML и PEM.
Криптография в 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для всякого значения, которое атакующий не должен суметь угадать.SIMD: инструкции, которые обрабатывают сразу несколько чисел, в двух семействах векторных дорожек с противоположными правилами. Дорожки
ct(u32x4,u32x8) допускают только побитовые операции, операции с переносом и сдвиги на константу; медиадорожки (u8x16,i16x8,i32x4и их двойники для AVX2) дают арифметику с насыщением и прочие операции, нужные кодекам.MCP-слой:
kola mcp— компилятор в роли сервера, к которому редактор или агент обращается с запросами вместо поиска по исходникам.Пакеты (kola.pack): манифест, бюджет
[caps], который читает рецензент,kola audit, зависимости и публикация.Железо: выданные окна и типизированный доступ к устройствам: работа с оборудованием через регистры, отображённые в память (MMIO: чтение и запись по определённым адресам обращаются не к RAM, а к устройству);
sys.mmio, выдающая по имени окна MMIO, RAM и портов, где каждое обращение проверяется на границы и выравнивание; окна только для чтения и снимки под seqlock; модель устройства, которая заменяет железо в тестах.Машина: Cpu, упорядочивание памяти и атомарные операции: эффект
hwи почему он отделён отio;sys.cpuдля управления прерываниями, остановки процессора и привилегированных регистров; атомарные операции над общим срезом; как опубликовать данные для другого ядра процессора, чтобы оно увидело записи в правильном порядке.Голое железо: код, работающий без операционной системы, и файлы устройств под её управлением;
DevиDeviceдля символьных устройств из пользовательского пространства, с моделью, которая подменяет устройство при обычном запуске;layout_assert[T](size, align);kola build --freestandingи функции-хуки, которые предоставляет платформа.Встраивание kola в C-программу: генерируемый заголовок
.khи соответствие типов kola типам C;pubкак способ управлять компоновкой; обёртка, которая проверяетreqу каждой экспортируемой функции; почему вызовы идут только из C в kola.Утечки регионов: единственный способ накопить память при регионах — выделение на каждом проходе цикла в регион, который этот цикл не открывал; что находит
kola report leaksи чего он не видит; бюджет[leaks]в манифесте.
За пределами глав: Под капотом рассказывает об интерпретаторе, бэкендах, целевых платформах и границе с C. Безопасность объясняет, как kola превращает поверхность программы, значимую для безопасности, в конечный список. IR-0 описывает проверенное промежуточное представление, по которому работают все компилирующие бэкенды; это единственное место, где компилятор может решить, что проверка не нужна. В каталоге golden/ репозитория лежат нормативные примеры.