Что дальше
Страница о том, чего в языке ещё нет: что делается сейчас, что стоит в очереди и что решено не делать. Дат здесь нет — ни кварталов, ни месяцев.
Что язык уже умеет, читают не здесь: Справочник конструкций, Справочник библиотеки, Справочник команд, Справочник отказов, Операции языка, Настройка редактора, Устранение неполадок, Выпуски.
Где язык сейчас
| Функций написано на flang | 24063 |
| Из них с доказанным завершением | 19694 |
| Утверждений о поведении высказано | 1045 |
| Из них доказано ядром — обо всех входах | 407 |
Главный предел языка виден прямо здесь, и он же — главный пункт плана: завершение доказывается массово, поведение — редко. Разрыв не сходится, а растёт: утверждения пишутся быстрее, чем ядро успевает их доказывать.
Сейчас в работе
Выпуска не будет, пока не перепечатано семя. Из всего списка этот пункт стоит первым, потому что он держит остальные. В bootstrap/ лежит компилятор, напечатанный в C99 и закоммиченный: из него одним make собирается двоичный, и больше для сборки ничего не нужно. Семя обязано совпадать с тем, что печатают сегодняшние исходники, — и не совпадает:
sh scripts/raskrutka.sh --bystro
→ расхождений 45. Компилятор правили, семя не перепечатали. (код 1)
Пока это так, правка в исходниках компилятора в собранной программе не появляется. Видно это на живом примере: печать плана процессов в C написана (flang/self/emit-c.flang), а в семени её нет ни строки — grep -c 'flang_conc.c' bootstrap/compiler_flang.c отвечает 0, тогда как цель Elixir там есть. Сама перепечатка стоит часы и сотни гигабайт памяти и с первого раза не проходит.
Ядро доказывает мало обычных функций. Мешает не скорость поиска, а сила самих правил: решающих правил три, и на теле обычной функции они кончаются. Как устроено ядро — Зачем и как.
Компилятор говорит о себе много, а доказано о нём мало. В исходниках компилятора (flang/self, 57 файлов, 114 164 строки) стоит 7214 строк обеспечивает при 8664 объявлениях функций (замер 29 августа 2026). Написать утверждение — не то же, что его доказать: доказанного среди них меньшинство, и упирается оно в ту же стену, что и библиотека. Считать эти файлы надо awk, а не grep: в link.flang внутри строкового литерала стоит один байт NUL, и одного такого байта хватает, чтобы grep счёл двоичным весь файл и молча его пропустил, — читает его grep -a.
У напечатанной программы нет границы входа. Установленный flang доводы по объявленным типам проверяет:
flang run examples/measure/natural.flang --function «Факториал» --args '{"н":-3}'
→ FLANG_TYPE: вызов функции «Факториал»: аргумент «н»: -3 вне неотрицательное (код 1)
Программа, вышедшая из flang emit, — нет: за её вход отвечает вызывающая сторона, и flang emit говорит об этом при печати. Печатает он при этом во все восемь целей одним и тем же двоичным — как встроить flang в чужую программу.
Английская половина сайта неполна. Страницы сайта переведены; руководство и спецификации — пока только по-русски.
Дальше, и каждое держит следующее
1. Нет менеджера пакетов. Сам пакет и замок есть: flang package кладёт библиотеку со всем, что она тянет, в один файл, flang lock записывает сами зависимости, а не ссылки на них — как это делается. Нет всего, что стоит над пакетом: реестра, поиска по имени, диапазонов версий, разрешения зависимостей. Обновление сегодня — взять новый файл и положить на место старого.
2. Библиотека выросла раньше менеджера пакетов. Здесь страница обещала обратный порядок — «пока библиотеку нельзя раздать по имени и версии, растить её незачем», — и порядок вышел другим. Сегодня в flang/stdlib 38 модулей, 1275 функций, из них 1271 с доказанным завершением, и пустых мест из прежнего списка в нём больше нет:
- базы данных — два драйвера: PostgreSQL по проводу (протокол 3.0, вход
scram-sha-256) и SQLite, который теперь не только читает файл обходом b-дерева, но и собирает его с нуля:«Собрать базу»отдаёт образ файла целиком, готовый к записи одним поручением. Проверяет себя он пока САМ — постусловия читают свой же образ обратно тем же обходом дерева; что этот файл примет чужаяsqlite3, отдельным прогоном ещё не подтверждено; - сеть — HTTP (разбор и печать запроса и ответа), двоичный протокол поверх TCP (
provod), Redis по RESP2, разбор рукопожатия TLS; - своя криптография — AES с режимами CTR, GCM и CBC, обмен ключами X25519, SHA-1, SHA-256, HMAC, PBKDF2, разбор DER, разбор сертификата X.509 и разбор списка отзыва CRL;
- регулярные выражения —
automaton.flang, 63 функции, все с доказанным завершением. Движок не откатывается: образец разбирается в дерево, а состояние автомата — сам образец, укороченный на прочитанный знак (производные Бжозовского). Шагов ровно столько, сколько знаков во входе, — по построению.
Что из этого списка ещё не сделано: своим шифром не исполняется само защищённое соединение — https по-прежнему уходит внешней программе curl, и проверку отзыва к нему никто не подключил, хотя читать CRL уже есть чем. В SQLite пишется образ целиком и только с нуля: дописать строку в чужой готовый файл нечем — для этого нужен журнал, а его нет. Реестр библиотеке от всего этого нужнее, а не меньше: раздавать по имени и версии теперь есть что.
3. Прикладного кода мало, но он уже не единственный. Служба-сокращатель ссылок (examples/web/shortener) — хранилище, маршрутизация, процессы и надзор, и между входными и выходными байтами ни одной строки не на flang; бэкенд-пример из семи файлов (examples/library-api); планы разговора с базами (examples/db). Служба поднимается и на настоящем сокете: планировщик процессов на C научился ждать сеть, не останавливаясь, и curl получает от неё 200 на /здоровье, 201 на POST, 301 с Location и 204 на DELETE. У этого прогона есть оговорка, и без неё называть его нечестно: таблицу плана процессов для C писали руками вне дерева, потому что печатать её нечем — в закоммиченном семени такой печати нет ни строки. Из чистого дерева тот же прогон сегодня не повторить. И это примеры, а не приложения в работе: программы, которую кто-то держит в проде, среди них нет.
4. Вспомогательный код всё ещё на JavaScript. В дереве 54 таких файла и 25 527 строк (git ls-files '*.mjs' '*.js' | xargs wc -l | tail -1, замер 29 августа 2026) — сборка сайта, проверки, замеры. Часть из них снять нельзя не из-за нехватки рук: возможностей не хватает в самом языке, и что именно держит каждый файл, разобрано в docs/javascript-inventory.md — там все 54 разложены по четырём кучам. Долг — 28 файлов и 13 507 строк; остальные 26 долгом не считаются вовсе: рантайм цели печати «js», вывод самого компилятора, запускатели, до которых flang в системе ещё нет, и отдельный каталог образцов.
Одна из дыр этого разбора закрылась наполовину, и вторая половина не закроется никогда. Регулярные выражения в языке появились, но просмотров вперёд и назад в них нет и не будет (см. ниже), а сторожа написаны с ними: claim-guard.mjs — три, count-guard.mjs — три, binary-rules-guard.mjs — два. Свободны от них name-guard.mjs и jargon-guard.mjs: эти два переносимы новым движком уже сегодня, оставшиеся три — нет, и переписывать в них придётся не образец, а замысел.
Решено не делать
Замыканий не будет. Захват окружения ломает доказательство завершения и прямую печать в C, Go и Rust. Функции первого класса при этом есть: компилятор заменяет функцию-значение меткой и разбирает по меткам. Замыкание и функция первого класса — разные вещи, отказано только первому.
Просмотров вперёд и назад в регулярных выражениях не будет. (?=…), (?<=…) и обратные ссылки \1 требуют вернуться и перечитать прочитанное — то есть ровно того возврата, ради отказа от которого движок и написан. Образец с ними не молчит, а отказывает названно: причина кладётся в поле «беда», и совпадение на таком образце отвечает «нет». Цена названа выше: три сторожа дерева остаются на JavaScript, пока их не перепишут без просмотров.
Двух версий одной библиотеки в одной программе не будет. Когда две зависимости тянут одну библиотеку разных версий, это решается подъёмом версии, а не соседством обеих в программе. Разбор — в Модульности и пакетах.
Модель Unison целиком не берём. Хранить код в базе вместо файлов — значит владеть редактором, владеть хостом и потерять git. Половину — адресацию по содержимому — берём, вторую нет.