Clause
← Уся документація

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26

Спеціалізація типів

Режим швидкості (-O2) використовує виведені факти, щоб усувати перевірки під час виконання (доведення, proofs), і може клонувати функцію у варіанти за представленням, захищені перевірками тегів під час виконання. -O0 і --no-type-specialization створюють лише узагальнений код: кожна перевірка лишається, кожен доступ до складеного значення йде через відповідну службу runtime.

Доведення

Доведення походить лише з фактів, які істинні щоразу, коли виконується код:

Специфікації ніколи нічого не доводять. term() і none() (код, який виведення визнало недосяжним) нічого не доводять; тіла анонімних fun не отримують доведень.

ОпераціяЧим доведеноЗгенерований код
+ - *обидва операнди в діапазонах малих цілих, діапазон результату в межах безпосереднього навантаженнядекодування, обчислення й кодування вбудовано; без перевірки тегу, переповнення чи запасного шляху
+ - *один або обидва операнди в діапазонах малих цілихдоведені перевірки тегів зникають; перевірка переповнення й запасний шлях через службу лишаються
зразок кортежуфакт аргументу чи значення, що зіставляється: точні кортежі арності зразкаперевірку форми усунуто (недоведене: перевіряється вбудовано)
елемент кортежуперевірка форми чи факт, що доводить кортежвбудоване завантаження елемента
зразок спискуфакт: напевно cons-коміркаперевірку форми усунуто (інакше перевірка первинного тегу на кожному рівні)
голова, хвістперевірка cons чи факт, що доводить коміркувбудовані завантаження
точний літерал [], {}, мале ціле, атомзавжди (на кожному рівні)порівняння слів: рівні безпосередні значення — одне слово
генератор спискуфакт вхідних даних генератора: правильний списокперевірка cons і читання комірки вбудовано на кожній ітерації

Факти доходять до зразків голів функцій (аргументи, об'єднані з місць виклику), зіставлень у тілі (права частина) і клауз case/try (значення, що зіставляється, або значення тіла try); факти елементів, голови й хвоста слідують за вилученнями. Вбудоване читання зберігається в кореневий слот, як вивід служби, тож пониження фреймів зберігає його як терм крізь точки безпеки (правило перезавантаження). Єдині перетворення на вказівники в згенерованому коді — це ці доведені читання й завантаження заголовків у вбудованих перевірках форми кортежу (proven.cell). Константи розміщення беруться з abi/term.hpp; runtime звіряє їх зі своїми приватними розміщеннями комірок.

Варіанти

Клонування/спрощення LLVM замінює доведені перевірки всередині клону. Обмежений диспетчер перевіряє кожен обмежений тег і передає контекст та аргументи варіанту або узагальненому тілу; публічний символ і ABI не змінюються. Жодних припущень зі специфікацій чи прапорців fast-math не вводиться.

Поточний ефект

Доведення діють на реальний вихідний код: локальні функції, яким місця виклику передають малі цілі, кортежі й списки, втрачають перевірки тегів, форми та виклики служб (proofs, перевіряється CTest codegen_proofs і запускається як еталон виконуваного файлу executables_proofs). Варіант має заощадити більше інструкцій, ніж коштує його диспетчеризація; одна усунена перевірка тегу аргументу рідко цього досягає, тож варіанти для вихідного коду зазвичай плануються, а потім відхиляються обмеженням зростання. Цільові фікстури LLVM вставляють повторювані перевірки тегів, щоб перевірити влучання, запасні шляхи та відкат зростання з нативним виконанням.

Еталони виконуваних файлів у повному режимі запускаються за кожної політики; швидкий режим запускає -O0 (узагальнений код) і -O2 зі спеціалізацією (доведення).

codegen_measurements записує measurements/<config>/measurements.json у каталог збірки тестів codegen (час компіляції, байти IR/об'єктного коду, варіанти, доведені читання, нативний час). Часи є описовими, ніколи не пороговими значеннями.