flang язык, в котором спецификация исполняется

К README · Указатель документации

Известные ограничения

Названы прямо, потому что на проект с необозначенными границами нельзя опереться. Та же граница проведена в [docs/overview.ru.md](../../docs/overview.ru.md); полные списки — в [flang/SPEC.md](../../flang/SPEC.md) §10 и в разделах «Долги» контрактов.

Доказано против проверено. Разница существенна, а слова звучат одинаково, поэтому:

Расширение доказуемого возможно — условия, укладывающиеся в линейную арифметику, разрешимы, — но подключение решателя к условиям верификации остаётся открытой задачей, а не готовой возможностью.

Язык.

Категорная поверхность. Морфизмы, композиция, цепочки, единицы, функторы, бифункторы, изоморфизмы, моноиды, группы и монады реализованы; у монады есть форма связывания в монаде. Отношения множеств сказаны двумя словами: вложение — подобъект (стрелка, которая ничего не склеивает), пересечение — расслоенное произведение над объемлющим множеством. Устройство обоих доказывается сличением объявлений, инъективность вложения проверяется на значениях автора и при склейке предъявляет контрпример, а непустота общей части подтверждается свидетелем; универсальность общей части остаётся допущением, и следствий из неё компилятор не выводит ([flang/cat/SETS.md](../../flang/cat/SETS.md)). Объединение словом НЕ стало: ко-произведение в языке уже есть — это тип … вариант … с исчерпывающим разбором. Стрелка вправе нести закон: даёт называет функцию, закон — примеры, и нарушенный закон валит flang test, называя и стрелку, и закон. Обратимость изоморфизма проверяется там, где обе стрелки названы через даёт, и остаётся допущением автора там, где хотя бы одна — нет. Предусловие (требует) не заведено: оно есть в контракте как задуманное, не как сделанное. Не реализованы естественные преобразования — они описаны в [flang/cat/SPEC.md](../../flang/cat/SPEC.md). Имена категорий в объявлении функтора — пометка для читателя, а не проверяемое утверждение. Монадой сегодня не объявить список и всё рекурсивное, включая ввод-вывод: отображение эндофунктора печатается на месте, поэтому параметр обязан стоять в поле целиком ([flang/cat/MONAD.md](../../flang/cat/MONAD.md)).

Конкурентность. Сделаны все семь шагов, но шестой — наполовину. Планировщик в рантайме C проверочный: один поток и чередование по семени, побайтово сходящееся с эталоном; рабочего пула потоков нет, и цена его измерена на двух машинах (передача пробега другому потоку стоит от четырёх до четырнадцати пробегов, смотря по машине). Процессы печатаются только в Elixir и C, а остальные шесть целей дают из программы с процесс обработчики как обычные функции и больше ничего. породить заводит экземпляры объявленных видов на ходу — в эталоне и в цели C, но не на BEAM, — и имя порождённому даёт родитель, потому что описанное действие не может вернуть ничего; адресат сообщения по-прежнему обязан быть литералом, поэтому говорить с порождённым можно только тем, с чем он родился; распределённости нет. Сетка семян проверяет конечный набор чередований — это проверенное утверждение, а не доказанное, и свободы от взаимной блокировки она не даёт. Измерение сделано на занятой машине (средняя нагрузка 18–76 при восьми доступных ядрах), поэтому числа времени в нём — верхние оценки, и рядом с каждым названа нагрузка; числа, от неё не зависящие (витки, редукции, байты), названы отдельно и повторяются от прогона к прогону.